Если ваш RAG всё ещё отвечает «42», возможно, вы просто спрашивали не о том. Мы провели восемь месяцев в окопах продакшен-RAG: 9 млн страниц для Usul AI и ещё 4 млн для безымянного легального гиганта. И вот что оказалось правдой, когда пыль легла.
Начали как все приличные люди: YouTube, LangChain → LlamaIndex. Прототип за пару дней, на 100 документах всё сияло. На проде — не сияло. Пользователи чувствовали фальшь, и мы по винтикам перестраивали систему, пока она не зазвучала. Самые эффективные приёмы — по убыванию ROI.
Генерация запросов. Один пользовательский вопрос редко хватает. LLM пересматривал диалог и штамповал несколько семантических и ключевых формулировок. Мы гоняли их параллельно и затем склеивали через реранкер. Это расширило «площадь покрытия» и снизило зависимость от гибридного скора.
Реранкинг. Пять строк кода — и мир меняется. Порядок чанков сдвигается сильнее, чем ожидаешь. Наш сладкий спот: подаём 50, оставляем 15.
Чанкинг. Самая трудоёмкая часть и главный источник качества. Данные разные — и пайплайн тоже. Проверяйте, чтобы:
- куски не резались посередине слова или предложения;
- каждый чанк был логической единицей и имел самодостаточный смысл.
Метаданные в LLM. Мы сперва слали только текст чанка. Добавили релевантные метаданные (заголовок, автор и т. п.) — ответы стали заметно точнее и контекстнее.
Роутинг запросов. Много вопросов вообще не про RAG: «кто автор?», «суммаризируй». Небольшой роутер отправляет их в API + LLM, минуя тяжёлую Retrieval-цепочку.
Наш стек:
- Векторка: Azure → Pinecone → Turbopuffer (дёшево, нативный keyword search)
- Экстракция: кастом
- Чанкинг: Unstructured.io по умолчанию, кастом для энтерпрайза (говорят, Chonkie неплох)
- Эмбеддинги: text-embedding-large-3
- Реранкер: None → Cohere 3.5 → Zerank
- LLM: GPT 4.1 → GPT 5 → снова GPT 4.1 (Azure-кредиты решают)
Всё это сложили в MIT-опенсорс: agentset-ai/agentset. Если коротко: расширяйте запрос, реранк — обязателен, чанки — ремесло, метаданные — бесплатная магия, роутер — здравый смысл. Остальное — детали.
