Почему мое RAG-приложение постоянно галлюцинировало и как я это исправила

Несколько месяцев назад я демонстрировала своего RAG-бота для поддержки. Он сообщил коллеге, что наш срок возврата средств составляет 30 дней. На самом деле наш срок — 14 дней. Бот не колебался. Он не сказал, что не уверен. Он с полной уверенностью выдумал ответ.

RAG должен уменьшать количество галлюцинаций. Моя настройка лишь перераспределила их. В процессе отладки этой системы я извлекла пять уроков.

  1. Перестаньте использовать фиксированное количество символов для чанков Я использовала чанки (chunks) по 1000 символов с небольшим перекрытием. Это создавало проблемы. В одном чанке часто смешивались правила доставки и правила возврата. Модель объединяла эти разные разделы в один неверный ответ. Решение: Я перешла на семантическое разбиение (semantic chunking). Я разделила данные по заголовкам и абзацам. Это позволяет сохранять связанную информацию вместе.

  2. Сходство не означает релевантность Мой ретривер (retriever) выбирал 3 лучших чанка на основе косинусного сходства. Чанк может быть похож на вопрос, но не содержать ответа. Модель предполагает, что всё в контексте — правда. Решение: Я добавила этап переранжирования (reranking) с использованием cross-encoder. Также я начала логировать оценки поиска (retrieval scores). Это позволяет увидеть, когда в системе отсутствует реальный ответ.

  3. Разрешите модели ошибаться Мой первоначальный промпт был простым: «Используй контекст, чтобы ответить на вопрос». Он не давал модели инструкций на случай отсутствия контекста. Модель заполняла пробелы догадками. Решение: Я добавила конкретную инструкцию: «Если ответа нет в контексте, скажи, что не знаешь». Количество галлюцинаций мгновенно снизилось.

  4. Установите порог поиска Когда поиск не срабатывал, модель всё равно использовала общие знания. Я надеялась, что промпта будет достаточно, но надежда — это не стратегия. Решение: Я установила жесткий порог оценки (score threshold). Если оценка лучшего результата поиска слишком низка, система останавливается. Вместо того чтобы позволять модели гадать, она выдает стандартное сообщение (fallback message).

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

RAG не останавливает галлюцинации полностью. Он делает их контролируемыми. Мой бот всё еще не знает всего. Но теперь, когда он не уверен, он говорит об этом. Это делает инструмент пригодным для использования.

Источник: https://dev.to/pallavi_sharma_10c1a6f1da/why-my-rag-app-kept-hallucinating-and-how-i-fixed-it-3i10