Диагностика Mock-интервью
Главная · RAG: поиск + генерация

Чанкинг и подготовка данных

Прежде чем документы попадут в векторный индекс RAG-системы, их режут на куски — чанки. От того, где пройдут границы, качество поиска зависит сильнее, чем от выбора модели эмбеддингов, — и именно здесь чаще всего ломаются реальные пайплайны.

Интуиция

Почему нельзя просто заэмбеддить документ целиком? Эмбеддинг — это одна точка в пространстве смыслов. Пятидесятистраничный регламент говорит о сотне вещей сразу, и его вектор получится «обо всём и ни о чём»: смысл размывается, и на конкретный вопрос такой документ находится плохо. Вдобавок у моделей эмбеддингов есть жёсткий лимит входа (часто 512 токенов) — лишнее просто обрежется.

Противоположная крайность — резать по одному предложению. Тогда каждый вектор точен, но бесполезен: чанк «Он подаётся минимум за две недели» не скажет ни поиску, ни LLM, что речь о заявлении на отпуск. Местоимения и отсылки теряют смысл без окружения — теряется контекст.

Стратегии нарезки

Зачем нужен overlap: если важная мысль оказалась ровно на границе, перекрытие гарантирует, что хотя бы в один чанк она попадёт целиком. Цена — дубли в индексе: хранилище растёт, а в выдаче могут оказаться два почти одинаковых кандидата.

💡 Ключевая мысль Чанк должен быть понятен сам по себе. Тест: покажи чанк коллеге без остального документа — если он не поймёт, о чём речь, не поймёт и ретривер с генератором.

Поэкспериментируй: на вопросе «Заболел в отпуске» при фиксированном размере 4 без overlap ответ режется пополам — правило про продление в одном чанке, а требование больничного листа в другом. Добавь overlap 1 — и ответ целиком попадает в найденный чанк. Режим «По структуре» решает ту же проблему без дублей: границы совпадают со смысловыми секциями.

Обогащение чанков

Голый кусок текста часто недостаточен, поэтому чанки обогащают:

Особые случаи и подводные камни

Таблицы нельзя резать посреди строк: строка без шапки превращается в бессмысленный набор чисел. Обычно таблицу либо кладут в чанк целиком, либо дублируют шапку в каждый кусок, либо конвертируют строки в текстовые описания. Код режут по функциям и классам, а не по числу символов — рекурсивные сплиттеры для кода используют синтаксические разделители языка.

⚠️ Подводный камень Если не прокинуть права доступа в метаданные чанков, RAG превращается в дыру в безопасности: поиск честно достанет содержимое зарплатной ведомости любому сотруднику, задавшему подходящий вопрос. Фильтрация по ACL должна происходить на этапе поиска, а не «потом отфильтруем в промпте».
🎤 На собеседовании
  • «Как выбрать размер чанка?» — это трейд-офф: крупнее — больше контекста, но размытый вектор; мельче — точный вектор, но потерянный смысл. Подбирается экспериментально по метрикам ретривера (см. оценку RAG).
  • «Зачем overlap и чем он плох?» — спасает мысли на границах, но плодит дубли в индексе и выдаче.
  • «Пользователи жалуются, что ответы обрываются на полуслове. Где искать?» — проверить границы чанков: скорее всего, ответ разрезан; лечится overlap или структурной нарезкой.
  • «Что положить в метаданные?» — дату, источник, версию и права доступа; без ACL система небезопасна.