中文翻译暂不可用,显示俄语原文。

Какие стратегии chunking'а вы знаете и когда какую применяете?

Краткий тезис

Chunking (разбиение документов на фрагменты) — один из самых важных этапов RAG. От выбора стратегии зависит, насколько хорошо retrieval найдёт нужную информацию и насколько полным будет контекст для LLM. Разные стратегии подходят для разных типов данных: от простых фиксированных кусков до семантических границ и иерархического разбиения по структуре документа.


1. Термин: Chunking (разбиение на чанки)

Что это Процесс разделения длинного документа на маленькие, логически завершённые фрагменты (чанки), которые затем индексируются в векторной БД.

Зачем нужен chunking

ПричинаОбъяснение
Контекстное окно LLMLLM имеют ограниченное окно (4k-128k токенов). Нельзя скормить весь документ целиком
Качество retrievalМаленькие чанки точнее матчатся с запросом, чем огромные куски текста
Стоимость эмбеддинговEmbedding модели имеют ограничение на длину входа (обычно 512-8192 токенов)
РелевантностьСлишком большой чанк содержит много нерелевантной информации

Термин «Токен» Базовая единица текста для LLM. 1 токен ≈ 0.75 слова на английском, ≈ 0.5 слова на русском.


2. Стратегия 1: Fixed-size chunking (фиксированный размер)

Как работает Документ режется на чанки строго по количеству символов/токенов. Самый простой и быстрый метод.

# Пример: чанки по 500 символов
text = "очень длинный текст..."
chunk_size = 500
chunks = [text[i:i+chunk_size] for i in range(0, len(text), chunk_size)]
ПлюсыМинусы
Простота реализацииРежет предложения и абзацы посередине
Максимальная скоростьТеряет смысловую структуру
Предсказуемый размер чанковМожет разорвать важную мысль

Когда применять Очень однородные данные, где структура не важна — логи серверов, JSON-строки, CSV-файлы, машинный код.

Термин «Однородные данные» (homogeneous data Данные, где все элементы имеют одинаковую структуру и не содержат естественных границ (абзацев, предложений, разделов).


3. Стратегия 2: RecursiveCharacterTextSplitter (рекурсивное разбиение)

Как работает LangChain-разделитель, который рекурсивно пробует разбить текст по иерархии разделителей: сначала по параграфам (\n\n), затем по предложениям (.), затем по словам ( ), затем по символам.

from langchain_text_splitters import RecursiveCharacterTextSplitter

splitter = RecursiveCharacterTextSplitter(
    chunk_size=1000,
    chunk_overlap=200,
    separators=["\n\n", "\n", ".", " ", ""]
)
chunks = splitter.split_text(document)

Термин «Рекурсивный» (Recursive Алгоритм пробует самый большой разделитель (параграф). Если полученный фрагмент всё ещё слишком длинный, применяет следующий разделитель (предложение), затем слово, затем символ. Процесс повторяется рекурсивно.

Термин «Разделитель» (Separator Символ или последовательность символов, по которой можно разделить текст (перевод строки, точка, пробел). Иерархия разделителей: от самых «крупных» к самым «мелким».

Термин «Перекрытие» (Overlap Последние N токенов чанка повторяются в начале следующего чанка. Нужно, чтобы важная информация не потерялась на границе разбиения.

Чанк 1: [токен 1 ... токен 500] 
Чанк 2: [токен 401 ... токен 900]  # overlap = 100 токенов
ПлюсыМинусы
Сохраняет естественные границы текстаМедленнее Fixed-size
Работает для 90% текстовТребует настройки разделителей под язык
Предсказуемый максимальный размерМожет создавать слишком короткие чанки

Когда применять Дефолтный выбор для большинства текстов (статьи, новости, документация, блоги, письма). Это золотая середина между качеством и простотой.


4. Стратегия 3: Semantic chunking (семантическое разбиение)

Как работает Использует embedding-модель для определения, где заканчивается одна смысловая единица и начинается следующая.

Алгоритм

  1. Разбить текст на предложения
  2. Вычислить эмбеддинги каждого предложения
  3. Измерить косинусное расстояние между соседними предложениями
  4. Если расстояние резко увеличивается → смысловая граница → разрыв чанка
# Псевдокод
embeddings = model.encode(sentences)
for i in range(len(embeddings)-1):
    similarity = cosine_similarity(embeddings[i], embeddings[i+1])
    if similarity < threshold:  # резкое изменение темы
        split_here()

Термин «Косинусное расстояние» (Cosine Distance Мера того, насколько два вектора (эмбеддинга) далеки друг от друга. Значение от 0 (векторы одинаковые) до 2 (противоположные). 1 - cosine_similarity.

Термин «Смысловая целостность» (Semantic Coherence Свойство текста, где все предложения относятся к одной теме. Semantic chunking пытается сохранить эту целостность.

ПлюсыМинусы
Лучшее сохранение смыслаСамый медленный метод
Адаптируется под контентТребует GPU для эмбеддингов
Не режет по границам абзацевЗависит от выбора threshold

Когда применять Когда важна смысловая целостность — научные статьи (каждый абзац о разном), новости (смена темы), разговоры (смена говорящего), обсуждения на форумах.


5. Стратегия 4: Document-based chunking (по структуре документа)

Как работает Использует естественную структуру документа — заголовки (H1, H2, H3), разделы, подразделы. Каждый раздел становится отдельным чанком.

Для Markdown

# Глава 1 (чанк 1)
Текст главы 1...

## Раздел 1.1 (чанк 2)
Текст раздела 1.1...

# Глава 2 (чанк 3)
Текст главы 2...

Для HTML

<h1>Глава 1</h1>... → чанк 1
<h2>Раздел 1.1</h2>... → чанк 2

Термин «Иерархическая структура» (Hierarchical Structure Документы часто имеют вложенность: книга → главы → параграфы → подпараграфы. Document-based chunking сохраняет эту иерархию.

Термин «Заголовки H1/H2/H3» HTML-теги для заголовков разных уровней. H1 — самый главный заголовок документа, H2 — подзаголовок, H3 — подраздел.

ПлюсыМинусы
Сохраняет логическую структуруТребует документы с заголовками
Чанки имеют чёткие границыНе работает для простого текста
Легко навигировать по источникуЗависит от качества разметки

Когда применять Юридические/технические документы с чёткой иерархией — договоры (разделы, пункты, подпункты), техническая документация (главы, разделы), книги, стандарты, законы.


6. Стратегия 5: Sliding window (скользящее окно)

Как работает Чанки перекрываются с большим overlap, создавая «скользящее окно» по документу. Каждый следующий чанк начинается не там, где кончился предыдущий, а на несколько предложений/токенов раньше.

Документ: [A][B][C][D][E][F][G][H][I][J]

Чанк 1: [A][B][C][D][E]
Чанк 2:        [D][E][F][G][H]
Чанк 3:              [G][H][I][J]

Формула Если chunk_size = 1000 токенов, overlap = 400 токенов, то каждый следующий чанк начинается на 600-м токене предыдущего.

ПлюсыМинусы
Максимальное сохранение контекстаМного дублирования (больше токенов)
Не теряет информацию на границахДороже (больше эмбеддингов)
Идеален для последовательных данныхМожет создавать много похожих чанков

Когда применять Когда контекст на границах критичен и нельзя потерять ни одного связующего звена — чаты (реплики связаны), диалоги агентов, код (функции, которые вызывают друг друга), видео-транскрипции (соседние предложения), временные ряды (данные с датчиков).


7. Сравнение стратегий (сводная таблица)

СтратегияСложностьСкоростьСохранение смыслаСохранение структурыПерекрытие
Fixed-sizeНизкаяОчень высокаяНизкоеНетОпционально
RecursiveНизкаяВысокаяСреднееЧастичноеДа
SemanticВысокаяНизкаяВысокоеНетНет
Document-basedСредняяСредняяВысокоеПолноеНет
Sliding windowСредняяСредняяСреднееНетВысокое

8. Как выбрать стратегию (практические рекомендации)

Тип данныхРекомендуемая стратегияПочему
Логи сервера, JSON, CSVFixed-sizeДанные однородны, структура не важна
Статьи, новости, блоги, письмаRecursiveCharacterTextSplitterДефолтный выбор, работает везде
Научные статьи, новости со сменой темSemantic chunkingВажна смена темы, а не границы абзацев
Юридические договоры, тех. документацияDocument-basedЕсть иерархия (разделы, подразделы)
Чаты, диалоги агентов, кодSliding windowКонтекст на границах критичен
Смешанные данныеКомбинацияПробуйте A/B тест

Термин «A/B тест в chunking» Сравнение двух стратегий chunking на одном датасете запросов. Измеряем recall@k, MRR, faithfulness. Выбираем стратегию с лучшими метриками.


9. Пет-проект для закрепления

Задача Сравнить 4 стратегии chunking на своём датасете документов.

Инструменты Python, LangChain, Qdrant, BAAI/bge-m3

Шаги

  1. Взять 10 документов разного типа (статья, новость, диалог, код, договор)
  2. Для каждого документа применить 4 стратегии:
  3. Для каждого подхода: индексировать, задать 10 вопросов
  4. Замерить метрики retrieval (hit rate, MRR) для каждого
  5. Написать вывод: какая стратегия лучше для какого типа данных

Ожидаемый результат Таблица с метриками и понимание, что semantic chunking лучше для статей, document-based — для договоров, sliding window — для диалогов, recursive — универсальный компромисс.


Связь с другими вопросами

ВопросТема
1Проектирование RAG (где chunking — ключевой этап)
2Lost in the middle (chunking влияет на позицию информации)
5Оценка retrieval (как сравнить стратегии)
14Обрезка контекста (большие чанки могут не влезть)
19Хранение истории диалога (sliding window для чатов)
86Retrieval не находит (неудачный chunking — частая причина)

3 Какие стратегии chunking'а вы знаете и когда какую применяете|3 Какие стратегии chunking'а вы знаете и когда какую применяете|3 Какие стратегии chunking'а вы знаете и когда какую применяете|3 полностью разобран. Переходим к вопросу 4, когда будете готовы|Вопрос 3 полностью разобран. Переходим к вопросу 4, когда будете готовы]]


Навигация