Очищайте документы перед RAG
Последнее обновление:
Очистить документ для генерации с дополненной выборкой (RAG) — значит удалить всё, что не является содержанием: колонтитулы, номера страниц и повторяющиеся стандартные тексты, которые PDF несёт на каждой странице, — до того, как оставшийся текст будет нарезан на чанки, встроен и сохранён в векторном индексе. Это наименее гламурный шаг конвейера RAG и тот, который тихо решает, работает ли выборка: индекс, построенный из неочищенного текста, хранит одно и то же обрамление сотни раз и извлекает его, как будто это знание. Эта статья объясняет, почему обрамление отравляет эмбеддинги, как нарезка на чанки работает на самом деле, почему дедупликация принадлежит этапу до встраивания, что снимать и что сохранять, и как оценить, помогла ли очистка. Чтобы сделать саму очистку, используйте очиститель документов и читайте свои собственные результаты рядом с этим руководством.
Почему обрамление страницы отравляет эмбеддинги
Модель эмбеддинга превращает чанк текста в вектор, который должен улавливать, о чём этот чанк. Дайте ей чанк, который наполовину состоит из названия отчёта, нижнего колонтитула о конфиденциальности и номера страницы, и вектор верно уловит и это тоже — что означает, что каждый чанк в длинном документе дрейфует к одному и тому же обрамлению, а чанки, которые должны быть далеко друг от друга в векторном пространстве, оказываются искусственно близко, потому что делят один колонтитул. Выборка тогда делает ровно то, о чём её попросили: на вопрос о разделе политики возврата она возвращает пять чанков, чьим сильнейшим общим сигналом является название компании в верхнем колонтитуле. Никто не совершил ошибки моделирования. Индекс был набит шумом в полную силу, повторяющимся на каждой странице, а шум, который повторяется, неотличим от сигнала для системы, которая считает сходство.
Ущерб хуже, чем разбавление. Чанки обрамления могут выиграть выборку всухую: вопрос, сформулированный как нижний колонтитул, — о конфиденциальности, контроле документов или версиях — совпадает с чанком колонтитула, который был встроен двести раз, лучше, чем с единственным абзацем, который на него действительно отвечает. Номера страниц создают более тонкий сбой, обучая модель тому, что голые числа являются содержанием, так что чанк, заканчивающийся на «42», может быть процитирован обратно, как будто число что-то значило. И каждый чанк обрамления занимает место в конечной выборке top-k, выталкивая подлинно релевантный чанк из контекста, который даётся модели. Очистка — это, следовательно, не косметическая уборка; это удаление систематического конкурента вашего собственного содержания внутри вашего собственного индекса.
Основы нарезки: размер, перекрытие и границы
Нарезка — это решение о том, какая единица будет встроена, и у неё есть три регулятора. Размер обменивает фокус на контекст: маленькие чанки, в несколько сотен символов, остро встраивают одну мысль и точно извлекаются, но могут прибыть без предложения, которое даёт мысли её условия; большие чанки, в несколько тысяч символов, несут свой контекст с собой, но смешивают несколько мыслей в один средний вектор, так что ни одна из них не извлекается сильно. Большинство документных корпусов оказывается где-то посередине — примерно от 500 до 1 000 символов является разумной стартовой областью, — и правильный ответ решается тестированием ваших собственных вопросов на ваших собственных документах, а не копированием числа из значения по умолчанию фреймворка. Документация LangChain по разделителям текста — хорошая карта семейств разделителей, от символьных и рекурсивных до учитывающих структуру.
Перекрытие — это страховка против второго регулятора, границ. Разделитель, который режет каждые 800 символов независимо от структуры, в конце концов разрежет определение пополам, и ни одна половина не будет хорошо извлекаться или читаться. Деление по границам — сначала абзацы, затем предложения, затем пробелы, как делают рекурсивные разделители — сохраняет единицы целыми большую часть времени, а скромное перекрытие в десять — двадцать процентов повторяет край одного чанка в начале следующего, чтобы разрез, который всё же происходит, не осиротил его контекст. Иерархия в документации LlamaIndex по парсерам узлов делает то же замечание со стороны загрузчика: разбирайте в узлы, которые уважают документ, а затем делите. Но ничто из этого не спасает обрамление: перекрытие верно повторяет колонтитул и в следующий чанк, поэтому очистка идёт перед нарезкой, никогда после.
Дедуплицируйте до встраивания
Дубликаты — второй систематический загрязнитель, и они бывают двух видов. Первый — дублирование целых документов: один и тот же PDF, проиндексированный дважды под разными именами файлов, старая версия, оставленная рядом с новой, вложение письма, сохранённое рядом с копией на общем диске. Второй находится внутри документа: отказ от ответственности на титульной странице и снова в приложении, резюме, повторяющееся в начале каждой главы, таблица, вставленная и в основной текст, и в приложение. Оба вида имеют одинаковое действие на выборку — дублированный текст встраивается повторно, поэтому он извлекается повторно, заполняя top-k копиями одного отрывка, пока другие отрывки никогда не всплывают, — и одинаковое действие на стоимость, потому что вы платите за встраивание и хранение каждой копии.
Дедупликация дешевле всего до встраивания, когда она ещё является сравнением строк. Точные дубликаты падают от нормализации: сверните пробелы, игнорируйте обрамление страницы, которое вы уже сняли, захэшируйте результат и сохраните одну копию. Почти дубликаты — тот же абзац с изменённой датой или перенумерованным заголовком — нуждаются в проходе сходства, но даже грубый ловит стандартный текст, который наносит наибольший ущерб. Две осторожности сохраняют дедупликацию честной. Во-первых, сохраняйте первое вхождение и записывайте, где были копии; предупреждение, повторяющееся в двух главах, может быть намеренным предохранительным устройством, и удаление его из записи полностью — это другое решение, чем удаление его из индекса. Во-вторых, дедуплицируйте после очистки, а не до: две страницы, которые различаются только номером страницы, являются дубликатами содержания, завёрнутого в разное обрамление, и только очищенный текст это раскрывает.
Что снимать и что сохранять
Снимайте то, что повторяется, не информируя: бегущие верхние и нижние колонтитулы, номера страниц, водяные знаки, баннеры конфиденциальности, сгенерированные строки «напечатано», и навигационные крошки, которые экспорт из веба в PDF штампует на каждой странице. Сохраняйте то, что структурирует: настоящие заголовки, потому что они являются сильнейшим сигналом границы чанка, который у вас есть, и часто принадлежат метаданным чанка; подписи, потому что подпись к рисунку часто является единственным текстом, который говорит, что показывает рисунок; содержимое таблиц, обращаемое осторожно, потому что лишённая обрамления таблица теряет заголовки строк и столбцов, которые дают её числам смысл; и списки, чьи элементы являются естественными единицами. Пограничный случай — оглавление. Как чанки, строки оглавления являются обрамлением — списком названий и номеров страниц, который смутно совпадает с каждым запросом и не отвечает ни на один, — но как метаданные та же страница оглавления является картой документа. Снимите её с встраиваемого текста, сохраните её в ваших заметках о корпусе.
То же суждение применяется внутри самого очистителя документов: обрамление и номера страниц отмечены по умолчанию, потому что их почти всегда безопасно удалять, в то время как дублирующиеся абзацы никогда не отмечены по умолчанию, потому что повторение иногда и есть смысл. Честность извлечения здесь тоже важна. PDF — это структурированный формат: стандарт ISO для PDF, ISO 32000, определяет страницы как потоки содержимого операций рисования и текста, а не как текучий текст, — поэтому любой экстрактор приближает порядок чтения, а отсканированный PDF вообще не имеет текстового слоя, пока OCR не даст ему один. Если ваши исходные документы важны и по другим причинам, сопроводительная статья о ваших PDF как части доступности вашего веб-сайта охватывает теговую структуру, которая помогает и экранным читалкам, и экстракторам.
Оценка выборки после очистки
Очистка — это гипотеза о том, что выборка улучшится, а гипотезы о качестве поиска проверяемы с постыдно малой машинерией. Соберите от двадцати до пятидесяти настоящих вопросов, которые ваши пользователи действительно задают, с отрывком, который должен отвечать на каждый, отмеченным вручную. Прогоните их против неочищенного индекса и очищенного индекса с тем же извлекателем, теми же настройками чанков и той же top-k, и сравните две вещи: как часто правильный отрывок вообще появляется в результатах и как высоко он стоит, когда появляется. Эта пара — полнота и ранг — и есть табло. Если очистка работает, чанки обрамления перестают появляться в результатах, правильные отрывки поднимаются, а вопросы, которые раньше проваливались, потому что нижний колонтитул перебивал ответ, начинают проходить.
Затем читайте провалы, потому что одни цифры будут вам льстить. Очищенный индекс может выиграть полноту, теряя при этом вопрос, чей ответ подлинно жил в повторяющемся резюме, которое вы дедуплицировали, или в колонтитуле, который нёс название продукта, в котором нуждался каждый чанк. Эти потери — информация: они говорят вам сохранить тот элемент как метаданные или намеренно приставить название документа к каждому чанку, вместо того чтобы встраивать его случайно двести раз. Повторно запускайте оценку всякий раз, когда меняются корпус, разделитель или модель встраивания, и держите набор вопросов версионированным рядом с индексом. Качество RAG — это не свойство запуска; это свойство обслуживания, и маленький фиксированный набор тестов — это то, что превращает «кажется, стало лучше» в нечто, что можно защитить.