Как ответить
RAG (Retrieval-Augmented Generation) — это архитектурный паттерн, который соединяет поиск по внешней базе знаний с генерацией ответа языковой моделью. Основная идея: вместо того чтобы полагаться только на внутренние знания LLM (которые могут быть устаревшими или неточными), мы на каждый запрос сначала ищем релевантные фрагменты документов, а затем подаём их в модель как контекст. Это резко снижает галлюцинации и позволяет отвечать на основе актуальных данных.
На практике RAG-система состоит из двух фаз:
- Индексация. Исходные документы (PDF, HTML, базы знаний) разбиваются на чанки. Типичный размер — 256–512 токенов с перекрытием 10–20%, чтобы не потерять контекст на стыках. Для каждого чанка вычисляется эмбеддинг (например,
text-embedding-3-smallот OpenAI илиintfloat/e5-mistral-7b-instruct). Векторы сохраняются в векторном хранилище — FAISS, Pinecone, Qdrant, Chroma. - Инференс. На запрос пользователя тоже вычисляется эмбеддинг, затем ищется top-k ближайших чанков (обычно k=3–10) по косинусной близости или L2. Найденные чанки вместе с исходным вопросом форматируются в промпт и отправляются в LLM.
Пример промпта (упрощённо):
Используй следующие фрагменты документов, чтобы ответить на вопрос. Если в фрагментах нет ответа, скажи, что не знаешь.
Фрагменты:
{context}
Вопрос: {question}
Ответ:Ключевые инженерные решения, которые я проверял на практике:
- Выбор ретривера. Часто комбинируют dense + sparse (BM25) — гибридный поиск даёт лучший recall. Для dense использую модели с размерностью 768–1024.
- Размер чанка. Слишком маленькие чанки (менее 100 токенов) теряют контекст, слишком большие (более 1000) — шум. Оптимум зависит от домена: для юридических документов я беру 400 токенов, для кода — 200.
- Метрики. Качество ретривера меряю через recall@k и MRR. Качество ответов — через human evaluation и автоматические метрики (ROUGE, BERTScore), но они не всегда коррелируют с реальной полезностью.
RAG не требует дообучения модели — это его главное преимущество перед fine-tuning. Можно быстро обновлять базу знаний, просто переиндексируя новые документы. Основная сложность — правильно настроить чанкинг и ретривер, чтобы контекст был релевантным, а не зашумлённым.