82% внедрений внутренних RAG-систем в энтерпрайзе перестают использоваться ровно через 40 дней после релиза. Это сухая статистика телеметрии, которую я вижу на аудитах инфраструктуры. ИТ-директор выбивает бюджет, вендор рисует красивые презентации, обещая корпоративный поиск, который реально экономит часы инженеров, а не плодит ещё одну вкладку. А в реальности компания получает мертвый портал search.company.local.
Инженер открывает новую вкладку. Вбивает в строку «как переподнять стейджинг биллинга». Система задумывается на двенадцать секунд и выдает уверенную, красиво отформатированную выжимку из регламента 2019 года, сдобренную галлюцинацией про несуществующие переменные окружения.
Инженер закрывает вкладку.
Больше он туда не вернется. Он идет в Slack и пингует DevOps-лида. Инвестиции в ИИ обнулились одной нерелевантной выдачей.
Почему корпоративный ИИ поиск ломается на старте
Люди путают полнотекстовый поиск и семантику. Хуже того, они думают, что трансформер — это магический фильтр, который сам разберется в мусоре. Стандартный пайплайн, который сейчас лепят на каждом углу: берем сырой дамп Confluence, выгрузку из Jira, скидываем все в векторную базу с наивным chunk_size=512 и натравливаем поверх самую дешевую облачную LLM.
Выдача становится мусором, потому что на входе мусор. Поиск по документации компании — это инженерия данных, а не API-вызов к модной нейросети. Когда в базе лежат три версии инструкции по деплою, и две из них устарели пять лет назад, векторный поиск найдет их все. Они семантически идеальны для запроса. Модель получит противоречивый контекст и попытается его усреднить.
Усредненный конфиг балансировщика не работает.
Еще одна фундаментальная ошибка — отказ от лексического поиска. Векторные эмбеддинги великолепно понимают смысл фраз «упала база» и «отвалился мастер», но они абсолютно беспомощны, когда инженер ищет конкретный трейсбек ERR_AUTH_774B. Для семантики 774B и 774C — это почти идентичные векторы. Для разработчика — это разница между сгоревшим токеном и упавшим шардом.
Наш подход: гибрид и жесткий граундинг
Доверие сгорает после одной попытки. Если система соврала, разработчик будет перепроверять за ней каждый чих, тратя больше времени, чем на самостоятельный поиск. Поэтому наш подход в Morana Labs строится на параноидальном граундинге. Мы на уровне системного промпта и архитектуры RAG запрещаем генеративным моделям додумывать.
Семантика ищет концепции. Классический BM25 ищет точные идентификаторы. Затем в дело вступает кросс-энкодер — тяжеловесная модель ранжирования, которая агрессивно выжигает нерелевантный контекст до того, как он попадет в генеративное окно.
Если после фильтрации нужного контекста не осталось, система обязана честно ответить: «Информации нет». Отказ в обслуживании лучше, чем галлюцинация.
А когда ответ сгенерирован, каждый факт, каждая строчка конфигурации обязана сопровождаться железобетонной ссылкой на источник. Инженер не доверяет ИИ. Инженер доверяет автору документации. Если нейросеть говорит, что таймаут на шлюзе 30 секунд, рядом висит кликабельная сноска [1], ведущая на конкретный коммит Васи из команды Core, где этот таймаут был захардкожен. Мы не заменяем экспертизу, мы просто схлопываем дистанцию между вопросом и автором ответа до миллисекунд.
Метрики успеха и иллюзия «среднего» времени
Перестаньте смотреть на MAU (Monthly Active Users) внутреннего портала. Это метрика тщеславия. То, что люди заходят на портал, не означает, что они решают свои проблемы. Забудьте про «среднее время до ответа» — в высоконагруженных командах смотрят только на перцентили.
Если ваш p90 latency превышает 10 секунд — поиск мертв. Человек не будет смотреть на спиннер загрузки. На восьмой секунде он уже открывает чат с коллегой. Время генерации первого токена (TTFT) должно укладываться в сотни миллисекунд.
Реальная метрика успеха корпоративного поиска — это Deflection Rate. Доля эскалаций, предотвращенных на нулевом уровне. Сколько вопросов вида «а где взять креды от тестовой кафки» не долетело до личных сообщений сеньоров. Измеряйте тишину в каналах поддержки.
Чтобы эта тишина наступила, система не должна быть отдельным сайтом.
- Никаких новых вкладок браузера. Интеграция должна быть нативной.
- Бот в Slack или Teams, который отвечает в треде, если его тегнуть.
- Плагин для IDE, который подтягивает контекст из корпоративного Git'а прямо в редактор.
- Хук в Jira, который анализирует описание бага до того, как разработчик нажал «создать», и подкидывает ему ссылку на идентичный закрытый инцидент месячной давности.
Если ради поиска информации инженеру нужно ломать свой флоу, переключаться в другой интерфейс и вспоминать пароль от портала — он выберет дернуть соседа по опенспейсу. Технология приживается только тогда, когда становится невидимой. Обратная связь здесь работает молчаливо: если человек прочитал сгенерированный ответ в чате, скопировал оттуда команду и пошел дальше — система отработала идеально. Если он нажал кнопку дизлайка или отправил следом уточняющий запрос — контекст был подобран криво.
Не пытайтесь заставить команду любить ИИ. Сделайте инструмент, который выдает нужный кусок лога, ссылку на актуальный регламент и исчезает с дороги, не требуя сказать спасибо.