Какой размер пересечения чанков использовать
Что проверяют
Понимаете ли вы, зачем вообще нужно пересечение и чем за него платите, или просто повторяете чужую цифру. Речь почти всегда о нарезке документов для RAG, и следом спрашивают: как вы проверяли, что выбранное значение лучше соседних.
Как отвечать
Начните с назначения. Пересечение (chunk_overlap) нужно, чтобы мысль, разрезанная границей чанка, целиком попала хотя бы в один из соседних кусков. Дальше каркас:
- единицы измерения: считайте в токенах токенизатора эмбеддинг-модели, а не в символах. У многих энкодеров лимит 512 токенов, всё сверх него молча обрезается;
- стартовая точка: 10-20% от размера чанка, например 500 токенов с пересечением 50-100. Это эвристика для первого прогона, а не ответ;
- цена: шаг окна равен
chunk_size - chunk_overlap, поэтому число чанков растёт примерно вsize / (size - overlap)раз. Пересечение 50% удваивает индекс, а в top-k начинают приходить почти одинаковые куски и вытеснять разнообразные; - от чего зависит: короткие ответы в FAQ и справках живут и без пересечения, длинные рассуждения, юридический текст и код требуют больше;
- альтернативы: резать по структуре (заголовки, абзацы, функции) через
RecursiveCharacterTextSplitterили сплиттеры по Markdown, а контекст добирать приёмами parent document или sentence window. Хорошая структурная нарезка часто делает пересечение почти ненужным.
Главное: значение подбирается на своих данных. Соберите 50-100 вопросов с известными релевантными фрагментами, прогоните сетку «размер × пересечение», сравните recall@k и MRR на этапе поиска, а затем качество итогового ответа модели.
Где спотыкаются
Называют «20%» как закон природы и не могут объяснить, откуда цифра и что будет при 0% или при 50%.
Путают символы и токены: задают chunk_size=1000 в символах, думая, что это токены, и получают куски в несколько раз меньше задуманного. Или наоборот, выходят за лимит энкодера, и хвост чанка не попадает в эмбеддинг.
Не убирают дубли после поиска: соседние чанки с большим пересечением занимают половину top-k, и модель получает один и тот же абзац трижды вместо трёх разных источников.