RAG (Retrieval-Augmented Generation — «Генерация, усиленная извлечением данных») — это архитектурный подход, который объединяет извлечение информации из внешних источников (retrieval) с генеративными возможностями языковых моделей (generation). Это мощная техника для создания более точных, прозрачных и масштабируемых систем на базе LLM (Large Language Models), особенно когда важно использовать актуальные или специфичные данные.
Обычные языковые модели (например, GPT-3 или GPT-4) генерируют текст на основе информации, "запомненной" во время обучения. Но у них есть ограничения:
-
Знания устаревают.
-
Модель может "галлюцинировать" — уверенно выдавать неправду.
-
Невозможно легко адаптироваться к новым данным.
-
Retrieval (извлечение):
-
Получив запрос пользователя, система ищет релевантные документы в базе знаний (например, векторной базе, файлах, SQL-базе или API).
-
-
Generation (генерация):
-
Извлечённая информация подаётся в языковую модель как дополнительный контекст.
-
Модель генерирует финальный ответ, основываясь на реальных данных.
-
-
Использовать актуальную информацию (например, из базы документов компании).
-
Дать ссылку на источник ответа.
-
Снизить риск "галлюцинаций".
RAG решает эти проблемы, добавляя внешний этап поиска знаний. Весь процесс можно разбить на два этапа:
Такой подход позволяет:
Популярные движки и инструменты для RAG
Эти базы позволяют искать документы по смыслу (семантике), а не просто по ключевым словам.
Векторное хранилище | Особенности |
---|---|
Pinecone | SaaS, масштабируемое, быстрый поиск |
Weaviate | Open-source + REST API + встроенные модули |
FAISS | Open-source от Facebook, работает локально, быстрый |
Qdrant | Rust + gRPC/REST, open-source, поддерживает фильтрацию |
Milvus | Подходит для крупных кластеров, open-source |
Языковые модели (LLM)
Модель | Подходит для | Примечание |
---|---|---|
GPT-4 (OpenAI) | Продвинутые ответы | API, высокая точность |
Claude (Anthropic) | Этические и юридические ответы | Большие контексты |
Mistral, LLaMA | Self-hosted решения | Можно использовать локально |
Gemini (Google) | Мультимодальные задачи | Поддерживает изображения и текст |
Интеграционные фреймворки
Фреймворк | Назначение |
---|---|
LangChain | Пайплайны с LLM, подключение ретриверов и памяти |
LlamaIndex (ex-GPT Index) | Индексация и эффективный поиск по документам |
Haystack | Немецкий open-source фреймворк для RAG, NLP и QA |
RAGStack (Pinecone + LangChain + OpenAI) | Готовое решение от Pinecone для продакшна |
Простой пример на LangChain + FAISS
from langchain.vectorstores import FAISS
from langchain.embeddings import OpenAIEmbeddings
from langchain.chains import RetrievalQA
from langchain.llms import OpenAI
Загрузка документов
from langchain.document_loaders import TextLoader
loader = TextLoader("docs/handbook.txt")
documents = loader.load()
Индексация
embeddings = OpenAIEmbeddings()
db = FAISS.from_documents(documents, embeddings)
Построение цепочки
retriever = db.as_retriever()
qa_chain = RetrievalQA.from_chain_type(
llm=OpenAI(),
retriever=retriever
)
Запрос
response = qa_chain.run("Какие есть правила увольнения?")
print(response)