Единица 3 / 11

Разбиение на части и подготовка документов

Прибыль:

  • Численная оценка размера фрагмента, перекрытия и компромиссов семантического фрагментирования.
  • Выбор подходящей стратегии разделения на блоки для разных типов документов (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 предотвращает потерю границ.
  • [ ] Я могу различать фрагменты на основе скобок, семантику и структуру с учетом структуры.
  • [ ] Я могу адаптировать стратегию для стола, кода и чата.
  • [ ] Я усиливаю поиск, добавляя метаданные и название главы к каждому треку.