Visual RAG para PDF con Vespa: una aplicación de demostración basada en Python
Base de conocimientos de IAActualizado hace 7 meses Círculo de intercambio de inteligencia artificial 2K 00
presentar (a algn. para un trabajo, etc.)
Thomas se incorporó a Vespa en abril de 2024 como ingeniero de software sénior. En su última misión anterior como consultor de IA, construyó una colección de PDF a gran escala basada en la tecnología de Vespa. RAG Aplicaciones.
Los PDF son omnipresentes en el mundo empresarial y la capacidad de buscar y recuperar información a partir de ellos es un caso de uso común. El problema es que muchos PDF suelen pertenecer a una o varias de las siguientes categorías:
- Al tratarse de documentos escaneados, no es fácil extraer el texto, por lo que hay que recurrir al OCR, lo que aumenta la complejidad.
- Contienen un gran número de gráficos, tablas y diagramas, que no son fácilmente recuperables, aunque pueda extraerse el texto.
- Contienen muchas imágenes, que a veces contienen información valiosa.
Obsérvese que el término ColPali Hay dos significados:
- particular modelización y un debatir sobre una ponencia o tesis (antiguo) Entrena un adaptador LoRa sobre el VLM (PaliGemma) para generar incrustaciones conjuntas de texto e imagen (una incrustación por cada parche de la imagen) para la "post-interacción" basada en la ColBERT Métodos para ampliar el modelo de lenguaje visual.
- También representa una recuperación visual de documentos orientaciones que combina las capacidades de los VLM con mecanismos eficientes posteriores a la interacción. Esta dirección no se limita al modelo específico del artículo original, sino que también puede aplicarse a otros VLM, como nuestra propuesta de utilizar ColQwen2 y la tecnología de Vespa. cuaderno .
En esta entrada de blog, nos sumergiremos en cómo crear una aplicación de demostración en tiempo real que muestre RAG visual en Vespa utilizando incrustaciones ColPali. Describiremos la arquitectura de la aplicación, la experiencia del usuario y la pila tecnológica utilizada para crear la aplicación.
Aquí tienes algunas capturas de pantalla de la aplicación de demostración:
El primer ejemplo no es una consulta habitual, pero demuestra la potencia de la búsqueda visual para determinados tipos de consultas. Es un buen ejemplo del paradigma "Lo que ves es lo que buscas (WYSIWYS)".
El mapeo de similitud resalta las secciones más parecidas para que los usuarios puedan ver fácilmente qué partes de la página son más relevantes para la consulta.


Tras haber experimentado de primera mano las dificultades de hacer que los PDF sean buscables, Thomas está especialmente interesado en los últimos avances en el campo del modelado visual del lenguaje (VLM).
Después de leer el post anterior sobre ColPali Entradas del blog de Vespa colaboración con Jo Bergum Tras una serie de discusiones en profundidad, se animó a proponer un proyecto para construir una aplicación RAG visual utilizando Vespa.
En Vespa, los empleados tienen la oportunidad de proponer un programa de trabajo que les gustaría llevar a cabo en cada ciclo de iteración. Siempre que el trabajo propuesto esté en consonancia con los objetivos de la empresa y no haya otras prioridades urgentes, podemos ponernos manos a la obra. Para Thomas, que viene del sector de la consultoría, esta autonomía es un soplo de aire fresco.
TL;DR
Construimos un Aplicación de demostración en tiempo realEste artículo muestra cómo implementar Visual RAG basado en PDF utilizando la incrustación ColPali en Vespa y Python con sólo FastHTML.
También proporcionamos código de reproducción:
- Un ejecutable cuadernoSe utiliza para configurar su propia aplicación Vespa para implementar Visual RAG.
- Aplicación FastHTML que puedes utilizar para configurar una aplicación web que interactúe con la aplicación Vespa.
Objetivos del proyecto
El proyecto tiene dos objetivos principales:
1. Construir una demostración en tiempo real
Mientras que los desarrolladores pueden estar contentos con una demo con salida JSON terminal como la interfaz de usuario, la verdad es que la mayoría de la gente prefiere una interfaz web.
Esto nos permitirá demostrar el PDF Visual RAG en Vespa basado en la incrustación ColPali, que creemos es relevante en una amplia gama de dominios y casos de uso como el jurídico, financiero, construcción, académico y médico.
Estamos seguros de que esto será importante en el futuro, pero aún no hemos visto ninguna aplicación práctica que lo demuestre.
Al mismo tiempo, nos aportó muchas ideas valiosas en términos de eficacia, escalabilidad y experiencia de usuario. Además, teníamos mucha curiosidad (o un poco de nervios) por ver si era lo bastante rápido para ofrecer una buena experiencia de usuario.
También queríamos destacar algunas de las útiles características de Vespa, por ejemplo:
- Ordenar por etapas
- Sugerencias de asociación de palabras clave
- Cálculo multivectorial MaxSim
2. Crear una plantilla de código abierto
Nos gustaría ofrecer una plantilla para que otros puedan crear sus propias aplicaciones Visual RAG.
Esta plantilla debería ser suficiente para los demásmás sencilloNo es necesario dominar un gran número de lenguajes o marcos de programación específicos.
Creación de un conjunto de datos
Para nuestra demostración, queríamos utilizar un conjunto de datos de documentos PDF que contuviera una gran cantidad de información importante en forma de imágenes, tablas y gráficos. También necesitamos un conjunto de datos de tamaño suficiente para demostrar que no es factible cargar todas las imágenes directamente en el VLM (omitiendo el paso de recuperación).
utilizar gemini-1.5-flash-8b
El número máximo actual de imágenes de entrada es de 3600.
Como no había ningún conjunto de datos público que respondiera a nuestras necesidades, decidimos crear uno propio.
Como orgullosos noruegos, nos alegró descubrir que el Fondo Global de Pensiones del Gobierno noruego (GPFG, también conocido como Fondo del Petróleo) publica informes anuales y documentos de gobernanza en su sitio web desde el año 2000. En el sitio web no se mencionan los derechos de autor y su recienterepresentacionesdemostrado que es el fondo más transparente del mundo, por lo que confiamos en poder utilizar estos datos con fines demostrativos.
El conjunto de datos incluye 116 informes diferentes en PDF de 2000 a 2024, con un total de 6992 páginas.
El conjunto de datos, que incluye imágenes, texto, URL, números de página, preguntas generadas, consultas e incrustaciones ColPali, se publica ahora en el aquí están.

Generar consultas y preguntas sintéticas
También generamos consultas y preguntas sintéticas para cada página. Éstas pueden utilizarse con dos fines:
- Proporcionar sugerencias de asociación de palabras clave para el cuadro de búsqueda a medida que el usuario escribe.
- A efectos de evaluación.
Las pistas que utilizamos para generar preguntas y consultas proceden del Este estupendo artículo de Daniel van Strien.
您是一名投资者、股票分析师和金融专家。接下来您将看到挪威政府全球养老基金(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,不返回任何额外说明文本。
Utilizamos gemini-1.5-flash-8b
Generar preguntas y consultas.
tenga en cuenta
En la primera ejecución, descubrimos que se generaban algunos problemas muy largos, por lo que añadimos una nueva sección a la sección generationconfig Se ha añadido el maxOutputTokens=500
Es muy útil.
También hemos observado algunas rarezas en las preguntas y consultas generadas, como que "cadena" aparece varias veces en las preguntas. Queremos una validación más exhaustiva de las preguntas y consultas generadas.
Utilizar Python en todo
Nuestro público objetivo es la creciente comunidad de la ciencia de datos y la IA. Es probable que esta comunidad sea una de las que más contribuyan a Python en GitHub. Informe de situación de OctoverseUna de las principales razones por las que está clasificado como el lenguaje de programación más popular (y de más rápido crecimiento) es que es uno de los lenguajes de programación más populares del mundo.
Necesitamos utilizar Python en el backend para el razonamiento incrustado en la consulta (utilizando la función colpali-motor-), hasta que Vespa admita de forma nativa la biblioteca ColpaliEmbedder
(En desarrollo, véase problema en github). Si se utilizan otros lenguajes (y sus frameworks) para el front-end, aumentará la complejidad del proyecto, lo que dificultará que otros reproduzcan la aplicación.
Así que decidimos construir toda la aplicación en Python.
Elección del marco de front-end
Streamlit y Gradio
Admitimos que es muy fácil construir PoCs (Pruebas de Concepto) simples usando Gradio y Streamlit, y los hemos usado en el pasado para ese propósito. Pero hay dos razones principales por las que decidimos no usarlos:
- Necesitábamos una interfaz de usuario profesional que pudiera utilizarse en un entorno de producción.
- Necesitamos un buen rendimiento. Esperar unos segundos o que la interfaz de usuario se congele de forma intermitente no es suficiente para la aplicación que queremos presentar.
Por mucho que nos guste hacer ejercicio, no nos gusta el mensaje "Corriendo" que aparece en la esquina superior derecha de la pantalla de Streamlit.

FastHTML al rescate
Lo somos. responder.ai de sus fieles seguidores. Así que cuando lanzaron a principios de este año FastHTML3Cuando lo hagamos, estaremos encantados de intentarlo.
FastHTML es un framework para crear aplicaciones web modernas utilizando Python puro. Según su visión (del futuro)::
FastHTML es un sistema de programación web completo de propósito general, de la misma categoría que Django, NextJS y Ruby on Rails. Su visión es ser la forma más fácil de crear prototipos rápidos, pero también la forma más fácil de crear aplicaciones escalables, potentes y ricas.
FastHTML utiliza el starlette responder cantando uvicornio.
Incluye Pico CSS para el estilo. Como Leandro, un desarrollador web experimentado del equipo, quería probar Tailwind CSS, junto con nuestro recientemente descubierto shad4fastDecidimos combinar FastHTML y shadcn/ui Los bonitos componentes de interfaz de usuario de
Pyvespa
Nuestro cliente Vespa Python pyvespa En el pasado, se utilizaba principalmente para crear prototipos de aplicaciones Vespa. Sin embargo, recientemente hemos trabajado para proporcionar más soporte para la funcionalidad de Vespa a través de pyvespa. Ahora se soporta el despliegue en producción y se ha añadido la configuración avanzada de Vespa a través de pyvespa. services.xml
del archivo. Para más detalles, consulte estos Ejemplos y detalles en el cuaderno.
Como resultado, la mayoría de las aplicaciones Vespa que no requieren componentes Java personalizados se pueden construir con pyvespa.
Anécdota:
Las funciones avanzadas de configuración de pyvespa están en realidad influenciadas por el hecho de que FastHTML ft
-inspirado en la forma en que los componentes se envuelven y se convierten en etiquetas HTML. En pyvespa, tenemos el vt
-componente realiza una operación similar, convirtiéndolo en una Vespa services.xml
Etiquetas. Los lectores interesados pueden consultar Este PR Más información. Este enfoque nos ahorra mucho trabajo en comparación con la implementación de clases personalizadas para todas las etiquetas compatibles.
Además, el proceso de creación de una aplicación Vespa con pyvespa nos permitió realizar una validación práctica.
software
Como incrustador ColPali con soporte nativo para Vespa, todavía está en el WIP sabemos que la GPU es necesaria para completar la inferencia. De nuestros experimentos en Colab, concluimos que una instancia T4 es suficiente.
Para generar la incrustación antes de incrustar las páginas PDF del conjunto de datos en Vespa, consideramos la posibilidad de utilizar un proveedor de GPU sin servidor (Modal (uno de nuestros favoritos). Sin embargo, dado que el conjunto de datos consta de "solo" 6.692 páginas, utilizamos un Macbook M2 Pro y trabajamos durante 5-6 horas para crear estas incrustaciones.
tutela
Aquí hay muchas opciones. Podríamos optar por un proveedor de nube tradicional como AWS, GCP o Azure, pero eso requeriría más esfuerzo por nuestra parte para configurar y gestionar la infraestructura y dificultaría que otros replicaran la aplicación.
Nos enteramos de que Espacios para abrazar la cara Ofrecen un servicio de alojamiento en el que se pueden añadir GPU según sea necesario. También proporcionan un botón "Clonar este espacio" con un solo clic que facilita mucho que otros copien la aplicación.
Encontramos responder.ai Crea un Bibliotecas reutilizablesque puede utilizarse para desplegar aplicaciones FastHTML en Hugging Face Spaces. Sin embargo, tras investigar más a fondo, descubrimos que su enfoque utiliza el SDK de Docker para manipular Spaces, y que en realidad hay formas más sencillas de hacerlo.
Mediante el uso de Espacios Python personalizados.
fundación huggingface-hub Documentación::
Aunque este no es un flujo de trabajo oficial, puedes ejecutar tu propia pila de Python + interfaz en Spaces eligiendo Gradio como SDK y proporcionando una interfaz front-end en el puerto 7860.
Anécdota 2: Hay una errata en la documentación que indica que el puerto en el que se presta el servicio es 7680
. Afortunadamente, no tardamos mucho en descubrir que el puerto correcto debía ser 7860
y presentó un PR, fusionado por Julien Chaumond, CTO de Hugging Face, corregido el error. ¡Tareas de la lista de control completadas!
modelo de lenguaje visual
Para la parte de "Generación" del GAR Visual, necesitamos un Modelo de Lenguaje Visual (MLV) que genere respuestas basadas en los documentos mejor clasificados obtenidos de Vespa.
Soporte Vespa Native LLM(Large Language Model), ya sea externo o integrado internamente, pero VLM (Visual Language Model) aún no está soportado de forma nativa en Vespa.
El año pasado, OpenAI, Anthropic y Google lanzaron excelentes modelos de lenguaje visual (VLM), por lo que el campo está creciendo rápidamente. Por motivos de rendimiento, queríamos elegir un modelo más pequeño, dado que Google Géminis API ha mejorado recientemente la experiencia de los desarrolladores, hemos decidido utilizar la gemini-1.5-flash-8b
.
Por supuesto, se recomienda una evaluación cuantitativa de los distintos modelos antes de seleccionar uno en un entorno de producción, pero esto queda fuera del alcance de este proyecto.
construya
Con la pila tecnológica en su lugar, podemos empezar a construir la aplicación. La arquitectura de alto nivel de la aplicación es la siguiente:

Aplicación Vespa
Entre los componentes clave de la aplicación Vespa se incluyen:
- Documentos que contienen campos y tipos definición del esquema.
- Perfil de rango Definición.
- un
services.xml
Archivo de configuración.
A todos. posible Definido en Python mediante pyvespa, pero recomendamos comprobar también los archivos de configuración generados, lo que puede hacerse llamando a la función app.package.to_files()
realizar. Para más información, consulte documentación sobre pyvespa.
Configuración del ranking
Una de las características más infravaloradas de la Vespa es el Clasificación por etapas Función. Permite definir varios perfiles de clasificación, cada uno de los cuales puede contener fases de clasificación diferentes (o heredadas) que pueden ejecutarse en nodos de contenido (fase 1 y fase 2) o nodos contenedores (escenario mundial).
Esto nos permite tratar muchos casos de uso diferentes por separado y encontrar el equilibrio ideal entre latencia, coste y calidad para cada situación.
Lea lo que nuestro CEO Jon Bratseth tiene que decir sobre la inversión arquitectónica de mover la computación al lado de los datos de la ecuación. Esta entrada del blog.
Para esta aplicación, definimos 3 configuraciones de clasificación diferentes:
tenga en cuenta recuperar (datos)La etapa consiste en pasar la consulta por el yql especificado, y elestrategia de clasificaciónse especifica en el archivo de configuración del ranking (que forma parte del paquete de la aplicación proporcionado en el momento de la implantación).
1. ColPali puro
El yql utilizado para este modo de clasificación en nuestra aplicación es:
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();
También hnsw.exploreAdditionalHits
El parámetro se ajusta a 300 para garantizar que no se pierda ninguna coincidencia relevante durante la fase de recuperación. Tenga en cuenta que esto tendrá un coste de rendimiento.
incluidos entre estos rq{i}
es el i-ésimo en la consulta Ficha (que debe proporcionarse como parámetro en la solicitud HTTP).n
es el número máximo de tokens de consulta a recuperar (en esta aplicación utilizamos 64).
Esta configuración de clasificación utiliza el max_sim_binary
Expresión de clasificación que aprovecha la funcionalidad optimizada de cálculo de la distancia de Hamming en Vespa (para más información, véase Ampliación de ColPali a miles de millones. Esto se utiliza en la primera fase de la clasificación y las 100 mejores coincidencias se vuelven a clasificar utilizando la representación completa en coma flotante de la incrustación ColPali.
2. Clasificación puramente textual (BM25)
En este caso, nos basamos únicamente en el weakAnd
Recuperar el documento.
select title, text from pdf_page where userQuery();
En la fase de clasificación, utilizamos bm25 Realizar la clasificación de la Fase I (sin Fase II).
Tenga en cuenta que, para obtener un rendimiento óptimo, es probable que queramos utilizar una combinación de características de clasificación basadas en texto y en visión (por ejemplo, utilizando la función Integración de la clasificación recíproca), pero en esta demostración queremos mostrar las diferencias entre ellos más que encontrar la combinación óptima.
3. Mezcla BM25 + ColPali
En la fase de recuperación, utilizamos la misma yql que en la configuración de clasificación ColPali pura.
Nos dimos cuenta de que para algunas consultas, especialmente las más cortas, ColPali puro coincidía con muchas páginas sin texto (sólo imágenes), mientras que muchas de las respuestas que buscábamos aparecían en realidad en páginas con texto.
Para resolver este problema, añadimos una expresión de clasificación de segunda etapa que combinaba la puntuación BM25 y la puntuación ColPali, utilizando una combinación lineal de las dos puntuaciones (max_sim + 2 * (bm25(title) + bm25(text))
).
Este método se basa en una heurística simple, pero sería más beneficioso encontrar las ponderaciones óptimas para las distintas características realizando experimentos de clasificación.
Generación de fragmentos en Vespa
En el front-end de búsqueda, es habitual incluir fragmentos del texto de origen con determinadas palabras en un negrita (tipo de letra) (Resaltado) Pantalla.

Mostrar fragmentos de términos de consulta coincidentes en su contexto permite a los usuarios determinar rápidamente si es probable que los resultados satisfagan sus necesidades de información.
En Vespa, esta función se llama "fragmentos dinámicos" y tiene varios parámetros que pueden ajustarse, como cuánto contexto circundante incluir y las etiquetas utilizadas para resaltar las palabras coincidentes.
En esta demostración, mostramos tanto el fragmento como el texto completo extraído de la página para comparar.
Para reducir el ruido visual en los resultados, eliminamos las stop words (and, in, the, etc.) de la consulta del usuario para que no aparecieran resaltadas.
Más información sobre los segmentos dinámicos de Vespa.
Recomendaciones de consulta en Vespa
Una característica común en las búsquedas son las "sugerencias de búsqueda", que se muestran a medida que el usuario teclea.
A menudo se utilizan consultas reales de usuarios para obtener resultados precalculados, pero aquí no tenemos tráfico de usuarios que analizar.

En este ejemplo, utilizamos una simple búsqueda de subcadenas que hace coincidir un prefijo introducido por el usuario con una pregunta relevante generada a partir de una página PDF para proporcionar sugerencias.
La consulta yql que utilizamos para obtener estas sugerencias es:
select questions from pdf_page where questions matches (".*{query}.*")
Una ventaja de este enfoque es que se puede confirmar que cualquier pregunta que aparezca en las recomendaciones tiene respuesta en los datos disponibles.
Podríamos habernos asegurado de que la página que genera la pregunta sugerida aparezca siempre entre las tres primeras respuestas (añadiendo una métrica de similitud entre la consulta del usuario y la pregunta generada por el documento en la configuración de ordenación), pero esto habría sido un poco "trampa" desde el punto de vista de la demostración de la funcionalidad del modelo ColPali.
experiencia del usuario
Tenemos la suerte de contar con el Científico Jefe de Jo Bergum Consiguió que le diéramos una gran retroalimentación sobre UX. Nos presionó para que la UX fuera "rápida y fluida". La gente está acostumbrada a Google, así que no hay duda de que la velocidad es fundamental para la experiencia del usuario en la búsqueda (y en la RAG). Es algo que todavía se subestima en la comunidad de la IA, donde mucha gente parece estar contenta esperando entre 5 y 10 segundos para obtener una respuesta. Y nosotros queremos conseguir tiempos de respuesta en milisegundos.
Basándonos en sus comentarios, tenemos que establecer un proceso de solicitud por etapas para evitar esperar a que Vespa devuelva la imagen completa y el tensor de mapeo de similitud antes de mostrar los resultados.
La solución consiste en extraer primero sólo los datos más importantes de los resultados. Para nosotros, esto significa extraer sólo los title
yurl
ytext
ypage_no
así como una versión reducida (borrosa) de la imagen (32x32 píxeles) para la visualización inicial de los resultados de la búsqueda. Esto nos permite mostrar los resultados inmediatamente y seguir cargando la imagen completa y la asignación de similitudes en segundo plano.
A continuación se muestra el proceso completo de UX:
Las principales fuentes de retraso son:
- Tiempo de inferencia para generar incrustaciones ColPali (realizado en la GPU, en función del número de tokens de la consulta).
- Así que decidimos utilizar el
@lru_cache
para evitar volver a calcular la incrustación varias veces para la misma consulta.
- Así que decidimos utilizar el
- Latencia de la red entre Face Spaces y Vespa (incluidos los apretones de manos TCP)
- El tiempo de transferencia de imágenes completas también es significativo (unos 0,5 MB por imagen).
- El tamaño del tensor de mapas de similitud es mayor (
n_query_tokens
xn_images
(x 1030 parches x 128).
- La creación de una imagen híbrida con un mapa de similitudes es una tarea que requiere mucha CPU, pero se realiza con la función
fastcore
(utilizado como expresión nominal)@threaded
El decorador se realiza en una tarea multihilo en segundo plano, en la que cada imagen sondea su punto final correspondiente para comprobar si el mapeo de similitud está listo.
prueba de esfuerzo
Nos preocupaba el rendimiento de nuestra aplicación durante una oleada de tráfico, así que realizamos un sencillo experimento de prueba de estrés. El experimento se realizó utilizando una herramienta de desarrollo del navegador para enviar peticiones /fetch_results
Se copió el comando cURL (sin activar la caché) y se ejecutó en bucle en 10 terminales paralelas. (En este punto desactivamos el @lru_cache
Decorador).
al final
Aunque las pruebas eran muy básicas, las primeras demostraron que el cuello de botella en el rendimiento de las búsquedas era el cálculo de las incrustaciones de ColPali en las GPU en el espacio Huggingface, mientras que el backend Vespa podía manejar fácilmente más de 20 consultas por segundo con un uso muy bajo de recursos. Creemos que esto es más que suficiente para las demostraciones. Si necesitáramos escalar, nuestro primer paso sería habilitar una instancia de GPU más grande para el espacio Huggingface.
La aplicación Vespa se comporta bien bajo carga, como se muestra en los siguientes gráficos.


Reflexiones sobre el uso de FastHTML
La principal ventaja de FastHTML es que rompe las barreras entre el desarrollo front-end y back-end. El código está estrechamente integrado, lo que nos permite a todos entender y contribuir a cada parte de la aplicación. Esto no debe subestimarse.
Nos gustó mucho poder utilizar las herramientas de desarrollo del navegador para inspeccionar el código del front-end y ver y entender realmente la mayor parte del mismo.
El proceso de desarrollo y despliegue se simplifica significativamente en comparación con el uso de un marco de front-end independiente.
Nos permite utilizar uv dirección propiedad que cambia radicalmente la forma en que manejamos las dependencias en Python.
La opinión de Thomas:
Como desarrollador con formación en ciencia de datos e IA, que prefiere Python pero ha trabajado con varios frameworks JS, mi experiencia ha sido muy positiva. Me sentí más capaz de participar en tareas relacionadas con el front-end sin añadir demasiada complejidad al proyecto. Me gustó mucho poder entender cada parte de la aplicación.
La vista de Andreas:
Llevo mucho tiempo trabajando en Vespa, pero no me he adentrado mucho en Python ni en el desarrollo front-end. Me sentí un poco abrumado durante los dos primeros días, pero es tan emocionante poder trabajar en pila completa y ver los efectos de mis cambios casi en tiempo real. Con la ayuda del gran modelo de lenguaje, es más fácil que nunca entrar en un entorno desconocido. Me gustó mucho que pudiéramos calcular la similitud de los parches de imagen mediante expresiones tensoriales dentro de Vespa (los vectores ya estaban almacenados en memoria) y devolverlos con los resultados de la búsqueda, creando mapeados de similitud con una latencia y un consumo de recursos mucho menores.
La opinión de Leandro:
Como desarrollador con una base sólida en el desarrollo web con React, JavaScript, TypeScript, HTML y CSS, pasar a FastHTML fue relativamente sencillo. El mapeo directo de elementos HTML del framework era muy coherente con mis conocimientos previos, lo que redujo la curva de aprendizaje. El principal reto fue adaptarme a la sintaxis basada en Python de FastHTML, que difiere de la estructura HTML/JS estándar.
¿Es la tecnología visual todo lo que necesita?
Hemos comprobado que la incrustación de interacciones tardías a nivel de token a partir del modelo de lenguaje visual (VLM) es muy potente para determinados tipos de consultas, pero no la consideramos una solución única, sino más bien una herramienta muy valiosa de la caja de herramientas.
Además de ColPali, en el último año hemos visto otras innovaciones en recuperación visual. Dos enfoques especialmente interesantes son:
- Incrustación de capturas de pantalla de documentos (DSE)5 - Un modelo de codificador dual para generar incrustaciones densas de capturas de pantalla de documentos y utilizar estas incrustaciones para la recuperación.
- IBM Docling - Una biblioteca para convertir varios tipos de documentos (por ejemplo, PDF, PPT, DOCX, etc.) en Markdown, evitando el OCR y utilizando en su lugar modelos de visión por ordenador.
Vespa admite la combinación de estos enfoques y permite a los desarrolladores encontrar el equilibrio más atractivo entre latencia, coste y calidad para casos de uso específicos.
Podemos imaginarnos una aplicación que combine la extracción de texto de alta calidad con Docling o herramientas similares, la recuperación intensiva mediante la incrustación de capturas de pantalla de documentos y la recuperación intensiva mediante características textuales y un modelado de tipo ColPali de la MaxSim
Las puntuaciones están ordenadas. Si realmente quieres mejorar el rendimiento, puedes incluso combinar todas estas funciones con otras como XGBoost tal vez LuzGBM La combinación del modelo GBDT del
Por lo tanto, aunque ColPali es una potente herramienta para hacer recuperable la información difícil de extraer en un texto, no es la panacea y debe combinarse con otros enfoques para lograr un rendimiento óptimo.
eslabón perdido
La modelización es temporal, mientras que la evaluación es permanente.
Añadir evaluaciones automatizadas está fuera del alcance de esta demo, pero le recomendamos encarecidamente que cree un conjunto de datos de evaluación para su propio caso de uso. Puede utilizar LLM-como-un-juicio para bootstrap (ver este Entradas de blogMás información buscar.vespa.ai (Al darse cuenta).
Vespa ofrece una serie de parámetros ajustables, y al proporcionar información cuantitativa sobre diferentes experimentos, puede encontrar las compensaciones más atractivas para su caso de uso específico.
llegar a un veredicto
Hemos creado una aplicación de demostración en vivo que muestra cómo realizar la recuperación visual RAG de PDF en Vespa utilizando la incrustación ColPali.
Si has leído hasta aquí, puede que te interese el código. Puede encontrar el código en la sección aquí (literario) Encuentra el código de la aplicación.
Y ahora, ¡a crear tu propia aplicación visual RAG!
Los que quieran saber más sobre recuperación visual, ColPali o Vespa, ¡no duden en unirse! Comunidad Slack de Vespa Haz una pregunta, pide ayuda a la comunidad o entérate de las últimas novedades de Vespa.
problemas comunes
¿Requiere ColPali el uso de una GPU para la inferencia?
Actualmente, para razonar las consultas en un tiempo razonable, necesitamos utilizar la GPU.
En el futuro, esperamos que la calidad y la eficacia (por ejemplo, incrustaciones más pequeñas) de los modelos similares a ColPali mejoren y que surjan más modelos similares, como hemos visto con la familia de modelos ColBERT, como answer.ai's answerai-colbert-small-v1El modelo ColBERT se ha desarrollado por primera vez, y su rendimiento supera al del modelo ColBERT original, a pesar de que tiene menos de un tercio del tamaño del modelo original.
Ver también Blog Vespa Más información sobre el uso de Vespa answerai-colbert-small-v1
.
¿Es posible utilizar ColPali junto con un filtro de consulta en Vespa?
Puede. En esta aplicación, añadimos la página a la carpeta published_year
pero su funcionalidad como opción de filtro aún no se ha implementado en el front-end.
¿Cuándo soportará Vespa de forma nativa las incrustaciones de ColPali?
Ver también Este tema de GitHub.
¿Es escalable a miles de millones de documentos?
Sí, Vespa admite el escalado horizontal y permite ajustar el equilibrio entre latencia, coste y calidad para casos de uso específicos.
¿Puede adaptarse esta demo para que sea compatible con ColQwen2?
Es posible, pero hay algunas diferencias en el cálculo de los mapas de similitud.
Ver también Este cuaderno Como punto de partida.
¿Puedo ejecutar esta demostración con mis propios datos?
Por supuesto. Ajustando el cuaderno Apuntando a tus datos, puedes configurar tu propia aplicación Vespa para Visual RAG. También puede utilizar la aplicación web proporcionada como punto de partida para su propio front-end.
bibliografía
© declaración de copyright
Derechos de autor del artículo Círculo de intercambio de inteligencia artificial Todos, por favor no reproducir sin permiso.
Artículos relacionados
Sin comentarios...