RAG (retrieval-augmented generation) это схема «сначала найди, потом ответь»: по вопросу пользователя ищем релевантные фрагменты в своей базе и подаём их модели в контекст. Так модель отвечает по актуальным и внутренним данным, может ссылаться на источники и меньше выдумывает.
Конвейер целиком
Индексация (офлайн):
- Загрузка и очистка документов: PDF, HTML, вики, тикеты. Убрать меню, колонтитулы, дубли.
- Чанкинг: нарезка на фрагменты.
- Эмбеддинги чанков и запись в индекс вместе с текстом и метаданными (источник, дата, права доступа).
Ответ (онлайн):
- Обработка запроса: при необходимости переписать его с учётом истории диалога («а для юрлиц?» → полный вопрос).
- Поиск кандидатов: векторный, лексический или оба.
- Реранкинг и отбор лучших.
- Сборка контекста и генерация ответа с цитатами.
Качество RAG определяется в первую очередь поиском: если нужного фрагмента нет в контексте, никакой промпт не поможет.
Чанкинг
- Фиксированный размер с перекрытием: например, 300-500 токенов с перекрытием 10-20%. Перекрытие нужно, чтобы мысль на границе не потерялась.
- По структуре: по заголовкам, абзацам, пунктам. Чанк совпадает со смысловой единицей, его проще цитировать.
- Рекурсивный: пытаемся резать по абзацам, если кусок слишком большой, по предложениям, потом по словам.
Компромисс: маленькие чанки точнее находятся, но теряют контекст; большие несут контекст, но размывают эмбеддинг и съедают окно. Полезный приём: искать по маленьким чанкам, а в модель отдавать окружающий раздел (parent document). Ещё один: добавлять к чанку заголовок документа и раздела, чтобы фрагмент «Срок: 14 дней» знал, о чём он.
Ретривер: векторный, лексический, гибридный
- Векторный поиск ловит смысл и перефразировки, но слаб на точных токенах: артикулы, коды ошибок, фамилии, редкие термины.
- Лексический поиск BM25 силён ровно на точных совпадениях. Формула учитывает частоту термина в документе (с насыщением, параметр
k1), редкость термина по корпусу (IDF) и нормализацию по длине документа (параметрb, обычно 0.75). - Гибридный поиск запускает оба и объединяет списки.
Объединять сырые оценки нельзя: косинус и BM25 в разных шкалах. Простой и устойчивый способ: reciprocal rank fusion:
RRF(d) = Σ по спискам 1 / (k + rank(d)), k обычно 60
Важна только позиция документа в каждом списке, шкалы не важны.
Реранкинг
Ретривер (bi-encoder) кодирует запрос и документ отдельно: быстро, но грубо. Реранкер (cross-encoder) получает пару «запрос и документ» целиком и выдаёт оценку релевантности: точнее, но дорого, поэтому его применяют к 20-100 кандидатам, а не ко всему индексу.
Типичная воронка: гибридный поиск достаёт 50 кандидатов, реранкер выбирает 5-8, они идут в контекст.
Для разнообразия выдачи применяют MMR (maximal marginal relevance): на каждом шаге берут документ, который релевантен запросу и при этом не похож на уже выбранные. Это убирает пять почти одинаковых чанков из разных версий одного документа.
Сборка контекста и генерация
- Бюджет токенов: системный промпт, история, чанки и место под ответ должны влезть в окно и в целевую стоимость.
- Каждый чанк с идентификатором источника: модель ставит ссылки
[1],[2], приложение превращает их в ссылки на документы. - Инструкция: отвечать только по контексту, при отсутствии ответа честно сказать об этом и предложить эскалацию.
- Права доступа: фильтровать по правам до генерации, на этапе поиска. Модель не должна видеть документы, которые пользователю нельзя.
Как понять, что сломалось
Оценивайте части отдельно:
- Поиск: recall@k и MRR по набору вопросов с известными релевантными чанками.
- Генерация: верность контексту (faithfulness, нет ли утверждений без опоры), полнота и полезность ответа.
Если recall@k низкий, крутите чанкинг, гибридный поиск, переписывание запроса. Если поиск находит, а ответ плохой, работайте с промптом, порядком и объёмом контекста.
Частые ошибки
- Нарезать PDF без очистки: в чанках колонтитулы и обрывки таблиц.
- Только векторный поиск в домене с кодами и артикулами.
- Складывать оценки разных ретриверов без нормализации вместо RRF.
- Пихать в контекст 30 чанков «на всякий случай»: дороже, медленнее и хуже.
- Проверять права доступа после генерации ответа.
Что спросят на собесе
- Из каких шагов состоит RAG и где чаще всего теряется качество.
- Как выбрать размер чанка и зачем перекрытие.
- BM25 против векторного поиска, гибридный поиск и RRF.
- Bi-encoder против cross-encoder, зачем реранкер.
- Как оценить RAG по частям: поиск отдельно, генерацию отдельно.