Запись архива

Self-RAG и Corrective RAG: как работает самопроверка в RAG

Разбираем две ключевые работы 2023–2024 годов о самопроверке RAG: Self-RAG учит модель решать, когда искать и как критиковать ответ, а CRAG исправляет неудачный retrieval внешним evaluator и веб-поиском.

Схема сравнения Self-RAG и CRAG: reflection tokens внутри генератора против внешнего retrieval evaluator с ветками Correct, Incorrect и Ambiguous

Self-RAG — работа, впервые выложенная на arXiv 17 октября 2023 года и затем опубликованная на ICLR 2024; Corrective Retrieval-Augmented Generation (CRAG) — статья, появившаяся на arXiv 29 января 2024 года. Обе работы пытаются решить одну и ту же практическую проблему: в RAG ошибается не только генератор, но и сам retrieval, а значит «подкладывание источников» не гарантирует фактологичность. Ниже — обзор именно этой волны работ 2023–2024 годов, без подмены темы более поздними agentic-RAG пайплайнами 2025–2026 годов. Главное различие простое: Self-RAG встраивает самокритику внутрь генерации, а CRAG выносит проверку в отдельный модуль вокруг retrieval.

Коротко

  • Self-RAG учит модель самой решать, нужен ли retrieval, и маркировать собственный ответ специальными reflection tokens.
  • CRAG не меняет логику генератора так глубоко: он сначала оценивает качество найденных документов, а затем либо очищает их, либо дополняет веб-поиском, либо сочетает оба пути.
  • Для практики это разные стратегии: Self-RAG ближе к дообучению модели, CRAG — к инженерной надстройке над существующим RAG-стеком.
  • По общим для двух работ задачам Self-RAG 7B выглядит сильным baseline, а Self-CRAG, по сообщению авторов CRAG, часто улучшает его дальше, но не на всех задачах одинаково.
  • Ни одна из работ не доказывает «универсальную самопроверку» LLM: обе зависят от качества retrieval, разметки, внешних сервисов и состава бенчмарков.

Контекст

Классический RAG в формулировке Lewis et al. из NeurIPS 2020 усиливает генератор внешними документами: retriever находит релевантные фрагменты, а модель отвечает с их учетом. Это решает часть проблем параметрической памяти, но создает новую: если найденный контекст нерелевантен, устарел или просто шумный, модель может стать не точнее, а увереннее в ошибке.

К 2023 году стало ясно, что retrieval не обязан быть одноразовым и фиксированным. Работа Active Retrieval Augmented Generation показала, что retrieval можно вызывать по ходу длинной генерации, когда это действительно нужно. Но даже такой шаг не отвечает на два вопроса, которые и стали центральными для Self-RAG и CRAG: когда retrieval вообще нужен и что делать, если retrieved context плохой.

Исторически Self-RAG и CRAG удобно читать вместе. Self-RAG решает проблему изнутри модели: генератор учится не только отвечать, но и высказывать суждение о полезности retrieval и об опоре ответа на источник. CRAG решает проблему снаружи: предполагается, что retrieval уже сработал, но его результат нужно проверить, исправить и только потом отдавать генератору.

Метод

Как устроен Self-RAG

В статье Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection модель расширяет словарь специальными reflection tokens. Таблица 1 работы перечисляет четыре группы токенов: Retrieve решает, нужен ли retrieval сейчас; ISREL оценивает релевантность passage; ISSUP оценивает, насколько passage поддерживает уже сгенерированный фрагмент; ISUSE оценивает общую полезность ответа.

Архитектурно это не просто «сначала поиск, потом ответ». Self-RAG разбивает генерацию на сегменты и на каждом шаге может выбрать один из режимов: не искать вовсе, запросить документы, продолжить генерацию с учетом уже найденного контекста, а затем ранжировать кандидатов по комбинации обычной вероятности и вероятностей reflection tokens. Важная деталь: в training loop участвуют две модели — critic и generator; на inference сам generator уже должен уметь предсказывать reflection tokens без внешнего критика.

Практический смысл такой: Self-RAG пытается научить модель экономить retrieval там, где он не нужен, и строже наказывать ответы, слабо поддержанные источником, там, где он нужен. Это делает метод ближе к управляемой политике генерации, чем к обычному «обвесу» вокруг RAG.

Как устроен Corrective RAG (CRAG)

В Corrective Retrieval Augmented Generation центр тяжести другой. Здесь вводится отдельный retrieval evaluator, и в статье для него используется дообученный T5-large. Его задача — оценить, хороши ли retrieved documents для данного запроса, и отнести ситуацию к одному из трех действий: Correct, Incorrect или Ambiguous.

Если срабатывает Correct, CRAG не отправляет документы в генератор как есть, а запускает refinement: документ декомпозируется на более мелкие полосы знания, нерелевантные части фильтруются, а полезные — recomposed обратно в компактный контекст. Если срабатывает Incorrect, исходный retrieval отбрасывается, запрос переписывается в более поисковую форму, и дальше подключается веб-поиск. Если срабатывает Ambiguous, система смешивает внутреннее и внешнее знание.

Поэтому CRAG — это не «самокритика ответа» в строгом смысле, а «коррекция входного знания до генерации». Авторы прямо позиционируют метод как plug-and-play надстройку над существующими RAG-подходами и отдельно показывают режим Self-CRAG, где corrective layer ставится поверх Self-RAG.

Ключевое различие в одной таблице

Вопрос Self-RAG CRAG
Где живет проверка Внутри генератора через reflection tokens Во внешнем retrieval evaluator
Что проверяется первым Нужен ли retrieval и насколько passage поддерживает ответ Насколько хорош весь набор retrieved documents
Что нужно дообучать Generator и critic-пайплайн под reflection tokens Отдельный evaluator; генератор можно оставить прежним
Что происходит при плохом контексте Модель может не искать, искать заново или менять выбор passage при ранжировании Исходный retrieval исправляется через refinement, query rewrite и web search
Инженерный профиль Ближе к model-level adaptation Ближе к modular RAG engineering

Результаты

Сравнивать две работы напрямую не идеально: у Self-RAG в основной статье шесть задач и больше метрик, а у CRAG — четыре датасета. Но у них есть общая зона пересечения: PopQA, Biography с FactScore, PubHealth и ARC-Challenge. Это позволяет хотя бы частично сопоставить методы в общей системе координат. Для сопоставимости CRAG использует retrieval results, предоставленные пайплайном Self-RAG на базе Contriever.

Общая задача Метрика Self-RAG 7B Self-CRAG на том же backbone
PopQA Accuracy 54.9 61.8
Biography FactScore 81.2 86.2
PubHealth Accuracy 72.4 74.8
ARC-Challenge Accuracy 67.3 67.2

Числа для строки Self-RAG 7B совпадают в статье Self-RAG и в таблице baseline статьи CRAG. Числа для Self-CRAG в этой таблице я привожу только по статье CRAG, то есть как авторскую оценку без независимой репликации в используемых здесь источниках. Из них видно важное: corrective layer дает заметный выигрыш не везде одинаково. На PopQA и Biography прибавка в отчете авторов CRAG выглядит существенной, на PubHealth — умеренной, а на ARC-Challenge улучшения уже нет.

Есть и еще один показательный результат, который тоже нужно читать осторожно. В отдельном эксперименте авторы CRAG сообщают, что их retrieval evaluator на PopQA точнее различал качество retrieval, чем промптованный ChatGPT: 84.3 против 58.0, 62.4 и 64.7 для трех вариантов prompting. Это полезный сигнал в пользу специализированного evaluator, но сравнение проведено внутри одной статьи и без внешней репликации.

У Self-RAG своя сильная сторона проявляется не только в accuracy. В основной работе авторы показывают, что метод улучшает citation precision и recall на ASQA и позволяет регулировать поведение на inference через веса критериальных токенов и порог retrieval. Для практики это значит, что Self-RAG задуман не просто как способ «поднять score», а как способ управлять компромиссом между опорой на источник, полнотой ответа и частотой retrieval.

Интерпретация

Наш комментарий

На наш взгляд, Self-RAG и CRAG лучше понимать не как прямых конкурентов, а как ответы на разные точки отказа в RAG-системе. Self-RAG спрашивает: может ли генератор сам дисциплинировать себя и retrieval-процесс, если обучить его правильным внутренним маркерам? CRAG спрашивает: можно ли считать retrieval недоверенным модулем и поставить перед генератором «санитарный кордон»?

Из этого следует практический выбор. Если у вас есть контроль над весами модели, пайплайном дообучения и желание встроить поведение проверки внутрь самой генерации, Self-RAG выглядит более цельным направлением. Если же у вас уже есть работающий RAG на API-модели или на стандартном open-weight генераторе, CRAG-подход часто проще ментально: вы не переписываете генератор, а добавляете evaluator, query rewrite, refinement и альтернативный поиск.

Еще один важный вывод: обе работы показывают, что «самопроверка» в RAG редко сводится к одному judge prompt. В сильных вариантах она почти всегда включает структуру: отдельные сигналы, отдельные действия и отдельную политику обработки плохого контекста.

Ограничения

  • Self-RAG не бесплатен в интеграции. Метод требует специального обучения generator на reflection tokens и отдельного critic-пайплайна для подготовки данных. Это не тот случай, когда можно просто взять любой LLM и добавить один системный промпт.
  • CRAG тоже не «безобиден» инженерно. Статья прямо признает, что без fine-tuning внешнего evaluator не обойтись. Кроме того, в репозитории используется сторонний Google Search API-провайдер, а значит поведение системы зависит от внешнего сервиса и меняющегося веба.
  • Репликация не полностью стабильна во времени. Репозиторий CRAG отдельно предупреждает, что для Bio/FactScore авторские результаты считались через text-davinci-003, который позже был снят с поддержки; современные повторы могут давать другие значения.
  • Набор задач узок относительно реального enterprise-RAG. В статьях есть open-domain QA, fact verification, biography generation и ARC-style reasoning, но почти нет таблиц, PDF с шумным парсингом, многошаговых tool-use сценариев и мультимодального retrieval.
  • Самокоррекция не универсальна. Вне RAG-контекста работа Large Language Models Cannot Self-Correct Reasoning Yet показывает, что prompted self-correction без внешней обратной связи часто слаба. Self-RAG частично обходит это ограничение, потому что опирается на retrieval и supervised reflection tokens, но это не доказательство общей способности LLM «проверять себя» на любых задачах.
  • Издержки измерены неполно. CRAG оценивает generation-phase overhead отдельно, но retrieval, web search и data processing вынесены за скобки. У Self-RAG стоимость тоже плавающая, потому что зависит от частоты retrieval и segment-level decoding.

Заключение

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

Источники

FAQ

Self-RAG и CRAG решают одну и ту же задачу?

Частично. Обе работы повышают надежность RAG, но Self-RAG встраивает проверку внутрь генерации, а CRAG исправляет качество retrieved context до генерации.

Можно ли внедрить идеи CRAG без переобучения генератора?

Да, в этом его главный инженерный плюс. Но без отдельного evaluator и без инфраструктуры refinement/search такой пайплайн не получится.

Заменяет ли Self-RAG обычный judge-подход поверх готового ответа?

Скорее нет. Self-RAG не просто «судит» финальный ответ, а учит модель принимать решения о retrieval и опоре на источник в процессе самой генерации.

Что выбрать для production-RAG?

Если у вас есть доступ к fine-tuning и вы хотите model-level контроль, смотрите на Self-RAG-подобные идеи. Если у вас уже есть рабочий RAG и боль в первую очередь в плохом retrieval, CRAG-подход обычно ближе к реальной интеграции.

Читайте также