Прибыль:
- Численная оценка размера фрагмента, перекрытия и компромиссов семантического фрагментирования.
- Выбор подходящей стратегии разделения на блоки для разных типов документов (PDF, таблица, код, журнал чата)
- Улучшите качество поиска и фильтрации, добавив метаданные в каждый фрагмент.
Это самый игнорируемый, но самый решающий шаг в RAG: как вы разбиваете документ. Это называется фрагментированием. Даже если вы передаете один и тот же документ одной и той же модели, из-за неправильного фрагментирования при поиске возвращается неверная часть, и модель никогда не даст хорошего ответа. В этом модуле мы рассмотрим стратегии фрагментации, как их адаптировать в соответствии с типом документа и как добавить значимые метаданные к каждому фрагменту.
Почему мы измельчаем?
Есть три причины. Во-первых, модели внедрения преобразуют текст до определенной длины в значимый вектор; Если всю 40-страничную главу втиснуть в один вектор, смысл становится «размытым». Во-вторых, мы хотим дать модели только ту часть, которая необходима в качестве контекста; передача всего документа обходится дорого и отвлекает. В-третьих, чтобы поиск был точным, поисковая группа должна быть небольшой и целенаправленной.
Таким образом, чанк — это наименьшая единица поиска. Он не должен быть слишком большим или слишком маленьким – в самый раз.
Размер чанка и баланс перекрытия
Существует две основные настройки: размер фрагмента (сколько токенов/слов будет в фрагменте) и перекрытие (часть, общая для соседних фрагментов).
Очень маленькие фрагменты (например, 100 токенов): сфокусированные, но оторванные от контекста. Он говорит «на 14 дней», но в предыдущем предложении осталось то, что такое 14 дней. Очень большие фрагменты (например, 2000 токенов): контекст сохраняется, но в них смешивается множество потоков; встраивание становится запутанным, и нерелевантные темы собираются вместе.
Перекрытие решает проблему границ. Если предложение попадает точно на границу двух частей, оно делится на две части без перекрытия и теряется смысл. Перекрытие 50-100 токенов гарантирует, что информация, попадающая в лимит, останется нетронутой хотя бы в одной части.
Размер чанка
Преимущество
Недостаток
соответствующий контент
Малый (100-250 жетонов)
Высокая чувствительность, сосредоточенность.
Контекст может сломаться
Часто задаваемые вопросы, короткие статьи, определения
Средний (300-600 токенов)
Баланс; большинство сценариев
—
Процедуры, тексты политики
Большой (800-1500 жетонов)
Целостность контекста
размытое встраивание
Повествование, длинные объяснения.
Совет: если вы не знаете, с чего начать, начните с фрагмента из 400–500 токенов и перекрытия из 50–80 токенов; затем измерьте и отрегулируйте свои собственные данные. «Правильный» размер не является универсальным, он зависит от контекста.
Стратегии разделения на части
Фиксированный размер: текст обрезается каждые N токенов. Это просто и быстро, но может прерваться на полуслове.
На основе разделителя (рекурсивный/разделитель): Деление происходит по границам абзаца, а затем по предложению; Это лучше сохраняет целостность смысла. Большинство производственных систем начинаются с этого.
Семантическое разбиение на части: оно смотрит на вложения предложений и делит их там, где происходит смена субъекта. Это самый качественный, но самый дорогой метод; При больших объемах транзакционные издержки возрастают.
С учетом структуры: использует структуру документа, такую как заголовки, разделы, таблицы. Например, разделение документа Markdown по заголовкам гарантирует, что каждая часть будет иметь собственный заголовок.
Адаптация по типу документа
Не все документы одинаковы. Стратегия различается в зависимости от типа:
- PDF/текст политики: на основе закладок, средний размер. Очистите повторы сверху/снизу страницы (верхний/нижний колонтитул).
- Таблицы: Не вырывайте строку из контекста; сохраняйте каждую строку с информацией заголовка («Товар: X, Цена: Y, Запас: Z»). Преобразование необработанной таблицы в обычный текст часто бывает необходимо.
- Код: разделение по границам функций/классов; Не отсекайте функцию.
- Запись чата/тикета: разделена по сообщениям или раундам разговора; Следите за тем, кто что сказал.
# фрагментирование (концептуальные) фрагменты на основе скобок = bol( text, target_size=450, # перекрытие токена=70, # скобки токена=["\n\n", "\n", ". ", " "] # первый абзац, последнее слово)
Добавьте метаданные к каждому треку
Разделение на части – это не просто «разделение»; состоит в том, чтобы обогатить каждую часть. Каждый тег, который вы прикрепляете к треку, на вес золота для будущей фильтрации и цитирования источников.
# Расширенный фрагмент (концептуальный) { "text": "Ежегодный оплачиваемый отпуск составляет 14 дней при стаже работы от 1 до 5 лет...", "metadata": { "source": "ik_el_kitabi_v7.pdf", "section": "5.2 Ежегодный отпуск", "page": 23, "date": "2025-06", "department": "IK", "privacy": "internal" }}
Еще один мощный метод — добавление контекстного заголовка: в начале каждого фрагмента пишется название главы, к которой он принадлежит. Таким образом, даже такая разрозненная статья, как «На 14 дней», лучше вписывается и имеет большее значение, чем «Ежегодный отпуск – 14 дней».
Слабое дробление / Сильное дробление
Слабое (слепая резка, без метаданных):
Обрезать текст каждые 1000 символов. Оставить только текст.# Результат: таблицы разбиты посередине, "14 дней" остается без контекста, # неизвестно из какого документа оно взято, фильтр сделать нельзя.
Мощный (с учетом структуры + заголовок + метаданные):
Разделить документ по заголовкам; добавьте заголовок раздела к каждой части; прикрепите метаданные источника, страницы, даты и конфиденциальности; конвертировать строки таблиц в простой текст с их заголовками.# Результат: сфокусированный, контекстуальный, фильтруемый, с возможностью источника.
Три мини-кейса
Случай 1 — Катастрофа с покраской. Финансовая команда разделила 200-страничный прайс-лист с жесткой обрезкой вслепую; строки таблицы были разделены случайным образом. «Какова цена товара X?» Модель прочитала неверную строку и указала неправильную цену (9 из 12 случаев неверны). Когда я преобразовал строки таблицы в обычный текст в формате «Товар:… | Цена:… | Единица измерения:…» ошибка уменьшилась до 0 из 12.
Случай 2 — Чрезвычайно большой кусок. В вики каждая страница состоит из одного фрагмента (некоторые говорят, что он состоит из 3000 токенов). Встраивание размыто, поскольку на одной странице есть «отпуск», «сверхурочная работа» и «заработная плата»; Раздел о рабочем времени также сыграл важную роль в отношении вопроса об отпуске. Когда страницы были разделены по заголовкам на средние, отзыв@5 увеличился с 64% до 91%.
Случай 3 — Сокращенное предложение без дублирования. Фиксированное сокращение 250 токенов для команды юристов, без дублирования. Критическое определение попало прямо на границу двух частей и раскололось надвое; Ни то, ни другое не содержит полного ответа. Когда было добавлено перекрытие из 60 токенов, то же определение осталось целым и был возвращен правильный ответ.
Распространенные ошибки
- Слепое фиксированное вырезание: предложения и таблицы разделяются посередине; смысл теряется.
- Оставляем перекрытие равным нулю: информация, попадающая на границу, разделяется и теряется.
- Без добавления метаданных: фильтрация и отображение источника становятся невозможными.
- Оставление таблиц необработанными: модель не может разрешить структуру таблицы; Преобразование строк в обычный текст.
- Навязывание одной стратегии: PDF, код и таблица не разделяются одним и тем же методом; Адаптируйтесь к жанру.
Внимание: не устанавливайте Chunking один раз и не забывайте об этом. Переоценивайте качество поиска по мере появления новых типов документов (билеты из новой системы, отсканированные PDF-файлы). Плохие входные данные означают плохой ответ («мусор на входе, мусор на выходе»).
В заключение
- Чанк — это наименьшая единица поиска; Не слишком большой и не слишком маленький – он должен быть сбалансирован по содержанию.
- Размер фрагмента указывает на баланс фокуса и контекста; Перекрытие управляет потерей границ.
- Разбиение на блоки на основе скобок и с учетом структуры является отправной точкой большинства систем генерации; семантическое разделение — это хорошее качество, но дорогое.
- Такие типы, как таблица, сценарий и чат, требуют своих собственных стратегий; Преобразование таблиц в обычный текст.
- Добавьте метаданные источника/даты/главы/конфиденциальности и название раздела к каждому треку; Это основа фильтрации и цитирования.
Задача приложения
Разбейте выбранный вами раздел документа на три различных способа: (1) маленькие части по 200 жетонов, (2) средние части по 500 жетонов (70 жетонов перекрываются), (3) отдельные большие части. Задайте одни и те же 3 вопроса для каждой стратегии, вручную отметьте, какую часть следует внести, и запишите обоснование того, какая стратегия лучше всего подходит для этого документа. Затем добавьте к каждой дорожке как минимум четыре поля метаданных и «название главы». Если документ содержит таблицу, преобразуйте строку таблицы в обычный текст в формате «поле:значение».
контрольный список
- [ ] Я могу сказать, что чанк — это наименьшая единица поиска, а размер — это баланс фокуса и контекста.
- [ ] Я знаю, почему Overlap предотвращает потерю границ.
- [ ] Я могу различать фрагменты на основе скобок, семантику и структуру с учетом структуры.
- [ ] Я могу адаптировать стратегию для стола, кода и чата.
- [ ] Я усиливаю поиск, добавляя метаданные и название главы к каждому треку.