Что такое Self-RAG и когда его использовать?
Краткий тезис
Self-RAG (Self-Reflective Retrieval-Augmented Generation — это архитектура, где LLM сама решает, когда и как использовать retrieval. В отличие от обычного RAG, где поиск документов происходит всегда (или по простому правилу), Self-RAG использует рефлексию — модель оценивает необходимость поиска, качество найденных документов и корректность своего ответа. Self-RAG генерирует цитаты (ссылки на источники) и может отказаться от ответа, если информация недостоверна.
Ключевая идея Один LLM выполняет три роли: решает, нужно ли искать, ищет, генерирует ответ, проверяет себя.
1. Термин: Self-RAG (Self-Reflective RAG)
Что это Фреймворк от исследователей из UIUC и Microsoft (2023), где LLM обучается генерировать специальные рефлексивные токены (reflection tokens), управляющие процессом retrieval.
Термин «Рефлексивные токены» (Reflection tokens Специальные служебные токены, которые модель генерирует, чтобы сигнализировать о своих действиях:
| Токен | Значение |
|---|---|
[Retrieve] | Нужно выполнить поиск документов |
[NoRetrieve] | Поиск не нужен (ответ из знаний модели) |
[Relevant] | Найденные документы релевантны |
[Irrelevant] | Документы не релевантны |
[Useful] | Документы полезны для ответа |
[NotUseful] | Документы бесполезны |
[Support] | Ответ подтверждается документами |
[Contradict] | Документы противоречат ответу |
Пример генерации Self-RAG
Вопрос: "Кто написал 'Войну и мир'?"
[Retrieve] → поиск документов → [Relevant] → генерация ответа с цитатой:
"Лев Толстой [Support]"
[NoRetrieve] → вопрос о погоде → ответ без поиска:
"Не знаю, я не обучен на погодных данных"
2. Как работает Self-RAG (архитектура)
2.1 Обучение Self-RAG
Self-RAG требует специального обучения (fine-tuning) модели на данных с рефлексивными токенами.
Этапы обучения
| Этап | Что делается | Источник данных |
|---|---|---|
| 1. Сбор данных | Генерация примеров с рефлексивными токенами | GPT-4 генерирует размеченные примеры |
| 2. Supervised fine-tuning | Модель учится предсказывать рефлексивные токены | Пары (инструкция, ответ с токенами) |
| 3. Оценка (critic) | Обучение модели оценивать релевантность и полезность | Промпты: "Релевантен ли этот документ?" |
Важно Self-RAG — это не просто промпт-инжиниринг, а дообученная модель.
2.2 Инференс Self-RAG (как работает во время использования)
Пользовательский запрос
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Шаг 1: Decision (Retrieve или NotRetrieve?) │
│ LLM решает: нужен ли поиск? │
│ • [Retrieve] → идём на шаг 2 │
│ • [NoRetrieve] → генерируем ответ из знаний модели (шаг 5) │
└─────────────────────────────────────────────────────────────┘
│ [Retrieve]
▼
┌─────────────────────────────────────────────────────────────┐
│ Шаг 2: Parallel Retrieval (параллельный поиск) │
│ Retrieval находит K документов (например, 10) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Шаг 3: Critique (оценка документов) │
│ Для каждого документа D_i: │
│ • LLM оценивает: [Relevant] или [Irrelevant] │
│ • LLM оценивает: [Useful] или [NotUseful] │
│ Оставляем только документы с [Relevant] и [Useful] │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Шаг 4: Generation (генерация ответа с цитатами) │
│ Для каждого документа D_i (или для всех вместе): │
│ • LLM генерирует часть ответа │
│ • Добавляет [Support] или [Contradict] после фактов │
│ • Добавляет цитату (source_id) │
└─────────────────────────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ Шаг 5: Final ответ с ранжированием │
│ Выбираем лучший ответ (по score) или объединяем │
└─────────────────────────────────────────────────────────────┘
3. Self-RAG vs обычный RAG: сравнение
| Характеристика | Обычный RAG | Self-RAG |
|---|---|---|
| Когда выполняется retrieval | Всегда (или по порогу) | LLM решает |
| Оценка релевантности документов | Отдельная модель (cross-encoder) или никак | LLM сама оценивает |
| Проверка ответа | Нет (или отдельный шаг) | LLM проверяет [Support]/[Contradict] |
| Цитаты | Добавляются принудительно (через промпт) | LLM учится добавлять цитаты |
| Отказ от ответа | По порогу confidence | LLM может сказать [NoRetrieve] |
| Количество LLM вызовов | 1 (генерация) | 3-10 (решения + генерация) |
| Latency | Низкая | Высокая (в 3-5 раз дольше) |
| Сложность отладки | Низкая | Высокая (много решений) |
| Требует fine-tuning | Нет (можно с промптами) | Да (обязательно) |
Термин «Latency» Время ответа. Self-RAG дольше, потому что LLM вызывается несколько раз.
4. Когда использовать Self-RAG?
4.1 Идеальные сценарии
| Сценарий | Почему подходит Self-RAG |
|---|---|
| Вопросы с разной потребностью в фактах | Одни вопросы требуют поиска ("сколько стоит?"), другие — нет ("привет, как дела?"). Self-RAG сам решает |
| Диалоговые системы (multi-turn | В начале диалога — приветствие (без поиска), потом — фактологические вопросы (с поиском) |
| Высокие требования к достоверности | Self-RAG проверяет ответ [Support] и может отказаться |
| Требование цитирования | Юридические, медицинские системы (каждый факт должен иметь источник) |
| Динамические знания | Документы часто меняются, нужно всегда проверять актуальность |
Пример диалога
User: Привет! → [NoRetrieve] → "Здравствуйте!"
User: Что нового в последней версии продукта? → [Retrieve] → ответ с цитатами
User: Спасибо! → [NoRetrieve] → "Пожалуйста!"
4.2 Когда НЕ стоит использовать Self-RAG
| Сценарий | Почему не подходит |
|---|---|
| Низкая latency (быстрые ответы | Self-RAG в 3-5 раз медленнее обычного RAG |
| Дешёвое решение (low cost | Много LLM вызовов → дорого |
| Нет возможности fine-tune | Self-RAG требует дообучения модели |
| Простой use case (всегда нужен поиск | Обычный RAG проще и быстрее |
| Мало вычислительных ресурсов | Self-RAG требует мощного GPU для нескольких LLM вызовов |
5. Альтернативы Self-RAG (что проще)
5.1 Adaptive-RAG
Что это Более простая альтернатива, где классификатор (не LLM) решает, нужен ли retrieval.
Архитектура
Запрос → Классификатор (BERT) →
├── "need_search" → RAG
└── "no_search" → LLM без RAG
| Характеристика | Self-RAG | Adaptive-RAG |
|---|---|---|
| Кто решает | LLM (рефлексия) | Классификатор (BERT/RoBERTa) |
| Требует fine-tune LLM | Да | Нет (классификатор отдельно) |
| Latency | Высокая | Низкая |
| Сложность | Высокая | Низкая |
| Качество решений | Лучше (LLM понимает контекст) | Хуже (бинарный классификатор) |
Когда Adaptive-RAG лучше Когда нужна простота, низкая latency и нет ресурсов на fine-tune LLM.
5.2 Обычный RAG с порогом (threshold)
Что это Самое простое решение — всегда делать поиск, но можно добавить порог confidence.
# Простейший "adaptive" подход
results = vector_search(query)
max_score = max(r.score for r in results)
if max_score > 0.7:
# Есть релевантные документы → RAG
return generate_with_context(query, results)
else:
# Нет релевантных → общая LLM
return generate_without_context(query)
Плюсы Очень просто, не требует дообучения. Минусы Классификатор по порогу хуже понимает сложные запросы.
6. Сравнительная таблица: RAG → Adaptive-RAG → Self-RAG
| Характеристика | Обычный RAG | Adaptive-RAG | Self-RAG |
|---|---|---|---|
| Retrieval решение | Всегда | Классификатор | LLM рефлексия |
| Оценка документов | Нет/отдельная | Нет/отдельная | LLM (Relevant/Useful) |
| Проверка ответа | Нет | Нет | LLM (Support/Contradict) |
| Цитаты | По промпту | По промпту | Обучена генерировать |
| Fine-tune LLM | Нет | Нет | Да |
| Latency | 1x | 1x (классификатор быстрый) | 3-5x |
| Стоимость | Низкая | Низкая | Высокая |
| Качество (сложные запросы | Среднее | Хорошее | Лучшее |
7. Практический кейс (пример для собеседования)
«В проекте медицинского чат-бота мы сначала использовали обычный RAG — всегда искали документы. Проблема: на приветствия и общие вопросы ("Спасибо", "Что вы умеете?") система всё равно искала документы (бесполезно, дорого, медленно).
Мы попробовали Adaptive-RAG с классификатором DistilBERT (легковесный). Классификатор определял "разговорные" запросы (30% трафика) и отправлял их напрямую в LLM без поиска. Это снизило среднюю latency на 25% и стоимость на 20%.
Затем для сложных запросов (медицинские диагнозы) мы добавили элементы Self-RAG: модель оценивала, действительно ли найденные документы релевантны, и генерировала цитаты. Галлюцинации снизились с 8% до 3% ценой увеличения latency в 1.5 раза.»
8. Пет-проект для закрепления
Задача Реализовать Adaptive-RAG (упрощённую версию Self-RAG) и сравнить с обычным RAG.
Инструменты Python, Hugging Face (DistilBERT для классификатора), Qdrant, Llama-3
Шаги
- Создать датасет из 500 запросов:
- 250 "разговорные" (приветствия, благодарности, small talk)
- 250 "фактологические" (вопросы по документам)
- Обучить классификатор DistilBERT различать два типа запросов
- Реализовать Adaptive-RAG:
- Запрос → классификатор
- Если "фактологический" → RAG (поиск + генерация)
- Если "разговорный" → LLM без поиска
- Сравнить с обычным RAG (всегда поиск) по метрикам:
- Latency (быстрее?)
- Cost (меньше токенов?)
- Quality (faithfulness не упала?)
- (Опционально, сложно) Попробовать Self-RAG с fine-tuning Llama-3 на рефлексивных токенах
Ожидаемый результат Adaptive-RAG быстрее и дешевле обычного RAG на 20-30% без потери качества.
Связь с другими вопросами
| Вопрос | Тема |
|---|---|
| 1 | Обычный RAG (основа для сравнения) |
| 5 | Оценка качества (faithfulness, галлюцинации) |
| 8 | Обработка запросов без ответа (часть Self-RAG) |
| 16 | Метрики качества генерации |
| 41-60 | Оркестрация (агенты, Self-RAG как агент) |
| 141-150 | Agentic RAG (где агент решает, когда искать) |
10. Что такое Self-RAG и когда его использовать|10. Что такое Self-RAG и когда его использовать|10. Что такое Self-RAG и когда его использовать|10 полностью разобран. Переходим к вопросу 11, когда будете готовы|Вопрос 10 полностью разобран. Переходим к вопросу 11, когда будете готовы]]
Навигация
- Предыдущий: 9
- Следующий: 11
- Индекс: 00. Индекс разборов