Что такое RAG, зачем он нужен и как работает архитектура retrieval-augmented generation
Retrieval-Augmented Generation — мост между вашими данными и мощью больших языковых моделей.
Представьте, что вы хотите создать чат-бота для компании. Бот должен отвечать на вопросы сотрудников о внутренних процессах, политиках и документах. Вы не можете просто использовать ChatGPT — он не знает ваших внутренних документов. Вы можете «скормить» все документы модели напрямую? Теоретически да, но у LLM есть ограничение на длину контекста (context window), да и знания модели застывают на момент обучения.
RAG (Retrieval-Augmented Generation) решает эту проблему элегантно. Вместо того чтобы загружать все документы в модель, система сначала находит релевантные фрагменты для конкретного вопроса, а затем генерирует ответ на основе найденного.
Проще говоря: RAG = Поиск + Генерация.
RAG-систа состоит из двух основных пайплайнов:
Прежде чем система сможет отвечать на вопросы, нужно подготовить документы:
# Упрощённая схема индексации
документ → разбиваем на чанки → создаём embeddings → сохраняем в векторную БДКаждый шаг важен:
Когда пользователь задаёт вопрос:
# Упрощённая схема генерации ответа
вопрос пользователя → embedding вопроса → поиск похожих чанков → промпт с чанками → LLM → ответПошагово:
Существует три основных подхода к работе с собственными данными через LLM:
Вы берёте базовую модель (например, GPT) и дообучаете её на своих данных. Проблемы:
Вы просто вставляете все документы в промпт. Проблемы:
Преимущества:
Сотрудник спрашивает: «Как оформить отпуск?» — бот находит соответствующий раздел HR-политики и формирует ответ со ссылкой на документ.
Клиент описывает проблему — система находит релевантные статьи из базы знаний и инструкций.
Юрист задаёт вопрос о конкретном законе — система находит соответствующие статьи судебной практики и нормативных актов.
Врач ищет информацию о взаимодействии лекарств — система находит данные из медицинской базы и формулирует ответ.
Аналитик работает с набором отчётов — RAG-система помогает быстро находить нужную информацию в массиве документов.
Для построения RAG на Python мы будем использовать:
| Компонент | Библиотеки |
|---|---|
| Embeddings | sentence-transformers, OpenAI API, Cohere API |
| Vector DB | chromadb, faiss, qdrant-client |
| Document loading | pypdf, python-docx, beautifulsoup4 |
| LLM | openai, anthropic, Ollama, OpenRouter |
| Chunking | Кастомная логика на Python |
В следующих темах мы подробно разберём каждый компонент и напишем работающий код.
Вот минимальный пример того, как может выглядеть RAG-система с использованием chromadb и sentence-transformers:
import chromadb
from chromadb.utils import embedding_functions
# 1. Создаём embedding-функцию
embedder = embedding_functions.SentenceTransformerEmbeddingFunction(
model_name="all-MiniLM-L6-v2"
)
# 2. Создаём клиент Chroma и коллекцию
client = chromadb.PersistentClient(path="./my_rag_db")
collection = client.get_or_create_collection(
name="documents",
embedding_function=embedder
)
# 3. Индексация документов
documents = [
"Отпуск оформляется через портал HR. Заявление подаётся за 2 недели.",
"Больничный лист нужно отправить в бухгалтерию в течение 3 дней.",
"Удалённая работа разрешена до 3 дней в неделю по согласованию."
]
collection.add(
documents=documents,
ids=["doc_1", "doc_2", "doc_3"]
)
# 4. Поиск релевантных документов
results = collection.query(
query_texts=["Как подать заявление на отпуск?"],
n_results=2
)
print("Найденные документы:", results["documents"])Этот код индексирует три коротких текста и находит наиболее релевантный для запроса. В следующих темах мы добавим загрузку реальных документов, продвинутый chunking и генерацию ответов через LLM.
RAG — не серебряная пуля. Вот типичные проблемы:
Эти проблемы мы разберём в продвинутых темах курса и научимся их решать.
Вопросы ещё не добавлены
Вопросы для этой подтемы ещё не добавлены.