Перейти к содержимому
Carbonfay

инженерные заметки

Как создать RAG-систему, которая не врёт в проде

Практический разбор создания RAG-системы: источники, индексация по событиям, гибридный поиск с переранжированием и оценка достоверности ответов.

Коротко для руководителя. RAG — это способ заставить модель отвечать по вашим данным, а не по тому, что она «знает». Демонстрация на десятке документов почти всегда выглядит идеально и почти ничего не говорит о проде. В реальной эксплуатации RAG-система не «не знает» — она уверенно отвечает неверно, и для бизнеса это дороже, чем честное «ответа нет». Разница между демо и работающей системой — не в модели, а в инженерии контекста: как источники приводятся к единому виду, как обновляются, как из них достаётся минимально достаточный фрагмент и как проверяется, что ответ обоснован. Это то, что нужно требовать на пилоте, и то, по чему считается стоимость.


Сценарий повторяется из проекта в проект. Берут базу знаний, загружают документы в векторное хранилище, подключают модель — на демонстрации ассистент уверенно отвечает на вопросы, всем нравится. Через два месяца в проде он так же уверенно сообщает клиенту устаревшее условие договора, ссылается на отменённый регламент и смешивает два разных продукта в одном ответе. Формально система «работает»: она всегда что-то отвечает. Именно это и проблема.

RAG (retrieval augmented generation) задумывался как способ убрать выдумку: модель отвечает не из памяти, а по найденному фрагменту. Но сам по себе RAG галлюцинации не убирает — он переносит их с уровня модели на уровень поиска. Если найден не тот фрагмент или фрагмент устарел, модель аккуратно и убедительно перескажет неправильное.

Уверенная ошибка дороже честного «не знаю».

Гипотеза: качество RAG определяется инженерией контекста, а не моделью

Принято думать, что качество ответа зависит от того, насколько сильная модель стоит за RAG. На практике решающее — какой именно фрагмент и в каком объёме попал в контекст. Сильная модель по неверному фрагменту даёт красиво оформленную ошибку; слабая модель по точному фрагменту даёт полезный ответ.

данные
Точность ответов: модель без поиска vs та же модель с RAG
Базовая модель без поиска (HaluEval)10%Та же модель с RAG (HaluEval)45%Базовая модель без поиска (TriviaQA)5%Та же модель с RAG (TriviaQA)35%

Решает не размер модели, а наличие поиска: на одной и той же модели подключение RAG поднимает точность в разы. Качество ответа определяется тем, какой контекст в неё попал.

Источник: Exploring RAG Solutions to Reduce Hallucinations in LLMs, IEEE, 2024 https://ieeexplore.ieee.org/document/11014810/

Из этого следует, что строить RAG-систему — это в основном строить конвейер контекста, а не подбирать модель.

Проблема: демо работает на статике, прод — на изменениях и объёме

У демо три удобства, которых нет в проде. Документов мало, поэтому почти любой поиск возвращает релевантное. Документы не меняются, поэтому ответ не устаревает. Вопросы задают «правильные», близкие к тексту источника.

В проде всё иначе. Источников тысячи, и среди них есть противоречащие друг другу версии. Документы меняются ежедневно: договор переподписан, регламент отменён, прайс обновлён. Вопросы задают своими словами, далёкими от формулировок документа. В этих условиях наивная схема «вектор → модель» начинает уверенно ошибаться, и хуже всего — ошибку не видно: система не падает, она просто иногда врёт.

Почему обычные подходы не работают

«Загрузить документы в векторную базу» — это не система знаний, а её самый простой кусок. Векторный поиск находит семантически похожее, но не различает свежее и устаревшее, точное и приблизительное, разрешённое этому пользователю и нет. Он вернёт похожий по смыслу старый регламент с той же уверенностью, что и действующий.

Увеличение размера модели проблему не решает: модель не знает, что поданный ей фрагмент устарел или не относится к делу. Подкладывание «всех найденных фрагментов на всякий случай» делает только хуже — растёт длина контекста (а с ней стоимость), и модель начинает смешивать источники. Корень в том, что в схеме нет трёх вещей: актуальности (когда фрагмент обновлялся), ранжирования (какой из похожих действительно отвечает на вопрос) и проверки обоснованности (опирается ли ответ на поданный текст).

Инженерная модель: конвейер, а не «база плюс модель»

Работающая RAG-система — это конвейер с явными слоями.

Нормализация источников. Разные форматы приводятся к единому виду, у каждого фрагмента есть метаданные: источник, версия, дата, права доступа. Без этого нельзя ни отсечь устаревшее, ни ограничить выдачу по пользователю.

Индексация по событиям, а не по расписанию. Индекс обновляется тогда, когда меняется источник (документ переподписан, регламент отменён), а не раз в сутки «пакетом». Устаревший ответ — это почти всегда индекс, отставший от реальности.

Гибридный поиск с переранжированием. Векторный поиск даёт семантические кандидаты, лексический — точные совпадения терминов и номеров; затем отдельный шаг переранжирования отбирает из кандидатов те, что действительно отвечают на вопрос. Это тот шаг, которого нет в наивной схеме и который сильнее всего влияет на «не врёт / врёт».

данные
Что даёт шаг переранжирования (cross-encoder)
+25–48%
прирост качества поиска от переранжирования (в зависимости от базовой схемы и домена)
+4 nDCG
преимущество cross-encoder над сильным bi-encoder в среднем по BEIR

Переранжирование — тот слой, которого нет в наивной схеме «вектор → модель» и который сильнее всего сдвигает результат из «врёт» в «не врёт».

Источник: BEIR benchmark; исследования cross-encoder reranking, 2022–2024 https://datasets-benchmarks-proceedings.neurips.cc/paper/2021/file/65b9eea6e1cc6bb9f0cd2a47751a186f-Paper-round2.pdf

Бюджет контекста. В модель подаётся не «всё найденное», а переранжированный минимум в пределах заданного лимита токенов. Это одновременно про качество (меньше смешивания источников) и про стоимость (контекст не растёт тихо).

Оценка обоснованности. Для части трафика автоматически проверяется, опирается ли ответ на поданные фрагменты, и нет ли утверждений «из воздуха». Это превращает «кажется, работает» в измеримую величину.

Практический вывод для бизнеса

Что из этого следует для решения о проекте.

Демо на десяти документах нельзя принимать за доказательство. Спросите на пилоте три вещи: как система понимает, что документ устарел; что происходит, когда найденного недостаточно (честное «не знаю» или ответ всё равно); как измеряется доля обоснованных ответов. Ответы на эти вопросы предсказывают поведение в проде лучше, чем любая демонстрация.

Цена ошибки определяет архитектуру, а не наоборот. Там, где неверный ответ — это юридический или финансовый риск, отсутствие ответа дешевле уверенной ошибки; система должна уметь молчать. Это проектное решение, принимаемое до разработки.

Стоимость RAG предсказуема, если заложены бюджеты контекста и индексация по событиям. Непредсказуемой она становится там, где «на всякий случай» подкладывают всё найденное и переиндексируют всё подряд.

Приложить это к вашим процессам — .

Открытые вопросы

Как измерять «правдивость» ответа в проде без разметки человеком — задача без зрелого общего решения; автоматические оценки обоснованности приближают, но не заменяют выборочную ручную проверку. Где граница между «система честно не знает» и «система обязана найти» — это решение бизнеса, а не модели, и оно меняется от процесса к процессу. Насколько свежим должен быть индекс — компромисс между стоимостью переиндексации и ценой устаревшего ответа; универсального ответа нет, есть расчёт под конкретный поток изменений.


Если у вас есть база знаний, по которой люди отвечают вручную, и цена ошибки в ответе высока — это кандидат на RAG, сделанный как система, а не как демо. — разберём источники, частоту изменений и где проходит граница «честно не знаю».

связанные кейсы

Следующий шаг

Спроектируем слой автоматизации на ИИ под ваши процессы.

DBCV