Ich habe von einem Community-Mitglied ein wirklich hervorragendes Feedback zu meiner Einreichung beim Python 2024-Wettbewerb erhalten. Ich hoffe, es ist in Ordnung, wenn ich es hier erneut poste:
Sie bauen einen Behälter, der mehr als fünfmal so groß ist wie reine IRIS
und das braucht Zeit
Containerstart ist ebenfalls langsam, wird aber abgeschlossen
Backend ist wie beschrieben zugänglich
eine Produktion hängt herum
Frontend reagiert
Ich verstehe nicht, was angezeigt werden soll
Die Erklärung ist für andere Experten als mich gedacht
Die Einreichung ist hier: https://openexchange.intersystems.com/package/IRIS-RAG-App
Ich freue mich sehr über dieses Feedback, nicht zuletzt, weil es eine tolle Anregung für einen Artikel über das Projekt ist. Dieses Projekt enthält eine ziemlich umfassende Dokumentation, setzt jedoch Kenntnisse mit Vektoreinbettungen, RAG-Pipelines und LLM-Textgenerierung sowie Python und bestimmten beliebten Python-Bibliotheken wie LLamaIndex voraus.
Dieser Artikel, der komplett ohne KI geschrieben wurde, soll ein Versuch sein, diese Dinge zu erklären und wie sie in diesem Projekt zur Demonstration des RAG zusammenpassen Workflow auf IRIS.
Der Container ist groß, da die Bibliotheksabhängigkeiten, die für die Python-Pakete benötigt werden, die an der Erstellung von Vektoreinbettungen beteiligt sind, sehr groß sind. Es ist möglich, dass durch selektivere Importe die Größe deutlich reduziert werden könnte.
Es dauert zwar einige Zeit, den Container zunächst zu erstellen, aber sobald Sie dies getan haben, dauert es weniger Zeit, ihn zu starten. Die Startzeit könnte durchaus noch verbessert werden. Der Hauptgrund dafür, dass der Start so lange dauert, ist, dass „entrypoint.sh“ unter der Annahme aktualisiert wurde, dass seit dem letzten Start möglicherweise Änderungen an irgendeinem Teil der Anwendung vorgenommen wurden, einschließlich der Datenbankmigrationen, CSS-Konfigurationen, Javascript-Konfigurationen und der Python Backend-Code und kompiliert das gesamte Projekt bei jedem Start neu. Dies soll den Einstieg in die Entwicklung dieses Projekts erleichtern, da es sonst schwierig sein kann, die Frontend- und Backend-Builds bei jeder Änderung ordnungsgemäß auszuführen. Wenn Sie auf diese Weise Code im Projekt ändern, müssen Sie nur den Container neu starten, möglicherweise die Produktion im Backend wiederherstellen, und Ihre Änderungen sollten sich in der Benutzeroberfläche und im Betrieb der Anwendung widerspiegeln.
Ich bin mir ziemlich sicher, dass die Produktion im Backend die http-Anfragen an die Django-Anwendung weiterleitet und für die Interoperabilität in diesem Paket von entscheidender Bedeutung ist. Ich bin jedoch neu auf der IRIS-Plattform und möchte noch mehr über Produktionen erfahren.
Als nächstes möchte ich eine umfassende Erläuterung von Vektoreinbettungen, LLMs und RAG geben. Die erste davon, die erfunden wurde, war die Vektoreinbettung. Zuerst können wir einen Vektor beschreiben. In den meisten Zusammenhängen ist ein Vektor eine Richtung. Es ist ein Pfeil, der irgendwo im Weltraum zeigt. Formaler ausgedrückt ist ein Vektor „eine Größe, die sowohl Richtung als auch Größe hat“. Ein Beispiel dafür könnte ein Feuerwerk sein, das sich in eine bestimmte Richtung bewegt und an einem bestimmten Punkt im Raum explodiert. Nehmen wir an, jedes Feuerwerk wird vom selben zentralen Punkt abgefeuert, einem Ursprungspunkt, [0,0,0], aber sie fliegen alle heraus und explodieren in einer Wolke um diesen Ursprungspunkt. Mathematisch könnte man den Ort jeder Feuerwerksexplosion mithilfe eines Drei-Koordinatensystems [x,y,z] beschreiben, und das wäre eine „Vektoreinbettung“ für eine Feuerwerksexplosion. Wenn Sie viele Videos eines Feuerwerks aufnehmen und alle Feuerwerksexplosionen als Datensatz aufzeichnen würden, würden Sie eine Art Vektoreinbettungsdatenbank oder Vektorspeicher des Feuerwerks erstellen.
Was könnten Sie mit diesen Informationen über das Feuerwerk machen? Wenn ich auf ein bestimmtes Feuerwerk hinweist und nach dem Feuerwerk frage, das während der gesamten Vorführung am nächsten an demselben Punkt explodiert, könnte man die anderen Feuerwerkskörper finden, die an nahegelegenen Punkten im Weltraum explodieren. Sie finden einfach diejenigen, die am nächsten liegen, und dafür gibt es Mathematik.
Denken Sie daran, dass wir für jedes Feuerwerk nur drei Zahlen aufgezeichnet haben, die X-, Y- und Z-Koordinaten in einem dreidimensionalen Raum mit [0,0,0] der Feuerwerkswerfer am Boden sein.
Was wäre, wenn ich auch wissen wollte, welches Feuerwerk sowohl in der Entfernung als auch zeitlich am nächsten zu einem anderen bestimmten Feuerwerk explodierte? Um das zu wissen, müssten wir unsere Videoaufnahmen des Feuerwerks noch einmal durchsehen und auch den Zeitpunkt jeder Explosion aufzeichnen. Jetzt haben wir einen 4-dimensionalen Vektor mit 4 Zahlen: der dreidimensionalen Position der Feuerwerksexplosion und dem Zeitpunkt der Explosion. Jetzt haben wir eine aussagekräftigere Art der Einbettung für das Feuerwerk, indem wir unseren Vektoreinbettungen eine weitere Dimension hinzufügen.
Wie lässt sich das auf maschinelles Lernen übertragen? Nun, um es kurz zu machen: Durch die Verarbeitung einer riesigen Menge an Textdaten gelang es Informatikern, Einbettungsmodelle zu erstellen, die ein Textstück wie eine Phrase, einen Satz, einen Absatz oder sogar eine Seite umwandeln und in eine sehr lange Reihe umwandeln können von Zahlen, die einen Punkt in einem theoretischen hochdimensionalen Raum darstellen.
Anstelle von 4 Zahlen gibt es 300 oder 700 oder sogar 1500. Diese repräsentieren 1500 Möglichkeiten, wie ein Textstück „nah“ sein kann oder „weit“ entfernt von einem anderen, oder 1500 Bedeutungsdimensionen. Für viele ist es ein faszinierendes Konzept, dass wir die Möglichkeit haben, Zahlen zu erstellen, die in irgendeiner Weise die semantische Bedeutung eines Textstücks darstellen.
Mit Hilfe von Mathematik können zwei dieser hochdimensionalen Textvektoreinbettungen verglichen werden, um herauszufinden, wie ähnlich oder „nah“ sie einander sind, wenn sie es wären nach dem gleichen Modell erstellt.
Das ist das Erste, was in dieser App passiert. Der Benutzer muss ein Dokument eingeben, es benennen und dann einen Einbettungstyp auswählen. Der Server nimmt dieses Dokument, zerlegt es in Textblöcke und wandelt dann jeden dieser Blöcke in eine Vektoreinbettung um. Dieser Block wird als Zeile in einer speziellen Tabelle für dieses Dokument gespeichert. Jedes Dokument wird in einer eigenen Tabelle gespeichert, um die variable Länge der Vektoreinbettungen zu berücksichtigen, die von verschiedenen Texteinbettungsmodellen erstellt werden.
Sobald ein Dokument als Vektoreinbettungen in der Datenbank gespeichert ist, kann der Benutzer eine Abfrage eingeben, um das Dokument zu „fragen“. Die Abfrage wird auf zwei Arten verwendet. Die erste Möglichkeit besteht darin, das Dokument zu durchsuchen. Wir führen keine herkömmliche Textsuche durch, sondern eine „Vektorsuche“. Die App nimmt die Abfrage, wandelt sie in eine Vektoreinbettung um und findet dann die Abschnitte des Dokuments mit Einbettungen, die der Abfragevektoreinbettung am ähnlichsten sind. Anschließend wird für jeden Dokumentabschnitt ein Ähnlichkeitswert zwischen 0 und 1 generiert, und basierend auf top_k_similarity und Similarity_threshold werden mehrere Abschnitte aus der Vektordatenbank abgerufen. Grundsätzlich können Sie fragen, wie viele Dokumentabschnitte abgerufen werden sollen und wie ähnlich diese Ihrer Abfrage sein müssen, um für den Abruf in Frage zu kommen.
Das ist das Retrieval in Retrieval Augmented Generation. Der nächste Schritt ist die Generation.
Sobald Informatiker herausgefunden hatten, wie man Text in semantisch signifikante numerische Vektoreinbettungen umwandelt, bestand der nächste Schritt darin, Modelle zu erstellen, die Text erzeugen konnten. Sie haben dies mit großem Erfolg getan, und jetzt haben wir große Sprachmodelle wie GPT-4, LLama3 und Claude 3.5. Diese LLMs können eine Eingabeaufforderung oder Abfrage annehmen und eine Vervollständigung oder Antwort liefern, d >
LLMs müssen anhand großer Textdatenmengen trainiert werden, und ihre Antworten oder Vervollständigungen sind auf diese Trainingsdaten beschränkt. Wenn wir möchten, dass die LLMs Vervollständigungen bereitstellen, die möglicherweise Daten umfassen, die nicht in ihren Trainingssätzen enthalten sind, oder ihre Vervollständigungen auf einem bestimmten Wissenssatz basieren, besteht eine Möglichkeit, dies zu erreichen, darin, zusätzliche Kontextdaten in die Eingabeaufforderung aufzunehmen. Wenn wir von einem LLM eine Antwort zu etwas wünschen, für das er nicht geschult wurde, müssen wir ihm grundsätzlich die Informationen in der Eingabeaufforderung geben.
Viele Menschen befanden sich in einer Situation, in der sie sich wünschten, chatGPT oder ihre lokale LLama-Installation könnten Antworten auf der Grundlage ihrer eigenen persönlichen Dokumente liefern. Es ist ganz einfach, Ihre Dokumente nach diesen Informationen zu durchsuchen, sie in die Eingabeaufforderung einzufügen und Ihre Frage einzugeben, und die Leute mussten dies manuell tun. Das ist eine eigene Form der Retrieval Augmented Generation. Bei RAG handelt es sich lediglich um die Automatisierung, Informationen zu finden, die für die Benutzeranfrage relevant sind, und diese mit der Anfrage an das LLM weiterzuleiten, um eine genauere oder nützlichere Antwort zu erhalten.
In dieser App werden die Dokumentabschnitte, die wir mit der Vektorsuche abrufen, mit der Abfrage an das ausgewählte LLM gesendet, das in der Schnittstelle als Modell gekennzeichnet ist Geben Sie den Kontext zur Antwort an. In dem Videobeispiel, das ich für dieses Projekt erstellt habe, stelle ich die Frage „Wer ist der Bösewicht in diesem Stück?“ mit den Dokumenten „Hamlet“ und „König Lear“, die den gesamten Text der beiden Shakespeare-Stücke enthalten. Die IRIS-Datenbank enthält bereits zwei Tabellen, eine für Hamlet und die andere für King Lear. Jede Tabelle ist mit Reihen von Vektoreinbettungen gefüllt, die durch die Aufteilung des Textes jedes Stücks in Abschnitte entstehen. Bei diesen Einbettungen handelt es sich um lange Zahlenreihen, die die vielen Bedeutungsdimensionen in den einzelnen Dokumentabschnitten darstellen. Der Server wandelt die Frage „Wer ist der Bösewicht in diesem Stück“ in einen numerischen Vektor um, indem er dasselbe Text-zu-Vektor-Modell verwendet, das die Vektoreinbettungen generiert hat für König Lear und findet die Abschnitte in der Tabelle „König Lear“, die ihm am ähnlichsten sind. Dies sind wahrscheinlich Abschnitte, in denen das Wort Bösewicht erwähnt wird, ja, aber möglicherweise auch andere schurkische Dinge wie Verrat, Verrat und Betrug, auch wenn Schurken nicht ausdrücklich erwähnt werden. Diese Dokumentabschnitte werden der Abfrage hinzugefügt und zusammen als Eingabeaufforderung an ein LLM gesendet, das dann die Frage basierend auf den bereitgestellten Dokumentabschnitten beantwortet. Dies erfolgt separat für jedes Dokument, weshalb die Antwort auf die Abfrage je nach abgefragtem Dokument unterschiedlich ausfällt. Damit ist das Akronym vervollständigt, da wir die Generierung unserer Antwort aus dem LLM durch den Abruf relevanter Kontextinformationen mithilfe der Vektorsuche erweitern. Vielen Dank an alle, die sich die Zeit nehmen, dies zu lesen, und ich würde mich freuen, in einem zukünftigen Artikel näher auf eines dieser Themen einzugehen. Feedback ist immer willkommen.
Das obige ist der detaillierte Inhalt vonEine ausführliche Erläuterung von RAG, Vektorsuche und deren Implementierung auf IRIS in der IRIS RAG-App. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!