Visual RAG для PDF с Vespa - демонстрационное приложение на базе Python

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用представить (кого-л. на работу и т.д.)

Томас присоединился к Vespa в апреле 2024 года в качестве старшего инженера-программиста. На предыдущем месте работы в качестве консультанта по искусственному интеллекту он создал крупномасштабную коллекцию PDF-файлов на базе Vespa. RAG Приложения.

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

  • Тот факт, что это отсканированные документы, означает, что текст не может быть легко извлечен, поэтому необходимо использовать OCR, что еще больше усложняет задачу.
  • Они содержат большое количество графиков, таблиц и диаграмм, которые нелегко извлечь, даже если можно извлечь текст.
  • Они содержат множество изображений, которые иногда содержат ценную информацию.

Обратите внимание, что термин ColPali Есть два значения:

  1. конкретный моделирование и связанный с ним обсудить статью или диссертацию (старая) Он обучает LoRa-адаптер поверх VLM (PaliGemma) генерировать совместные вкрапления текста и изображения (по одному вкраплению для каждого участка изображения) для "пост-взаимодействия" на основе ColBERT Методы расширения визуальной модели языка.
  2. Он также представляет собой визуальный поиск документов ориентации которая сочетает возможности ВЛМ с эффективными механизмами постинтерфейсного взаимодействия. Это направление не ограничивается конкретной моделью в оригинальной статье, но может быть применено и к другим ВЛМ, например, к нашему предложению использовать ColQwen2 и Vespa's ноутбук .

В этом блоге мы рассмотрим, как создать демо-приложение, демонстрирующее визуальный RAG на Vespa в реальном времени с использованием вкраплений ColPali. Мы опишем архитектуру приложения, пользовательский опыт и технологический стек, использованный для создания приложения.

Вот несколько скриншотов демонстрационного приложения:

Первый пример - не самый распространенный запрос, но он демонстрирует возможности визуального поиска для определенных типов запросов. Это хороший пример парадигмы "Что видишь, то и ищешь (WYSIWYS)".

Карта сходства выделяет наиболее похожие разделы, чтобы пользователи могли легко понять, какие части страницы наиболее релевантны запросу.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用Второй пример, более распространенный пользовательский запрос, демонстрирует возможности ColPali в плане семантического сходства.  使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

Испытав на собственном опыте трудности с обеспечением поиска в PDF-файлах, Томас особенно заинтересован в последних разработках в области визуального моделирования языка (VLM).

После прочтения предыдущего поста о ColPali Записи в блоге Vespa сотрудничество с Джо Бергам После ряда подробных обсуждений он вдохновился идеей предложить проект по созданию визуального RAG-приложения с помощью Vespa.

В Vespa у сотрудников есть возможность предложить программу работы, которую они хотели бы выполнить в каждом итерационном цикле. Если предложенная работа соответствует целям компании и нет других срочных приоритетов, мы можем приступать к работе". Для Томаса, который пришел из консалтинговой индустрии, такая самостоятельность - глоток свежего воздуха.

TL;DR

Мы построили Демонстрационное приложение в режиме реального времениВ этой статье показано, как реализовать визуальный RAG на основе PDF с использованием встраивания ColPali в Vespa и Python с помощью только FastHTML.

Мы также предоставляем код воспроизведения:

  1. Управляемый ноутбукОн используется для настройки собственного приложения Vespa для реализации Visual RAG.
  2. Приложение FastHTML код, который можно использовать для создания веб-приложения, взаимодействующего с приложением Vespa.

Цели проекта

Проект преследует две основные цели:

1. Создание демонстрации в реальном времени

Хотя разработчики могут быть довольны демо-версией с терминальным JSON-выводом в качестве пользовательского интерфейса, на самом деле большинство людей предпочитают веб-интерфейс.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用Это позволит нам продемонстрировать работу PDF Visual RAG в Vespa на основе встраивания ColPali, что, по нашему мнению, актуально для широкого спектра доменов и сценариев использования, таких как юридические, финансовые, строительные, академические и медицинские.

Мы уверены, что это будет важно в будущем, но пока мы не видели ни одного практического применения, которое бы это продемонстрировало.

В то же время он дал нам много ценных сведений об эффективности, масштабируемости и пользовательском опыте. Кроме того, нам было очень любопытно (или немного нервно) посмотреть, достаточно ли он быстр, чтобы обеспечить хороший пользовательский опыт.

Мы также хотели подчеркнуть некоторые полезные функции Vespa, например:

2. Создайте шаблон с открытым исходным кодом

Мы хотели бы предоставить шаблон, чтобы другие могли создавать свои собственные приложения Visual RAG.

Этого шаблона должно быть достаточно для другихпрощеНет необходимости осваивать большое количество специальных языков программирования или фреймворков.

Создание набора данных

Для демонстрации мы хотели использовать набор данных PDF-документов, содержащий большое количество важной информации в виде изображений, таблиц и графиков. Нам также нужен набор данных достаточного размера, чтобы продемонстрировать, что нецелесообразно загружать все изображения непосредственно в VLM (минуя этап поиска).

пользоваться gemini-1.5-flash-8bВ настоящее время максимальное количество вводимых изображений составляет 3600.

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

Как гордые норвежцы, мы с радостью обнаружили, что Глобальный пенсионный фонд правительства Норвегии (GPFG, также известный как Нефтяной фонд) публикует годовые отчеты и документы по управлению на своем сайте с 2000 года. На сайте нет упоминания об авторских правах, а его последниепредставленияпродемонстрировал, что является самым прозрачным фондом в мире, поэтому мы уверены, что можем использовать эти данные в демонстрационных целях.

Набор данных включает 116 различных PDF-отчетов с 2000 по 2024 год общим объемом 6992 страницы.

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

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

Создание синтетических запросов и вопросов

Мы также генерируем синтетические запросы и вопросы для каждой страницы. Они могут быть использованы для двух целей:

  1. Предоставляйте предложения по ассоциации ключевых слов в строке поиска по мере ввода пользователем текста.
  2. Для целей оценки.

Подсказки, которые мы используем для создания вопросов и запросов, поступают из Эта замечательная статья в блоге Даниэля ван Стриена.

您是一名投资者、股票分析师和金融专家。接下来您将看到挪威政府全球养老基金(GPFG)发布的报告页面图像。该报告可能是年度或季度报告,或关于责任投资、风险等主题的政策报告。
您的任务是生成检索查询和问题,这些查询和问题可以用于在大型文档库中检索此文档(或基于该文档提出问题)。
请生成三种不同类型的检索查询和问题。
检索查询是基于关键词的查询,由 2-5 个单词组成,用于在搜索引擎中找到该文档。
问题是自然语言问题,文档中包含该问题的答案。
查询类型如下:
1. 广泛主题查询:覆盖文档的主要主题。
2. 具体细节查询:涵盖文档的某个具体细节或方面。
3. 可视元素查询:涵盖文档中的某个可视元素,例如图表、图形或图像。
重要指南:
- 确保查询与检索任务相关,而不仅仅是描述页面内容。
- 使用基于事实的自然语言风格来书写问题。
- 设计查询时,以有人在大型文档库中搜索此文档为前提。
- 查询应多样化,代表不同的搜索策略。
将您的回答格式化为如下结构的 JSON 对象:
{
"broad_topical_question": "2019 年的责任投资政策是什么?",
"broad_topical_query": "2019 责任投资政策",
"specific_detail_question": "可再生能源的投资比例是多少?",
"specific_detail_query": "可再生能源投资比例",
"visual_element_question": "总持有价值的时间趋势如何?",
"visual_element_query": "总持有价值趋势"
}
如果没有相关的可视元素,请在可视元素问题和查询中提供空字符串。
以下是需要分析的文档图像:
请基于此图像生成查询,并以指定的 JSON 格式提供响应。
只返回 JSON,不返回任何额外说明文本。

Мы используем gemini-1.5-flash-8b Создавайте вопросы и запросы.

принимать к сведению

При первом запуске мы обнаружили, что возникают очень длинные вопросы, поэтому мы добавили новый раздел в generationconfig Добавил maxOutputTokens=500Это очень полезно.

Мы также заметили некоторые странности в сгенерированных вопросах и запросах, например, многократное появление слова "string" в вопросах. Мы хотим провести более глубокую проверку сгенерированных вопросов и запросов.

Используйте Python повсюду

Наша целевая аудитория - растущее сообщество специалистов по науке о данных и искусственному интеллекту. Это сообщество, вероятно, является одним из самых крупных разработчиков Python на GitHub. Отчет о состоянии OctoverseОдна из главных причин, по которой он считается самым популярным (и быстрорастущим) языком программирования, заключается в том, что это один из самых популярных языков программирования в мире.

Нам нужно использовать Python на бэкенде для встроенных в запрос рассуждений (с помощью colpali-engine-библиотека), пока Vespa не будет поддерживать ColpaliEmbedder (Находится в разработке, см. проблема на github). Если для фронтенда используются другие языки (и их фреймворки), это увеличивает сложность проекта, что затрудняет воспроизведение приложения другими людьми.

Поэтому мы решили построить все приложение на Python.

Выбор фронтенд-фреймворка

Streamlit и Gradio

Мы признаем, что с помощью Gradio и Streamlit очень легко создавать простые PoC (Proof of Concepts), и в прошлом мы использовали их для этих целей. Но есть две основные причины, по которым мы решили отказаться от них:

  1. Нам нужен был профессиональный пользовательский интерфейс, который можно было бы использовать в производственной среде.
  2. Нам нужна хорошая производительность. Ожидание в несколько секунд или периодическое зависание пользовательского интерфейса недостаточно для приложения, которое мы хотим представить.

Мы любим заниматься спортом, но нам не нравится сообщение "Бег" в правом верхнем углу экрана Streamlit.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

FastHTML на помощь

Мы. answer.ai своих преданных поклонников. Поэтому, когда в начале этого года они выпустили FastHTML3Когда это произойдет, мы с удовольствием попробуем.

FastHTML - это фреймворк для создания современных веб-приложений на чистом Python. Согласно его видение (будущего)::

FastHTML - это система веб-программирования общего назначения, относящаяся к той же категории, что и Django, NextJS и Ruby on Rails. Ее концепция заключается в том, чтобы стать самым простым способом создания быстрых прототипов, а также самым простым способом создания масштабируемых, мощных, насыщенных приложений.

FastHTML использует базовый Старлетт ответить пением uvicorn.

В комплект входит Pico CSS для создания стилей. Поскольку Леандро, опытный веб-разработчик в нашей команде, захотел попробовать Tailwind CSS вместе с нашим недавно открытым shad4fastМы решили объединить FastHTML и shadcn/ui Красивые компоненты пользовательского интерфейса в

Pyvespa

Наш клиент Vespa Python pyvespa В прошлом он использовался в основном для создания прототипов приложений Vespa. Однако в последнее время мы работаем над тем, чтобы обеспечить большую поддержку функциональности Vespa через pyvespa. Теперь поддерживается развертывание в производство, а также добавлена расширенная настройка Vespa через pyvespa! services.xml функция файла. Для получения подробной информации см. эти Примеры и подробности в блокноте.

В результате большинство приложений Vespa, не требующих собственных Java-компонентов, могут быть созданы с помощью pyvespa.

Анекдот:

На расширенные возможности конфигурации pyvespa влияет тот факт, что FastHTML будет ft-вдохновленный тем, как компоненты оборачиваются и преобразуются в HTML-теги. В pyvespa у нас есть vt-компонент выполняет аналогичную операцию, преобразуя его в Vespa services.xml Теги. Читатели, заинтересованные в этом, могут проверить Этот пиар Узнайте больше. Такой подход позволяет нам сэкономить много работы по сравнению с реализацией собственных классов для всех поддерживаемых тегов.

Кроме того, процесс создания приложения Vespa с помощью pyvespa позволил нам провести практическую проверку.

программное обеспечение

Как встраиватель ColPali с встроенной поддержкой Vespa, он все еще находится в WIP состояние, мы знаем, что для завершения выводов необходим GPU. Из наших экспериментов в Colab мы сделали вывод, что экземпляра T4 достаточно.

Для генерации эмбеддинга перед встраиванием PDF-страниц набора данных в Vespa мы рассмотрели возможность использования бессерверного GPU-провайдера (Модальный (один из наших любимых). Однако, поскольку в наборе данных всего 6 692 страницы, мы использовали Macbook M2 Pro и работали над созданием этих вкраплений 5-6 часов.

опека

Здесь есть много вариантов. Мы могли бы воспользоваться услугами традиционных облачных провайдеров, таких как AWS, GCP или Azure, но это потребует от нас дополнительных усилий по настройке и управлению инфраструктурой и затруднит копирование приложения другими пользователями.

Мы узнали, что Обнимающиеся лица Они предлагают услуги хостинга, где вы можете добавлять GPU по мере необходимости. Кроме того, они предоставляют кнопку "Клонировать это место", которая позволяет другим пользователям легко скопировать приложение.

Мы нашли answer.ai Создает Библиотеки многократного использования, который можно использовать для развертывания FastHTML-приложений на Hugging Face Spaces. Однако при дальнейшем исследовании мы обнаружили, что их подход использует Docker SDK для работы с пространствами, и что на самом деле есть более простые способы сделать это.

Благодаря использованию Пользовательские пространства Python.

земля Документация huggingface-hub::

Хотя это не официальный рабочий процесс, вы можете запустить свой собственный стек Python + интерфейс в Spaces, выбрав Gradio в качестве SDK и предоставив внешний интерфейс на порт 7860.

Анекдот 2: В документации есть опечатка, в которой говорится, что порт, на котором предоставляется услуга, является 7680. К счастью, нам не потребовалось много времени, чтобы выяснить, что правильный порт должен быть 7860и представил PR, объединенный Джулиеном Шомоном, техническим директором Hugging Face, исправил ошибку. Задачи контрольного списка выполнены!

визуальная модель языка

Для части Visual RAG "Генерация" нам нужна модель визуального языка (VLM), чтобы генерировать ответы на основе документов, ранжированных по верхнему краю, полученных от Vespa.

Родная поддержка Vespa LLM(Large Language Model), либо внешние, либо интегрированные внутрь, но VLM (Visual Language Model) пока не поддерживается в Vespa.

За последний год OpenAI, Anthropic и Google выпустили отличные модели визуального языка (VLM), и эта область быстро развивается. По соображениям производительности мы хотели выбрать модель меньшего размера, учитывая, что Google Близнецы API недавно улучшил работу с разработчиками, и мы решили использовать gemini-1.5-flash-8b.

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

построить

Когда стек технологий готов, мы можем приступить к созданию приложения. Высокоуровневая архитектура приложения выглядит следующим образом:

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

Применение Vespa

Ключевые компоненты приложения Vespa включают в себя:

Все. возможно Определяется на Python с помощью pyvespa, но мы рекомендуем также проверять сгенерированные конфигурационные файлы, что можно сделать, вызвав app.package.to_files() реализовать. Для получения подробной информации см. документация pyvespa.

Конфигурация ранжирования

Одна из самых недооцененных особенностей Vespa - это Рейтинг по этапам Функции. Она позволяет определить несколько профилей ранжирования, каждый из которых может содержать различные (или наследуемые) фазы ранжирования, которые могут выполняться на узлах содержимого (фаза 1 и фаза 2) или узлах контейнеров (глобальная сцена).

Это позволяет нам отдельно обрабатывать множество различных сценариев использования и находить идеальный баланс между задержкой, стоимостью и качеством для каждой ситуации.

Прочитайте, что наш генеральный директор Джон Братсет (Jon Bratseth) говорит об инверсии архитектуры, когда вычисления переносятся на сторону данных. Эта запись в блоге.

Для этого приложения мы определили 3 различные конфигурации ранжирования:

принимать к сведению получить (данные)На этом этапе необходимо передать запрос через yql указано, истратегия ранжированияуказывается в файле конфигурации ранжирования (который входит в пакет приложения, предоставляемый при развертывании).

1. Чистый Колпали

В нашем приложении для этого режима ранжирования используется yql:

select title, text from pdf_page where targetHits:{100}nearestNeighbor(embedding,rq{i}) OR targetHits:{100}nearestNeighbor(embedding,rq{i+1}) .. targetHits:{100}nearestNeighbor(embedding,rq{n}) OR userQuery();

Мы также hnsw.exploreAdditionalHits Параметр настроен на 300, чтобы гарантировать, что ни одно релевантное совпадение не будет пропущено на этапе поиска. Обратите внимание, что это потребует дополнительных затрат производительности.

среди них rq{i} является i-м в запросе Токен (который должен быть предоставлен в качестве параметра в HTTP-запросе).n максимальное количество лексем для запроса (в данном приложении мы используем 64).

В этой конфигурации ранжирования используется max_sim_binary Ранжирующее выражение, использующее оптимизированную функцию вычисления расстояния Хэмминга в Vespa (подробнее см. Масштабирование ColPali до миллиардов. Это используется на первом этапе ранжирования, а 100 лучших совпадений повторно ранжируются с использованием полного представления с плавающей точкой вкраплений ColPali.

2. чисто текстовое ранжирование (BM25)

В этом случае мы основываемся только на weakAnd Получите документ.

select title, text from pdf_page where userQuery();

На этапе ранжирования мы используем bm25 Проведите первую фазу ранжирования (без второй фазы).

Обратите внимание, что для достижения оптимальной производительности мы, скорее всего, захотим использовать комбинацию текстовых и зрительных признаков ранжирования (например, используя Интеграция взаимного ранжирования), но в данной демонстрации мы хотим показать различия между ними, а не найти оптимальную комбинацию.

3. Смешать BM25 + ColPali

На этапе поиска мы используем тот же yql, что и в чистой конфигурации ранжирования ColPali.

Мы заметили, что по некоторым запросам, особенно коротким, чистый ColPali находил много страниц без текста (только изображения), в то время как многие ответы, которые мы искали, появлялись на страницах с текстом.

Чтобы решить эту проблему, мы добавили второй этап ранжирования, объединив оценку BM25 и оценку ColPali, используя линейную комбинацию этих двух оценок (max_sim + 2 * (bm25(title) + bm25(text))).

Этот метод основан на простой эвристике, но было бы полезнее найти оптимальные веса для различных признаков, проведя эксперименты по ранжированию.

Генерация фрагментов в Vespa

Во внешнем интерфейсе поиска принято включать выдержки из исходного текста с определенными словами в жирный (шрифт) (Выделено) Дисплей.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

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

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

В этой демонстрации мы показываем как сниппет, так и полный извлеченный текст страницы для сравнения.
Чтобы уменьшить визуальный шум в результатах, мы удалили стоп-слова (and, in, the и т. д.) из запроса пользователя, чтобы они не выделялись.

Узнайте больше о динамично развивающихся сегментах Vespa.

Рекомендации по запросам в Vespa

Общей особенностью поиска являются "поисковые предложения", которые отображаются по мере ввода пользователем текста.
Реальные запросы пользователей часто используются для получения предварительно рассчитанных результатов, но в данном случае у нас нет пользовательского трафика для анализа.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

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

Запрос yql, который мы используем для получения этих предложений, выглядит следующим образом:

select questions from pdf_page where questions matches (".*{query}.*")

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

Мы могли бы сделать так, чтобы страница, генерирующая предложенный вопрос, всегда оказывалась в тройке лучших ответов (добавив в конфигурацию сортировки метрику сходства между запросом пользователя и вопросом, сгенерированным документом), но это было бы немного "обманом" с точки зрения демонстрации функциональности модели ColPali.

опыт пользователей

Нам повезло, что главный ученый из Джо Бергам Он получил от нас отличную обратную связь по UX. Он подтолкнул нас к тому, чтобы сделать UX "быстрым и плавным". Люди привыкли к Google, поэтому нет никаких сомнений в том, что скорость имеет решающее значение для пользовательского опыта в поиске (и RAG). Это то, что все еще несколько недооценивается в сообществе ИИ, где многие люди, кажется, счастливы ждать ответа 5-10 секунд. А мы хотим добиться времени отклика в миллисекундах.

Основываясь на его отзывах, мы должны настроить поэтапный процесс запроса, чтобы не ждать, пока Vespa вернет полное изображение и тензор отображения сходства, прежде чем отображать результаты.

Решение заключается в том, чтобы сначала извлечь из результатов только самые важные данные. Для нас это означает извлечение только title, иurl, иtext, иpage_noа также уменьшенную (размытую) версию изображения (32x32 пикселя) для первоначального отображения результатов поиска. Это позволяет нам сразу отображать результаты и продолжать загрузку полного изображения и отображения сходства в фоновом режиме.

Полный процесс UX показан ниже:

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用Основными источниками задержки являются:

  • Время вывода для генерации вкраплений ColPali (выполняется на GPU, в зависимости от количества Token в запросе)
    • Поэтому мы решили использовать @lru_cache Декоратор позволяет избежать многократного вычисления вкраплений для одного и того же запроса.
  • Задержка в сети между Face Spaces и Vespa (включая рукопожатия TCP)
    • Время передачи полных изображений также значительно (около 0,5 МБ на изображение).
    • Размер тензора отображения сходства больше (n_query_tokens x n_images (x 1030 патчей x 128).
  • Создание гибридного изображения по сходству - задача, требующая больших затрат процессора, но она выполняется с помощью fastcore (используется в форме номинального выражения) @threaded Декоратор выполняется в многопоточной фоновой задаче, где каждое изображение опрашивает соответствующую конечную точку, чтобы проверить, готово ли отображение сходства.

стресс-тест

Нас беспокоила производительность нашего приложения при резком увеличении трафика, поэтому мы провели простой эксперимент по стресс-тестированию. Эксперимент проводился с помощью инструмента разработки браузера, который отправлял запросы /fetch_results Команда cURL была скопирована (с не включенным кэшированием) и запущена в цикле через 10 параллельных терминалов. (На этом этапе мы отключили @lru_cache Декоратор).

в конце концов

Хотя тесты были очень базовыми, первые тесты показали, что узким местом в производительности поиска было вычисление вкраплений ColPali на GPU в пространстве Huggingface, в то время как бэкэнд Vespa мог легко обрабатывать более 20 запросов в секунду с очень низким использованием ресурсов. Мы считаем, что этого более чем достаточно для демонстрации. Если нам понадобится масштабирование, то первым шагом будет включение большего экземпляра GPU для пространства Huggingface.

Мотоцикл Vespa отлично работает под нагрузкой, как показано на следующих графиках.

使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用使用 Vespa 实现 PDF 的视觉 RAG - 一个基于 Python 的演示应用

Размышления об использовании FastHTML

Главный вывод от использования FastHTML заключается в том, что он разрушает барьеры между фронтендом и бэкендом разработки. Код тесно интегрирован, что позволяет всем нам понимать каждую часть приложения и вносить в нее свой вклад. Это нельзя недооценивать.

Нам очень понравилась возможность использовать инструменты разработки браузера для проверки внешнего кода и действительно видеть и понимать большую его часть.

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

Это позволяет нам использовать uv менеджмент собственность зависимостей, что кардинально меняет способ работы с зависимостями в Python.

Мнение Томаса:

Как разработчик, специализирующийся на науке о данных и искусственном интеллекте, предпочитающий Python, но работавший с несколькими JS-фреймворками, мой опыт был очень положительным. Я чувствовал себя лучше, когда мог решать задачи, связанные с фронтендом, не слишком усложняя проект. Мне очень понравилось, что я мог понять каждую часть приложения.

Вид на Андреаса:

Я давно работаю над Vespa, но до этого не слишком увлекался Python или front-end разработкой. В первые день-два я чувствовал себя немного подавленным, но это так здорово - иметь возможность работать в полном стеке и видеть эффект от своих изменений почти в реальном времени! С помощью большой языковой модели стало как никогда легко входить в незнакомую среду. Мне очень понравилось, что мы смогли создать отображения сходства с гораздо меньшим временем ожидания и потреблением ресурсов, вычисляя сходство патчей изображений с помощью тензорных выражений внутри Vespa (векторы уже хранятся в памяти) и возвращая их с результатами поиска.

Мнение Леандро:

Для разработчика, имеющего солидный опыт веб-разработки с использованием React, JavaScript, TypeScript, HTML и CSS, переход на FastHTML был относительно простым. Прямое отображение элементов HTML в фреймворке полностью соответствовало моим предыдущим знаниям, что сократило время обучения. Основная сложность заключалась в адаптации к синтаксису FastHTML, основанному на Python, который отличается от стандартной структуры HTML/JS.

Визуальные технологии - это все, что вам нужно?

Мы убедились, что использование встраивания поздних взаимодействий на уровне токенов из Vision Language Model (VLM) очень эффективно для определенных типов запросов, но мы не считаем это универсальным решением, а скорее очень ценным инструментом в наборе инструментов.

Помимо ColPali, за последний год мы увидели и другие инновации в области визуального поиска. Особенно интересны два подхода:

  • Встраивание скриншотов документов (DSE)5 - Модель двойного кодировщика для генерации плотных вкраплений для скриншотов документов и использования этих вкраплений для поиска.
  • IBM Доклинг - Библиотека для разбора различных типов документов (например, PDF, PPT, DOCX и т.д.) в Markdown, избегая OCR и используя вместо этого модели компьютерного зрения.

Vespa поддерживает сочетание этих подходов и позволяет разработчикам найти наиболее привлекательный баланс между задержкой, стоимостью и качеством для конкретных случаев использования.

Мы можем представить себе приложение, сочетающее в себе высококачественное извлечение текста с помощью Docling или аналогичных инструментов, интенсивный поиск с помощью встраивания скриншотов документов и интенсивный поиск с помощью текстовых характеристик и ColPali-подобных моделей MaxSim Оценки сортируются. Если вы действительно хотите повысить производительность, вы можете даже объединить все эти функции с такими, как XGBoost возможно LightGBM Сочетание модели GBDT с моделью

Поэтому, хотя ColPali и является мощным инструментом, позволяющим сделать трудноизвлекаемую информацию в тексте доступной для поиска, он не является панацеей и должен сочетаться с другими подходами для достижения оптимальной эффективности.

недостающее звено

Моделирование - это временное явление, а оценка - постоянное.

@charles_irl на X

Добавление автоматических оценок выходит за рамки этой демонстрации, но мы настоятельно рекомендуем вам создать набор данных для оценки вашего собственного случая использования. Вы можете использовать LLM-as-a-judge для бутстрапинга (см. Записи в блогеУзнайте больше о том, как мы предоставляем search.vespa.ai (Понимая это).

Vespa предлагает множество настраиваемых параметров, а количественная обратная связь по результатам различных экспериментов позволяет найти наиболее привлекательные компромиссы для конкретного случая использования.

вынести вердикт

Мы создали демонстрационное приложение, показывающее, как выполнять визуальный RAG-поиск PDF-файлов в Vespa с помощью встраивания ColPali.

Если вы дочитали до этого места, вас может заинтересовать код. Вы можете найти код в здесь (литературный) Найдите код приложения.

А теперь создайте свое собственное визуальное приложение RAG!

Для тех, кто хочет узнать больше о визуальном поиске, ColPali или Vespa, не стесняйтесь присоединиться! Сообщество Vespa в Slack Задайте вопрос, обратитесь за помощью к сообществу или следите за последними событиями в Vespa.

общие проблемы

Требует ли использование ColPali использования графического процессора для выводов?

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

В будущем мы ожидаем, что качество и эффективность (например, меньшие вкрапления) ColPali-подобных моделей будут улучшаться и появятся более похожие модели, как мы уже видели в семействе моделей ColBERT, таких как answer.ai's answerai-colbert-small-v1Модель ColBERT была разработана впервые, и ее производительность превосходит производительность оригинальной модели ColBERT, несмотря на то, что ее размер составляет менее трети от размера оригинальной модели.

См. также Блог о Vespa Узнайте больше о том, как использовать Vespa's answerai-colbert-small-v1.

Можно ли использовать ColPali в сочетании с фильтром запросов в Vespa?

Можно. В этом приложении мы добавляем страницу в published_year поле, но его функциональность в качестве опции фильтра пока не реализована на фронт-энде.

Когда Vespa будет нативно поддерживать эмбеды ColPali?

См. также Эта проблема на GitHub.

Можно ли масштабировать это на миллиарды документов?

Да. Vespa поддерживает горизонтальное масштабирование и позволяет настроить компромисс между задержкой, стоимостью и качеством для конкретных случаев использования.

Можно ли адаптировать эту демонстрацию для поддержки ColQwen2?

Это возможно, но есть некоторые различия в расчете карт сходства.

См. также Этот блокнот В качестве отправной точки.

Могу ли я запустить эту демонстрацию со своими собственными данными?

Безусловно! Настроив предоставленные ноутбук Указав на свои данные, вы можете создать собственное приложение Vespa для визуального RAG. Вы также можете использовать предоставленное веб-приложение в качестве отправной точки для собственного фронт-энда.

библиография

  1. ColPali: эффективный поиск документов с помощью языковых моделей зрения
  2. Блокнот pyvespa по использованию ColQwen2 с Vespa
  3. Улучшение поиска с помощью LLM в качестве судьи
  4. Масштабирование ColPali до миллиардов
  5. Встраивание скриншотов документов
  6. Доклинг
  7. FastHTML
© заявление об авторских правах

Похожие статьи

Нет комментариев

Вы должны войти в систему, чтобы участвовать в комментариях!
Войти сейчас
нет
Нет комментариев...