Die erweiterte Generation (Graph Retrieval-Augmented Generation) (Graph RAG) entwickelt sich zu einer leistungsstarken Technik für generative KI-Anwendungen, um domänenspezifisches Wissen und relevante Informationen zu nutzen. Graph RAG ist eine Alternative zu Vektorsuchmethoden, die eine Vektordatenbank verwenden.
Wissensgraphen (Knowledge Graphs) sind Wissenssysteme, in denen Graphdatenbanken wie Neo4j oder Amazon Neptune strukturierte Daten darstellen können. In einem Wissensgraphen sind die Beziehungen zwischen Datenpunkten, als Edges bezeichnet, genauso aussagekräftig wie die Verbindungen zwischen Datenpunkten, die als Knoten bezeichnet werden. Ein Wissensgraph erleichtert das Durchlaufen eines Netzwerks und das Verarbeiten komplexer Abfragen zu verbundenen Daten. Wissensgraphen eignen sich besonders gut für Anwendungsfälle, die Chatbots, Identitätsauflösung, Netzwerkanalyse, Empfehlungsmaschinen, Customer 360 und Betrugserkennung beinhalten.
Ein Graph RAG-Ansatz nutzt die strukturierte Natur von Diagrammdatenbanken, um den abgerufenen Informationen über Netzwerke oder komplexe Beziehungen mehr Tiefe und Kontext zu verleihen. Eine Graphdatenbank wird mit einem Large Language Model (LLM) gepaart. So kann ein Entwickler wichtige Teile des Graphen-Erstellungsprozesses aus unstrukturierten Daten wie Text automatisieren. Ein LLM kann Textdaten verarbeiten und Entitäten identifizieren, ihre Beziehungen verstehen und sie in einer Diagrammstruktur darstellen.
Es gibt verschiedene Möglichkeiten, eine Graph-RAG-Anwendung zu erstellen, beispielsweise mit GraphRAG von Microsoft oder durch die Kombination von GPT4 mit LlamaIndex. Für dieses Tutorial verwenden Sie Memgraph, eine Open-Source-Lösung für Graphdatenbanken, um ein Rag-System mit Meta's Llama-3 auf Watsonx zu erstellen. Memgraph verwendet Cypher, eine deklarative Abfragesprache. Es weist einige Ähnlichkeiten mit SQL auf, konzentriert sich jedoch eher auf Knoten und Beziehungen als auf Tabellen und Zeilen. Llama 3 erstellt und füllt Ihre Diagrammdatenbank aus unstrukturiertem Text und Abfrageinformationen in der Datenbank.
Sie können zwar aus mehreren Tools wählen, aber dieses Tutorial führt Sie durch die Einrichtung eines IBM® Kontos für die Verwendung eines Jupyter Notebook.
Melden Sie sich mit Ihrem IBM Cloud-Konto bei watsonx.ai an.
Erstellen Sie ein watsonx.ai-Projekt.
Sie können Ihre Projekt-ID in Ihrem Projekt abrufen. Klicken Sie auf die Registerkarte „Verwalten“. Kopieren Sie dann die Projekt-ID aus dem Abschnitt „Details“ der Seite „Allgemein“. Sie benötigen diese Projekt-ID für dieses Tutorial.
Verknüpfen Sie als Nächstes Ihr Projekt mit watsonx.ai Runtime
a. Erstellen Sie eine Instanz des watsonx.ai Runtime Service (wählen Sie den Lite-Plan als kostenlose Instanz).
b. Generieren Sie einen API-Schlüssel in watsonx.ai Runtime. Speichern Sie diesen API-Schlüssel für die Verwendung in diesem Tutorial.
c. Gehen Sie zu Ihrem Projekt und wählen Sie die Registerkarte „Verwalten“ aus
d. Wählen Sie auf der linken Registerkarte „Services und Integrationen“ aus
e. Wählen Sie IBM Services aus
f. Wählen Sie Associate Service und watsonx.ai Runtime aus.
g. Verknüpfen Sie watsonx.ai Runtime mit dem Projekt, das Sie in watsonx.ai erstellt haben
Nun müssen Sie Docker installieren.
Nachdem Sie Docker installiert haben, installieren Sie Memgraph mithilfe des Docker-Containers. Unter OSX oder Linux können Sie diesen Befehl in einem Terminal verwenden:
Verwenden Sie einen Windows-Computer:
Folgen Sie den Installationsschritten, um die Memgraph-Engine und das Memgraph-Labor zum Laufen zu bringen.
Erstellen Sie auf Ihrem Computer eine neue virtualenv für dieses Projekt:
Installieren Sie in der Python-Umgebung für Ihr Notebook die folgenden Python-Bibliotheken:
Jetzt können Sie sich mit Memgraph verbinden.
Wenn Sie Memgraph für die Verwendung eines Benutzernamens und eines Passworts konfiguriert haben, geben Sie diese hier ein. Andernfalls können Sie die Standardeinstellungen verwenden, bei denen weder Benutzername noch Passwort erforderlich sind. Für eine Produktionsdatenbank ist dies nicht empfehlenswert, jedoch stellt es für eine lokale Entwicklungsumgebung, in der keine sensiblen Daten gespeichert werden, kein Problem dar.
Erstellen Sie nun einen Beispielstring, der einen Datensatz mit Beziehungen beschreibt, mit dem Sie die Fähigkeiten Ihres LLM-Systems zur Diagrammerstellung testen können. Sie können auch komplexere Datenquellen verwenden, aber dieses einfache Beispiel hilft uns, den Algorithmus zu demonstrieren.
Geben Sie den watsonx API-Schlüssel ein, den Sie im ersten Schritt erstellt haben:
Konfigurieren Sie nun eine watsonxLLM-Instanz, um Text zu generieren. Die Temperatur sollte relativ niedrig und die Anzahl der Token hoch sein, um das Modell zu ermutigen, so viele Details wie möglich zu generieren, ohne dabei Entitäten oder Beziehungen zu halluzinieren, die nicht vorhanden sind.
Mit dem LLMGraphTransformer können Sie festlegen, welche Arten von Knoten und Beziehungen das LLM generieren soll. In Ihrem Fall beschreibt der Text die Mitarbeiter eines Unternehmens, die Gruppen, in denen sie arbeiten, und ihre Berufsbezeichnungen. Wenn Sie das LLM auf diese Entitäten beschränken, ist es wahrscheinlicher, dass Sie eine gute Darstellung des Wissens in einem Diagramm erhalten.
Der Aufruf von convert_to_graph_documents lässt den LLMGraphTransformer einen Wissensgraphen aus dem Text erstellen. Dieser Schritt generiert die korrekte Neo4j-Syntax zum Einfügen der Informationen in die Graphdatenbank, um den relevanten Kontext und die relevanten Entitäten darzustellen.
Löschen Sie nun alle alten Daten aus der Memgraph-Datenbank und fügen Sie die neuen Knoten und Edges ein.
Die generierte Cypher-Syntax wird in den Objekten graph_documents gespeichert. Sie können sie einfach überprüfen, indem Sie sie als Zeichenfolge ausdrucken.
Das Schema und die Datentypen, die von Cypher erstellt wurden, können in der Eigenschaft „get_schema” der Graphen eingesehen werden.
Dies ergibt Folgendes:
Sie können die Diagrammstruktur auch im Memgraph Labs Viewer sehen:
Das LLM hat angemessene Arbeit bei der Erstellung der richtigen Knotenpunkte und Beziehungen geleistet. Jetzt ist es an der Zeit, den Wissensgraphen abzufragen.
Das korrekte Prompting des LLM erfordert ein gewisses Prompt-Engineering. LangChain stellt ein FewShotPromptTemplate bereit, das verwendet werden kann, um dem LLM im Prompt Beispiele zu geben, um sicherzustellen, dass es die korrekte und prägnante Cypher-Syntax schreibt. Der folgende Code enthält mehrere Beispiele für Fragen und Abfragen, die das LLM verwenden sollte. Außerdem wird die Ausgabe des Modells auf die Abfrage beschränkt. Ein übermäßig gesprächiger LLM könnte zusätzliche Informationen hinzufügen, die zu ungültigen Cypher-Abfragen führen würden. Daher fordert die Prompt-Vorlage das Modell auf, nur die Abfrage selbst auszugeben.
Das Hinzufügen eines instruktiven Präfixes hilft auch, das Verhalten des Modells einzuschränken und macht es wahrscheinlicher, dass der LLM die korrekte Cypher-Syntax ausgibt.
Als Nächstes erstellen Sie einen Prompt, um zu steuern, wie das LLM die Frage mit den von Memgraph zurückgegebenen Informationen beantwortet. Wir werden dem LLM mehrere Beispiele und Anweisungen zur Verfügung stellen, wie es reagieren soll, sobald es Kontextinformationen aus der Graphdatenbank zurückerhalten hat.
Jetzt ist es an der Zeit, die Frage-Antwort-Kette zu erstellen. Mit MemgraphQAChain können Sie festlegen, welches LLM Sie verwenden möchten, welches Graphschema verwendet werden soll und Informationen zum Debugging. Die Verwendung einer Temperatur von 0 und einer Längenstrafe ermutigt das LLM, den Cypher-Prompt kurz und einfach zu halten.
Nun können Sie die Kette mit einer Frage in natürlicher Sprache aufrufen (bitte beachten Sie, dass Ihre Antworten leicht abweichen können, da LLMs nicht rein deterministisch sind).
Dies wird Folgendes zur Ausgabe bringen:
> Entering new MemgraphQAChain chain...
Generated Cypher:
MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id
Full Context:
[{'t.id': 'Director of the Digital Marketing Group'}]
> Finished chain.
{'query': 'What is Johns title?',
'result': ' \nAnswer: Director of the Digital Marketing Group.',
'intermediate_steps': [{'query': " MATCH (p:Person {id: 'John'})-[:TITLE]->(t:Title) RETURN t.id"},
{'context': [{'t.id': 'Director of the Digital Marketing Group'}]}]}
Stellen Sie der Kette in der nächsten Frage eine etwas komplexere Frage:
Dies sollte Folgendes liefern:
Die richtige Antwort ist in der Antwort enthalten. In einigen Fällen kann es zusätzlichen Text geben, den Sie entfernen möchten, bevor Sie die Antwort an einen Endbenutzer zurückgeben.
Sie können die Memgraph-Kette nach Gruppenbeziehungen fragen:
Dies führt zu folgendem Ergebnis:
Das ist die richtige Antwort.
Stellen Sie der Kette abschließend eine Frage mit zwei Ausgaben:
Dies sollte Folgendes ergeben:
Die Kette identifiziert beide Beteiligten korrekt.
In diesem Tutorial haben Sie eine Graph RAG-Anwendung mit Memgraph und watsonx erstellt, um die Diagrammdatenstrukturen zu generieren und abzufragen. Mithilfe eines LLM über watsonx haben Sie Knoten- und Edge-Informationen aus dem Quelltext in natürlicher Sprache extrahiert und eine Cypher-Abfragesyntax generiert, um eine Diagrammdatenbank zu füllen. Anschließend haben Sie watsonx verwendet, um Fragen in natürlicher Sprache zu diesem Quelltext in Cypher-Abfragen umzuwandeln, die Informationen aus der Diagrammdatenbank extrahiert haben. Mithilfe von Prompt Engineering wandelte das LLM die Ergebnisse aus der Memgraph-Datenbank in Antworten in natürlicher Sprache um.