RAG (генерация с дополнением поиском)
| Полное название | Retrieval-Augmented Generation |
|---|---|
| Впервые описан | 2020, Льюис и соавт. (Facebook AI Research) |
| Компоненты | разбиение на фрагменты, эмбеддинги, индекс, поиск, реранжирование, генерация |
| Типичные хранилища | pgvector, Qdrant, Milvus, Weaviate, Chroma, FAISS |
| Связанные подходы | дообучение, длинный контекст, GraphRAG, агентный поиск |
RAG (англ. Retrieval-Augmented Generation — генерация с дополнением поиском) — способ построения систем на основе больших языковых моделей, при котором перед ответом модель получает фрагменты текста из внешней базы знаний, отобранные поиском по запросу. Модель отвечает, опираясь на эти фрагменты, а не только на то, что запомнила при обучении. RAG позволяет работать с внутренними и свежими документами без дообучения, ссылаться на источники и снижать число галлюцинаций.
История
Термин ввели исследователи Facebook AI Research во главе с Патриком Льюисом в статье 2020 года, где генеративная модель обучалась совместно с нейросетевым поисковиком по Википедии.[1] С распространением чат-моделей в 2023 году название закрепилось за более простой и практичной схемой: готовая модель плюс поиск по базе фрагментов, найденные тексты подставляются в промпт. Именно в этом смысле термин обычно употребляется сегодня.
Схема работы
Индексация (выполняется заранее):
- Документы очищаются и разбиваются на фрагменты (чанки) — обычно от нескольких сотен до тысячи токенов, часто с перекрытием (см. Чанкинг документов).
- Каждый фрагмент превращается в вектор моделью эмбеддингов.
- Векторы и тексты сохраняются в индексе — векторной базе или расширении обычной СУБД (см. pgvector и векторные БД).[4]
Ответ на запрос:
- Запрос пользователя тоже переводится в вектор.
- В индексе ищутся ближайшие векторы — приближённым поиском ближайших соседей, чаще всего по графу HNSW[2] (см. Векторный поиск).
- Найденные фрагменты при необходимости реранжируются более точной моделью.
- Лучшие фрагменты вместе с вопросом передаются модели с инструкцией отвечать по ним и указывать источник.
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 | ИИ-агент сам решает, что и сколько раз искать, в том числе через инструменты MCP |
RAG, дообучение и длинный контекст
- Дообучение меняет поведение и стиль модели, но плохо подходит для фактов, которые часто обновляются, и не даёт ссылок на источники.
- Длинный контекст позволяет вставить документы целиком, но стоит дороже, отвечает медленнее, а качество использования информации из середины длинного контекста падает.[6]
- RAG дешевле на каждый запрос и прозрачнее, но качество ответа ограничено качеством поиска: если нужный фрагмент не найден, модель его не увидит.
На практике подходы сочетают.
Оценка качества
Отдельно оценивают поиск (нашёлся ли нужный фрагмент среди первых k — метрики recall@k, MRR) и генерацию (опирается ли ответ на найденное, отвечает ли он на вопрос). Для этого собирают набор вопросов с эталонными ответами и источниками (см. Оценка LLM (evals)).
Типичные проблемы
- неудачное разбиение: таблица или фрагмент кода разрезаны посередине;
- устаревший индекс, не синхронизированный с документами;
- модель игнорирует найденное или смешивает его с собственными «знаниями»;
- внедрение инструкций через проиндексированные документы (Безопасность LLM: prompt injection).
См. также
Источники
- Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (2020)
- Malkov, Yashunin. Efficient and robust approximate nearest neighbor search using HNSW graphs
- Cormack et al. Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods (2009)
- pgvector — GitHub
- Edge et al. From Local to Global: A Graph RAG Approach (Microsoft, 2024)
- Liu et al. Lost in the Middle: How Language Models Use Long Contexts (2023)