- alert: HighLatency expr: rate(http_request_duration[5m]) > 2.0 — вот так выглядит абсолютная слепота в production-среде. Когда вы мониторите on-prem RAG-систему в закрытом контуре исключительно инфраструктурными дашбордами, вы не управляете качеством. Вы просто следите за тем, чтобы генератор чуши работал без перебоев с минимальной задержкой. Этот постмортем: RAG тихо галлюцинировал на проде 6 недель — faithfulness упал 0.92→0.71, и uptime это не показал. Мы прозевали момент, когда нейросеть начала изобретать юридические прецеденты, потому что видеокарты гудели ровно, а 152-ФЗ и ФСТЭК категорически запрещают нам стримить логи во внешние облачные сервисы для аналитики.
Как мы до этого докатились? Релиз-кандидат был идеальным, никто не ждал подвоха. Приёмка шла на вылизанном golden set из восьмисот сложных контрактов и нормативных актов. Метрика faithfulness — степень того, насколько генерация LLM опирается исключительно на извлечённые из базы факты — держалась на железобетонном уровне 0.92. Мы выкатили систему на edge-кластер, подписали акты и пошли пить кофе.
Первая неделя: полёт нормальный, запросы идут. Вторая неделя: заказчик штатно заливает в векторную базу 3000 новых корпоративных политик. Третья неделя: ответы становятся чуть более обтекаемыми, но явных жалоб нет. Пятая неделя: дрейф корпуса достигает критической массы. При этом метрики рисуют идеальную картину: зелёные 99.9% доступности и 450 миллисекунд Time To First Token. Шестая неделя: взрыв. Юристы приносят распечатанное сгенерированное заключение, где модель уверенно ссылается на несуществующий пункт свежего постановления. Почему мы узнаём о деградации качества RAG от разъярённого пользователя с претензией на столе, а не из PagerDuty? Да потому что мы мониторили железо, а не смысл.
Золотой датасет на приёмке оценивает статику. В проде векторная база живёт, пухнет и меняется каждый день. При добавлении тех 3000 новых юридических документов в нашем пайплайне поплыл алгоритм чанкинга. Новые плотные тексты семантически пересеклись со старым пулом контрактов, образовав огромные монолитные зоны в векторном пространстве. В HNSW-индексе радикально изменилась плотность кластеров. Никто, естественно, не пересчитал критический параметр ef_search под возросший объем. Алгоритм поиска ближайших соседей просто не успевал пробиться через новые слои графа за заданное время.
В результате этап retrieval начал вытаскивать не самые релевантные куски, а те, что тупо быстрее находились алгоритмом аппроксимации на верхних слоях. Действительно релевантные параграфы просто вытеснились из top-k контекста, передаваемого в промпт. Что делает большая языковая модель, когда в системном промпте ей жестко приказывают «отвечай как эксперт», но не дают нужного факта? Она спасает ситуацию единственным доступным математическим способом — уверенно и правдоподобно врёт, опираясь на веса своей претрейн-базы.
Наш изолированный контур усугубил проблему: готового внешнего мониторинга от SaaS-вендоров у нас нет, API для online-eval закрыто корпоративным файрволом, а свой пайплайн непрерывной оценки мы не построили. Оправдывались тем, что инференс и так жрёт слишком много GPU-памяти.
Постмортем: RAG тихо галлюцинировал на проде 6 недель — что мы внедрили
Теперь мы на собственной шкуре знаем, почему RAG врёт под нагрузкой. Метрик latency недостаточно, online-eval должен работать прямо поверх потока запросов в реальном времени. Мы полностью пересобрали архитектуру и развернули жесткий контур оценки, который крутится локально рядом с основным пайплайном:
- LLM-judge на сэмпле прод-трафика: мы подняли отдельную легковесную модель, которая асинхронно прогоняет 5% реальных логов запросов и ответов, замеряя метрику faithfulness. Если скор падает ниже 0.85 — срабатывает алерт.
- Citation-grounding hard-fail: перед выдачей ответа пользователю запускается легковесный кросс-энкодер. Он построчно проверяет, что каждый сгенерированный факт имеет прямую, математически доказуемую ссылку на исходный чанк. Нет ссылки — генерация блокируется на корню с отбивкой «Недостаточно данных».
- Алерт на падение retrieval-recall: логируем распределение косинусного расстояния в выдаче базы. Если средний скор возвращаемых документов деградирует — это прямой сигнал к перестройке HNSW-индекса.
- Human-in-the-loop на критичных доменах: для запросов с тегами юридических рисков ответы с низким confidence score принудительно падают в очередь на ручную верификацию.
Golden set на этапе приёмки — это не гарантия качества. Это лишь подтверждение того, что ваша система могла работать в идеальных условиях ровно один день в прошлом. Без семантического онлайн-мониторинга любой внедрённый RAG деградирует молча, накапливая ошибки, пока они не выстрелят. Единственный способ не получить иск от регулятора за тихое враньё нейросети — развернуть независимый eval-контур прямо на том же железе, где крутится инференс. Планируете катить LLM в зарегулированный сектор — начните с аудита того, как вы собираетесь ловить дрейф.