Visual RAG pour PDF avec Vespa - une application de démonstration basée sur Python
présenter (qqn pour un emploi, etc.)
Thomas a rejoint Vespa en avril 2024 en tant qu'ingénieur logiciel senior. Lors de sa dernière mission en tant que consultant en IA, il a construit une collection de PDF à grande échelle basée sur le système d'information de Vespa. RAG Applications.
Les PDF sont omniprésents dans le monde de l'entreprise et la possibilité de rechercher et d'extraire des informations à partir de ces documents est un cas d'utilisation courant. La difficulté réside dans le fait que de nombreux PDF appartiennent généralement à l'une ou plusieurs des catégories suivantes :
- Le fait qu'il s'agisse de documents scannés signifie que le texte ne peut pas être facilement extrait, et qu'il faut donc utiliser l'OCR, ce qui ajoute à la complexité.
- Ils contiennent un grand nombre de graphiques, de tableaux et de diagrammes, qui ne sont pas facilement récupérables, même si le texte peut être extrait.
- Ils contiennent de nombreuses images, qui renferment parfois des informations précieuses.
Il convient de noter que le terme ColPali Il y a deux significations :
- particulier modélisation et un projet connexe discuter d'un article ou d'une thèse (ancien) Il forme un adaptateur LoRa au-dessus du VLM (PaliGemma) pour générer des encastrements conjoints de texte et d'image (un encastrement pour chaque parcelle de l'image) pour la "post-interaction" sur la base de l'analyse de l'image de l'utilisateur. ColBERT Méthodes d'extension des modèles de langage visuel.
- Il s'agit également d'une recherche visuelle de documents orientations qui combine les capacités des VLM avec des mécanismes efficaces de post-interaction. Cette orientation n'est pas limitée au modèle spécifique de l'article original, mais peut également s'appliquer à d'autres VLM, comme notre proposition d'utiliser ColQwen2 et le modèle de Vespa carnet de notes .
Dans cet article de blog, nous allons nous plonger dans la construction d'une application de démonstration en temps réel présentant un RAG visuel sur Vespa en utilisant des embeds ColPali. Nous décrirons l'architecture de l'application, l'expérience utilisateur et la pile technologique utilisée pour construire l'application.
Voici quelques captures d'écran de l'application de démonstration :
Le premier exemple n'est pas une requête courante, mais il démontre la puissance de la recherche visuelle pour certains types de requêtes. Il s'agit d'un bon exemple du paradigme "What You See Is What You Search (WYSIWYS)".
La cartographie de similarité met en évidence les sections les plus similaires afin que les utilisateurs puissent facilement voir quelles parties de la page sont les plus pertinentes par rapport à la requête.


Ayant fait l'expérience directe des difficultés à rendre les PDF consultables, Thomas est particulièrement intéressé par les derniers développements dans le domaine de la modélisation du langage visuel (VLM).
Après avoir lu l'article précédent sur ColPali Vespa Blog Posts collaboration avec Jo Bergum Après une série de discussions approfondies, il a eu l'idée de proposer un projet visant à créer une application visuelle de RAG à l'aide de Vespa.
Chez Vespa, les employés ont la possibilité de proposer un programme de travail qu'ils souhaitent réaliser à chaque cycle d'itération. Tant que le travail proposé est aligné sur les objectifs de l'entreprise et qu'il n'y a pas d'autres priorités urgentes, nous pouvons commencer. Pour Thomas, qui vient du secteur du conseil, cette autonomie est une bouffée d'air frais.
TL;DR
Nous avons construit un Application de démonstration en temps réelCet article montre comment mettre en œuvre un Visual RAG basé sur un PDF en utilisant l'intégration ColPali dans Vespa et Python avec seulement FastHTML.
Nous fournissons également un code de reproduction :
- Un système d'exécution carnet de notesIl permet de mettre en place votre propre application Vespa pour mettre en œuvre Visual RAG.
- Application FastHTML que vous pouvez utiliser pour mettre en place une application web qui interagit avec l'application Vespa.
Objectifs du projet
Le projet a deux objectifs principaux :
1. construire une démonstration en temps réel
Si les développeurs peuvent se contenter d'une démo avec une sortie JSON terminale comme interface utilisateur, la plupart des gens préfèrent en réalité une interface web.
Cela nous permettra de démontrer le PDF Visual RAG dans Vespa basé sur l'intégration ColPali, que nous pensons être pertinent dans un large éventail de domaines et de cas d'utilisation tels que le juridique, le financier, la construction, l'académique et le médical.
Nous sommes convaincus que cela sera important à l'avenir, mais nous n'avons pas encore vu d'applications pratiques qui le démontrent.
En même temps, il nous a fourni de nombreuses informations précieuses en termes d'efficacité, d'évolutivité et d'expérience utilisateur. Nous étions également très curieux (ou un peu nerveux) de voir s'il était suffisamment rapide pour offrir une bonne expérience à l'utilisateur.
Nous avons également voulu mettre en évidence certaines des fonctions utiles de Vespa, par exemple :
- Trier par étape
- Suggestions d'associations de mots-clés
- Calcul MaxSim multi-vectoriel
2. créer un modèle open source
Nous aimerions fournir un modèle pour que d'autres puissent créer leurs propres applications Visual RAG.
Ce modèle devrait suffire pour les autresplus simpleIl n'est pas nécessaire de maîtriser un grand nombre de langages de programmation ou de cadres spécifiques.
Création d'un ensemble de données
Pour notre démonstration, nous voulions utiliser un ensemble de données de documents PDF contenant une grande quantité d'informations importantes sous forme d'images, de tableaux et de graphiques. Nous avons également besoin d'un ensemble de données de taille suffisante pour démontrer qu'il n'est pas possible de télécharger toutes les images directement vers le VLM (en sautant l'étape d'extraction).
utiliser gemini-1.5-flash-8b
Le nombre maximum d'images saisies est actuellement de 3600.
Comme il n'existait pas d'ensemble de données publiques répondant à nos besoins, nous avons décidé de créer le nôtre.
En tant que Norvégiens fiers de l'être, nous avons été heureux de constater que le Fonds de pension global du gouvernement norvégien (GPFG, également connu sous le nom de Fonds pétrolier) publie des rapports annuels et des documents de gouvernance sur son site web depuis 2000. Il n'y a aucune mention de droits d'auteur sur le site web et ses récents rapports annuels et documents de gouvernance sont disponibles en ligne.représentationsa démontré qu'il était le fonds le plus transparent au monde, et nous sommes donc convaincus que nous pouvons utiliser ces données à des fins de démonstration.
L'ensemble de données comprend 116 rapports PDF différents de 2000 à 2024, totalisant 6992 pages.
L'ensemble de données, qui comprend des images, du texte, des URL, des numéros de page, des questions générées, des requêtes et des encastrements ColPali, est désormais publié dans la revue Voici.

Générer des requêtes et des questions synthétiques
Nous générons également des requêtes et des questions synthétiques pour chaque page. Celles-ci peuvent être utilisées à deux fins :
- Fournir des suggestions d'association de mots-clés pour la boîte de recherche au fur et à mesure que l'utilisateur tape.
- À des fins d'évaluation.
Les indices que nous utilisons pour générer des questions et des requêtes proviennent de la base de données Cet excellent article de blog 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,不返回任何额外说明文本。
Nous utilisons gemini-1.5-flash-8b
Générer des questions et des requêtes.
prendre note
Lors de la première exécution, nous avons constaté que des questions très longues étaient générées. generationconfig Ajouté le maxOutputTokens=500
C'est très utile.
Nous avons également remarqué quelques bizarreries dans les questions et les requêtes générées, telles que "string" apparaissant plusieurs fois dans les questions. Nous souhaitons procéder à une validation plus approfondie des questions et requêtes générées.
Utiliser Python partout
Notre public cible est la communauté grandissante de la science des données et de l'IA. Cette communauté est susceptible d'être l'un des plus grands contributeurs à Python sur GitHub. Rapport sur l'état d'avancement d'OctoverseL'une des principales raisons pour lesquelles il est classé comme le langage de programmation le plus populaire (et celui qui connaît la croissance la plus rapide) est qu'il s'agit de l'un des langages de programmation les plus populaires au monde.
Nous devons utiliser Python en arrière-plan pour le raisonnement intégré aux requêtes (en utilisant le module colpali-moteur-), jusqu'à ce que Vespa supporte nativement la bibliothèque ColpaliEmbedder
(En cours de développement, voir problème github). Si d'autres langages (et leurs frameworks) sont utilisés pour le front-end, cela augmentera la complexité du projet, rendant ainsi plus difficile la reproduction de l'application par d'autres.
Nous avons donc décidé de développer l'ensemble de l'application en Python.
Choix du framework front-end
Streamlit et Gradio
Nous admettons qu'il est très facile de construire des PoC (Proof of Concepts) simples en utilisant Gradio et Streamlit, et nous les avons utilisés dans le passé à cette fin. Mais il y a deux raisons principales pour lesquelles nous avons décidé de ne pas les utiliser :
- Nous avions besoin d'une interface utilisateur professionnelle pouvant être utilisée dans un environnement de production.
- Nous avons besoin de bonnes performances. Attendre quelques secondes ou voir l'interface utilisateur se figer par intermittence n'est pas suffisant pour l'application que nous voulons présenter.
Même si nous aimons faire de l'exercice, nous n'aimons pas le message "En cours d'exécution" dans le coin supérieur droit de l'écran Streamlit.

FastHTML à la rescousse
Nous sommes. answer.ai de leurs fidèles fans. C'est pourquoi, lorsqu'ils ont publié au début de l'année FastHTML3Lorsque c'est le cas, nous sommes heureux de faire un essai.
FastHTML est un framework permettant de construire des applications web modernes en utilisant purement Python. Selon son vision (de l'avenir): :
FastHTML est un système de programmation web polyvalent et complet, dans la même catégorie que Django, NextJS, et Ruby on Rails. Sa vision est d'être le moyen le plus facile de créer des prototypes rapides, mais aussi le moyen le plus facile de créer des applications évolutives, puissantes et riches.
FastHTML utilise la technologie sous-jacente starlette répondre en chantant uvicorn.
Il est livré avec Pico CSS pour le stylisme. Comme Leandro, un développeur web expérimenté de l'équipe, souhaitait essayer Tailwind CSS, ainsi que notre nouvelle application shad4fastNous avons décidé de combiner FastHTML et shadcn/ui Les magnifiques composants de l'interface utilisateur de la
Pyvespa
Notre client Vespa Python pyvespa Dans le passé, il était principalement utilisé pour le prototypage d'applications Vespa. Cependant, nous avons récemment travaillé pour fournir plus de support pour les fonctionnalités de Vespa à travers pyvespa. Le déploiement en production est maintenant supporté, et la configuration avancée de Vespa via pyvespa a été ajoutée ! services.xml
du fichier. Pour plus de détails, voir ces Exemples et détails dans le carnet.
Par conséquent, la plupart des applications Vespa qui ne nécessitent pas de composants Java personnalisés peuvent être construites avec pyvespa.
Anecdote :
Les fonctions de configuration avancées de pyvespa sont en fait influencées par le fait que FastHTML va ft
-inspiré par la façon dont les composants sont enveloppés et convertis en balises HTML. Dans pyvespa, nous avons un vt
-Le composant "Vespa" effectue une opération similaire, le transformant en Vespa. services.xml
Tags. Les lecteurs intéressés peuvent consulter Ce PR En savoir plus. Cette approche nous permet d'économiser beaucoup de travail par rapport à l'implémentation de classes personnalisées pour toutes les balises prises en charge.
En outre, le processus de construction d'une application Vespa à l'aide de pyvespa nous a permis d'effectuer une validation pratique.
logiciel
En tant qu'outil d'intégration de ColPali avec prise en charge native de Vespa, il est encore dans la phase d'élaboration du projet. WIP nous savons que le GPU est nécessaire pour compléter l'inférence. D'après nos expériences dans Colab, nous concluons qu'une instance T4 est suffisante.
Afin de générer l'intégration avant d'intégrer les pages PDF du jeu de données dans Vespa, nous avons envisagé d'utiliser un fournisseur de GPU sans serveur (Modal (l'un de nos favoris). Cependant, comme l'ensemble de données ne comporte "que" 6 692 pages, nous avons utilisé un Macbook M2 Pro et travaillé pendant 5 à 6 heures pour créer ces liens.
tutelle
De nombreuses options s'offrent à nous. Nous pourrions opter pour un fournisseur de cloud traditionnel comme AWS, GCP ou Azure, mais cela nécessiterait plus d'efforts de notre part pour mettre en place et gérer l'infrastructure et rendrait plus difficile la réplication de l'application par d'autres.
Nous avons appris que Espaces de câlins Ils offrent un service d'hébergement où vous pouvez ajouter des GPU selon vos besoins. Ils proposent également un bouton "Cloner cet espace" en un clic qui permet à d'autres de copier l'application très facilement.
Nous avons trouvé answer.ai Crée un Bibliothèques réutilisablesqui peut être utilisé pour déployer des applications FastHTML sur des espaces Hugging Face. Après une recherche plus approfondie, nous avons découvert que leur approche utilise le SDK Docker pour manipuler les espaces, et qu'il existe en fait des moyens plus simples de le faire.
Grâce à l'utilisation de Espaces Python personnalisés.
sol huggingface-hub Documentation: :
Bien qu'il ne s'agisse pas d'un flux de travail officiel, vous pouvez exécuter votre propre pile Python + interface dans Spaces en choisissant Gradio comme SDK et en fournissant une interface frontale sur le port 7860.
Anecdote 2 : La documentation contient une erreur de frappe indiquant que le port sur lequel le service est fourni est 7680
. Heureusement, il ne nous a pas fallu longtemps pour découvrir que le port correct était le suivant 7860
et a présenté un PRLe bug a été corrigé par Julien Chaumond, CTO de Hugging Face, et a été fusionné par Julien Chaumond. Tâches de la liste de contrôle terminées !
modèle de langage visuel
Pour la partie "Génération" du RAG visuel, nous avons besoin d'un modèle de langage visuel (VLM) pour générer des réponses basées sur les documents les mieux classés obtenus par Vespa.
Vespa Native Support LLM(Large Language Model), soit en externe, soit en interne, mais le VLM (Visual Language Model) n'est pas encore pris en charge de manière native dans Vespa.
Avec OpenAI, Anthropic et Google qui ont tous publié d'excellents modèles de langage visuel (VLM) au cours de l'année écoulée, le domaine se développe rapidement. Pour des raisons de performance, nous avons voulu choisir un modèle plus petit, compte tenu du fait que Google n'a pas de modèle de langage visuel. Gémeaux a récemment amélioré l'expérience des développeurs, nous avons décidé d'utiliser l'API gemini-1.5-flash-8b
.
Bien entendu, il est recommandé de procéder à une évaluation quantitative des différents modèles avant de choisir un modèle dans un environnement de production, mais cela dépasse le cadre de ce projet.
construire
Une fois la pile technologique en place, nous pouvons commencer à construire l'application. L'architecture de haut niveau de l'application est la suivante :

Application Vespa
Les principaux éléments de l'application Vespa sont les suivants :
- Documents contenant des champs et des types définition du schéma.
- Profil de classement Définition.
- un
services.xml
Fichier de configuration.
Tous. possible Défini en Python à l'aide de pyvespa, mais nous recommandons de vérifier également les fichiers de configuration générés, ce qui peut être fait en appelant la fonction app.package.to_files()
à mettre en œuvre. Pour plus d'informations, voir documentation pyvespa.
Configuration du classement
L'une des caractéristiques les plus méconnues de la Vespa est le système d'alimentation en eau. Classement par étape Fonction. Elle permet de définir plusieurs profils de classement, chacun pouvant contenir des phases de classement différentes (ou héritées) qui peuvent être exécutées sur des nœuds de contenu (phase 1 et phase 2) ou des nœuds de conteneur (scène mondiale).
Cela nous permet de traiter séparément de nombreux cas d'utilisation différents et de trouver l'équilibre idéal entre la latence, le coût et la qualité pour chaque situation.
Lisez ce que notre PDG Jon Bratseth a à dire sur l'inversion architecturale qui consiste à déplacer le calcul vers le côté données de l'équation. Cet article de blog.
Pour cette application, nous avons défini trois configurations de classement différentes :
prendre note récupérer (données)L'étape consiste à faire passer la requête par l'outil yql spécifié, et lestratégie de classementest spécifié dans le fichier de configuration du classement (qui fait partie du paquetage de l'application fourni au moment du déploiement).
1) Pure ColPali
L'algorithme utilisé pour ce mode de classement dans notre application est le suivant :
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();
Nous allons également hnsw.exploreAdditionalHits
Le paramètre est ajusté à 300 pour s'assurer qu'aucune correspondance pertinente n'est manquée pendant la phase d'extraction. Veuillez noter que cela entraîne un coût en termes de performances.
Parmi ceux-ci rq{i}
est le i-ième de la requête Jeton (qui doit être fourni en tant que paramètre dans la requête HTTP).n
est le nombre maximum de jetons de requête à récupérer (nous utilisons 64 dans cette application).
Cette configuration de classement utilise l'option max_sim_binary
Expression de classement qui tire parti de la fonctionnalité optimisée de calcul de la distance de Hamming dans Vespa (pour plus d'informations, voir Faire passer ColPali à des milliards d'euros. Ces données sont utilisées lors de la première étape du classement et les 100 premières correspondances sont reclassées en utilisant la représentation complète en virgule flottante de l'intégration de ColPali.
2. classement purement textuel (BM25)
Dans ce cas, nous nous basons uniquement sur les weakAnd
Récupérer le document.
select title, text from pdf_page where userQuery();
Dans la phase de classement, nous utilisons bm25 Effectuer le classement de la phase I (pas de phase II).
Notez que pour des performances optimales, il est probable que nous voulions utiliser une combinaison de caractéristiques de classement basées sur le texte et sur la vision (par exemple, en utilisant l'option Intégration du classement réciproque), mais dans cette démonstration, nous voulons montrer les différences entre elles plutôt que de trouver la combinaison optimale.
3. mélanger BM25 + ColPali
Dans la phase de recherche, nous utilisons le même yql que dans la configuration de classement pure de ColPali.
Nous avons remarqué que pour certaines requêtes, en particulier les plus courtes, ColPali pur correspondait à de nombreuses pages sans texte (images uniquement), alors que de nombreuses réponses que nous recherchions apparaissaient en fait dans des pages avec texte.
Pour résoudre ce problème, nous avons ajouté une expression de classement de deuxième étape combinant le score BM25 et le score ColPali, en utilisant une combinaison linéaire des deux scores (max_sim + 2 * (bm25(title) + bm25(text))
).
Cette méthode est basée sur une simple heuristique, mais il serait plus avantageux de trouver les poids optimaux pour les différentes caractéristiques en effectuant des expériences de classement.
Génération de fragments dans Vespa
Dans la partie frontale de la recherche, il est courant d'inclure des extraits du texte source avec certains mots dans un champ de recherche. gras (police de caractères) (surligné) Affichage.

L'affichage d'extraits de termes de recherche correspondants dans leur contexte permet aux utilisateurs de déterminer rapidement si les résultats sont susceptibles de répondre à leurs besoins d'information.
Dans Vespa, cette fonction est appelée "extraits dynamiques" et plusieurs paramètres peuvent être ajustés, tels que la quantité de contexte environnant à inclure et les étiquettes utilisées pour mettre en évidence les mots correspondants.
Dans cette démonstration, nous montrons à la fois l'extrait et le texte complet extrait de la page à des fins de comparaison.
Afin de réduire le bruit visuel dans les résultats, nous avons supprimé les mots vides (et, dans, le, etc.) de la requête de l'utilisateur afin qu'ils ne soient pas mis en évidence.
En savoir plus sur les segments dynamiques de Vespa.
Recommandations de recherche dans Vespa
Les "suggestions de recherche", qui s'affichent au fur et à mesure que l'utilisateur tape, sont une caractéristique courante de la recherche.
Les requêtes d'utilisateurs réels sont souvent utilisées pour fournir des résultats précalculés, mais ici nous n'avons pas de trafic d'utilisateurs à analyser.

Dans cet exemple, nous utilisons une simple recherche de sous-chaînes qui fait correspondre un préfixe saisi par l'utilisateur à une question pertinente générée à partir d'une page PDF afin de fournir des suggestions.
La requête yql que nous utilisons pour obtenir ces suggestions est la suivante :
select questions from pdf_page where questions matches (".*{query}.*")
L'un des avantages de cette approche est que toute question apparaissant dans les recommandations peut être confirmée comme ayant une réponse dans les données disponibles !
Nous aurions pu nous assurer que la page générant la question suggérée apparaisse toujours dans les trois premières réponses (en ajoutant une métrique de similarité entre la requête de l'utilisateur et la question générée par le document dans la configuration du tri), mais cela aurait été un peu "triché" du point de vue de la démonstration de la fonctionnalité du modèle ColPali.
expérience utilisateur
Nous avons la chance de pouvoir compter sur le scientifique en chef de l'Agence européenne pour la sécurité et la santé au travail. Jo Bergum Il a obtenu de nous un excellent retour d'information sur l'interface utilisateur. Il nous a poussés à rendre l'UX "rapide et fluide". Les gens sont habitués à Google, il ne fait donc aucun doute que la vitesse est essentielle à l'expérience de l'utilisateur en matière de recherche (et de RAG). C'est un aspect qui est encore quelque peu sous-estimé dans la communauté de l'IA, où de nombreuses personnes semblent être satisfaites d'attendre 5 à 10 secondes pour obtenir une réponse. Or, nous voulons obtenir des temps de réponse de l'ordre de la milliseconde.
Sur la base de ses commentaires, nous devons mettre en place un processus de demande échelonné afin d'éviter d'attendre que l'image complète et le tenseur de similarité soient renvoyés par Vespa avant d'afficher les résultats.
La solution consiste à n'extraire que les données les plus importantes des résultats. Pour nous, il s'agit d'extraire uniquement les title
,url
,text
,page_no
ainsi qu'une version réduite (floue) de l'image (32x32 pixels) pour l'affichage initial des résultats de la recherche. Cela nous permet d'afficher les résultats immédiatement et de continuer à charger l'image complète et la cartographie de similarité en arrière-plan.
Le processus UX complet est illustré ci-dessous :
Les principales sources de retard sont les suivantes :
- Temps d'inférence pour générer des embeddings ColPali (effectué sur le GPU, en fonction du nombre de Token dans la requête)
- Nous avons donc décidé d'utiliser le
@lru_cache
afin d'éviter de recalculer l'intégration plusieurs fois pour la même requête.
- Nous avons donc décidé d'utiliser le
- Temps de latence du réseau entre Face Spaces et Vespa (y compris les poignées de main TCP)
- Le temps de transfert des images complètes est également important (environ 0,5 Mo par image).
- La taille du tenseur de similarité est plus importante (
n_query_tokens
xn_images
(x 1030 patchs x 128).
- La création d'une image hybride mappée par similarité est une tâche gourmande en ressources humaines, mais elle est réalisée à l'aide de la fonction
fastcore
(utilisé comme expression nominale)@threaded
Le décorateur est réalisé dans une tâche d'arrière-plan multithread, où chaque image interroge son point de terminaison correspondant pour vérifier si le mappage de similarité est prêt.
test de stress
Nous étions préoccupés par les performances de notre application lors d'une augmentation subite du trafic, et nous avons donc mené une expérience simple de test de stress. L'expérience a été réalisée en utilisant un outil de développement de navigateur pour envoyer des requêtes /fetch_results
La commande cURL a été copiée (sans que la mise en cache soit activée) et exécutée en boucle sur 10 terminaux parallèles. (À ce stade, nous avons désactivé la fonction @lru_cache
Décorateur).
en fin de compte
Bien que les tests aient été très basiques, les premiers tests ont montré que le goulot d'étranglement dans le débit de recherche était le calcul des embeddings ColPali sur les GPU dans l'espace Huggingface, alors que le backend Vespa pouvait facilement traiter plus de 20 requêtes par seconde avec une très faible utilisation des ressources. Nous pensons que cela est plus que suffisant pour les démonstrations. Si nous avons besoin de passer à l'échelle supérieure, notre première étape consistera à activer une instance GPU plus grande pour l'espace Huggingface.
L'application Vespa fonctionne bien sous charge, comme le montrent les graphiques suivants.


Réflexions sur l'utilisation de FastHTML
Le principal avantage de l'utilisation de FastHTML est qu'il fait tomber les barrières entre le développement du front-end et du back-end. Le code est étroitement intégré, ce qui nous permet à tous de comprendre et de contribuer à chaque partie de l'application. Il ne faut pas sous-estimer cet aspect.
Nous avons vraiment apprécié de pouvoir utiliser les outils de développement du navigateur pour inspecter le code frontal et en voir et comprendre la majeure partie.
Le processus de développement et de déploiement est considérablement simplifié par rapport à l'utilisation d'un cadre frontal autonome.
Il nous permet d'utiliser uv managérial propriété ce qui change radicalement la façon dont nous gérons les dépendances en Python.
Le point de vue de Thomas :
En tant que développeur avec une formation en science des données et en IA, préférant Python mais ayant travaillé avec plusieurs frameworks JS, mon expérience a été très positive. Je me suis senti plus à même de m'engager dans des tâches liées au front-end sans ajouter trop de complexité au projet. J'ai vraiment apprécié de pouvoir comprendre chaque partie de l'application.
Le point de vue d'Andreas :
Je travaille sur Vespa depuis longtemps, mais je n'ai pas beaucoup touché à Python ou au développement frontal. Je me suis sentie un peu dépassée le premier ou le deuxième jour, mais c'est tellement excitant de pouvoir travailler en full stack et de voir les effets de mes changements presque en temps réel ! Avec l'aide du grand modèle linguistique, il est plus facile que jamais d'entrer dans un environnement inconnu. J'ai beaucoup apprécié le fait que nous ayons pu créer des correspondances de similarité avec une latence et une consommation de ressources bien moindres en calculant la similarité de patchs d'images à l'aide d'expressions tensorielles dans Vespa (les vecteurs sont déjà stockés en mémoire) et en les renvoyant avec les résultats de la recherche.
Le point de vue de Leandro :
En tant que développeur ayant une base solide en développement web utilisant React, JavaScript, TypeScript, HTML et CSS, le passage à FastHTML a été relativement simple. Le mappage direct des éléments HTML du framework était très cohérent avec mes connaissances antérieures, ce qui a réduit la courbe d'apprentissage. Le principal défi a été de s'adapter à la syntaxe de FastHTML basée sur Python, qui diffère de la structure HTML/JS standard.
La technologie visuelle est-elle tout ce dont vous avez besoin ?
Nous avons constaté que l'utilisation de l'intégration tardive des interactions au niveau du token à partir du modèle du langage de vision (VLM) est très puissante pour certains types de requêtes, mais nous ne la considérons pas comme une solution unique, mais plutôt comme un outil très précieux dans la boîte à outils.
Outre ColPali, d'autres innovations ont vu le jour dans le domaine de la recherche visuelle au cours de l'année écoulée. Deux approches particulièrement intéressantes sont :
- Intégration de captures d'écran de documents (DSE)5 - Un modèle d'encodeur double pour générer des encastrements denses pour les captures d'écran de documents et utiliser ces encastrements pour la récupération.
- IBM Docling - Une bibliothèque pour analyser plusieurs types de documents (par exemple, PDF, PPT, DOCX, etc.) en Markdown, en évitant l'OCR et en utilisant à la place des modèles de vision par ordinateur.
Vespa permet de combiner ces approches et permet aux développeurs de trouver l'équilibre le plus intéressant entre la latence, le coût et la qualité pour des cas d'utilisation spécifiques.
Nous pouvons envisager une application qui combine une extraction de texte de haute qualité avec Docling ou des outils similaires, une recherche intensive grâce à l'intégration de captures d'écran de documents, et une recherche intensive grâce à des caractéristiques de texte et à des modèles de type ColPali de l'image de l'utilisateur. MaxSim
Les scores sont triés. Si vous souhaitez vraiment améliorer les performances, vous pouvez même combiner toutes ces fonctions avec des fonctions telles que XGBoost peut-être LightGBM La combinaison du modèle GBDT de la
Par conséquent, bien que ColPali soit un outil puissant pour rendre les informations difficiles à extraire d'un texte récupérables, il n'est pas une panacée et doit être combiné à d'autres approches pour obtenir des performances optimales.
chaînon manquant
La modélisation est temporaire, tandis que l'évaluation est permanente.
L'ajout d'évaluations automatisées dépasse le cadre de cette démo, mais nous vous recommandons vivement de créer un ensemble de données d'évaluation pour votre propre cas d'utilisation. Vous pouvez utiliser LLM-as-a-judge pour amorcer le processus (voir ceci Articles de blogEn savoir plus sur la façon dont nous fournissons search.vespa.ai (S'en rendant compte).
Vespa offre un certain nombre de paramètres ajustables, et en fournissant un retour quantitatif sur différentes expériences, vous pouvez trouver les compromis les plus attrayants pour votre cas d'utilisation spécifique.
rendre un verdict
Nous avons créé une application de démonstration en direct qui montre comment effectuer une recherche visuelle RAG de PDF dans Vespa à l'aide de l'intégration ColPali.
Si vous avez lu jusqu'ici, vous serez peut-être intéressé par le code. Vous pouvez trouver le code dans la section ici (littéraire) Trouvez le code de l'application.
Maintenant, créez votre propre application visuelle RAG !
Pour ceux qui veulent en savoir plus sur la récupération visuelle, ColPali ou Vespa, n'hésitez pas à nous rejoindre ! Communauté Slack de Vespa Posez une question, demandez de l'aide à la communauté ou découvrez les derniers développements chez Vespa.
problèmes courants
L'utilisation de ColPali nécessite-t-elle l'utilisation d'un GPU pour l'inférence ?
Actuellement, pour raisonner sur les requêtes en un temps raisonnable, nous devons utiliser le GPU.
À l'avenir, nous nous attendons à ce que la qualité et l'efficacité (par exemple, des encastrements plus petits) des modèles de type ColPali s'améliorent et que d'autres modèles similaires émergent, comme nous l'avons vu avec la famille de modèles ColBERT, tels que le modèle de answer.ai. answerai-colbert-small-v1Le modèle ColBERT a été développé pour la première fois et ses performances dépassent celles du modèle ColBERT original, bien qu'il soit moins d'un tiers de la taille du modèle original.
Voir aussi Blog Vespa En savoir plus sur l'utilisation du système Vespa answerai-colbert-small-v1
.
Est-il possible d'utiliser ColPali en conjonction avec un filtre de requête dans Vespa ?
Peut. Dans cette application, nous ajoutons la page à la rubrique published_year
mais sa fonctionnalité en tant qu'option de filtrage n'a pas encore été mise en œuvre sur le front-end.
Quand Vespa prendra-t-il en charge les liens ColPali en mode natif ?
Voir aussi Ce problème GitHub.
Cette méthode est-elle applicable à des milliards de documents ?
Oui, Vespa prend en charge la mise à l'échelle horizontale et vous permet d'ajuster le compromis entre la latence, le coût et la qualité pour des cas d'utilisation spécifiques.
Cette démo peut-elle être adaptée pour prendre en charge ColQwen2 ?
C'est possible, mais il existe des différences dans le calcul des cartes de similarité.
Voir aussi Ce carnet En guise de point de départ.
Puis-je exécuter cette démonstration avec mes propres données ?
Absolument ! En ajustant les carnet de notes En vous référant à vos données, vous pouvez créer votre propre application Vespa pour le RAG visuel. Vous pouvez également utiliser l'application web fournie comme point de départ pour votre propre interface.
bibliographie
© déclaration de droits d'auteur
Article copyright Cercle de partage de l'IA Tous, prière de ne pas reproduire sans autorisation.
Articles connexes
Pas de commentaires...