# RAG (генерация с дополнением поиском)

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

Источник: https://llmdocs.ru/wiki/rag/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Полное название**: Retrieval-Augmented Generation
- **Впервые описан**: 2020, Льюис и соавт. (Facebook AI Research)
- **Компоненты**: разбиение на фрагменты, эмбеддинги, индекс, поиск, реранжирование, генерация
- **Типичные хранилища**: pgvector, Qdrant, Milvus, Weaviate, Chroma, FAISS
- **Связанные подходы**: дообучение, длинный контекст, GraphRAG, агентный поиск
**RAG** (англ. *Retrieval-Augmented Generation* — генерация с дополнением поиском) — способ построения систем на основе [больших языковых моделей](https://llmdocs.ru/wiki/llm.md), при котором перед ответом модель получает фрагменты текста из внешней базы знаний, отобранные поиском по запросу. Модель отвечает, опираясь на эти фрагменты, а не только на то, что запомнила при обучении. RAG позволяет работать с внутренними и свежими документами без дообучения, ссылаться на источники и снижать число [галлюцинаций](https://llmdocs.ru/wiki/hallucinations.md).

## История

Термин ввели исследователи Facebook AI Research во главе с Патриком Льюисом в статье 2020 года, где генеративная модель обучалась совместно с нейросетевым поисковиком по Википедии.[1] С распространением чат-моделей в 2023 году название закрепилось за более простой и практичной схемой: готовая модель плюс поиск по базе фрагментов, найденные тексты подставляются в промпт. Именно в этом смысле термин обычно употребляется сегодня.

## Схема работы

**Индексация** (выполняется заранее):

1. Документы очищаются и разбиваются на фрагменты (**чанки**) — обычно от нескольких сотен до тысячи [токенов](https://llmdocs.ru/wiki/tokenization.md), часто с перекрытием (см. [Чанкинг документов](https://llmdocs.ru/wiki/chunking.md)).
2. Каждый фрагмент превращается в вектор моделью [эмбеддингов](https://llmdocs.ru/wiki/embedding.md).
3. Векторы и тексты сохраняются в индексе — векторной базе или расширении обычной СУБД (см. [pgvector и векторные БД](https://llmdocs.ru/wiki/pgvector.md)).[4]

**Ответ на запрос:**

1. Запрос пользователя тоже переводится в вектор.
2. В индексе ищутся ближайшие векторы — приближённым поиском ближайших соседей, чаще всего по графу HNSW[2] (см. [Векторный поиск](https://llmdocs.ru/wiki/vector-search.md)).
3. Найденные фрагменты при необходимости **реранжируются** более точной моделью.
4. Лучшие фрагменты вместе с вопросом передаются модели с инструкцией отвечать по ним и указывать источник.

```python
query_vec = embed(question)
chunks = index.search(query_vec, k=20)          # кандидаты
chunks = rerank(question, chunks)[:5]           # самые релевантные
prompt = f"Ответь по фрагментам, укажи источник.\n\n{format(chunks)}\n\nВопрос: {question}"
answer = llm(prompt)
```

## Улучшения базовой схемы

| Приём | Суть |
|---|---|
| Гибридный поиск | объединение векторного поиска с лексическим (BM25), результаты сливаются, например, методом Reciprocal Rank Fusion[3] |
| Реранжирование | кросс-энкодер оценивает пару «вопрос — фрагмент» точнее, чем сравнение векторов |
| Переформулировка запроса | модель расширяет или разбивает вопрос на подзапросы |
| Метаданные и фильтры | поиск только по нужному продукту, версии, дате |
| Контекстные чанки | к фрагменту добавляется заголовок документа и раздела |
| GraphRAG | граф сущностей и связей для вопросов «обо всём корпусе»[5] |
| Агентный RAG | [ИИ-агент](https://llmdocs.ru/wiki/ai-agent.md) сам решает, что и сколько раз искать, в том числе через инструменты [MCP](https://llmdocs.ru/wiki/mcp.md) |

## RAG, дообучение и длинный контекст

- **[Дообучение](https://llmdocs.ru/wiki/fine-tuning-lora.md)** меняет поведение и стиль модели, но плохо подходит для фактов, которые часто обновляются, и не даёт ссылок на источники.
- **Длинный контекст** позволяет вставить документы целиком, но стоит дороже, отвечает медленнее, а качество использования информации из середины длинного контекста падает.[6]
- **RAG** дешевле на каждый запрос и прозрачнее, но качество ответа ограничено качеством поиска: если нужный фрагмент не найден, модель его не увидит.

На практике подходы сочетают.

## Оценка качества

Отдельно оценивают **поиск** (нашёлся ли нужный фрагмент среди первых k — метрики recall@k, MRR) и **генерацию** (опирается ли ответ на найденное, отвечает ли он на вопрос). Для этого собирают набор вопросов с эталонными ответами и источниками (см. [Оценка LLM (evals)](https://llmdocs.ru/wiki/llm-evals.md)).

## Типичные проблемы

- неудачное разбиение: таблица или фрагмент кода разрезаны посередине;
- устаревший индекс, не синхронизированный с документами;
- модель игнорирует найденное или смешивает его с собственными «знаниями»;
- внедрение инструкций через проиндексированные документы ([Безопасность LLM: prompt injection](https://llmdocs.ru/wiki/prompt-injection.md)).

## См. также

- [Векторный поиск](https://llmdocs.ru/wiki/vector-search.md)
- [Эмбеддинг](https://llmdocs.ru/wiki/embedding.md)
- [llms.txt](https://llmdocs.ru/wiki/llms-txt.md)
- [Контекстное окно](https://llmdocs.ru/wiki/context-window.md)

## Источники

1. [Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (2020)](https://arxiv.org/abs/2005.11401)
2. [Malkov, Yashunin. Efficient and robust approximate nearest neighbor search using HNSW graphs](https://arxiv.org/abs/1603.09320)
3. [Cormack et al. Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods (2009)](https://plg.uwaterloo.ca/~gvcormac/cormacksigir09-rrf.pdf)
4. [pgvector — GitHub](https://github.com/pgvector/pgvector)
5. [Edge et al. From Local to Global: A Graph RAG Approach (Microsoft, 2024)](https://arxiv.org/abs/2404.16130)
6. [Liu et al. Lost in the Middle: How Language Models Use Long Contexts (2023)](https://arxiv.org/abs/2307.03172)
