На фоне обновлений в 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):
- Retrieval.
- Оценка релевантности (judge — LLM или модель).
- Если да — отвечаем.
- Если нет — переписываем запрос, ищем снова или говорим «не знаю».
CRAG предлагает три действия: Correct (использовать), Incorrect (перейти в веб), Ambiguous (объединить local + web).
Self-RAG идёт дальше: модель сама генерирует сигналы вроде «нужен retrieval», «релевантен ли фрагмент». Требует fine-tuning, поэтому редко в продакшене.
Практичный минимум
Многие делают так:
- Retrieve.
- LLM-grader проверяет: «достаточно ли чанков для ответа? да/нет, почему».
- Если да — генерируем ответ.
- Если нет — переписываем запрос (с учётом причины), ищем ещё раз. Один retry.
- Если опять нет — отвечаем: «недостаточно данных».
Это даёт 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 вернётесь, когда они дозреют.