AI Personal Learning
und praktische Anleitung

Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung

Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung-1(jemandem eine Stelle etc.) anbieten

Thomas kam im April 2024 als Senior Software Engineer zu Vespa. In seiner letzten Tätigkeit als KI-Berater baute er eine umfangreiche PDF-Sammlung auf der Grundlage von Vespas RAG Anwendungen.

PDFs sind in der Unternehmenswelt allgegenwärtig, und die Möglichkeit, in ihnen zu suchen und Informationen abzurufen, ist ein häufiger Anwendungsfall. Die Herausforderung besteht darin, dass viele PDFs typischerweise in eine oder mehrere der folgenden Kategorien fallen:

  • Da es sich um gescannte Dokumente handelt, kann der Text nicht einfach extrahiert werden, so dass eine OCR verwendet werden muss, was die Komplexität noch erhöht.
  • Sie enthalten eine große Anzahl von Schaubildern, Tabellen und Diagrammen, die nicht leicht abrufbar sind, selbst wenn der Text extrahiert werden kann.
  • Sie enthalten viele Bilder, die manchmal wertvolle Informationen enthalten.

Beachten Sie, dass der Begriff ColPali Es gibt zwei Bedeutungen:

  1. besondere Modellierung und eine damit verbundene ein Papier oder eine These diskutieren (alt) Es trainiert einen LoRa-Adapter auf dem VLM (PaliGemma), um gemeinsame Text- und Bildeinbettungen (eine Einbettung für jeden Fleck im Bild) für die "Post-Interaktion" auf der Grundlage der ColBERT Methoden zur Erweiterung des visuellen Sprachmodells.
  2. Sie stellt auch eine visuelle Dokumentensuche dar Ausrichtungen die die Fähigkeiten von VLMs mit effizienten Post-Interaktionsmechanismen kombiniert. Diese Richtung ist nicht auf das spezifische Modell im Originalbeitrag beschränkt, sondern kann auch auf andere VLMs angewandt werden, wie z. B. unser Vorschlag, ColQwen2 und Vespas Notizbuch .

In diesem Blog-Beitrag erfahren Sie, wie Sie eine Echtzeit-Demo-Anwendung erstellen, die visuelles RAG auf Vespa mit ColPali-Embeds zeigt. Wir beschreiben die Architektur der Anwendung, das Benutzererlebnis und den für die Erstellung der Anwendung verwendeten Technologie-Stack.


Hier sind einige Screenshots der Demo-Anwendung:

Das erste Beispiel ist keine übliche Abfrage, aber es zeigt die Leistungsfähigkeit der visuellen Suche für bestimmte Arten von Abfragen. Dies ist ein gutes Beispiel für das Paradigma "What You See Is What You Search (WYSIWYS)".

Die Ähnlichkeitszuordnung hebt die ähnlichsten Abschnitte hervor, so dass die Nutzer leicht erkennen können, welche Teile der Seite für die Suchanfrage am relevantesten sind.

Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung-1Das zweite Beispiel, eine häufigere Benutzeranfrage, zeigt die Leistungsfähigkeit von ColPali in Bezug auf semantische Ähnlichkeit.  Visual RAG für PDF mit Vespa - eine Python-Demoanwendung-2

Da er aus erster Hand erfahren hat, wie schwierig es ist, PDFs durchsuchbar zu machen, ist Thomas besonders an den neuesten Entwicklungen im Bereich der visuellen Sprachmodellierung (VLM) interessiert.

Nach der Lektüre des letzten Beitrags über ColPali Vespa Blog Beiträge Zusammenarbeit mit Jo Bergum Nach einer Reihe eingehender Diskussionen wurde er dazu inspiriert, ein Projekt zum Aufbau einer visuellen RAG-Anwendung mit Vespa vorzuschlagen.

Bei Vespa haben die Mitarbeiter die Möglichkeit, ein Arbeitsprogramm vorzuschlagen, das sie in jedem Iterationszyklus durchführen möchten. Solange die vorgeschlagene Arbeit mit den Unternehmenszielen übereinstimmt und es keine anderen dringenden Prioritäten gibt, können wir loslegen. Für Thomas, der aus der Beratungsbranche kommt, ist diese Autonomie wie ein frischer Wind.

TL;DR

Wir haben eine Demo-Anwendung in EchtzeitDieser Artikel zeigt, wie man ein PDF-basiertes Visual RAG mit ColPali-Einbettung in Vespa und Python mit nur FastHTML implementiert.

Wir stellen auch Reproduktionscodes zur Verfügung:

  1. Ein lauffähiges NotizbuchDamit können Sie Ihre eigene Vespa-Anwendung einrichten, um Visual RAG zu implementieren.
  2. FastHTML-Anwendung Code, den Sie verwenden können, um eine Webanwendung einzurichten, die mit der Vespa-Anwendung interagiert.

Ziele des Projekts

Mit dem Projekt werden zwei Hauptziele verfolgt:

1. eine Echtzeit-Demonstration aufzubauen

Auch wenn Entwickler mit einer Demo mit JSON-Terminalausgabe als Benutzeroberfläche zufrieden sein können, bevorzugen die meisten Anwender eine Webschnittstelle.

Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung-1Dies wird uns ermöglichen, das PDF Visual RAG in Vespa auf der Grundlage der ColPali-Einbettung zu demonstrieren, von dem wir glauben, dass es für eine breite Palette von Bereichen und Anwendungsfällen wie Recht, Finanzen, Bauwesen, Wissenschaft und Medizin relevant ist.

Wir sind zuversichtlich, dass dies in Zukunft wichtig sein wird, aber wir haben noch keine praktischen Anwendungen gesehen, die dies belegen.

Gleichzeitig haben wir dadurch viele wertvolle Erkenntnisse in Bezug auf Effizienz, Skalierbarkeit und Benutzerfreundlichkeit gewonnen. Außerdem waren wir sehr neugierig (oder ein wenig nervös), ob es schnell genug war, um ein gutes Nutzererlebnis zu bieten.

Wir wollten auch einige der nützlichen Funktionen der Vespa hervorheben, zum Beispiel:

2. eine Open-Source-Vorlage erstellen

Wir möchten eine Vorlage für andere bereitstellen, damit diese ihre eigenen Visual RAG-Anwendungen erstellen können.

Diese Vorlage sollte für andere ausreichend seinEinfacherEs besteht keine Notwendigkeit, eine große Anzahl von spezifischen Programmiersprachen oder Frameworks zu beherrschen.

Erstellen eines Datensatzes

Für unsere Demo wollten wir einen PDF-Datensatz verwenden, der eine große Menge an wichtigen Informationen in Form von Bildern, Tabellen und Diagrammen enthält. Außerdem benötigen wir einen ausreichend großen Datensatz, um zu demonstrieren, dass es nicht möglich ist, alle Bilder direkt in das VLM hochzuladen (und den Abrufschritt zu überspringen).

ausnutzen gemini-1.5-flash-8bDie maximale Anzahl der eingegebenen Bilder beträgt derzeit 3600.

Da es keinen öffentlichen Datensatz gab, der unseren Anforderungen entsprach, beschlossen wir, unseren eigenen zu erstellen.

Als stolze Norweger haben wir mit Freude festgestellt, dass der Norwegian Government Global Pension Fund (GPFG, auch bekannt als Petroleum Fund) seit 2000 Jahresberichte und Governance-Dokumente auf seiner Website veröffentlicht. Auf der Website wird das Urheberrecht nicht erwähnt und die jüngstenVertretungenWir haben bewiesen, dass er der transparenteste Fonds der Welt ist, und sind daher zuversichtlich, dass wir diese Daten zu Demonstrationszwecken verwenden können.

Der Datensatz umfasst 116 verschiedene PDF-Berichte aus den Jahren 2000 bis 2024, die insgesamt 6992 Seiten umfassen.

Der Datensatz, der Bilder, Texte, URLs, Seitenzahlen, generierte Fragen, Abfragen und ColPali-Einbettungen enthält, ist jetzt im Internet veröffentlicht. hier sind.

Visual RAG für PDF mit Vespa - eine Python-Demoanwendung-4

Generierung synthetischer Abfragen und Fragen

Wir generieren auch synthetische Abfragen und Fragen für jede Seite. Diese können für zwei Zwecke verwendet werden:

  1. Bereitstellung von Vorschlägen für Schlüsselwort-Assoziationen für das Suchfeld während der Eingabe durch den Benutzer.
  2. Für Bewertungszwecke.

Die Hinweise, die wir zur Erstellung von Fragen und Abfragen verwenden, stammen aus dem Dieser großartige Blogbeitrag von Daniel van Strien.

Sie sind ein Investor, Aktienanalyst und Finanzexperte. Als nächstes sehen Sie ein Bild einer Berichtsseite, die vom Norwegian Government Global Pension Fund (GPFG) veröffentlicht wurde. Bei dem Bericht kann es sich um einen Jahres- oder Quartalsbericht oder um einen politischen Bericht zu einem Thema wie verantwortungsbewusstes Investieren, Risiko usw. handeln.
Ihre Aufgabe ist es, Suchanfragen und Fragen zu erstellen, mit denen dieses Dokument (oder darauf basierende Fragen) in einer großen Dokumentenbibliothek abgerufen werden kann.
Bitte erstellen Sie drei verschiedene Arten von Suchanfragen und Fragen.
Suchanfragen sind stichwortbasierte Abfragen, die aus 2-5 Wörtern bestehen und zum Auffinden des Dokuments in einer Suchmaschine verwendet werden.
Fragen sind Fragen in natürlicher Sprache, bei denen das Dokument die Antwort auf die Frage enthält.
Es gibt folgende Arten von Suchanfragen:
1. allgemeine Themenabfrage: deckt das Hauptthema des Dokuments ab.
2. spezifische Detailabfragen: beziehen sich auf ein bestimmtes Detail oder einen bestimmten Aspekt des Dokuments. 3.
3. Abfrage eines visuellen Elements: bezieht sich auf ein visuelles Element im Dokument, wie z. B. ein Diagramm, eine Grafik oder ein Bild.
Wichtige Richtlinien:
- Stellen Sie sicher, dass die Abfrage für die Suchaufgabe relevant ist und nicht nur den Inhalt der Seite beschreibt.
- Verwenden Sie einen faktenbasierten, natürlichsprachlichen Stil für das Schreiben von Fragen.
- Entwerfen Sie Abfragen unter der Annahme, dass jemand in einem großen Dokumentenspeicher nach diesem Dokument suchen wird.
- Die Abfragen sollten vielfältig sein und verschiedene Suchstrategien repräsentieren.
Formatieren Sie Ihre Antwort als JSON-Objekt mit der folgenden Struktur:
{
"broad_topical_question": "Was ist die verantwortungsvolle Investitionspolitik für 2019?" ,
"broad_topical_query": "Verantwortungsvolle Anlagepolitik 2019",
"specific_detail_question": "Wie hoch ist der Anteil der Investitionen in erneuerbare Energien?" ,
"specific_detail_query": "Wie hoch ist der Anteil der Investitionen in erneuerbare Energien?", "specific_detail_query": "Wie hoch ist der Anteil der Investitionen in erneuerbare Energien?" ,
"visual_element_question": "Wie ist die zeitliche Entwicklung des Gesamtwerts der Beteiligungen?" ,
"visual_element_query": "Entwicklung des Gesamtwertes der Beteiligung"
}
Wenn es kein relevantes visuelles Element gibt, geben Sie leere Zeichenfolgen in den visuellen Elementen question und query ein.
Unten sehen Sie ein Bild des zu analysierenden Dokuments:
Bitte erstellen Sie eine Abfrage auf der Grundlage dieses Bildes und liefern Sie die Antwort im angegebenen JSON-Format.
Es wird nur JSON zurückgegeben, kein zusätzlicher erläuternder Text.

Wir verwenden gemini-1.5-flash-8b Generieren Sie Fragen und Abfragen.

zur Kenntnis nehmen

Beim ersten Durchlauf stellten wir fest, dass einige sehr langwierige Ausgaben erzeugt wurden, so dass wir einen neuen Abschnitt in die generationconfig Hinzufügen der maxOutputTokens=500Das ist sehr hilfreich.

Außerdem sind uns einige Merkwürdigkeiten in den generierten Fragen und Abfragen aufgefallen, wie z. B. das mehrfache Auftreten von "string" in den Fragen. Wir wollen die generierten Fragen und Abfragen noch eingehender überprüfen.

Python durchgängig verwenden

Unsere Zielgruppe ist die wachsende Data-Science- und KI-Community. Diese Gemeinschaft wird wahrscheinlich einer der größten Beitragszahler für Python auf GitHub sein. Octoverse StatusberichtEiner der Hauptgründe, warum sie als die beliebteste (und am schnellsten wachsende) Programmiersprache gilt, ist, dass sie eine der beliebtesten Programmiersprachen der Welt ist.

Wir müssen Python am Backend für die in die Abfrage eingebetteten Schlussfolgerungen verwenden (unter Verwendung der colpali-engine-Library), bis Vespa nativ die ColpaliEmbedder (In Entwicklung, siehe Github-Problem). Wenn andere Sprachen (und deren Frameworks) für das Frontend verwendet werden, erhöht sich die Komplexität des Projekts, wodurch es für andere schwieriger wird, die Anwendung zu reproduzieren.

Deshalb haben wir beschlossen, die gesamte Anwendung in Python zu erstellen.

Wahl des Front-End-Frameworks

Streamlit und Gradio

Wir geben zu, dass es sehr einfach ist, einfache PoCs (Proof of Concepts) mit Gradio und Streamlit zu erstellen, und wir haben sie in der Vergangenheit auch für diesen Zweck verwendet. Aber es gibt zwei Hauptgründe, warum wir uns gegen sie entschieden haben:

  1. Wir brauchten eine professionell aussehende Benutzeroberfläche, die in einer Produktionsumgebung verwendet werden konnte.
  2. Wir brauchen eine gute Leistung. Ein paar Sekunden Wartezeit oder ein gelegentliches Einfrieren der Benutzeroberfläche sind für die Anwendung, die wir präsentieren wollen, nicht ausreichend.

So gern wir auch trainieren, die Meldung "Läuft" in der oberen rechten Ecke des Streamlit-Bildschirms gefällt uns nicht.

Visual RAG für PDF mit Vespa - eine Python-Demoanwendung-4

FastHTML als Retter in der Not

Wir sind. Antwort.ai ihrer treuen Fans. Als sie also Anfang dieses Jahres FastHTML3Wenn das der Fall ist, probieren wir es gerne aus.

FastHTML ist ein Framework zur Erstellung moderner Webanwendungen mit reinem Python. Laut seiner Vision (der Zukunft)::

FastHTML ist ein universelles, vollwertiges Web-Programmiersystem, das in die gleiche Kategorie wie Django, NextJS und Ruby on Rails fällt. Seine Vision ist es, der einfachste Weg zu sein, um schnelle Prototypen zu erstellen, aber auch der einfachste Weg, um skalierbare, leistungsstarke, reichhaltige Anwendungen zu erstellen.

FastHTML verwendet die zugrunde liegende Sternchen im Gesang antworten uvicorn.

Es kommt mit Pico-CSS für das Styling. Da Leandro, ein erfahrener Webentwickler im Team, Tailwind CSS ausprobieren wollte, zusammen mit unserem kürzlich entdeckten shad4fastWir haben uns für eine Kombination von FastHTML und shadcn/ui Die schönen UI-Komponenten in der

Pyvespa

Unser Vespa-Python-Kunde pyvespa In der Vergangenheit wurde es hauptsächlich für das Prototyping von Vespa-Anwendungen verwendet. Wir haben jedoch kürzlich daran gearbeitet, mehr Unterstützung für Vespa-Funktionen durch pyvespa bereitzustellen. Das Deployment in die Produktion wird nun unterstützt und die erweiterte Konfiguration von Vespa über pyvespa wurde hinzugefügt! services.xml Funktion der Datei. Für Details, siehe diese Beispiele und Details im Notizbuch.

Daher können die meisten Vespa-Anwendungen, die keine eigenen Java-Komponenten benötigen, mit pyvespa erstellt werden.

Eine Anekdote:

Die erweiterten Konfigurationsmöglichkeiten von pyvespa werden durch die Tatsache beeinflusst, dass FastHTML ft-inspiriert von der Art und Weise, wie Komponenten umhüllt und in HTML-Tags umgewandelt werden. In pyvespa haben wir die vt-Komponente führt eine ähnliche Operation durch und wandelt sie in eine Vespa um services.xml Stichworte. Interessierte Leserinnen und Leser können sich informieren über Diese PR Erfahren Sie mehr. Dieser Ansatz spart uns eine Menge Arbeit im Vergleich zur Implementierung benutzerdefinierter Klassen für alle unterstützten Tags.

Außerdem ermöglichte uns der Prozess der Erstellung einer Vespa-Anwendung mit pyvespa eine praktische Validierung.

Software

Als ColPali-Embedder mit nativer Unterstützung für Vespa ist er noch in der WIP wissen wir, dass die GPU benötigt wird, um die Inferenz abzuschließen. Aus unseren Experimenten in Colab schließen wir, dass eine T4-Instanz ausreichend ist.

Um die Einbettung zu generieren, bevor die PDF-Seiten des Datensatzes in Vespa eingebettet werden, haben wir die Verwendung eines serverlosen GPU-Anbieters (Modal (einer unserer Favoriten). Da der Datensatz jedoch "nur" 6.692 Seiten umfasst, haben wir ein Macbook M2 Pro verwendet und 5-6 Stunden gearbeitet, um diese Einbettungen zu erstellen.

Treuhandschaft

Hier gibt es eine Reihe von Möglichkeiten. Wir könnten uns für einen traditionellen Cloud-Anbieter wie AWS, GCP oder Azure entscheiden, aber das würde einen höheren Aufwand für uns bedeuten, um die Infrastruktur einzurichten und zu verwalten, und es würde es für andere schwieriger machen, die Anwendung zu replizieren.

Wir haben gelernt, dass Gesicht umarmen Räume Sie bieten einen Hosting-Service an, bei dem Sie nach Bedarf GPUs hinzufügen können. Außerdem gibt es eine Schaltfläche "Diesen Bereich klonen", die es anderen sehr leicht macht, die Anwendung zu kopieren.

Wir haben festgestellt, dass answer.ai eine Wiederverwendbare Bibliothekendie verwendet werden kann, um FastHTML-Anwendungen auf Hugging Face Spaces einzusetzen. Bei weiteren Recherchen fanden wir jedoch heraus, dass ihr Ansatz das Docker SDK verwendet, um Spaces zu manipulieren, und dass es eigentlich einfachere Wege gibt, dies zu tun.

Durch den Einsatz von Benutzerdefinierte Python-Räume.

Stiftung huggingface-hub Dokumentation::

Obwohl dies kein offizieller Arbeitsablauf ist, können Sie Ihren eigenen Python + Interface Stack in Spaces ausführen, indem Sie Gradio als SDK wählen und eine Front-End-Schnittstelle auf Port 7860 bereitstellen.

Anekdote 2: Es gibt einen Tippfehler in der Dokumentation, der besagt, dass der Port, über den der Dienst bereitgestellt wird, 7680. Glücklicherweise haben wir nicht lange gebraucht, um herauszufinden, dass der richtige Anschluss der folgende sein sollte 7860und reichte eine PRvon Julien Chaumond, CTO von Hugging Face, zusammengeführt und der Fehler behoben. Aufgaben der Checkliste abgeschlossen!

visuelles Sprachmodell

Für den Teil "Generierung" der visuellen RAG benötigen wir ein visuelles Sprachmodell (VLM), um Antworten auf der Grundlage der von Vespa erhaltenen Dokumente mit dem höchsten K-Ranking zu generieren.

Vespa Native Unterstützung LLM(Large Language Model), entweder extern oder intern integriert, aber VLM (Visual Language Model) wird in Vespa noch nicht nativ unterstützt.

Mit OpenAI, Anthropic und Google, die im letzten Jahr alle hervorragende visuelle Sprachmodelle (VLMs) veröffentlicht haben, wächst das Feld schnell. Aus Leistungsgründen wollten wir ein kleineres Modell wählen, da Google die Zwillinge API in letzter Zeit die Erfahrung der Entwickler verbessert hat, haben wir beschlossen, die gemini-1.5-flash-8b.

Natürlich ist eine quantitative Bewertung verschiedener Modelle empfehlenswert, bevor man sich für ein Modell in einer Produktionsumgebung entscheidet, aber das würde den Rahmen dieses Projekts sprengen.

bauen

Mit dem vorhandenen Technologie-Stack können wir mit der Erstellung der Anwendung beginnen. Die High-Level-Architektur der Anwendung sieht wie folgt aus:

Visual RAG für PDF mit Vespa - Eine Python-Demo-Anwendung-5

Vespa Anwendung

Zu den wichtigsten Komponenten der Vespa-Anwendung gehören:

Alle von ihnen. möglich Definiert in Python mit pyvespa, aber wir empfehlen, auch die generierten Konfigurationsdateien zu überprüfen, was durch den Aufruf der app.package.to_files() zu implementieren. Ausführliche Informationen finden Sie unter pyvespa-Dokumentation.

Rangliste Konfiguration

Eines der am meisten unterschätzten Merkmale der Vespa ist die Rangfolge nach Etappen Funktion. Sie ermöglicht die Definition mehrerer Ranking-Profile, von denen jedes unterschiedliche (oder geerbte) Ranking-Phasen enthalten kann, die auf Inhaltsknoten (Phase 1 und Phase 2) oder Containerknoten ausgeführt werden können (Weltbühne).

So können wir viele verschiedene Anwendungsfälle getrennt behandeln und für jede Situation das ideale Gleichgewicht zwischen Latenz, Kosten und Qualität finden.

Lesen Sie, was unser CEO Jon Bratseth über die architektonische Umkehrung der Verlagerung der Rechenleistung auf die Datenseite der Gleichung zu sagen hat. Dieser Blogbeitrag.

Für diese Anwendung haben wir 3 verschiedene Ranking-Konfigurationen definiert:

zur Kenntnis nehmen abrufen (Daten)Der Schritt besteht darin, die Abfrage durch den yql angegeben, und dieRanking-Strategiewird in der Rangordnungskonfigurationsdatei angegeben (die Teil des Anwendungspakets ist, das zum Zeitpunkt der Bereitstellung bereitgestellt wird).

1. reines ColPali

Der in unserer Anwendung für diesen Ranking-Modus verwendete yql lautet:

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

Wir werden auch hnsw.exploreAdditionalHits Der Parameter wird auf 300 eingestellt, um sicherzustellen, dass während der Abrufphase keine relevanten Treffer übersehen werden. Bitte beachten Sie, dass dies mit Leistungseinbußen verbunden ist.

darunter auch rq{i} ist die i-te in der Abfrage Token (die als Parameter in der HTTP-Anfrage angegeben werden muss).n ist die maximale Anzahl der abzurufenden Abfrage-Token (in dieser Anwendung werden 64 verwendet).

Diese Ranking-Konfiguration verwendet die max_sim_binary Ranking-Ausdruck, der die optimierte Hamming-Distanz-Berechnungsfunktion in Vespa nutzt (weitere Informationen unter Skalierung von ColPali auf MilliardenbeträgeDiese Methode wird in der ersten Stufe der Rangliste verwendet. Diese Methode wird in der ersten Stufe der Rangliste verwendet, und die 100 besten Treffer werden unter Verwendung der vollständigen Gleitkommadarstellung der ColPali-Einbettung neu gereiht.

2. rein textbasiertes Ranking (BM25)

In diesem Fall stützen wir uns nur auf die weakAnd Rufen Sie das Dokument ab.

select title, text from pdf_page where userQuery();

In der Ranking-Phase verwenden wir bm25 Durchführung der Phase I des Rankings (keine Phase II).

Beachten Sie, dass wir für eine optimale Leistung wahrscheinlich eine Kombination aus textbasierten und bildbasierten Einstufungsmerkmalen verwenden werden (z. B. unter Verwendung der Integration der wechselseitigen Rangliste), aber in dieser Demonstration wollen wir die Unterschiede zwischen ihnen aufzeigen und nicht die optimale Kombination finden.

3. mischen BM25 + ColPali

In der Retrieval-Phase verwenden wir das gleiche yql wie in der reinen ColPali-Ranking-Konfiguration.

Wir stellten fest, dass ColPali bei einigen, vor allem kürzeren Suchanfragen viele Seiten ohne Text (nur mit Bildern) gefunden hat, während viele der gesuchten Antworten auf Seiten mit Text zu finden waren.

Um dieses Problem zu lösen, fügten wir eine zweite Stufe hinzu, die den BM25-Score und den ColPali-Score kombiniert und eine lineare Kombination der beiden Scores verwendet (max_sim + 2 * (bm25(Titel) + bm25(Text))).

Diese Methode basiert auf einfachen Heuristiken, aber es wäre vorteilhafter, die optimalen Gewichtungen für verschiedene Merkmale durch Ranking-Experimente zu ermitteln.

Fragmentgenerierung in Vespa

Im Such-Frontend ist es üblich, Auszüge aus dem Ausgangstext mit bestimmten Wörtern in einem fett (Schriftart) (Hervorgehoben) Anzeige.

Visual RAG für PDF mit Vespa - eine Python-Demoanwendung-6

Die Anzeige von Ausschnitten passender Suchbegriffe im Kontext ermöglicht es den Nutzern, schnell festzustellen, ob die Ergebnisse ihrem Informationsbedarf entsprechen.

In Vespa wird diese Funktion als "dynamische Snippets" bezeichnet, und es gibt verschiedene Parameter, die angepasst werden können, z. B. wie viel Umgebungskontext einbezogen werden soll und welche Bezeichnungen zur Hervorhebung passender Wörter verwendet werden.

In dieser Demo zeigen wir zum Vergleich sowohl den Ausschnitt als auch den gesamten extrahierten Text der Seite.
Um das visuelle Rauschen in den Ergebnissen zu reduzieren, haben wir die Stoppwörter (und, in, der usw.) aus der Suchanfrage des Benutzers entfernt, damit sie nicht hervorgehoben werden.

Erfahren Sie mehr über die dynamischen Segmente von Vespa.

Abfrage von Empfehlungen in Vespa

Eine gängige Funktion bei der Suche sind "Suchvorschläge", die während der Eingabe angezeigt werden.
Echte Nutzeranfragen werden oft verwendet, um vorberechnete Ergebnisse zu liefern, aber hier haben wir keinen Nutzerverkehr zu analysieren.

Visual RAG für PDF mit Vespa - Eine Python-Demo-Anwendung-7

In diesem Beispiel verwenden wir eine einfache Teilstringsuche, die ein vom Benutzer eingegebenes Präfix mit einer aus einer PDF-Seite generierten relevanten Frage vergleicht, um Vorschläge zu machen.

Die yql-Abfrage, mit der wir diese Vorschläge erhalten, lautet:

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

Ein Vorteil dieses Ansatzes ist, dass alle Fragen, die in den Empfehlungen auftauchen, durch die verfügbaren Daten bestätigt werden können!

Wir hätten dafür sorgen können, dass die Seite, die die vorgeschlagene Frage generiert, immer unter den ersten drei Antworten erscheint (indem wir in der Sortierkonfiguration eine Ähnlichkeitsmetrik zwischen der Benutzerabfrage und der vom Dokument generierten Frage hinzugefügt hätten), aber das wäre im Hinblick auf die Demonstration der Funktionsweise des ColPali-Modells ein bisschen "geschummelt" gewesen.

Benutzererfahrung

Wir sind in der glücklichen Lage, dass der leitende Wissenschaftler von Jo Bergum Er bekam großartiges UX-Feedback von uns. Er drängte uns, die UX "schnell und flüssig" zu gestalten. Die Menschen sind an Google gewöhnt, daher besteht kein Zweifel, dass Geschwindigkeit für die Nutzererfahrung bei der Suche (und RAG) entscheidend ist. In der KI-Gemeinschaft wird dies immer noch etwas unterschätzt, denn viele Menschen scheinen damit zufrieden zu sein, 5-10 Sekunden auf eine Antwort zu warten. Und wir wollen Antwortzeiten in Millisekunden erreichen.

Auf der Grundlage seines Feedbacks müssen wir einen gestaffelten Anfrageprozess einrichten, um zu vermeiden, dass wir warten müssen, bis das vollständige Bild und der Ähnlichkeitszuordnungstensor von Vespa zurückgegeben werden, bevor wir die Ergebnisse anzeigen können.

Die Lösung besteht darin, zunächst nur die wichtigsten Daten aus den Ergebnissen zu extrahieren. Für uns bedeutet das, dass wir nur die Titel, undurl, undText, undseiten_nummersowie eine verkleinerte (unscharfe) Version des Bildes (32x32 Pixel) für die Anzeige der ersten Suchergebnisse. Auf diese Weise können wir die Ergebnisse sofort anzeigen und das Laden des vollständigen Bildes und der Ähnlichkeitszuordnung im Hintergrund fortsetzen.

Der gesamte UX-Prozess ist unten dargestellt:

Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung-1Die Hauptursachen für Verzögerungen sind:

  • Inferenzzeit für die Generierung von ColPali-Einbettungen (erfolgt auf der GPU, abhängig von der Anzahl der Token in der Abfrage)
    • Deshalb haben wir beschlossen, die @lru_cache Dekorator, um zu vermeiden, dass die Einbettung für dieselbe Abfrage mehrmals neu berechnet wird.
  • Umarmende Netzwerklatenz zwischen Face Spaces und Vespa (einschließlich TCP-Handshakes)
    • Die Übertragungszeit für vollständige Bilder ist ebenfalls beträchtlich (etwa 0,5 MB pro Bild).
    • Die Größe des Ähnlichkeitsabbildungstensors ist größer (n_abfrage_tokens x n_images (x 1030 Patches x 128).
  • Die Erstellung eines Hybridbildes mit Ähnlichkeitsabbildung ist eine rechenintensive Aufgabe, die jedoch mit dem Fastcore (in Form eines Nominalausdrucks) @threaded Der Dekorator wird in einer Multithreading-Hintergrundaufgabe ausgeführt, bei der jedes Bild seinen entsprechenden Endpunkt abfragt, um zu prüfen, ob die Ähnlichkeitszuordnung bereit ist.

Stresstest

Wir waren besorgt über die Leistung unserer Anwendung bei einem starken Anstieg des Datenverkehrs und führten daher ein einfaches Stresstest-Experiment durch. Das Experiment wurde mit Hilfe eines Browser-Entwicklungstools durchgeführt, um Anfragen zu senden /fetch_results Der cURL-Befehl wurde kopiert (mit nicht aktivierter Zwischenspeicherung) und in einer Schleife über 10 parallele Terminals ausgeführt. (An diesem Punkt haben wir die @lru_cache Dekorateur).

am Ende

Obwohl die Tests sehr einfach waren, zeigten die ersten Tests, dass der Engpass beim Suchdurchsatz die Berechnung der ColPali-Einbettungen auf den GPUs im Huggingface-Raum war, während das Vespa-Backend problemlos mehr als 20 Abfragen pro Sekunde bei sehr geringem Ressourcenverbrauch bewältigen konnte. Wir denken, dass dies für Demos mehr als ausreichend ist. Wenn wir skalieren müssen, wäre unser erster Schritt, eine größere GPU-Instanz für den Huggingface-Raum zu aktivieren.

Die Vespa-Anwendung zeigt eine gute Leistung unter Last, wie die folgenden Diagramme zeigen.

Visual RAG für PDF mit Vespa - Eine Python-Demo-Anwendung-10

Visual RAG für PDF mit Vespa - eine Python-Demoanwendung-11

Überlegungen zur Verwendung von FastHTML

Die wichtigste Erkenntnis aus dem Einsatz von FastHTML ist, dass es die Grenzen zwischen Front-End- und Back-End-Entwicklung aufhebt. Der Code ist eng integriert, was es uns allen ermöglicht, jeden Teil der Anwendung zu verstehen und dazu beizutragen. Dies sollte nicht unterschätzt werden.

Wir haben es sehr genossen, dass wir die Entwicklungswerkzeuge des Browsers nutzen konnten, um den Front-End-Code zu untersuchen und das meiste davon tatsächlich zu sehen und zu verstehen.

Der Entwicklungs- und Bereitstellungsprozess wird im Vergleich zur Verwendung eines eigenständigen Front-End-Frameworks erheblich vereinfacht.

Sie ermöglicht uns die Nutzung uv Geschäftsführung Eigentum Abhängigkeiten, was die Art und Weise, wie wir mit Abhängigkeiten in Python umgehen, drastisch verändert.

Thomas' Ansicht:

Als Entwickler mit einem datenwissenschaftlichen und KI-Hintergrund, der Python bevorzugt, aber mit mehreren JS-Frameworks gearbeitet hat, waren meine Erfahrungen sehr positiv. Ich fühlte mich besser in der Lage, mich mit Front-End-bezogenen Aufgaben zu beschäftigen, ohne dem Projekt zu viel Komplexität zu verleihen. Ich habe es sehr genossen, dass ich jeden Teil der Anwendung verstehen konnte.

Der Blick von Andreas:

Ich arbeite schon lange an Vespa, habe mich aber noch nicht viel mit Python oder Frontend-Entwicklung befasst. In den ersten ein oder zwei Tagen fühlte ich mich ein wenig überfordert, aber es ist so aufregend, dass ich mit dem gesamten Stack arbeiten kann und die Auswirkungen meiner Änderungen fast in Echtzeit sehe! Mit Hilfe des großen Sprachmodells ist es einfacher denn je, in eine unbekannte Umgebung einzusteigen. Mir hat es sehr gut gefallen, dass wir die Ähnlichkeit von Bildfeldern durch Tensorausdrücke innerhalb von Vespa berechnen konnten (die Vektoren waren bereits im Speicher gespeichert) und sie mit den Suchergebnissen zurückgeben konnten, wodurch Ähnlichkeitszuordnungen mit viel geringerer Latenz und geringerem Ressourcenverbrauch erstellt wurden.

Leandros Ansicht:

Als Entwickler mit einer soliden Grundlage in der Webentwicklung mit React, JavaScript, TypeScript, HTML und CSS war der Wechsel zu FastHTML relativ einfach. Das direkte HTML-Element-Mapping des Frameworks war sehr konsistent mit meinem Vorwissen, was die Lernkurve reduzierte. Die größte Herausforderung bestand darin, sich an die Python-basierte Syntax von FastHTML zu gewöhnen, die sich von der Standard-HTML/JS-Struktur unterscheidet.

Ist visuelle Technologie alles, was Sie brauchen?

Wir haben gesehen, dass die Verwendung der späten Interaktionseinbettung auf Token-Ebene aus dem Vision Language Model (VLM) für bestimmte Arten von Abfragen sehr leistungsfähig ist, aber wir sehen sie nicht als Einheitslösung, sondern eher als ein sehr wertvolles Werkzeug im Werkzeugkasten.

Neben ColPali gab es im vergangenen Jahr weitere Innovationen im Bereich des visuellen Retrievals. Zwei besonders interessante Ansätze sind:

  • Dokument-Screenshot-Einbettungen (DSE)5 - Ein duales Kodierungsmodell zur Erzeugung dichter Einbettungen für Screenshots von Dokumenten und zur Verwendung dieser Einbettungen für die Suche.
  • IBM Docling - Eine Bibliothek zum Parsen verschiedener Dokumenttypen (z. B. PDF, PPT, DOCX usw.) in Markdown, die OCR vermeidet und stattdessen ein Computer-Vision-Modell verwendet.

Vespa unterstützt die Kombination dieser Ansätze und ermöglicht es Entwicklern, die attraktivste Balance zwischen Latenz, Kosten und Qualität für bestimmte Anwendungsfälle zu finden.

Wir können uns eine Anwendung vorstellen, die qualitativ hochwertige Textextraktion mit Docling oder ähnlichen Tools, intensives Retrieval durch Einbettung von Screenshots in Dokumente und intensives Retrieval durch Textmerkmale und ColPali-ähnliche Modellierung der MaxSim Die Ergebnisse werden sortiert. Wenn Sie die Leistung wirklich verbessern wollen, können Sie all diese Funktionen sogar mit Funktionen wie den folgenden kombinieren XGBoost vielleicht LichtGBM Die Kombination aus dem GBDT-Modell der

ColPali ist zwar ein leistungsfähiges Werkzeug, um schwer zu extrahierende Informationen in Texten abrufbar zu machen, aber es ist kein Allheilmittel und sollte mit anderen Ansätzen kombiniert werden, um eine optimale Leistung zu erzielen.

fehlende Verbindung

Die Modellierung ist vorübergehend, während die Bewertung dauerhaft ist.

@charles_irl on X

Das Hinzufügen automatischer Auswertungen würde den Rahmen dieser Demo sprengen, aber wir empfehlen Ihnen dringend, einen Auswertungsdatensatz für Ihren eigenen Anwendungsfall zu erstellen. Sie können mit LLM-as-a-judge bootstrappen (siehe dies Blog-BeiträgeErfahren Sie mehr darüber, wie wir Ihnen suche.vespa.ai (Dies zu erkennen).

Vespa bietet eine Reihe von einstellbaren Parametern, und durch die Bereitstellung von quantitativem Feedback zu verschiedenen Experimenten können Sie die attraktivsten Kompromisse für Ihren spezifischen Anwendungsfall finden.

ein Urteil fällen

Wir haben eine Live-Demo-Anwendung erstellt, die zeigt, wie man in Vespa mit ColPali-Einbettung eine visuelle RAG-Abfrage von PDFs durchführt.

Wenn Sie bis hierher gelesen haben, sind Sie vielleicht an dem Code interessiert. Sie finden den Code in der hier (literarisch) Finden Sie den Code für die App.

Erstellen Sie jetzt Ihre eigene visuelle RAG-Anwendung!

Wer mehr über visuelles Retrieval, ColPali oder Vespa erfahren möchte, kann sich gerne anschließen! Vespas Slack-Gemeinschaft Stellen Sie eine Frage, suchen Sie Hilfe in der Community oder informieren Sie sich über die neuesten Entwicklungen bei Vespa.

allgemeine Probleme

Erfordert die Verwendung von ColPali die Nutzung eines Grafikprozessors für die Inferenz?

Derzeit müssen wir die GPU nutzen, um Abfragen in einer vernünftigen Zeitspanne zu beantworten.

Für die Zukunft erwarten wir, dass sich die Qualität und Effizienz (z.B. kleinere Einbettungen) von ColPali-ähnlichen Modellen verbessern und weitere ähnliche Modelle entstehen werden, wie wir es bei der ColBERT-Modellfamilie gesehen haben, z.B. bei answer.ai's antwortai-colbert-klein-v1Das ColBERT-Modell wurde zum ersten Mal entwickelt, und seine Leistung übertrifft die des ursprünglichen ColBERT-Modells, obwohl es weniger als ein Drittel der Größe des ursprünglichen Modells hat.

Siehe auch Vespa Blog Erfahren Sie mehr über die Verwendung von Vespas antwortai-colbert-klein-v1.

Ist es möglich, ColPali in Verbindung mit einem Abfragefilter in Vespa zu verwenden?

können. In dieser Anwendung fügen wir die Seite zum veröffentlicht_Jahr Feld, aber seine Funktionalität als Filteroption wurde noch nicht in das Frontend implementiert.

Wann wird Vespa nativ ColPali-Einbettungen unterstützen?

Siehe auch Dieses GitHub-Problem.

Lässt sich dies auf Milliarden von Dokumenten übertragen?

Ja, Vespa unterstützt die horizontale Skalierung und ermöglicht es Ihnen, den Kompromiss zwischen Latenz, Kosten und Qualität für bestimmte Anwendungsfälle anzupassen.

Kann diese Demo angepasst werden, um ColQwen2 zu unterstützen?

Es ist möglich, aber es gibt einige Unterschiede bei der Berechnung von Ähnlichkeitskarten.

Siehe auch Dieses Notizbuch Das ist der Ausgangspunkt.

Kann ich diese Demo mit meinen eigenen Daten durchführen?

Unbedingt! Durch die Einstellung der vorgesehenen Notizbuch Sie können Ihre eigene Vespa-Anwendung für Visual RAG einrichten, indem Sie auf Ihre Daten verweisen. Sie können auch die mitgelieferte Webanwendung als Ausgangspunkt für Ihr eigenes Frontend verwenden.

bibliographie

  1. ColPali: Effiziente Dokumentensuche mit visuellen Sprachmodellen
  2. pyvespa Notizbuch zur Verwendung von ColQwen2 mit Vespa
  3. Verbesserung des Abrufs mit LLM als Richter
  4. Skalierung von ColPali auf Milliardenbeträge
  5. Dokument-Screenshot-Einbettungen
  6. Docling
  7. FastHTML
AI Leichtes Lernen

Der Leitfaden für Laien zum Einstieg in die KI

Hilft Ihnen, die Nutzung von KI-Tools kostengünstig und von Null an zu erlernen.KI ist, wie Bürosoftware, eine wesentliche Fähigkeit für jeden. Die Beherrschung von KI verschafft Ihnen einen Vorteil bei der Stellensuche und die Hälfte des Aufwands bei Ihrer zukünftigen Arbeit und Ihrem Studium.

Details ansehen>
Darf nicht ohne Genehmigung vervielfältigt werden:Chef-KI-Austauschkreis " Visual RAG für PDF mit Vespa - eine Python-basierte Demo-Anwendung

Chef-KI-Austauschkreis

Der Chief AI Sharing Circle konzentriert sich auf das KI-Lernen und bietet umfassende KI-Lerninhalte, KI-Tools und praktische Anleitungen. Unser Ziel ist es, den Nutzern dabei zu helfen, die KI-Technologie zu beherrschen und gemeinsam das unbegrenzte Potenzial der KI durch hochwertige Inhalte und den Austausch praktischer Erfahrungen zu erkunden. Egal, ob Sie ein KI-Anfänger oder ein erfahrener Experte sind, dies ist der ideale Ort für Sie, um Wissen zu erwerben, Ihre Fähigkeiten zu verbessern und Innovationen zu verwirklichen.

Kontaktieren Sie uns
de_DE_formalDeutsch (Sie)