10 актуальных RAG-подходов: какие действительно полезны и когда их применять

10 актуальных RAG-подходов: какие действительно полезны и когда их применять

На фоне обновлений в LLM-стеке за последний год, всё больше команд используют RAG (Retrieval-Augmented Generation) в продакшене. Ниже — практический обзор подходов, которые реально работают, с примерами и рекомендациями по применению.

Что такое RAG (если коротко)

RAG (Retrieval-Augmented Generation) — это подход, при котором LLM отвечает не на основе внутренних знаний, а используя контекст из внешней базы. Схема проста: «вопрос пользователя → поиск релевантных фрагментов → передача контекста LLM → генерация ответа со ссылками на источники».

Зачем это нужно? Модель не знает вашу документацию, тикеты, политики или свежие новости. RAG решает эту проблему без fine-tuning. Это дешевле, быстрее, проще обновлять и объяснять регуляторам. Далее — разбор подходов, чем они отличаются и когда какой использовать.

1. Basic / 2-step RAG

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

Технически: вопрос → vector search → топ-N фрагментов → LLM генерирует ответ.

Этого достаточно для MVP. LangChain предлагает готовые туториалы: нарезаете документы, считаете эмбеддинги, кладёте в Chroma или FAISS, подключаете LLM. Собрать можно за день.

Основные минусы

  • Размер чанка: слишком мал — теряется контекст; слишком велик — модель тонет в шуме. Универсального решения нет — нужно тестировать.
  • Vector search не всегда точен: запрос про «версию 2.4» может вернуть фрагменты про 2.3 и 2.5 из-за семантической близости.
  • Галлюцинации: если retrieval вернул нерелевантные фрагменты, LLM уверенно ответит на их основе.

Что важно подметить?

  • Используйте Basic RAG для проверки гипотезы: решает ли RAG вашу задачу. Это дешёвый и быстрый способ (1–2 недели).
  • Не задерживайтесь на нём. В продакшене это сырой бот с нестабильной работой. Улучшайте при первых жалобах.
  • Логируйте, какие фрагменты попали в LLM. Это помогает понять: проблема в retrieval или в генерации.

2. Hybrid RAG или BM25 + Vector Search

Главный апгрейд после Basic RAG. Решает слабые стороны чисто семантического поиска.

Представьте двух библиотекарей: один (vector search) понимает смысл — спросите «как справиться с бессонницей», он найдёт книги про сон и медитацию. Второй (BM25) знает точные названия и коды — спросите «справочник Иванова 2023, глава 4» — найдёт мгновенно.

Vector search хорош для смысла, но слаб на точных терминах: версии, артикулы, имена. BM25 точен в словах, но не понимает синонимы. Hybrid RAG объединяет оба подхода и даёт прирост в сложных доменах.

Как это работает

Два поиска параллельно: семантический (vector) и точный (BM25). Результаты объединяют через:

  • Взвешивание: alpha × vector_score + (1-alpha) × bm25_score
  • Reciprocal Rank Fusion (RRF): комбинирует ранги без нормализации.

Pinecone поддерживает hybrid через sparse-dense vectors. Weaviate, Qdrant и OpenSearch тоже умеют.

Что важно подметить?

  • Включайте hybrid сразу после MVP. Прирост качества ощутим, усилия — минимальны.
  • Подбирайте alpha экспериментально. Базовое 0.5 редко оптимально. Если много кодов — сдвигайте к BM25 (0.3–0.4). Если смысловые запросы — к vector (0.6–0.7).
  • Для русского языка делайте стемминг и лемматизацию. Без этого BM25 будет считать «запрос» и «запросы» разными словами.

3. Reranking RAG

Второе по важности улучшение после hybrid. Решает проблему грубого отбора на этапе retrieval.

Представьте отбор кандидатов: первый рекрутер быстро отбирает топ-30 по ключевым словам. Второй внимательно читает эти 30 и выбирает 5 лучших. Vector search — это первый рекрутер. Reranker — второй.

Он анализирует пару «запрос-документ» целиком, что делает его точнее, но дороже — нельзя предпосчитать, нужно считать на каждый запрос.

Схема: vector search → 30–100 кандидатов → reranker → топ-5 → LLM.

Какие reranker'ы использовать

  • Cohere Rerank 3.5/4.0: production-grade, поддержка 100+ языков (включая русский), API.
  • BGE Reranker (BAAI/bge-reranker-v2-m3): open-source, multilingual, можно запускать локально.
  • Jina Reranker: open-source альтернатива.

Cohere и Elastic описывают reranker как финальный шаг поверх любого retrieval — keyword, semantic или hybrid.

Сколько это стоит по latency

Reranking добавляет 200–400 мс. Для чат-ботов (общая задержка 2–3 сек) — норма. Для высоконагруженных API с требованием 200 мс — критично. Можно кешировать или пропускать для частых запросов.

Что важно подметить?

  • Если низкий precision (много нерелевантных результатов) — ставьте reranker до смены embedding-модели.
  • Логируйте до и после reranking. Иначе невозможно понять, помогает ли он или вредит.

4. Query Transformation RAG

Проблема большинства RAG-чатов — разговорные запросы: «А это как работает?», «Чё там с настройками?». Vector search по таким запросам возвращает мусор — «это» и «там» не несут смысла.

Query Transformation — это слой, который превращает разговорный запрос в поисковый. Делается через дополнительный вызов LLM перед retrieval.

Основные техники

  • Query rewrite: переформулирует разговорный запрос в полноценный. Подходит для большинства чат-ботов.
  • Standalone question: объединяет follow-up с историей в самостоятельный вопрос. Нужно при диалогах.
  • Multi-query: генерирует 3–5 переформулировок, ищет по каждой. Для широких, неоднозначных запросов.
  • RAG-Fusion: multi-query + объединение через RRF. Уменьшает дубли.
  • Step-back prompting: сначала задаёт общий вопрос, потом точный. Для очень специфичных запросов.
  • HyDE (Hypothetical Document Embeddings): LLM генерирует гипотетический ответ, по нему ищут. Даже если ответ неверен, его структура близка к реальным документам, поэтому поиск точнее. Полезно при коротких запросах в узких доменах (медицина, юриспруденция).

Что важно подметить?

  • Standalone question — обязательно при диалогах. Без него retrieval ломается.
  • Попробуйте HyDE в узких доменах с короткими запросами.
  • Multi-query и RAG-Fusion — для широких запросов, но учитывайте стоимость.

5. Metadata / Structured RAG

Часто упускаемый, но мощный инструмент, особенно в B2B.

Представьте поиск на Amazon: сначала выбираете категорию, фильтруете по цене, бренду — и только потом смотрите товары. Так же и в RAG: вместо полного семантического поиска сначала фильтруем по метаданным.

Metadata RAG: фильтрация по полям (дата, тип документа, страна, версия) → семантический поиск в отфильтрованном подмножестве.

Простой пример

Запрос: «Покажи AML policy для США, актуальную после января 2025».

Чистый vector search может вернуть старую версию из США — эмбеддинги слабо различают даты и страны. Metadata RAG сначала фильтрует: country = "US" AND doc_type = "policy" AND effective_date > "2025-01-01", затем ищет внутри 5–10 документов. Точность резко растёт.

Основные минусы

  • Слабая схема метаданных: если есть только filename и page — фильтровать не по чему. Нужно продумывать на этапе индексации.
  • Метаданные не наследуются: 50 чанков из одного документа должны получить одинаковые метаданные (страна, тип, дата). Иначе фильтр не работает.
  • Галлюцинации LLM: модель может придумать несуществующие поля. Фильтры нужно валидировать перед выполнением.

Что важно подметить?

  • Проведите аудит: filename, дата создания, источник, тип документа — этого хватит для 80% фильтров.
  • Большой retrieval требует продуманной схемы метаданных. Не спешите индексировать — подготовьтесь заранее.
  • Учитывайте безопасность: в multi-tenant системах метаданные (например, tenant_id) критичны. Без них пользователь компании А может увидеть документы компании Б.

6. Conversational RAG / History-aware RAG

Частный случай query transformation, но настолько важный, что заслуживает отдельного места.

Пример диалога:

— Расскажи про trial offer.
— Вот что мы предлагаем: ...
— А почему он плохо конвертит?

Если retrieval смотрит только на последнее сообщение, он не понимает, что «он» — это trial offer. Нужно преобразовать: «Почему trial offer плохо конвертит?»

Альтернатива, которая не работает

Многие просто добавляют всю историю в prompt. Это работает 5–10 реплик, потом:

  • Контекстное окно заполняется быстро (5–10K токенов).
  • Retrieval всё равно ищет по последнему сообщению — проблема не решена.
  • Стоимость растёт линейно с длиной диалога.

Standalone-question rewrite решает всё: один маленький LLM-вызов, дешевле, надёжнее.

Что важно подметить

  • Включайте всегда, если у вас чат (не просто Q&A).
  • Передавайте в rewrite только последние 4–6 сообщений. Полная история не нужна — только нагрузка.

7. Agentic RAG

Здесь RAG превращается в агента, который сам решает, что делать.

Как детектив: получил зацепку — решает, к кому идти (свидетель, архив), какой вопрос задать, что делать, если ответ нерелевантен.

Agentic RAG:

  • Решает, нужно ли искать.
  • Выбирает источник (документы, SQL, Slack, веб).
  • Оценивает релевантность.
  • Решает, искать дальше или отвечать.

LangChain называет это подходом с пошаговым рассуждением. LangGraph позволяет строить такие графы решений.

Что важно подметить

Каждое решение — вызов LLM. Один запрос может стоить 4–7 вызовов вместо одного. Это умножает стоимость и задержку.

Для продукта с высокой нагрузкой это может увеличить расходы с $500 до $2–3K в день. Считайте перед внедрением.

Когда agentic оправдан?

  • Несколько источников: Docs + SQL + Slack + GitHub.
  • Нужно не только найти, но и выполнить действие (создать тикет, обновить запись).
  • Динамическое расширение поиска: если первый поиск пуст — пробует другую формулировку или источник.

Когда не оправдан?

Если у вас один источник, фиксированные запросы, узкий домен — не применяйте. Простой if-else в коде будет дешевле, быстрее и предсказуемее.

8. Self-corrective / Corrective RAG

Идея: перед ответом проверить, достаточно ли данных.

Как студент на экзамене: сильный перечитывает ответ — «А я точно ответил на вопрос? Аргументы подтверждают?» — и, если нет, переписывает.

Corrective RAG (CRAG):

  1. Retrieval.
  2. Оценка релевантности (judge — LLM или модель).
  3. Если да — отвечаем.
  4. Если нет — переписываем запрос, ищем снова или говорим «не знаю».

CRAG предлагает три действия: Correct (использовать), Incorrect (перейти в веб), Ambiguous (объединить local + web).

Self-RAG идёт дальше: модель сама генерирует сигналы вроде «нужен retrieval», «релевантен ли фрагмент». Требует fine-tuning, поэтому редко в продакшене.

Практичный минимум

Многие делают так:

  1. Retrieve.
  2. LLM-grader проверяет: «достаточно ли чанков для ответа? да/нет, почему».
  3. Если да — генерируем ответ.
  4. Если нет — переписываем запрос (с учётом причины), ищем ещё раз. Один retry.
  5. Если опять нет — отвечаем: «недостаточно данных».

Это даёт 80% пользы Self-RAG за 20% сложности. Главное — честно отказываться, а не выдавать уверенные неправильные ответы.

Что важно подметить?

  • Включайте в рисковых доменах: медицина, юриспруденция, финансы, compliance. «Уверенный неправильный ответ» хуже, чем «не знаю».
  • В consumer-продуктах часто избыточно: пользователи быстрее поправят бота, чем вы окупите дополнительный вызов LLM.
  • Добавьте fallback: если similarity очень низкий — лучше отказаться, чем отвечать.

9. GraphRAG

Полезен для своих задач, но бесполезен для большинства.

Представьте доску с подозреваемыми и нитками: «работал с ним», «бывшая жена». Это knowledge graph — связи между сущностями.

GraphRAG: на этапе индексации LLM извлекает сущности (люди, компании) и связи. Строится граф + summaries для кластеров (communities).

Запросы:

  • Local: про сущность («что знаем про X?») — идём по связям.
  • Global: про весь корпус («какие темы?») — используем summaries.

Microsoft Research показала: GraphRAG обыгрывает обычный RAG на global-вопросах (70–80% win rate). Реализация: microsoft.github.io/graphrag.

Что важно подметить?

GraphRAG очень дорогой:

  • Индексация: прогонка LLM по всему корпусу. Для 100 МБ текста — $50–200 через GPT-4o.
  • Поддержка: при изменении документов нужно пересчитывать части графа. Это сложно и легко сломать.

Когда стоит брать?

  • Вопросы про связи: «Какие компании связаны с этим человеком?»
  • Анализ больших корпусов: «Какие темы в 500 интервью?»
  • Расследования, compliance — когда нужно восстановить сеть.

Когда НЕ брать?

Для FAQ или бота по документации. Если 30 страниц — не стройте граф. Hybrid + reranker + metadata решат 95% задач за 1/100 стоимости.

10. Multimodal RAG

Если в вашем корпусе PDF с таблицами, презентации, скриншоты — обычный text-only RAG теряет смысл. Multimodal RAG это исправляет.

Представьте аналитика, читающего отчёт. Половина информации — в графиках и таблицах. Без них он поймёт только «выручка выросла», но не на сколько и где.

Два основных паттерна

Паттерн 1: Image embeddings (true multimodal)
Используются multimodal модели (CLIP, Cohere Embed v4, Voyage Multimodal), кодирующие текст и изображения в одно векторное пространство. На запрос «график выручки за Q3» можно найти и описание, и сам график. Просто, но качество пока уступает text-only моделям.

Паттерн 2: Image-to-text summaries
Извлекаем изображения, прогоняем через vision LLM (GPT-4o, Claude), генерируем текстовое описание, индексируем как обычный текст. Дороже, но надёжнее — можно использовать зрелые text embedders.

Для PDF с таблицами и графиками паттерн 2 обычно лучше. Но медленнее и дороже на индексацию.

IBM описывает multimodal RAG как расширение для разных данных. LlamaIndex/LlamaParse даёт готовый pipeline для сложных PDF.

Что важно подметить?

  • Если корпус — PDF с таблицами и графиками (отчёты, презентации), без multimodal вы теряете 30–50% смысла. Включайте.
  • Если корпус текстовый (markdown, тикеты, код) — отложите. Это не ваша проблема.
  • Начните с паттерна 2 — он надёжнее. К multimodal embeddings вернётесь, когда они дозреют.
Читать оригинал