Как ответить
RAG (Retrieval-Augmented Generation) состоит из двух связанных контуров: подготовки данных (индексация) и инференса (поиск + генерация). На входе — корпус документов, на выходе — ответ LLM с опорой на контекст.
- Шаг индексации: документы режутся на чанки (обычно 200–500 токенов, с перекрытием 10-20%), каждый чанк превращается в вектор через embedding-модель (например, text-embedding-ada-002, intfloat/multilingual-e5-large), векторы записываются в векторную БД (Pinecone, Qdrant, FAISS, Milvus).
- Шаг retrieval: запрос пользователя тоже эмбеддится, в БД ищут top-K похожих чанков (K=3–10) через косинусное расстояние или dot product. Часто добавляют re-ranker (например, BGE или Cohere rerank) для уточнения порядка.
- Шаг generation: собранные чанки вставляются в промпт (обычно в instruction или system message) вместе с исходным вопросом, LLM генерирует ответ, опираясь на контекст. Важно следить за длиной промпта — не превышать лимит модели.
- Дополнительно: метаданные (дата, источник), фильтры (например, по тегу), гибридный поиск (sparse + dense, типа BM25 + Dense), кэширование, мониторинг качества retrieval через hit rate и MRR.
На практике хороший RAG — не про «кинуть всё в LLM», а про чистоту данных, нормализацию чанков, умную обработку длинных документов (summary-индексы, hierarchical retrieval). Без этого качество ответов падает: модель либо не находит нужное, либо теряется в шуме.