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

Материал из llmdocs — справочник разработчика
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 году название закрепилось за более простой и практичной схемой: готовая модель плюс поиск по базе фрагментов, найденные тексты подставляются в промпт. Именно в этом смысле термин обычно употребляется сегодня.

Схема работы

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

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

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

  1. Запрос пользователя тоже переводится в вектор.
  2. В индексе ищутся ближайшие векторы — приближённым поиском ближайших соседей, чаще всего по графу HNSW[2] (см. Векторный поиск).
  3. Найденные фрагменты при необходимости реранжируются более точной моделью.
  4. Лучшие фрагменты вместе с вопросом передаются модели с инструкцией отвечать по ним и указывать источник.
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).

См. также

Источники

  1. Lewis et al. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks (2020)
  2. Malkov, Yashunin. Efficient and robust approximate nearest neighbor search using HNSW graphs
  3. Cormack et al. Reciprocal Rank Fusion outperforms Condorcet and individual Rank Learning Methods (2009)
  4. pgvector — GitHub
  5. Edge et al. From Local to Global: A Graph RAG Approach (Microsoft, 2024)
  6. Liu et al. Lost in the Middle: How Language Models Use Long Contexts (2023)