Основные выводы
Традиционное разбиение документов на фрагменты уничтожает жизненно важный контекст — заголовки, референты и цитаты, — превращая валидные предложения в непригодные или вводящие в заблуждение факты.
Парсинг PDF на основе страниц создает высокую долю фрагментов (до 43%), в то время как разбиение на основе предложений с учетом заголовков снижает количество ошибок до 1%.
Эффективная загрузка для генерации с дополненным извлечением (RAG) требует сохранения контекста на этапе парсинга и явного тегирования метаданными до того, как векторы будут проиндексированы или переданы большим языковым моделям (LLMs).
Системы поиска зависят от этапа, которому уделяется сравнительно мало внимания. Прежде чем документ можно будет искать, цитировать или использовать для ответа на вопрос, его необходимо разделить на части, достаточно малые для индексации и передачи модели.
Само по себе разделение тривиально в реализации. Сохранение смысла при этом — нет.
Предложение, извлеченное со страницы 40 документа, больше не знает, что оно пришло со страницы 40. Оно не знает, под каким заголовком оно находилось, на что ссылались его местоимения или что на самом деле говорит цитируемый им закон. Документ содержал всю эту информацию. Извлеченное предложение не содержит ничего из этого, и ничто на последующих этапах не сможет это восстановить.
В этой статье я документирую пять ошибок, обнаруженных в производственной системе загрузки документов, вместе с измерениями, полученными в ней, представляю сводку соответствующего исследования и предлагаю пять способов устранения этих ошибок.
5 ошибок в производственных конвейерах загрузки
Парсинг текста документов для последующих задач, таких как RAG, часто выглядит как решенная проблема — до тех пор, пока вы не изучите сохраненные результаты. Большинство стратегий разбиения страдают не от сложных алгоритмических сбоев, а от структурных упущений при извлечении: предложения теряют свой контекст, разрывы страниц делят слова посреди мысли, а заголовки исчезают или сливаются с соседним текстом.
Эти пять различных типов сбоев в производственных конвейерах загрузки показывают, как стандартные процессоры документов непреднамеренно искажают данные еще до того, как их увидит модель:
- Предложение перестает быть интерпретируемым
Предложение перестает быть интерпретируемым
- Граница страницы не является границей предложения
Граница страницы не является границей предложения
- Структура заголовков определяется, а затем отбрасывается
Структура заголовков определяется, а затем отбрасывается
- В веб-контенте текст заголовка хуже, чем его отсутствие
В веб-контенте текст заголовка хуже, чем его отсутствие
- Предложение ссылается на источник, который никогда не разрешается
Предложение ссылается на источник, который никогда не разрешается
Предложение перестает быть интерпретируемым
Рассмотрим одно извлеченное утверждение:
«Он вмещает до 128 ключей».
Референтом для местоимения «он» был заголовок тремя строками выше предложения, и этот заголовок не был включен в извлеченный фрагмент. Теперь это утверждение непригодно для использования, хотя оно остается грамматически правильным и будет возвращено поиском так, будто оно является полным.
Это общий случай. Четыре следующие ошибки являются его вариациями.
Эта ошибка устраняется способами 1 и 2.
Граница страницы не является границей предложения
Деление PDF постранично — интуитивный подход, потому что страница является понятной единицей для читателя-человека. Но это не единица смысла для парсера.
Измерения по 590 страницам 686-страничного документа, содержащим хоть какой-то текст, показали, что 73% страниц начинались посреди предложения, а 78% заканчивались посреди него. В одном случае граница страницы разделяла слово «стандарты» (standards), и впоследствии двум разным вызовам модели было предложено вывести факт из каждой половины этого слова.
Последствия сохраняются далеко за пределами процесса загрузки. Когда этот документ обрабатывался с использованием постраничного деления, 43% полученных сохраненных утверждений не заканчивались точкой. Это фрагменты предложений, которые были записаны как факты и возвращаются в качестве ответов на вопросы:
«общий доход по ставке, указанной в любом Центральном акте для соответствующего налогового года».
Тот же документ, повторно обработанный через четыре дня после исправления логики разбиения, дал показатель в 1%. Стоит отметить, что разбиение на основе предложений создало меньше фрагментов, чем постраничное, а не больше.
Эта ошибка устраняется способом 3.
Структура заголовков определяется, а затем отбрасывается
Почти каждый парсер уже определяет заголовки, так как обнаружение заголовков — это способ понять, где один блок закончился, а другой начался. Обнаружив их, большинство реализаций затем отбрасывают текст заголовка.
Таким образом, структурная информация проходит через парсер и удаляется строкой позже.
Сохранение этой информации не требует дополнительного чтения документа и дополнительных выводов, поскольку она уже доступна в точке отбрасывания. В одной рабочей кодовой базе все исправление состояло из стека, поддерживаемого во время обхода, который уже выполнялся.
Эта ошибка устраняется способами 1 и 2.
В веб-контенте текст заголовка хуже, чем его отсутствие
Заголовок не заканчивается точкой. Следовательно, логика извлечения текста, разделяющая по знакам препинания конца предложения, соединит заголовок с абзацем под ним и сохранит результат как единое целое. Этот фрагмент затем становится цитатой-доказательством:
«Пределы ключей EdgeKV Пространство имен вмещает до 128 ключей».
Такое предложение на исходной странице отсутствует. Два заголовка и один абзац были объединены в одно утверждение. На одной измеренной странице 11 заголовков разделов были сохранены как самостоятельные факты, каждый из которых приписывался документу как нечто им утвержденное.
Эта ошибка устраняется способом 4 и предотвращается на границах страниц способом 3.
Предложение ссылается на источник, который никогда не разрешается
Документы часто ссылаются на самих себя и друг на друга, а тексты законов делают это чаще других:
«Независимо от чего-либо, содержащегося в статье 67, в случаях, когда активы компании распределяются...»
Предложение точено, но его нельзя использовать изолированно. Строка «статья 67» занимает текст так же, как и любые другие слова, поэтому утверждение выглядит полным и не содержит указаний на то, что оно зависит от материала в другом месте.
Из 3651 сохраненного утверждения 1188 — примерно каждое третье — ссылались на другую часть документа или на другой документ целиком. Всего было 1665 ссылок, из которых 493 были уникальными, включая статьи, подразделы, приложения, главы и названные законы.
Здесь часто смешиваются три разные операции, и это различие имеет значение.
- Запись ссылки бесплатна и не несет риска, поскольку ссылка является собственным текстом документа.
Запись ссылки бесплатна и не несет риска, поскольку ссылка является собственным текстом документа.
- Разрешение ссылки — это операция поиска, которая требует собственных доказательств и может завершиться ошибкой.
Разрешение ссылки — это операция поиска, которая требует собственных доказательств и может завершиться ошибкой.
- Замена ссылки ее содержимым — замена «статьи 67» тем, что говорится в статье 67, — представляет собой модель, редактирующую закон, и создает артефакт, который ничто на последующих этапах не сможет отличить от оригинала.
Замена ссылки её содержимым — замена «статьи 67» тем, что в ней говорится — представляет собой модель, которая редактирует закон и создает артефакт, который ничто на последующих этапах не может отличить от оригинала.
Этот сбой устраняется исправлением 5.
Как исследования подходят к извлечению доказательств и отслеживанию происхождения
Два вопроса в этой области были тщательно изучены:
- Как сделать извлеченный фрагмент самодостаточным?
Как сделать извлеченный фрагмент самодостаточным?
- Как зафиксировать его происхождение?
Как зафиксировать его происхождение?
Эти вопросы рассматривались в исследованиях в следующих областях:
Деконтекстуализация
Decontextualization определяется как задача переформулирования предложения таким образом, чтобы оно могло выдерживать удаление из контекста без изменения смысла. Наиболее полезным вкладом этого исследования является наблюдение, что некоторые предложения не могут быть переписаны таким образом, и что их выявление само по себе является частью правильного результата: авторы сообщают, что примерно 40% предложений были классифицированы либо как не поддающиеся деконтекстуализации, либо как не требующие никаких изменений вообще.
Исследование , цитирующее эту работу, сообщает об относительной доле улучшения до 30% по среднему обратному рангу (mean reciprocal rank) для деконтекстуализированных доказательств по сравнению с предложениями «слово в слово». Средний обратный ранг — это среднее значение от деления 1 на позицию первого правильного результата среди всех запросов, поэтому оценка 1.0 означает, что правильный ответ всегда возвращался первым, 0.5 означает, что он обычно был вторым, а все, что ниже примерно 0.1, означает, что пользователи прокручивают мимо 10 результатов, прежде чем найти его.
Claimify
Метод на базе LLM Claimify извлекает утверждения из пары вопрос-ответ в четыре этапа:
- Конструирование: На первом этапе ответ разбивается на предложения и для каждого строится контекст, представляющий собой настраиваемую комбинацию окружающих предложений и метаданных документа, включая иерархию заголовков (исправление 1 под другим названием).
Конструирование: На первом этапе ответ разбивается на предложения и для каждого строится контекст, представляющий собой настраиваемую комбинацию окружающих предложений и метаданных документов, включая иерархию заголовков (исправление 1 под другим названием).
- Выбор: На этапе выбора отбрасывается материал, который ничего не утверждает.
Выбор: На этапе выбора отбрасывается материал, который ничего не утверждает.
- Устранение неоднозначности: Определяет, является ли предложение неоднозначным, и если окружающий контекст не может разрешить неоднозначность, отклоняет его, вместо того чтобы угадывать.
Устранение неоднозначности: Определяет, является ли предложение неоднозначным, и если окружающий контекст не может разрешить неоднозначность, отклоняет его, вместо того чтобы угадывать.
- Декомпозиция: Декомпозиция порождает утверждения. Авторы сообщают, что 99% полученных утверждений вытекают из исходного предложения.
Декомпозиция: Декомпозиция порождает утверждения. Авторы сообщают, что 99% полученных утверждений вытекают из исходного предложения.
DnDScore
DnDScore служит предостережением против бездумного применения как декомпозиции, так и контекстуализации. Декомпозиция делает каждый факт простым; контекстуализация делает каждый факт более объемным. Применение обоих методов оставляет оценщика неспособным определить, какой именно компонент проверяется.
HiChunk
HiChunk дообучает языковую модель для восстановления многоуровневой структуры документа. Его более значительным вкладом является прилагаемый бенчмарк HiCBench, который авторы представили на том основании, что существующие наборы тестов не могли отличить хорошее разбиение на чанки от плохого, поскольку поддерживающие доказательства были слишком разреженными, чтобы размещение границ могло повлиять на оценку.
RAPTOR
RAPTOR кластеризует фрагменты, суммирует каждый кластер, а затем рекурсивно кластеризует полученные суммаризации. Извлечение из получившегося дерева в сочетании с GPT-4 улучшило лучший предыдущий результат на бенчмарке QuALITY на 20 пунктов абсолютной точности.
Contextual Retrieval
Contextual Retrieval использует модель, которая генерирует короткую пояснительную заметку для каждого фрагмента и индексирует ее вместе с ним, сообщая, что частота сбоев поиска в топ-20 снизилась на 49%, а в сочетании с переранжированием — на 67%.
Позднее разбиение на чанки
Late chunking обрабатывает весь документ с помощью модели эмбеддингов с большим контекстом и применяет границы чанков после этого, на этапе пулинга среднего (mean-pooling), так что вектор каждого фрагмента отражает весь документ без генерации какого-либо нового текста.
Три системы решают исходную проблему напрямую.
GROBID
GROBID перестраивает PDF-файлы в TEI XML, хотя и с особым акцентом на технические и научные публикации, а не на документы в целом.
DocParser
DocParser парсит полную структуру документа, включая вложенные рисунки, таблицы и структуры ячеек таблиц.
Docling
Docling преобразует PDF, файлы Office, HTML и изображения в единую модель документа, которая сохраняет порядок чтения, таблицы и происхождение. Его инструмент разбиения выдает путь к разделу и ограничивающие рамки на уровне страниц для каждого чанка, что делает его ближе всего к эталонной реализации исправлений, которые мы обсудим далее.
5 структурных исправлений на этапе парсинга
Парсинг неструктурированного текста документов в чистый контекст на уровне чанков редко является проблемой ИИ — почти всегда это архитектурная проблема. Вместо того чтобы полагаться на тяжелые вызовы LLM для восстановления фрагментированных документов или вывода пропущенных заголовков на последующих этапах, все пять исправлений, описанных в таблице, выполняются непосредственно во время парсинга без единой зависимости от моделей.
Перенося эти исправления выше по потоку в однопроходный обход документа парсером, вы можете систематически устранять структурные ошибки, сохранять межстраничный контекст и обеспечивать гораздо более надежное разбиение на чанки для последующего поиска.
Сохранение текста заголовков
1, 3
Стек, поддерживаемый во время парсинга
Перенос стека через границы страниц
1, 3
Состояние парсера, ограниченное рамками документа
Деление по предложениям, а не по страницам
Разделитель предложений с защищенным объединением
Исключение заголовков из текста абзацев
Типизация блоков до извлечения текста
Запись ссылок без их разрешения
Сопоставление с образцом в сохраненном поле
Все пять исправлений происходят во время парсинга; ни одно из них не требует модели
Сохранение текста заголовков
Обход документа по порядку с поддержанием единого списка открытых в данный момент заголовков. При обнаружении заголовка уровня N извлекаются все записи уровня N или глубже, затем добавляется новый заголовок; каждый создаваемый блок получает копию списка. Уровни заголовков определяются от h1 до h6 в HTML или по размеру и начертанию шрифта в PDF. Дополнительный обход не требуется, так как парсер уже выполняет этот проход.
Перенос стека через границы страниц
Стек заголовков является свойством документа, а не страницы. Реализация, которая перебирает страницы и создает новый экземпляр парсера для каждой из них, сбросит стек несколько сотен раз на длинном документе; итерация должна происходить внутри одного обхода, которому она принадлежит. Колонтитулы должны быть предварительно удалены, иначе заголовок, повторяющийся в начале каждой страницы, будет помещен в стек как настоящий заголовок.
Делите на предложения, а не на страницы
Объединяйте перед разделением: везде, где последний блок на странице не заканчивается точкой, а следующая страница не начинается с заголовка, объедините их и исправьте переносы слов, вызванные разрывом строки. Затем примените инструмент разделения на предложения — pysbd, spaCy и ICU break iterator отлично подходят, и ни один из них не является моделью — и упаковывайте полные предложения до достижения лимита размера.
Проверка заголовка служит условием остановки, а не механизмом контекста. Страница со следующим за ней фрагментом, начинающимся с заголовка, действительно завершена, несмотря на отсутствие знака препинания, и неконтролируемое объединение приварило бы этот заголовок к фрагменту выше, воспроизведя ошибку 4 другим путем. Это изменение снизило частоту появления фрагментов с 43% до 1%.
Не допускайте попадания заголовков в текст абзацев
Основной дефект заключается в уплощении: разметка удаляется, а заключенный в ней текст сохраняется, поэтому заголовок и следующий за ним абзац превращаются в одну строку. Выполняйте типизацию блоков перед извлечением их текста, чтобы заголовок записывался в метаданные фрагмента, а не в его тело. Для уже сохраненных данных пригодным детектором является предложение, содержащее заглавную букву в середине строки без предшествующей точки.
Фиксируйте ссылки без их разрешения
Сопоставляйте формы цитирования, которые фактически используются в корпусе — раздел 67, подраздел (17), Приложение III, Глава VI-A и названия других нормативных актов — с помощью списка шаблонов и географического справочника. Сохраняйте совпадения в поле, соседнем с путем к разделу, чтобы каждый фрагмент нес как собственный текст, так и явный список своих зависимостей. Разрешение ссылок должно происходить на этапе запроса, где есть доступ к собственным данным и где сбой может быть очевидным.
Когда контекст для захвата отсутствует
Пять исправлений восстанавливают контекст, который документ фактически содержит. Иногда документ вообще не содержит контекста. На странице может не быть никаких заголовков вообще, предложение может начинаться с местоимения, референт которого никогда не был записан, или цитата может указывать на раздел, хранящийся в другом файле.
В таких случаях правильным действием будет зафиксировать отсутствие значения. Пустое поле означает, что документ ничего не говорил. Это не разрешение на предоставление значения по умолчанию.
Обычно выполняются три подстановки, и каждая из них представляет собой предположение, выдаваемое за факт:
- Фрагменту без предшествующего заголовка присваивается название документа или последний заголовок, замеченный на предыдущей странице.
Фрагменту без предшествующего заголовка присваивается название документа или последний заголовок, замеченный на предыдущей странице.
- Местоимение без антецедента во фрагменте разрешается в ближайшее предшествующее существительное.
Местоимение без антецедента во фрагменте разрешается в ближайшее предшествующее существительное.
- Цитата заменяется текстом раздела, на который она ссылается.
Цитата заменяется текстом раздела, на который она ссылается.
Все три подстановки недороги в реализации, и все три выдают результат, который выглядит более полным, чем то, что они заменили. В этом заключается главная трудность. Как только угаданный раздел сохраняется рядом с подлинным, ни одно последующее измерение не сможет их различить, и качество корпуса больше нельзя будет установить путем проверки.
Как Akamai может помочь
Реализация исправлений на этапе синтаксического анализа в больших масштабах требует обработки с низкими задержками до того, как данные будут сохранены в векторной памяти. Развертывая пользовательские воркеры синтаксического анализа в Akamai Functions в сочетании с Akamai Cloud for AI, группы разработки платформ могут обрабатывать потоки документов с большим контекстом глобально на периферии без затрат на исходящий трафик централизованного облака или узких мест при приеме данных.
Об авторе
Сачидананда Каркала
Сачидананда Каркала — сингапурский корпоративный архитектор с более чем 26-летним опытом стимулирования цифровой трансформации. Пройдя путь от инженера-программиста до опытного архитектора решений, он проектировал и поставлял масштабируемые корпоративные экосистемы, сложные облачные миграции и цифровые решения нового поколения для стратегических клиентов по всему региону APAC. Сачи увлечен искусственным интеллектом и использованием технологий для повышения качества пользовательского опыта. Вне работы он также любит музыку, чтение и проводить время с семьей.





