АгентеоАгентео
Разработка

Почему RAG отвечает неверно: диагностика по шагам от документа до ответа

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

Опубликовано

Сначала разделить «не нашёл» и «нашёл, но ответил не так»Девять симптомов и что с ними делатьЗолотой набор вопросов вместо ощущений

Первый вопрос диагностики: ошибка поиска или ошибка ответа

RAG состоит из двух частей: поиск находит фрагменты, модель по ним отвечает. Принцип разобран в статье «RAG: как научить ИИ отвечать по документам компании». Ошибиться может любая из частей, и лечатся они по-разному. Поэтому первая задача — понять, какая.

Для этого берут вопрос с известным правильным ответом и смотрят, что произошло на каждом шаге.

Что видимЧто это значитКуда смотреть
Нужного фрагмента нет среди найденныхОшибка поиска: документ не в индексе, плохо нарезан или запрос не совпал по смыслуДанные, нарезка, поиск, формулировка вопроса
Нужный фрагмент найден, но стоит ниже других или не попал в итоговый запросОшибка ранжирования или сборки запросаРеранкинг, число фрагментов, порядок
Нужный фрагмент в запросе есть, а ответ неверныйОшибка генерации: модель проигнорировала или исказила контекстИнструкция, формат, проверка цитат
Нужный фрагмент есть и ответ верный, но пользователь недоволенПроблема в форме или в ожиданияхФормат, длина, ссылки, тон
Не меняйте модель, пока не знаете, нашёл ли поиск нужный фрагмент.

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

Как измерять: золотой набор и две метрики

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

  • Найден ли нужный фрагмент. Для каждого вопроса проверяем, попал ли правильный фрагмент в число найденных (например, в первые пять). Это метрика поиска, её часто называют полнотой на k.
  • Верен ли ответ при правильном контексте. Подаём модели заведомо правильный фрагмент и смотрим, ответит ли она верно. Это проверка генерации отдельно от поиска.
  • Честный отказ. В набор добавляем вопросы, ответа на которые в базе нет. Правильное поведение — отказ.
  • Верная ссылка. Указан ли именно тот документ и пункт.

Две первые метрики вместе показывают, где проблема: если поиск находит нужное редко, чиним поиск; если находит, а ответы неверны, чиним генерацию. Набор запускают после каждого изменения, иначе правка одного вопроса незаметно ломает другие. Как проводить такую проверку у агентов в целом, описано в статье «Как оценить качество AI-агента».

Шесть участков, где ломается RAG

1. Данные: документа нет, он устарел или плохо читается

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

2. Нарезка: фрагмент без контекста или слишком большой

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

  • Резать по смыслу (раздел, пункт, строка таблицы), а не по числу символов.
  • Хранить вместе с фрагментом название документа, заголовки разделов и номер пункта.
  • Таблицы резать по строкам, добавляя заголовки столбцов в каждую.
  • Для длинных документов хранить связь «фрагмент — родительский раздел», чтобы при необходимости подтянуть соседний текст.

3. Поиск: только по смыслу или только по словам

Поиск по смыслу (векторный) хорошо находит близкие по значению формулировки, но слабее на артикулах, номерах договоров, аббревиатурах и редких терминах. Поиск по словам, наоборот, точен на кодах и пропускает синонимы. Практичное решение — сочетать оба и добавлять фильтры по метаданным: подразделение, дата, версия, права доступа. Выбор модели для векторного поиска влияет на качество на русском тексте, поэтому проверяйте её на своих вопросах, а не по общим таблицам сравнения.

4. Вопрос: короткий, неоднозначный или зависит от истории

Пользователи пишут «а сколько?» или «и для командировок?», где смысл лежит в предыдущей реплике. Поиск по такому тексту бесполезен. Помогают переписывание вопроса с учётом истории («сколько дней отпуска положено при командировке») и уточняющий вопрос системы, когда вопрос неоднозначен. Для длинных диалогов важно, как устроена память, см. «Память AI-агента».

5. Ранжирование и сборка запроса: нужное найдено, но потерялось

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

6. Генерация: модель достраивает или игнорирует контекст

Даже при правильном контексте модель иногда отвечает «из общих знаний», склеивает два противоречивых фрагмента или обобщает условие там, где оно относилось к частному случаю. Что помогает: инструкция отвечать только по найденному, требование цитаты, проверка кодом, что цитата есть в источнике, и явный отказ при отсутствии ответа. Как писать такие инструкции, разобрано в статье «Системный промпт AI-агента».

Симптомы и лечение: таблица для быстрой диагностики

СимптомВероятная причинаКак проверитьЧто делать
Ответ по старому регламентуВ индексе несколько версийПосмотреть дату и версию найденных фрагментовУбрать или пометить архив, показывать дату в ответе
«В базе этого нет», хотя документ естьНе прошёл индексацию или права отсеклиИскать вопрос без фильтра прав и по индексу напрямуюПочинить сбор, права или нарезку
Ответ верен для одной категории, а применён ко всемФрагмент потерял заголовок или условиеПрочитать найденный фрагмент отдельноХранить заголовки и родительский раздел
Промах на артикулах и номерахТолько поиск по смыслуСравнить поиск по смыслу и по словам на таких запросахДобавить поиск по словам
Нужный фрагмент найден, но не в итоговом запросеСлабое ранжирование или малое число фрагментовПосмотреть позицию нужного фрагмента среди кандидатовРеранкер, разумное число фрагментов
Ответ с неточной цифрой из таблицыТаблица разорвана или распознана плохоОткрыть исходный фрагмент таблицыРезать по строкам с заголовками, проверять итоги кодом
Ответ звучит уверенно, но противоречит документуМодель игнорирует контекстПодать правильный фрагмент вручную и посмотреть ответУсилить инструкцию, цитата и проверка кодом
На каждый второй вопрос «уточните вопрос»Слишком строгий отказ или слабый поискИзмерить долю отказов на вопросах с известным ответомОслабить порог, улучшить поиск
Два документа дают разные ответыПротиворечие в самих документахНайти оба фрагмента и сравнитьПоказать оба и отправить владельцам на сверку

Чего делать не стоит

  • Менять модель первым делом. Это самое дорогое действие с самым непонятным результатом. Сначала проверьте, находит ли поиск нужное.
  • Увеличивать число фрагментов без измерения. Больше контекста не значит лучше, часто результат ухудшается и цена растёт.
  • Добавлять документы «на всякий случай». Мусор в индексе вытесняет нужное. Лучше меньше документов, но актуальных и с владельцем.
  • Лечить симптомы в промпте. Фраза «не ошибайся» не заменяет исправление нарезки или поиска. Правка промпта под один вопрос обычно ломает другой.
  • Судить по нескольким диалогам. Без золотого набора невозможно понять, стало ли лучше.

Если система работает внутри вашего контура, к этому добавляются свои вопросы про мощность и качество открытых моделей: «Локальные LLM для AI-агентов».

Порядок работ, когда качество не устраивает

  1. Собрать золотой набор вопросов с известными источниками и добавить вопросы без ответа.
  2. Измерить две метрики: находит ли поиск нужный фрагмент и верен ли ответ при правильном контексте.
  3. Начать с данных: версии, дубли, плохие сканы, права.
  4. Затем нарезка: контекст фрагмента, таблицы, заголовки.
  5. Затем поиск: сочетание по смыслу и по словам, фильтры по метаданным, переписывание вопроса.
  6. Затем ранжирование и сборка запроса: реранкер, число фрагментов, порядок.
  7. И только после этого инструкция и модель: формат, цитата, отказ, проверка кодом.
  8. После каждого шага прогонять золотой набор и фиксировать результат.

Эта последовательность стоит в основе того, как мы настраиваем ИИ-ассистента по базе знаний. Выбор между поиском по документам и дообучением модели обсуждается в статье «Дообучение или RAG».

Частые вопросы

Почему RAG отвечает неверно, хотя документ в базе есть?

Причин несколько: документ плохо нарезан и потерял контекст, поиск не нашёл нужный фрагмент, он нашёлся, но не попал в итоговый запрос, или модель не использовала контекст. Первым делом проверяют, был ли нужный фрагмент среди найденных.

Как понять, виноват поиск или модель?

Взять вопрос с известным ответом и посмотреть, какие фрагменты нашёл поиск. Если нужного нет, проблема в поиске. Если он есть, подать его модели вручную: верный ответ говорит о проблеме в поиске или сборке, неверный о проблеме генерации.

Что такое чанкинг и как выбрать размер фрагмента?

Это нарезка документов на фрагменты для поиска. Универсального размера нет: режут по смыслу (раздел, пункт, строка таблицы), сохраняют заголовки и проверяют на своих вопросах, чтобы фрагменты не теряли контекст и не были слишком шумными.

Нужен ли гибридный поиск?

Часто да. Поиск по смыслу находит близкие формулировки, но хуже работает на артикулах, номерах и аббревиатурах, а поиск по словам точен на кодах и пропускает синонимы. Сочетание обычно устойчивее каждого из вариантов по отдельности.

Что такое реранкер?

Это вторая, более строгая проверка найденных фрагментов. Быстрый поиск набирает кандидатов, а реранкер упорядочивает их по соответствию вопросу, и в запрос к модели попадают лучшие. Помогает, когда нужный фрагмент находится, но стоит слишком низко.

Как улучшить RAG, не меняя модель?

Навести порядок в данных, улучшить нарезку, добавить поиск по словам и фильтры по метаданным, переписывание вопроса и реранкер, затем настроить инструкцию с цитатой и отказом. Каждый шаг проверяют на золотом наборе вопросов.

Сколько вопросов нужно в золотом наборе?

Для первого замера хватает нескольких десятков реальных вопросов с известными источниками и ответами, плюс вопросы без ответа в базе. Набор растёт по мере работы: каждую найденную ошибку добавляют в него.

Разберём, где ломается ваш ассистент

На экспресс-аудите берём ваши вопросы и документы, проверяем отдельно поиск и ответ и называем, что чинить в первую очередь. Экспресс-аудит — 50 000 ₽, 5-7 рабочих дней, сумма засчитывается в проект.

Оставить заявку

Готовы начать?

Проще всего написать нам в Telegram: разберём задачу и скажем, есть ли смысл в аудите. Ответим в течение часа.

Написать в Telegram

или оставьте контакты

Оставьте телефон или Telegram - что вам удобнее. Достаточно одного.

Спасибо! Заявка отправлена - свяжемся с вами в ближайшее время.
Не удалось отправить заявку. Напишите нам в Telegram @dimax_web.

Или позвоните: +7 (949) 365-03-18 · dimaxeod@gmail.com