RAG
Материал из MachineLearning.
| Строка 1: | Строка 1: | ||
| - | {{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] | + | {{well|Статья написана с использованием LLM '''Claude Opus 4.8''' и проверена участником [[Участник:Iaroslav Lyakhov|Iaroslav Lyakhov]] 16:50, 26 июля 2026 (MSD)}} |
{{TOCright}} | {{TOCright}} | ||
| Строка 24: | Строка 24: | ||
# Найденные фрагменты добавляются в промпт вместе с вопросом. | # Найденные фрагменты добавляются в промпт вместе с вопросом. | ||
# Модель генерирует ответ, опираясь на предоставленный контекст, и при необходимости приводит ссылки на источники. | # Модель генерирует ответ, опираясь на предоставленный контекст, и при необходимости приводит ссылки на источники. | ||
| + | |||
| + | == Математическая постановка == | ||
| + | Формально RAG вводит скрытую (латентную) переменную - извлечённый документ. Пусть <tex>x</tex> - запрос, <tex>y</tex> - ответ, а <tex>\mathcal{Z}</tex> - внешняя коллекция документов. Обычная модель задаёт распределение <tex>p_\theta(y\mid x)</tex> напрямую, а RAG маргинализует ответ по документам: | ||
| + | |||
| + | ::<tex>p(y\mid x) = \sum_{z \in \mathcal{Z}} p_\eta(z\mid x)\, p_\theta(y\mid z, x),</tex> | ||
| + | |||
| + | где <tex>p_\eta(z\mid x)</tex> - модель поиска (какой документ релевантен запросу), а <tex>p_\theta(y\mid z, x)</tex> - генератор, отвечающий по запросу и документу. Суммировать по всей коллекции нельзя (в ней бывают миллиарды записей), поэтому на практике берут только <tex>k</tex> самых релевантных документов <tex>\mathcal{R}_k(x)</tex>: | ||
| + | |||
| + | ::<tex>p(y\mid x) \approx \sum_{z \in \mathcal{R}_k(x)} p_\eta(z\mid x)\, p_\theta(y\mid z, x).</tex> | ||
| + | |||
| + | Различают два режима. В '''RAG-Sequence''' один и тот же документ используется для всего ответа. В '''RAG-Token''' документ можно выбирать заново для каждого токена: | ||
| + | |||
| + | ::<tex>p(y\mid x) = \prod_{t} \sum_{z \in \mathcal{R}_k(x)} p_\eta(z\mid x)\, p_\theta(y_t\mid y_{<t}, z, x).</tex> | ||
| + | |||
| + | В большинстве современных систем поступают проще: несколько найденных фрагментов просто дописывают к запросу, а генератор работает как обычная [[Языковая модель|авторегрессионная модель]] на таком расширенном контексте. | ||
== Ключевые компоненты == | == Ключевые компоненты == | ||
| - | * '''Ретривер''' (retriever) отвечает за поиск. Разреженный ретривер (например, BM25) ищет по совпадению ключевых слов; плотный (dense) - по близости эмбеддингов и находит смысловые совпадения даже при разных формулировках; на практике часто комбинируют оба (гибридный поиск). | + | * '''Ретривер''' (retriever) отвечает за поиск. Разреженный ретривер (например, BM25) ищет по совпадению ключевых слов; плотный (dense) - по близости эмбеддингов и находит смысловые совпадения даже при разных формулировках; на практике часто комбинируют оба (гибридный поиск). Плотный ретривер обычно устроен как два кодировщика (dual encoder): один переводит запрос в вектор <tex>\mathbf{q} = E_Q(x)</tex>, другой - документ в вектор <tex>\mathbf{d} = E_D(z)</tex>, а релевантность оценивают их скалярным произведением <tex>\mathrm{sim}(x, z) = \mathbf{q}^\top \mathbf{d}</tex>. Классический пример такого ретривера - DPR (Dense Passage Retrieval); для быстрого поиска по миллионам векторов используют библиотеки приближённого поиска ближайших соседей вроде FAISS или ScaNN. |
* '''Реранкер''' (re-ranker) переупорядочивает найденных кандидатов более точной, но дорогой моделью, чтобы наверх попали действительно релевантные фрагменты. | * '''Реранкер''' (re-ranker) переупорядочивает найденных кандидатов более точной, но дорогой моделью, чтобы наверх попали действительно релевантные фрагменты. | ||
| - | * '''Генератор''' - собственно LLM, которая формирует итоговый ответ. | + | * '''Генератор''' - собственно LLM, которая формирует итоговый ответ. Это может быть модель типа энкодер-декодер (T5, BART) или decoder-only (GPT, LLaMA). |
== Нарезка и качество поиска == | == Нарезка и качество поиска == | ||
Качество ответа в RAG во многом определяется поиском: если наверх попали нерелевантные фрагменты, модель ответит по ним же неверно (принцип «мусор на входе - мусор на выходе»). Поэтому важны и способ нарезки документов (слишком мелкие куски теряют контекст, слишком крупные размывают релевантность), и качество эмбеддера, и наличие реранкера. | Качество ответа в RAG во многом определяется поиском: если наверх попали нерелевантные фрагменты, модель ответит по ним же неверно (принцип «мусор на входе - мусор на выходе»). Поэтому важны и способ нарезки документов (слишком мелкие куски теряют контекст, слишком крупные размывают релевантность), и качество эмбеддера, и наличие реранкера. | ||
| + | |||
| + | == Обучение == | ||
| + | Компоненты RAG можно обучать по-разному. | ||
| + | * '''Сквозное обучение''' (end-to-end): ретривер и генератор настраивают вместе. Выбор документа из коллекции недифференцируем, поэтому градиент проводят через маргинальное правдоподобие <tex>\log p(y\mid x)</tex>, взвешивая вклад каждого документа его вероятностью <tex>p_\eta(z\mid x)</tex>. Так обучались исходные RAG и REALM. | ||
| + | * '''Замороженный ретривер''' (frozen retriever): берут готовый поисковый модуль (например, DPR или BM25) и дообучают только генератор на извлечённых документах. Это дешевле и проще масштабируется; так устроен Atlas, где индекс лишь периодически пересчитывают. | ||
| + | * '''Многоэтапное обучение''': сначала отдельно обучают ретривер на парах «запрос-документ», затем генератор на расширенных контекстах, и при необходимости слегка дообучают всё вместе. | ||
| + | При росте базы важно поддерживать актуальность индекса: по мере изменения энкодера документы асинхронно переиндексируют. | ||
== Проблемы == | == Проблемы == | ||
| Строка 38: | Строка 60: | ||
* Ограничение длины контекста: в промпт помещается лишь несколько фрагментов. | * Ограничение длины контекста: в промпт помещается лишь несколько фрагментов. | ||
* Модель может проигнорировать переданный контекст и ответить «из памяти». | * Модель может проигнорировать переданный контекст и ответить «из памяти». | ||
| + | * Задержка: поиск по большой коллекции добавляет заметное время ответа; спасают кэширование и приближённый поиск. | ||
| + | * Конфликт знаний: сведения из внешних документов могут противоречить тому, что модель «помнит» из обучения, и ответы становятся непоследовательными. | ||
| + | * Обслуживание индекса: базу нужно обновлять, чистить от дубликатов и держать свежей - это отдельная инженерная работа. | ||
== Развитие == | == Развитие == | ||
| - | + | Исходные RAG и REALM (2020) появились почти одновременно и задали направление. Дальше выросло целое семейство подходов: | |
| + | * '''RETRO''' (2022) встраивает поиск прямо в архитектуру [[Трансформер|трансформера]] через блоки chunked cross-attention и работает с базой в триллионы токенов. | ||
| + | * '''FiD''' (Fusion-in-Decoder) обрабатывает каждый документ отдельно в энкодере, а объединяет их уже в декодере, что позволяет учесть десятки фрагментов сразу. | ||
| + | * '''Atlas''' показал сильное обучение по немногим примерам за счёт поиска. | ||
| + | * '''Self-RAG''' учит модель саму решать, когда обращаться к поиску, и критически оценивать найденное и собственный ответ с помощью специальных токенов-рефлексий. | ||
| + | * '''REPLUG''' применяет RAG к закрытым (black-box) моделям, дообучая только лёгкий ретривер. | ||
| + | Из более прикладных направлений: '''agentic RAG''' (модель сама решает, что и когда искать, и делает несколько итераций поиска), '''GraphRAG''' (поиск по [[Граф знаний|графу знаний]], а не только по отдельным фрагментам), итеративное и многошаговое извлечение для сложных вопросов, а также мультимодальный RAG для изображений и видео. | ||
== RAG или дообучение == | == RAG или дообучение == | ||
| Строка 50: | Строка 81: | ||
* [[Embedding|Векторное представление (эмбеддинг)]] | * [[Embedding|Векторное представление (эмбеддинг)]] | ||
* [[Векторная база данных]] | * [[Векторная база данных]] | ||
| + | * [[Информационный поиск]] | ||
* [[Промпт-инжиниринг]] | * [[Промпт-инжиниринг]] | ||
== Литература == | == Литература == | ||
* {{статья |автор=Lewis P. и др. |заглавие=Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks |издание=Advances in Neural Information Processing Systems (NeurIPS) |год=2020 |ссылка=https://arxiv.org/abs/2005.11401}} | * {{статья |автор=Lewis P. и др. |заглавие=Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks |издание=Advances in Neural Information Processing Systems (NeurIPS) |год=2020 |ссылка=https://arxiv.org/abs/2005.11401}} | ||
| + | * {{статья |автор=Guu K. и др. |заглавие=REALM: Retrieval-Augmented Language Model Pre-Training |издание=Proc. of the 37th International Conference on Machine Learning (ICML) |год=2020 |ссылка=https://arxiv.org/abs/2002.08909}} | ||
* {{статья |автор=Karpukhin V. и др. |заглавие=Dense Passage Retrieval for Open-Domain Question Answering |издание=Proc. of EMNLP |год=2020 |ссылка=https://arxiv.org/abs/2004.04906}} | * {{статья |автор=Karpukhin V. и др. |заглавие=Dense Passage Retrieval for Open-Domain Question Answering |издание=Proc. of EMNLP |год=2020 |ссылка=https://arxiv.org/abs/2004.04906}} | ||
| + | * {{статья |автор=Izacard G., Grave E. |заглавие=Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering (Fusion-in-Decoder) |издание=Proc. of EACL |год=2021 |ссылка=https://arxiv.org/abs/2007.01282}} | ||
| + | * {{статья |автор=Borgeaud S. и др. |заглавие=Improving Language Models by Retrieving from Trillions of Tokens (RETRO) |издание=Proc. of the 39th International Conference on Machine Learning (ICML) |год=2022 |ссылка=https://arxiv.org/abs/2112.04426}} | ||
| + | * {{статья |автор=Izacard G. и др. |заглавие=Atlas: Few-shot Learning with Retrieval Augmented Language Models |издание=Препринт arXiv:2208.03299 |год=2022 |ссылка=https://arxiv.org/abs/2208.03299}} | ||
| + | * {{статья |автор=Shi W. и др. |заглавие=REPLUG: Retrieval-Augmented Black-Box Language Models |издание=Препринт arXiv:2301.12652 |год=2023 |ссылка=https://arxiv.org/abs/2301.12652}} | ||
| + | * {{статья |автор=Asai A. и др. |заглавие=Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection |издание=Препринт arXiv:2310.11511 |год=2023 |ссылка=https://arxiv.org/abs/2310.11511}} | ||
* {{статья |автор=Gao Y. и др. |заглавие=Retrieval-Augmented Generation for Large Language Models: A Survey |издание=Препринт arXiv:2312.10997 |год=2023 |ссылка=https://arxiv.org/abs/2312.10997}} | * {{статья |автор=Gao Y. и др. |заглавие=Retrieval-Augmented Generation for Large Language Models: A Survey |издание=Препринт arXiv:2312.10997 |год=2023 |ссылка=https://arxiv.org/abs/2312.10997}} | ||
| + | * {{статья |автор=Edge D. и др. |заглавие=From Local to Global: A Graph RAG Approach to Query-Focused Summarization |издание=Препринт arXiv:2404.16130 |год=2024 |ссылка=https://arxiv.org/abs/2404.16130}} | ||
[[Категория:Машинное обучение]] | [[Категория:Машинное обучение]] | ||
[[Категория:Анализ текстов]] | [[Категория:Анализ текстов]] | ||
Текущая версия
| | Статья написана с использованием LLM Claude Opus 4.8 и проверена участником Iaroslav Lyakhov 16:50, 26 июля 2026 (MSD) |
|
RAG (англ. retrieval-augmented generation - генерация с дополнением извлечёнными знаниями) - архитектурный подход, при котором языковая модель перед формированием ответа извлекает релевантные документы из внешнего хранилища и использует их как контекст. RAG соединяет параметрическую память модели (знания, «зашитые» в её веса) с непараметрической (внешняя база, которую можно менять в любой момент). Такой подход повышает фактическую точность ответов, позволяет ссылаться на источники и заметно снижает галлюцинации. Термин введён в работе Facebook AI Research (Lewis et al., 2020).
Зачем нужен
Знания обычной LLM «заморожены» на момент обучения: их трудно обновлять, а проследить, откуда взялось конкретное утверждение, невозможно. RAG решает сразу несколько проблем:
- Актуальность. Внешнюю базу можно обновлять без переобучения модели.
- Достоверность. Ответ опирается на конкретные документы, которые можно процитировать и проверить.
- Приватность и специализация. К модели подключают закрытые корпоративные или узкопредметные данные, не вливая их в обучающую выборку.
- Экономичность. Не нужно дорогостоящее дообучение под каждую новую коллекцию знаний.
Как устроен
Типичный конвейер RAG состоит из двух фаз.
Индексация (офлайн)
- Документы нарезаются на фрагменты (chunking).
- Каждый фрагмент кодируется в векторное представление моделью-эмбеддером.
- Векторы складываются в векторную базу данных (FAISS, Milvus, Qdrant и др.), где по ним можно быстро искать ближайших соседей.
Извлечение и генерация (онлайн)
- Запрос пользователя кодируется в вектор тем же эмбеддером.
- По близости (обычно косинусной) находятся
наиболее релевантных фрагментов - это семантический поиск: ищут по смыслу, а не по точному совпадению слов.
- Найденные фрагменты добавляются в промпт вместе с вопросом.
- Модель генерирует ответ, опираясь на предоставленный контекст, и при необходимости приводит ссылки на источники.
Математическая постановка
Формально RAG вводит скрытую (латентную) переменную - извлечённый документ. Пусть - запрос,
- ответ, а
- внешняя коллекция документов. Обычная модель задаёт распределение
напрямую, а RAG маргинализует ответ по документам:
где - модель поиска (какой документ релевантен запросу), а
- генератор, отвечающий по запросу и документу. Суммировать по всей коллекции нельзя (в ней бывают миллиарды записей), поэтому на практике берут только
самых релевантных документов
:
Различают два режима. В RAG-Sequence один и тот же документ используется для всего ответа. В RAG-Token документ можно выбирать заново для каждого токена:
В большинстве современных систем поступают проще: несколько найденных фрагментов просто дописывают к запросу, а генератор работает как обычная авторегрессионная модель на таком расширенном контексте.
Ключевые компоненты
- Ретривер (retriever) отвечает за поиск. Разреженный ретривер (например, BM25) ищет по совпадению ключевых слов; плотный (dense) - по близости эмбеддингов и находит смысловые совпадения даже при разных формулировках; на практике часто комбинируют оба (гибридный поиск). Плотный ретривер обычно устроен как два кодировщика (dual encoder): один переводит запрос в вектор
, другой - документ в вектор
, а релевантность оценивают их скалярным произведением
. Классический пример такого ретривера - DPR (Dense Passage Retrieval); для быстрого поиска по миллионам векторов используют библиотеки приближённого поиска ближайших соседей вроде FAISS или ScaNN.
- Реранкер (re-ranker) переупорядочивает найденных кандидатов более точной, но дорогой моделью, чтобы наверх попали действительно релевантные фрагменты.
- Генератор - собственно LLM, которая формирует итоговый ответ. Это может быть модель типа энкодер-декодер (T5, BART) или decoder-only (GPT, LLaMA).
Нарезка и качество поиска
Качество ответа в RAG во многом определяется поиском: если наверх попали нерелевантные фрагменты, модель ответит по ним же неверно (принцип «мусор на входе - мусор на выходе»). Поэтому важны и способ нарезки документов (слишком мелкие куски теряют контекст, слишком крупные размывают релевантность), и качество эмбеддера, и наличие реранкера.
Обучение
Компоненты RAG можно обучать по-разному.
- Сквозное обучение (end-to-end): ретривер и генератор настраивают вместе. Выбор документа из коллекции недифференцируем, поэтому градиент проводят через маргинальное правдоподобие
, взвешивая вклад каждого документа его вероятностью
. Так обучались исходные RAG и REALM.
- Замороженный ретривер (frozen retriever): берут готовый поисковый модуль (например, DPR или BM25) и дообучают только генератор на извлечённых документах. Это дешевле и проще масштабируется; так устроен Atlas, где индекс лишь периодически пересчитывают.
- Многоэтапное обучение: сначала отдельно обучают ретривер на парах «запрос-документ», затем генератор на расширенных контекстах, и при необходимости слегка дообучают всё вместе.
При росте базы важно поддерживать актуальность индекса: по мере изменения энкодера документы асинхронно переиндексируют.
Проблемы
- Ответ ограничен качеством поиска: пропущенный или нерелевантный фрагмент портит результат.
- Чувствительность к способу нарезки и размеру фрагментов.
- Ограничение длины контекста: в промпт помещается лишь несколько фрагментов.
- Модель может проигнорировать переданный контекст и ответить «из памяти».
- Задержка: поиск по большой коллекции добавляет заметное время ответа; спасают кэширование и приближённый поиск.
- Конфликт знаний: сведения из внешних документов могут противоречить тому, что модель «помнит» из обучения, и ответы становятся непоследовательными.
- Обслуживание индекса: базу нужно обновлять, чистить от дубликатов и держать свежей - это отдельная инженерная работа.
Развитие
Исходные RAG и REALM (2020) появились почти одновременно и задали направление. Дальше выросло целое семейство подходов:
- RETRO (2022) встраивает поиск прямо в архитектуру трансформера через блоки chunked cross-attention и работает с базой в триллионы токенов.
- FiD (Fusion-in-Decoder) обрабатывает каждый документ отдельно в энкодере, а объединяет их уже в декодере, что позволяет учесть десятки фрагментов сразу.
- Atlas показал сильное обучение по немногим примерам за счёт поиска.
- Self-RAG учит модель саму решать, когда обращаться к поиску, и критически оценивать найденное и собственный ответ с помощью специальных токенов-рефлексий.
- REPLUG применяет RAG к закрытым (black-box) моделям, дообучая только лёгкий ретривер.
Из более прикладных направлений: agentic RAG (модель сама решает, что и когда искать, и делает несколько итераций поиска), GraphRAG (поиск по графу знаний, а не только по отдельным фрагментам), итеративное и многошаговое извлечение для сложных вопросов, а также мультимодальный RAG для изображений и видео.
RAG или дообучение
RAG и дообучение (fine-tuning) решают разные задачи: дообучение меняет поведение и стиль модели, а RAG снабжает её свежими фактами. На практике подходы дополняют друг друга: модель дообучают под формат и тон ответов, а актуальные знания подают через RAG.
См. также
- Большая языковая модель
- Галлюцинации языковых моделей
- Векторное представление (эмбеддинг)
- Векторная база данных
- Информационный поиск
- Промпт-инжиниринг
Литература
- Lewis P. и др. Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks // Advances in Neural Information Processing Systems (NeurIPS). — 2020.
- Guu K. и др. REALM: Retrieval-Augmented Language Model Pre-Training // Proc. of the 37th International Conference on Machine Learning (ICML). — 2020.
- Karpukhin V. и др. Dense Passage Retrieval for Open-Domain Question Answering // Proc. of EMNLP. — 2020.
- Izacard G., Grave E. Leveraging Passage Retrieval with Generative Models for Open Domain Question Answering (Fusion-in-Decoder) // Proc. of EACL. — 2021.
- Borgeaud S. и др. Improving Language Models by Retrieving from Trillions of Tokens (RETRO) // Proc. of the 39th International Conference on Machine Learning (ICML). — 2022.
- Izacard G. и др. Atlas: Few-shot Learning with Retrieval Augmented Language Models // Препринт arXiv:2208.03299. — 2022.
- Shi W. и др. REPLUG: Retrieval-Augmented Black-Box Language Models // Препринт arXiv:2301.12652. — 2023.
- Asai A. и др. Self-RAG: Learning to Retrieve, Generate, and Critique through Self-Reflection // Препринт arXiv:2310.11511. — 2023.
- Gao Y. и др. Retrieval-Augmented Generation for Large Language Models: A Survey // Препринт arXiv:2312.10997. — 2023.
- Edge D. и др. From Local to Global: A Graph RAG Approach to Query-Focused Summarization // Препринт arXiv:2404.16130. — 2024.

