1. Главная
  2. Docs
  3. Глоссарий
  4. Индексация документов

Индексация документов

15

Индексация — подготовка документов к поиску. Один раз при запуске и потом при каждом изменении: извлечь текст, нарезать на фрагменты, посчитать векторы, сохранить вместе с метаданными.

Этап скучный и потому недооценённый: именно на нём закладывается потолок качества всей системы. Плохо извлечённый текст не спасёт ни одна модель.

Пайплайн по шагам

Стадии конвейера. Извлечение текста по формату → очистка от мусора → нарезка на фрагменты → векторизация → запись в индекс с метаданными. Каждая стадия пишет журнал: какой документ, когда, с каким результатом. Без журнала конвейер молча проглатывает ошибки, и о них узнают по качеству ответов — самым дорогим способом.

Ориентиры по скорости. Извлечение текста из документов с текстовым слоем — тысячи страниц в минуту; распознавание сканов — секунды на страницу, и на корпусе из десятков тысяч сканов именно оно определяет срок проекта; векторизация при локальном инференсе — сотни–тысячи фрагментов в минуту на один ускоритель, при внешнем API упирается в лимиты запросов. Отсюда планирование: доля сканов в корпусе — главный множитель срока индексации.

Нарезка — самостоятельный этап со своими компромиссами; у чанкинга есть отдельная статья, здесь важно одно: параметры нарезки выбираются до векторизации, потому что после изменения придётся пересчитывать всё.

Извлечение текста

PDF с текстовым слоем — извлекается напрямую, но порядок чтения может быть нарушен: колонки, врезки, колонтитулы перемешиваются с основным текстом. Проверять надо глазами на выборке, а не доверять библиотеке.

Сканы — требуют распознавания. Его качество определяет всё дальнейшее: ошибка в цифре суммы или номере пункта уйдёт в индекс и будет уверенно процитирована. Для многостраничных договоров и приложений к ним разметка «что есть страница, а что — штамп поверх текста» часто важнее самого распознавания.

Офисные документы — извлекаются надёжнее, но теряют структуру таблиц. Несколько версий одного файла в каталоге — источник конфликтов: в индекс должен попадать один определённый экземпляр, а не все.

Веб-страницы — нужна очистка от меню, подвалов и баннеров, иначе индекс заполнится навигацией.

Таблицы и изображения — отдельная задача. Таблица, превращённая в поток текста, теряет смысл; диаграмма без подписи не индексируется вовсе. Рабочий приём для таблиц — превращать строку в текстовое предложение «поле — значение» перед нарезкой.

Разбор того, как вытащить данные из разных форматов без потери структуры, — тема материала про извлечение данных из документов.

Дедупликация

Зачем. Дубли в индексе не безобидны: почти одинаковые фрагменты занимают несколько мест в выдаче, вытесняя другие релевантные, и завышают стоимость контекста. Хуже то, что редакции одного документа с мелкими правками дают «похожие, но разные» ответы, и система уверенно цитирует устаревший вариант.

Точные дубли. Ловятся сравнением контрольных сумм текста фрагмента — дёшево и без настроек. Удалять лучше до векторизации: считать вектор дважды для одного текста — прямые потери.

Почти-дубли. Ловятся сигнатурами: текст разбивается на перекрывающиеся сочетания из нескольких соседних слов, по набору сочетаний строится устойчивая сигнатура, и документы с близкими сигнатурами сравниваются уже целиком. Так находятся версии с правками и пересылками, которые контрольная сумма не видит.

Что делать с найденным. Не удалять автоматически: из группы близких документов выбирается канонический экземпляр по правилу — новейшая дата, статус «действует», источник из справочной системы, — а правило фиксируется. Автоудаление без правила стирает единственную копию, когда правило ошиблось.

Метаданные

Вместе с фрагментом сохраняют источник и ссылку, раздел или номер пункта, дату документа и редакцию, права доступа, тип документа.

Каждое поле имеет практическое назначение: ссылка нужна, чтобы человек мог проверить ответ; дата — чтобы отфильтровать устаревшее; права — чтобы сотрудник не увидел лишнего. Без метаданных система работает, но проверить её ответы нельзя.

Метаданные заполняются при индексации или не заполняются вовсе. Дописать дату и права к миллиону уже записанных фрагментов — отдельный проект; поэтому состав полей фиксируется до первого прогона, а недостающие поля в источнике помечаются явным «неизвестно», чтобы фильтрация не интерпретировала пустоту как «подходит всем».

Обновление: полная и инкрементальная переиндексация

Полная переиндексация — просто и предсказуемо, годится, пока объём невелик.

Инкрементальная — обрабатываются только изменившиеся документы. Изменение обнаруживается контрольной суммой файла или меткой версии в источнике; сам обмен фрагментов делается атомарно: сначала удалить все фрагменты старой версии документа, затем записать новые, иначе в индексе временно живут обе редакции. Незакрытый вопрос удаления приводит к тому, что система отвечает по отменённому регламенту, при этом ссылаясь на реальный документ.

Триггер обновления. Надёжнее событие — документ изменён в источнике, — чем расписание: расписание всегда отстаёт на период, а событие — на время обработки. Периодическая полная сверка индекса с источником остаётся как страховка от пропущенных событий.

Лаг индексации — эксплуатационная метрика. Время от изменения документа до возможности найти его фрагменты. Если регламенты правят еженедельно, а лаг составляет квартал, система вводит людей в заблуждение; лаг выводится на мониторинг наравне с ошибками конвейера.

Контроль качества индекса

После каждого прогона. Сколько документов не обработалось и почему — молча пропущенные файлы обычное дело; есть ли фрагменты с пустым или мусорным текстом; совпадает ли число фрагментов с ожидаемым порядком величины.

Регулярно, а не один раз. Выборочная глазами проверка извлечённого текста у десятка документов разных типов; доля почти-дублей в индексе; распределение длин фрагментов — всплеск у нуля означает мусор, всплеск у максимума — неработающую нарезку. Находятся ли по тестовым запросам известные фрагменты — прогон «золотых» запросов, это дешёвый аналог метрик RAG на уровне индекса.

Деградация копится тихо. Индекс живёт месяцами, корпус дрейфует — новые документы, новые форматы, забытые источники; это дрейф данных. Без регулярного контроля качества первое внешнее проявление — жалобы на ответы, и разбираться тогда придётся по цепочке от генерации обратно к индексации.

Частые вопросы

Как часто переиндексировать?

По частоте изменения документов, а не по расписанию «раз в месяц». Если регламенты правятся еженедельно, а индекс обновляется раз в квартал, система будет уверенно отвечать по отменённым редакциям — и это хуже, чем отсутствие системы.

Что делать со сканами?

Распознавать, но сначала оценить качество распознавания на выборке. Ошибка в цифре или номере пункта попадёт в индекс и будет процитирована как факт. Если качество низкое, дешевле получить исходные файлы, чем строить систему на плохо распознанном тексте.

Нужно ли удалять старые фрагменты при обновлении?

Обязательно. Незакрытый вопрос удаления — частая причина того, что система отвечает по отменённому документу и при этом ссылается на реальный источник. Проверить просто: измените документ, переиндексируйте и задайте вопрос по старой редакции.

Сколько времени занимает индексация?

Зависит от объёма, типа документов и того, локально или через внешний сервис считаются векторы. Оценивать надо на своей выборке: разброс между «минуты» и «сутки» определяется прежде всего долей сканов, требующих распознавания.

Как обнаружить дубли в уже собранном индексе?

Точные — сравнением контрольных сумм фрагментов, почти-дубли — сигнатурами по сочетаниям соседних слов. Порог «почти одинаковые» подбирается на выборке пар глазами: сначала глазами, потом правилом на весь корпус. Удалять лучше с выдачей отчёта «что и почему удалено», чтобы правило можно было оспорить до потери данных.

Какие метрики здоровья индекса стоит мониторить постоянно?

Доля ошибок конвейера и молча пропущенных файлов, лаг индексации, доля пустых и мусорных фрагментов, доля почти-дублей и результаты прогона «золотых» запросов. Эти метрики дёшевы и снимаются автоматически; их сдвиг — ранний сигнал, что качество ответов упадёт через недели.

Индексировать ли черновики и архивные версии?

По умолчанию — нет: они дают ответы по отменённым решениям с честной ссылкой на источник, что сбивает и пользователей, и проверяющих. Архив включают в индекс только отдельным типом с метаданными статуса и фильтром «только по явному запросу пользователя». Решение фиксируется в правилах источника, а не в настройках индексации на месте.

Что почитать по теме