paint-brush
Möchten Sie Warhammer 40K lernen? Erstellen Sie diesen Chatbot mit Vektoren und RAG auf Commodity-Hardwareby@datastax
521
521

Möchten Sie Warhammer 40K lernen? Erstellen Sie diesen Chatbot mit Vektoren und RAG auf Commodity-Hardware

DataStax11m2024/02/26
Read on Terminal Reader

Erfahren Sie mehr über eine einfache Methode zum Kombinieren von Vektorspeichern, lexikalischer Suche und Prompt-Engineering, um eine genaue RAG auf Standardhardware durchzuführen.
featured image - Möchten Sie Warhammer 40K lernen? Erstellen Sie diesen Chatbot mit Vektoren und RAG auf Commodity-Hardware
DataStax HackerNoon profile picture
0-item


Beim Erstellen einer generativen KI-Anwendung, die ein großes Sprachmodell (LLM) mehrmals aufrufen muss, um eine Aufgabe abzuschließen, besteht ein häufiges Problem darin, dass wiederholte Abfragen an das LLM sowohl teuer als auch unvorhersehbar sein können. Große Modelle wie GPT-3.5/4 sind unglaublich ressourcenintensiv, um Inferenz zu trainieren und auszuführen; Dies spiegelt sich in den API-Gebühren sowie gelegentlichen Serviceunterbrechungen wider. ChatGPT wurde ursprünglich als Forschungsvorschau veröffentlicht und war nicht für den Einsatz in Produktionsanwendungen gedacht. Allerdings ist sein Nutzen für eine Vielzahl von Anwendungen unbestreitbar, weshalb das Interesse an LLMs explosionsartig zugenommen hat.


Seit der Einführung von ChatGPT haben Benutzer nach Möglichkeiten gesucht, den Mangel an Privatsphäre und die Unfähigkeit, die Betriebszeit oder Inferenzeinstellungen bei der Verwendung von GPT zu kontrollieren, zu umgehen. Dies hat zur Popularität kostenloser, öffentlicher Modelle wie Metas Llama 2 und später zur Entwicklung quantisierter Versionen von Llama mit niedrigeren Parametern geführt, die auf Verbraucherhardware ausgeführt werden können. Diese öffentlichen Modelle sind in der Lage, einen Großteil der gleichen Funktionalität wie GPT für viel weniger Rechenleistung bereitzustellen, allerdings auf Kosten weniger Parameter und weniger ausführlicher Ausgaben.


Wenn Ihre Anwendung nicht unbedingt auf die Verarbeitung übermäßig großer Kontexte oder die Erstellung ausführlicher Ausgaben angewiesen ist, kann das Hosten Ihrer eigenen Inferenz auf von Ihnen kontrollierten Instanzen eine kostengünstigere Option sein. Und wenn es um reale Anwendungen der Retrieval Augmented Generation (RAG) geht, könnten die Kostenunterschiede sogar noch größer werden.


Ich zeige eine einfache Methode zum Kombinieren von Vektorspeichern, lexikalischer Suche und Prompt Engineering, um eine genaue RAG auf Standardhardware durchzuführen. Mit dieser Methode können Sie sowohl die Komplexität großer Informationsmengen reduzieren als auch die Ausführung generativer KI-Anwendungen im großen Maßstab genauer, effizienter und kostengünstiger gestalten. Durch die Verwendung von RAG für bestimmte Informationsspeicher können Sie Halluzinationen beseitigen und aus jedem Quellmaterial wirksame und sachkundige Agenten erstellen, ohne für APIs von Drittanbietern bezahlen zu müssen.


Um zu beginnen, benötigen Sie entweder eine DataStax Enterprise 7-Instanz oder DataStax Astra DB zum Speichern der Vektoren und Textdaten sowie ein LLM und ein Satztransformatormodell, um Antworten zu generieren und Ihre Daten mit Vektoren zu kodieren. Abhängig von der Komplexität Ihrer Daten oder den Benutzeraufforderungen können Sie dies auch mit einer DataStax Enterprise 6.8-Datenbank kombinieren, die Solr- Suchen durchführen kann, um größere Datenbereiche abzugleichen, was ich in diesem Beispiel verwendet habe. DataStax arbeitet kontinuierlich an Verbesserungen, um alle diese Vorgänge mit einer einzigen Datenbank zu ermöglichen, aber im Moment verwende ich zwei Datenbanken.


Lösung für Halluzinationen

Unabhängig davon, für welches LLM Sie sich entscheiden, leiden sie alle immer noch unter Halluzinationen . Diese Einschränkung muss vorerst gelöst werden, indem wahrheitsgemäße Informationen in den Kontext von Eingabeaufforderungen an das LLM, auch bekannt als RAG, eingegeben werden. Die Methode, mit der Sie Ihre Informationen finden und für die Eingabeaufforderungen umwandeln, hängt vollständig von Ihrem Datenmodell ab. Durch die Verwendung von Vektordatenbanken können Sie jedoch relevantere Informationen effizienter finden.


Angenommen, Sie haben eine Sammlung von E-Books zu einem Thema, das Sie erforschen möchten, beispielsweise wie man Warhammer 40.000 spielt. Unter normalen Umständen würde es Jahre dauern, die Begleitliteratur durchzulesen und genug Spielerfahrung zu sammeln, um ein Expertenniveau zu erreichen.

Eine gezielte Frage wie „Was können Sie mir über Morvenn Vahl von Adepta Sororitas erzählen?“ Die Antwort würde am besten ein erfahrener Spieler oder ein Mitarbeiter eines Warhammer-Ladens geben. Während ChatGPT viele Fragen zum Spiel beantworten kann, liegen leider keine Trainingsdaten vor, die diesen bestimmten Charakter abdecken:

Vergleichen Sie dies mit einem Llama 2 13B-Parameter-LLM, das auf einer Consumer-Workstation mit einer Nvidia RTX A4000-Grafikkarte gehostet wird. Ebenso kann das Modell grundlegende Kenntnisse des Warhammer-Universums demonstrieren, aber aufgrund der Abstimmung ist es dem Modell egal, dass der Charakter nicht gefunden wird, und liefert stattdessen eine Best-Effort-Halluzination:

Wenn Sie einen Chatbot erstellen möchten, der sowohl Neulingen als auch Veteranen beim Spielen von Warhammer 40.000 helfen kann, dann sind diese Ergebnisse inakzeptabel. Um ein effektiver Spielführer zu sein, muss der Chatbot die Spielregeln, die Regeln für jede Einheit, einige Teile der Überlieferung sowie einige Strategien und Kommentare kennen. Glücklicherweise sind alle Informationen zu den Regeln der 10. Edition kostenlos bei Games Workshop und auf Fan-Websites verfügbar, und Sie müssen sie nur für Ihre Chatbot-App durchsuchbar machen.


Vergleichen Sie dies mit demselben 13B-Llama-Modell, bei dem bei RAG einige Quellen zu Morvenn Vahl verglichen und auf der Grundlage der Benutzeraufforderung eine relevante Antwort entwickelt werden sollen. Diesmal hat der Chatbot Zugriff auf eine Suchdatenbank und eine Vektordatenbank mit allen öffentlichen Informationen zum Spielen von Warhammer 40.000, 10. Edition:

Was für ein Unterschied! Es findet nicht nur relevante Informationen zu diesem Nischencharakter, sondern hält seine Ausgaben auch im Einklang mit dem Kontext, wie das Spiel mit den Regeln der 10. Edition gespielt wird.

Der schwierigste Teil dabei ist die Durchführung einer effektiven Suche, um die relevanten Seiten zu finden, die in das LLM eingespeist werden sollen. Hier können Vektordatenbanken besonders nützlich sein.

Anwenden von Vektoren

In diesem Beispiel verwenden wir DSE 7 und DSE 6.8, die in Docker-Instanzen ausgeführt werden, um die Datenbankanforderungen der Chatbot-Anwendung zu erfüllen, die in der Lage sein muss, Vektoren zu vergleichen und lexikalische Suchen durchzuführen. DSE 7 und Astra DB haben die Möglichkeit eingeführt, Vektoren zu speichern und Vektorsuchen durchzuführen sowie nach Textübereinstimmungen zu filtern. Für dieses Beispiel müssen wir nur ein paar Dutzend Bücher durchsuchen, sodass die Ausführung von DSE-Instanzen in Docker für die meisten Consumer-Hardware ausreichend ist.


Die Verwendung von Vektoren in Ihren Datenbanken hilft dabei, Dokumente zu finden, die einer bestimmten Abfrage ähneln, oder sie können zum Vergleichen von Ergebnissen aus einer anderen Suche verwendet werden. Dies kann Ihnen helfen, die Einschränkungen der lexikalischen Suche zu überwinden und die Effektivität von Datenmodellen zu verbessern.


Beispielsweise können E-Book-PDFs von der Kodierung mit Satztransformatoren wie miniLM profitieren, und die Vektoren können verwendet werden, um einen Ähnlichkeitsvergleich zwischen einer Abfrage und einer bestimmten Quelle durchzuführen. In diesem Fall wird ein Satztransformatormodell verwendet, um Einbettungen des Texts einer Seite in einem E-Book zu erstellen. Dadurch können Sie mit der Eingabeaufforderung des Benutzers vergleichen, um herauszufinden, ob ein Ergebnis für die Abfrage relevant ist. Relevante Seiten sollten eine oder mehrere Instanzen von Begriffen enthalten, die der Suchanfrage des Benutzers ähneln und aus Sicht des Modells zu besseren Ähnlichkeitswerten führen.


Allerdings lassen sich die Vektoren am besten als Ergänzung zu einem bestehenden lexikalischen Suchmodell anwenden. Wenn Sie nur nach Vektoren suchen, kann es sein, dass Sie unerwartet nicht verwandte Dokumente abrufen und sie als Kontext bereitstellen, auf den sie nicht zutreffen.

In diesem Beispiel lautet die Abfrage „Was können Sie mir über Morvenn Vahl von Adepta Sororitas erzählen?“ kann durch ein LLM in eine Reihe einfacher Suchbegriffe umgewandelt werden:


Morvenn, Vahl, Adepta, Sororitas


Der erste Schritt bei der Suche nach relevanten Dokumenten wäre die Suche nach Dokumenten, die diese Grundbegriffe enthalten. Dies kann erreicht werden, indem zunächst nach Textübereinstimmungen in der Datenbank gefiltert wird, um Schlüsselwörter im Seitentext zu finden, die zu einer solchen Abfrage passen. Der Grund für die Verwendung eines LLM zum Generieren von Schlüsselwörtern besteht darin, ein breiteres Spektrum möglicher Schlüsselwörter für die Suche bereitzustellen, da häufig versucht wird, weitere Schlüsselwörter hinzuzufügen, die verwandt sind, aber nicht im Text der ursprünglichen Eingabeaufforderung enthalten sind. Seien Sie dabei jedoch vorsichtig, da LLMs auch Sonderzeichen und ungerade Sequenzen generieren können, die Sie bereinigen müssen.


Sobald Sie mindestens ein Ergebnis haben, können Sie die Anfrage des Benutzers vektorisieren und mit den Vektoren der lexikalischen Suche vergleichen und so Bewertungen erstellen, wie relevant jedes Ergebnis ist. Auf diese Weise können Sie die Suchergebnisse auf ihre Genauigkeit hin überprüfen und einen Schwellenwert für die Ablehnung unabhängiger Ergebnisse festlegen, wenn Ihre Ergebnisse schließlich dem LLM präsentiert werden sollen.


In diesem Fall sollte der erste Schritt mit Seiten übereinstimmen, die speziell die Karteikarte oder Spielmechanik von Morvenn Vahl zeigen, da diese die Einheit des Charakters im Hinblick darauf beschreiben, wie sie im Spiel spielt. Wenn die Seite einen bestimmten, von der Anwendung festgelegten Relevanzschwellenwert für die Benutzerabfrage erreicht, wird sie zusammengefasst und in einer Ergebnisliste platziert.


Schließlich können die Suchergebnisse in einer Liste zusammengestellt und an das LLM zurückgegeben werden, wo es aufgefordert wird, die relevantesten Kontexte zur Beantwortung der ursprünglichen Anfrage zu verwenden. Hier ist eine Visualisierung des Flusses:



Wie Sie sehen können, wird das LLM für diesen Flow recht häufig aufgerufen. Der LLM ist dafür verantwortlich, die Benutzeraufforderung in Schlüsselwörter umzuwandeln, anwendbare Ergebnisse zusammenzufassen und auszuwählen, welcher Kontext eine Anfrage am besten beantwortet. Jede zu prüfende Quelle fügt einen weiteren LLM-Aufruf hinzu, was bei Abfragen an GPT recht teuer sein kann. Wenn Sie jedoch bereits über die benötigten Informationen verfügen und diese nur zusammenfassen oder transformieren möchten, müssen Sie möglicherweise kein so großes Modell verwenden. Tatsächlich kann der Wechsel zu kleineren Modellen eine Reihe von Vorteilen mit sich bringen.


Durch die Verwendung eines kleineren LLM können Sie den Rechenaufwand für jede Abfrage reduzieren, was im Laufe der Zeit zu erheblichen Einsparungen führen kann. Dies kann auch zu schnelleren Reaktionszeiten für Ihre Benutzer führen, was ihr Gesamterlebnis verbessern kann. In diesem Beispiel, in dem RAG mit einem kleinen LLM und kleinen Datenbanken durchgeführt wird, die alle auf derselben GPU-Instanz gehostet werden, dauert es etwa 30 Sekunden, um 15 Quellen abzurufen, sie auf Relevanz zu analysieren und eine endgültige Antwort bereitzustellen. Und je kürzer die Eingabeaufforderungen (Quellen), desto schneller können die Ausgaben zurückgegeben werden.


Darüber hinaus ermöglicht diese Methode eine erhöhte Sicherheit und Skalierbarkeit. Durch schnelles Engineering und eine Pipeline von Aufrufen an das LLM haben Sie die volle Kontrolle darüber, wie auf die Daten zugegriffen wird und was die Benutzer in ihren Antworten erhalten. Im Hinblick auf die Ressourcennutzung verbraucht das Beispiel-13B-Parametermodell nur etwas mehr als 8 GB VRAM und liefert dennoch relevante Antworten. Abhängig von den Anforderungen zeigt dies das Potenzial, RAG sogar auf unzähligen anderen Plattformen auszuführen, beispielsweise auf Benutzerarbeitsplätzen und mobilen Geräten.

Steuern der Ausgabe

Schnelles Engineering ist der Schlüssel dafür, dass RAG genau das tut, was Sie wollen. Sie haben die Kontrolle darüber, wie der Chatbot die Daten interpretiert und in welchem Kontext er denken soll. In diesem Beispiel möchten wir sicherstellen, dass der Chatbot weiß, dass wir speziell nach Warhammer-Informationen suchen, sodass wir ihn zunächst bitten können, unterstützenden Kontext für die Anfrage des Benutzers bereitzustellen:


Abfrage: „<Benutzerabfrage>“

Geben Sie mir eine minimale, durch Kommas getrennte Liste von Warhammer 40K-Schlüsselwörtern für eine Suchmaschine. Antworten Sie nur mit der Anfrage. Verwenden Sie keine Emojis oder Sonderzeichen.

Antwort:


Warhammer 40.000 ist voll von Begriffen und Namen, die in anderen, nicht verwandten Populärkulturen auftauchen könnten, daher ist es wichtig, den Kontext der RAG gleich bei der ersten Abfrage festzulegen. Dieser Kontext sollte zur Auswahl oder Änderung verfügbar sein, wenn Ihre Anwendung mehrere Kontexte abdeckt, beispielsweise wenn Sie mehrere Ausgaben der Warhammer-Spielregeln abdecken oder diese mit den offiziellen Lore-Büchern kombinieren müssen.


Beachten Sie, dass die Anfrage des Benutzers für dieses Experiment immer mit Anführungszeichen gekapselt ist. Dies hilft dem LLM, zwischen der Anfrage, die es direkt zu beantworten versucht, und den separaten Anweisungen zur Eingabeaufforderung zu unterscheiden, die es nicht direkt beantworten darf. Der Frage-/Antwortteil der Eingabeaufforderung kann an einen bestimmten Kontext angepasst werden, aber im Wesentlichen müssen Sie dem LLM lediglich mitteilen können, worauf er direkt antworten soll und was nicht und wie er reagieren soll.


In diesem Fall kann man mit Sicherheit davon ausgehen, dass der LLM über allgemeine Kenntnisse des Spieleuniversums verfügt, da die Serie einigermaßen beliebt ist und allgemeine Informationen kostenlos verfügbar sind. Die Ausgabe dieser ersten Abfrage hilft dabei, einige Schlüsselwörter für die lexikalische Suche zu generieren, ohne dass wir einen Spickzettel in unsere Anwendung einbauen müssen.


Die lexikalischen und vektoriellen Vergleiche können dann im Hintergrund durchgeführt werden und eine Ergebnisliste wird zur Überprüfung durch das LLM zusammengestellt. Da die ursprüngliche Eingabeaufforderung des Benutzers im ersten Schritt nie direkt mit Schlussfolgerungen beantwortet wird, wandelt das LLM nur das um, was in einer Suche gefunden wird, und kann leicht daran gehindert werden, Anfragen außerhalb seiner Leitplanken oder Wissensdatenbank zu beantworten.

Wenn die Suche relevante Ergebnisse liefert:


Abfrage: „<Benutzerabfrage>“

Überprüfen Sie diese Suchergebnisse und verwenden Sie sie zur Beantwortung der Anfrage.

Ergebnis 1

Ergebnis 2

usw.

Antwort:


Wenn die Suche keine relevanten Ergebnisse liefert:


Abfrage: „<Benutzerabfrage>“
Sagen Sie mir höflich, dass Sie gesucht, aber keine Antwort auf die Frage gefunden haben. Antworten Sie stattdessen nach bestem Wissen und Gewissen.

Antwort:


Für zusätzliche Sicherheit können Sie die Anfrage vollständig ablehnen oder umleiten, wenn sie nicht bearbeitet werden kann.


Abfrage: „<Benutzerabfrage>“

Teilen Sie mir höflich mit, dass Sie gesucht, aber keine Antwort auf die Frage gefunden haben. Weisen Sie mich an, mich stattdessen an das Kundendienstteam zu wenden, um Hilfe zu erhalten.

Antwort:


Sie können die Ausgaben sogar verlängern, indem Sie nach weiteren Details fragen. Solange Sie Ihr Quellmaterial in das Kontextfenster einfügen können, kann das LLM es für Sie umwandeln.


Abfrage: „<Benutzerabfrage>“

Überprüfen Sie diese Suchergebnisse und verwenden Sie sie zur Beantwortung der Anfrage. Seien Sie möglichst detailliert und geben Sie die Quellen an.

Ergebnis 1

Ergebnis 2

usw.

Antwort:

Einschränkungen

Das LLM verfügt über ein begrenztes Kontextfenster und kann außergewöhnlich große Textseiten nicht verarbeiten. Erwägen Sie, die Zeilengröße zu begrenzen, damit Ihre Daten besser verwaltet und vom LLM leichter verarbeitet werden können . Beispielsweise scheint es gut zu funktionieren, Seiten in Abschnitte mit etwa 1.000 Zeichen zu unterteilen, und versuchen Sie zu vermeiden, mehr als vier oder fünf detaillierte Antworten in die Eingabeaufforderung einzugeben.


Der LLM hat keine Erinnerung an ein Gespräch, abgesehen von dem, was Sie in das Kontextfenster einfügen können. Es ist möglich, einen permanenten Speicher für Konversationsdaten aufzubauen, aber es ist einem LLM nicht möglich, übermäßig große Konversationen oder detaillierten Kontext in eine Eingabeaufforderung zu integrieren; Es gibt eine Obergrenze für das, was es transformieren kann. Das bedeutet, dass Sie in jedem Fall ab einem bestimmten Punkt feststellen werden, dass das LLM bestimmte Details zu „vergessen“ scheint, selbst wenn sie als Kontext bereitgestellt werden; Dies ist lediglich eine inhärente Einschränkung des Tools. Verlassen Sie sich am besten nur bei kurzen Gesprächen darauf und konzentrieren Sie sich darauf, jeweils kleine Textmengen umzuwandeln, um Halluzinationen zu minimieren.


Zufälligkeit im LLM kann ein Problem sein. Tests und Optimierungen sind erforderlich, um festzustellen, welche Eingabeaufforderungen für Ihren Datensatz am besten geeignet sind, und um herauszufinden, welches Modell für Ihren Anwendungsfall am besten geeignet ist. Bei meinen Tests mit einem 13B-Parametermodell war es sehr unvorhersehbar, welche Suchbegriffe aus der ersten Eingabeaufforderung generiert wurden, insbesondere mit zunehmender Länge der Eingabeaufforderung. Um optimale Ergebnisse zu erzielen, halten Sie sich an kürzere Eingabeaufforderungen.

Abschluss

Zusammenfassend lässt sich sagen, dass die Nutzung von RAG durch die Kombination von Vektor- und lexikalischen Suchmodellen ein effektiveres Auffinden und Sortieren relevanter Ergebnisse sowie die Generierung von Agentenausgaben ermöglicht, die weitaus weniger anfällig für Halluzinationen sind. Je kleiner der durchsuchbare Kontext ist, desto präziser und genauer sind die Antworten. Der Aufbau Ihrer eigenen benutzerdefinierten Pipeline von LLM-Anrufen bietet weitaus mehr Flexibilität bei der Abstimmung der Antworten auf Ihr gewünschtes Maß an Genauigkeit und Leitplanken.


Während es innerhalb des begrenzten Kontextfensters keine übermäßig großen Datenmengen verarbeiten kann, bietet es die Möglichkeit, effektive Assistenten auf begrenzten Wissensdatenbanken zu erstellen und mehr Agenten gleichzeitig auf derselben oder einer geringeren Hardware als zuvor auszuführen. Dies könnte mehr Möglichkeiten für virtuelle Assistenten für Anwendungen wie Tabletop-Gaming eröffnen oder sogar komplexere Themen für den Einsatz in Behörden, Anwalts- und Wirtschaftsprüfungsgesellschaften, wissenschaftlicher Forschung, Energie und mehr abdecken.


Wenn Sie bereit sind, mit dem Bauen zu beginnen, können Sie Astra DB kostenlos testen . Erstellen Sie Ihre Datenbank und beginnen Sie noch heute mit dem Laden Ihrer RAG-Quellen, ohne dass Cloud- oder Datenbank-Ops-Erfahrung erforderlich ist.


Von Mario Charnell-Delgado, DataStax


Auch hier veröffentlicht.