Vision-first RAG: как PULSAR удвоил точность ответов на 2,4 млн страниц

Vision-first RAG: как PULSAR удвоил точность ответов на 2,4 млн страниц

Представьте, что из каждых ста рублей, которые ваша RAG-система тратит на подготовку документов, семьдесят три улетают в мусорную корзину. Именно так работал классический пайплайн у одной инвестиционной компании: языковая модель описывала каждую диаграмму словами, но фильтр качества отбраковывал 73% этих описаний. Деньги заплачены, результата нет. Команда Mubadala совместно с Microsoft и Inception42 переписала систему с нуля, и результат описан в свежей статье на arXiv: PULSAR, production-система поиска по 2,4 миллионам страниц корпоративных документов, где единица индексации не текст, а изображение страницы. Точность ответов при этом выросла более чем вдвое.

Что такое vision-first RAG

Vision-first RAG (Retrieval-Augmented Generation, генерация с дополненным поиском) это подход, при котором документы индексируются как изображения страниц, а не как извлечённый текст. Визуальная языковая модель превращает каждую страницу в набор векторов напрямую, без OCR и без промежуточного текстового описания. При ответе система находит нужные страницы и показывает их изображения генеративной модели, которая читает оригинал, а не чей-то пересказ.

Идея не нова как исследование: ColPali показал её работоспособность ещё в 2025 году, а бенчмарки вроде ViDoRe регулярно ставят визуальные ретриверы выше текстовых. Новизна PULSAR в другом. Это не очередная модель и не новый алгоритм поиска, а инженерная работа по доведению парадигмы до production на реальном корпоративном корпусе. Авторы честно пишут: их вклад не retrieval-примитив, а то, как заставить это работать на миллионах страниц при жёстком бюджете на железо.

Почему OCR плюс вербализация это дорогой обходной путь

Классический пайплайн для документов с диаграммами выглядит так. Сначала страницу прогоняют через OCR и модель анализа layout. Потом каждую найденную диаграмму отдельно отправляют визуальной модели, которая описывает её текстом. Затем весь этот вербализованный текст режут на чанки и эмбеддят. Три прохода по каждой странице там, где vision-first подход делает один.

Цена вопроса на корпусе из 106 тысяч страниц получилась показательной. Базовая система отправила на вербализацию 143 934 диаграммы, и только 38 868 описаний, то есть 27%, прошли фильтр качества и попали в индекс. Почти три четверти вызовов VLM купили результат, который сразу выбросили. По подсчётам авторов, инжест одной страницы в старом пайплайне обходился примерно в 20 раз дороже, чем один forward pass ColQwen3-4B в PULSAR.

Есть и вторая, менее очевидная потеря. Вербализация передаёт конкретные числа с диаграммы, но теряет то, как элементы связаны визуально: группировки, порядок, пространственные подсказки, по которым аналитик читает слайд. А именно это и спрашивают у системы. Когда вопрос звучит как «как меняется доля контрактной выручки в прогнозе», текстовое описание «на графике показана выручка» не помогает.

Late interaction: почему один вектор на страницу не работает

PULSAR построен на late interaction, подходе, который начался с ColBERT. Вместо того чтобы схлопывать документ в один плотный вектор, модель хранит по вектору на каждый токен, а похожесть считается через MaxSim: для каждого токена запроса берётся лучшее совпадение среди всех токенов документа, и результаты суммируются. ColPali перенёс эту идею на изображения: backbone разбивает страницу на патчи, каждый патч становится токеном, и MaxSim работает между текстовыми токенами запроса и патчами страницы.

Плюс очевиден: значения на диаграммах и детали layout остаются адресуемыми. Минус тоже очевиден: ColQwen3-4B выдаёт больше 2000 векторов размерности 320 на каждую страницу. На корпусе в 2,4 миллиона страниц это миллиарды векторов в индексе, и стоимость скоринга каждого запроса растёт линейно с числом патчей. Без оптимизаций такой индекс просто нельзя поднять в production: все полные векторы не помещаются в RAM кластера.

Двухступенчатый индекс: как ужать поиск в 15 раз

Решение PULSAR комбинирует два известных метода пулинга, которые раньше никто не собирал вместе на таком масштабе. На первой стадии каждая страница сжимается до от 8 до 16 векторов: патчи раскладываются по 2D-сетке, и векторы усредняются по строкам и столбцам. Эти компактные представления бинарно квантуются и живут в RAM. Запрос, наоборот, не пулится: его токены в полном виде сравниваются со сжатыми представлениями страниц через HNSW, и два таких поиска дают общий шортлист кандидатов.

На второй стадии шортлист перескоривается точным MaxSim, но тоже не по полным векторам, а по иерархически спуленным: похожие патчи кластеризуются, и каждый кластер заменяется средним. При факторе пулинга 3 остаётся примерно треть векторов, что по данным авторов ColPali сохраняет 97,8% качества NDCG@5.

Свип из десяти конфигураций на ViDoRe V3 (14 514 запросов) дал однозначного победителя. Продакшн-конфигурация, mean-пулинг с бинарным квантованием на префетче плюс иерархический пулинг на реранке, снизила медианную латентность векторного поиска с 752,7 мс до 49,9 мс. Это ускорение в 15,1 раза при потере качества меньше сотой доли NDCG@10. В оперативной памяти индекс стал занимать 12 ГБ вместо 169 ГБ, то есть в 14 раз меньше. Под нагрузкой картина ещё драматичнее: спуленный индекс держит около 47 QPS с субсекундной медианой, а непуленный упирается в 0,5 QPS и теряет больше половины запросов при 64 одновременных соединениях. В живом production за семь дней медиана поиска составила 156 мс при пиковой нагрузке 62 QPS.

Два разных DPI: дёшево индексировать, чётко отвечать

Самое элегантное решение в системе это разделение разрешений. Для построения эмбеддингов страницы рендерятся в 150 DPI, а для ответа модели хранится и отдаётся версия в 500 DPI. Оба значения получены не из воздуха, а из абляций.

С DPI эмбеддингов авторы поступили статистически строго: прогнали семь вариантов разрешения против базовых 150 и проверили эквивалентность через парный тест Уилкоксона с поправкой Холма. Разрешения от 200 до 600 DPI оказались эквивалентны 150 по качеству поиска, но дороже в инжесте. А вот 72 и 100 DPI уже теряют измеримое качество. Значит, 150 это точка минимальной стоимости без потерь.

С ответом всё наоборот. На двух инвестиционных комитетских деках (516 вопросов, размеченных экспертами) авторы меняли только разрешение изображения, которое видит отвечающая модель. Ошибки читаемости страниц монотонно падали с ростом DPI и обратились в ноль ровно на 500. На 400 DPI остаточные ошибки концентрировались на плотных диаграммах с мелкими осями и тесными легендами. Вывод простой: поиску хватает грубой картинки, а модели, которая читает цифры с графика, нужна максимальная чёткость.

Инжест, который не мешает работать

Третий слой системы отвечает за свежесть данных. В инвестиционной компании документы по сделкам меняются постоянно, причём часто прямо перед закрытием, и аналитик не может ждать ночной переиндексации. PULSAR решает это двумя механизмами.

Первый это skip-aware переиндексация. SHA-256 от сырых байтов документа позволяет пропустить неизменённые файлы целиком, а хеш каждой отрендеренной страницы позволяет переэмбеддить только изменённые страницы. Правка одного слайда в трёхсотстраничной презентации становится доступной для поиска за секунды. За семь дней пайплайн обработал 50 368 изменённых страниц, и медианный лаг от изменения до появления в поиске составил 2 секунды. Даже в самый загруженный час (5491 страница) p95 держался на 63 секундах.

Второй механизм это приоритетные очереди. Загрузки аналитиков по живым сделкам идут в высокий приоритет, почасовые синки в средний, фоновые материалы в низкий. Причём приоритет работает на двух уровнях: диспетчер выбирает, какой документ индексировать следующим, а vLLM выбирает, какой запрос на эмбеддинг выполнит GPU, вытесняя низкоприоритетные задачи и возобновляя их с последней сохранённой страницы. Поисковые запросы всегда идут с высшим приоритетом, поэтому фоновый инжест никогда не блокирует выдачу.

PULSAR против старого пайплайна: цифры

Сравнение end-to-end провели на 75 вопросах, составленных экспертами предметной области, с золотыми ответами, тоже написанными экспертами. Обе системы отвечали через одну и ту же VLM, отличался только путь индексации. Результат однозначный при любом k от 1 до 10.

При k=1 completeness ответа (оценка LLM-судьи по пятибалльной шкале) выросла с 1,68 до 3,41, а доля золотых фактов в ответе с 10,2% до 49,2%. При k=5 recall фактов в ответе составил 73,3% против 27,1% у базы. По сути, старая система при топ-1 странице находила один факт из десяти, а новая находит каждый второй. Все доверительные интервалы, кластеризованные по семи сделкам, исключают ноль.

Отдельно порадовала валидация судьи. Три эксперта вслепую переоценили 20% выборки, и их согласие с LLM-судьёй оказалось высоким: корреляция Пирсона 0,83-0,86 по completeness и 0,94-0,98 по фактам. При этом все трое независимо оценили разрыв между системами не меньше, а больше, чем судья. То есть автоматическая оценка скорее занижает преимущество PULSAR, чем раздувает его. Такая проверка встречается в индустриальных статьях редко, и это правильный стандарт.

Где подвох

Авторы честно перечисляют ограничения, и их стоит держать в голове. Все production-замеры сделаны на одном корпусе: документы private markets с высокой плотностью диаграмм и таблиц, один backbone ColQwen3-4B. На корпусе с другой структурой цифры могут съехать. Эквивалентность DPI и пулинга проверена на публичном ViDoRe V3, а не на документах самой компании. Сравнение идёт против одного конкретного baseline, а не против альтернативных vision-first стеков. И late interaction даже после всех оптимизаций остаётся тяжелее одиночного вектора на документ: пулинг снижает накладные расходы, но не обнуляет их.

Есть и этический момент, который авторы проговаривают прямо. Система влияет на инвестиционные решения, поэтому она подаётся аналитикам как советующий инструмент, а всё, что уходит в клиентские материалы, проходит человеческое ревью. Запускать такой поиск как бесконтрольного принимающего решения авторы не рекомендуют.

Часто задаваемые вопросы

Чем vision-first RAG лучше OCR с текстовым поиском?

OCR-пайплайн тратит на страницу три прохода моделей и теряет визуальные связи между элементами диаграмм. Vision-first индексирует страницу одним проходом: в PULSAR это снизило стоимость инжеста примерно в 20 раз и удвоило долю найденных фактов в ответах.

Почему нельзя просто хранить один вектор на страницу?

Одиночный вектор усредняет страницу и стирает детали: конкретные значения на графиках, структуру таблиц, расположение легенд. Late interaction хранит вектор на каждый патч, поэтому модель может «указать пальцем» на конкретное место страницы. Цена вопроса это миллиарды векторов в индексе, что и пришлось решать пулингом.

Нужно ли дообучать модель под свои документы?

Нет. PULSAR работает на замороженном предобученном ColQwen3-4B без какого-либо fine-tuning под корпус компании и всё равно обходит базовый пайплайн на собственных деках. Это важный практический вывод: порог входа в vision-first поиск ниже, чем кажется.

Итог

PULSAR показывает, что vision-first RAG это уже не лабораторная демка, а рабочая production-архитектура с измеримой экономикой: инжест в 20 раз дешевле, поиск за 50 миллисекунд, точность ответов выше вдвое. Два инженерных решения делают это возможным: разделение разрешений (150 DPI для индекса, 500 для ответа) и двухступенчатый спуленный индекс. Если ваша RAG-система до сих пор кормит модели текстовыми пересказами диаграмм, посчитайте, сколько вызовов VLM у вас уходит в фильтр. Цифра может оказаться неприятно близкой к 73%.

← Все записи