GraphRAG Skill
Retrieval-Augmented Generation über einem Wissensgraphen anstelle von flachen Chunks. Aus Ihren Dokumenten werden Entitäten und Beziehungen extrahiert, in einer Graphdatenbank gespeichert und das LLM nutzt zur Abfragezeit die Graphstruktur für Schlussfolgerungen.
Warum ein Graph statt Vektoren
Die Vektorsuche findet ähnliche Chunks. Sie kann keine Verbindungen verfolgen:
- „Welche Lieferanten waren von der Störung in Werk X betroffen?“ benötigt
Störung → betrifft → Werk → beliefert_durch → Lieferant– zwei Hops, die kein einzelner Chunk enthält. - „Fasse alles zusammen, was wir über Projekt Y wissen“ benötigt die Gemeinschaft von Entitäten rund um Y, nicht die zehn ähnlichsten Absätze.
Wenn Ihre Fragen einfache Faktenabfragen sind, bleiben Sie bei Vektor-RAG – es ist einfacher. Greifen Sie zu GraphRAG, wenn Fragen Beziehungen überspannen.
Stack
- Kuzu – eingebettete Graphdatenbank (
pip install kuzu), kein Server nötig, Cypher-Abfragesprache. Fangen Sie hier an. - Neo4j – wenn die eingebettete Lösung nicht mehr ausreicht: Mehrbenutzer, größere Graphen, Bloom-Visualisierung. Dieselben Cypher-Kenntnisse sind übertragbar.
- LLM-Extraktion – jedes starke Modell mit strukturierter Ausgabe für die Extraktion von Entitäten/Beziehungen.
Pipeline
1. Definieren Sie zuerst das Schema
Lassen Sie den Extraktor nicht frei Typen erfinden – Sie erhalten 40 Schreibweisen derselben Beziehung. Deklarieren Sie Knoten- und Kantentypen vorab:
CREATE NODE TABLE Person(name STRING, PRIMARY KEY(name));
CREATE NODE TABLE Project(name STRING, status STRING, PRIMARY KEY(name));
CREATE NODE TABLE Document(title STRING, date DATE, PRIMARY KEY(title));
CREATE REL TABLE WORKS_ON(FROM Person TO Project, role STRING);
CREATE REL TABLE MENTIONS(FROM Document TO Person);
CREATE REL TABLE MENTIONS_PROJECT(FROM Document TO Project);
Halten Sie das Schema klein (5-10 Knotentypen). Sie können es erweitern; Sie können einen unübersichtlichen Graphen nicht günstig wieder „ent-extrahieren".
2. Entitäten und Beziehungen extrahieren
Teilen Sie Dokumente in Chunks (500-1000 Token, überlappend), dann fordern Sie den Extraktor auf:
Extrahiere Entitäten und Beziehungen aus dem folgenden Text.
Erlaubte Knotentypen: Person, Project, Document
Erlaubte Kantentypen: WORKS_ON (Person→Project), MENTIONS (Document→Person),
MENTIONS_PROJECT (Document→Project)
Regeln:
- Namen normalisieren („J. Schmidt" und „Hans Schmidt" sind dieselbe Person)
- Nur Beziehungen extrahieren, die im Text ausdrücklich genannt oder klar impliziert sind
- Gib JSON zurück: {"nodes": [...], "edges": [...]}
Text:
<chunk>
Überprüfen Sie 10-20 Chunks manuell stichprobenartig. Die Extraktionsqualität ist die Obergrenze für alles nachgelagerte – ein verrauschter Graph liefert verrauschte Antworten.
3. In Kuzu laden
import kuzu
db = kuzu.Database("./knowledge.kz")
conn = kuzu.Connection(db)
# Schema erstellen, dann parameterisiertes MERGE/CREATE pro extrahiertem Knoten/Kante
Beim Laden deduplizieren (MERGE auf Primärschlüssel) – dieselbe Entität erscheint
in vielen Chunks.
4. Abfragemuster
Lokale Suche – alles, was mit einer Entität verbunden ist:
MATCH (p:Person {name: $name})-[r]-(neighbor)
RETURN type(r), neighbor;
Multi-Hop-Schlussfolgerung – Beziehungen über den Graphen hinweg verfolgen:
// Wer arbeitet an Projekten, die in Dokumenten zur Störung erwähnt werden?
MATCH (d:Document)-[:MENTIONS_PROJECT]->(proj:Project)<-[:WORKS_ON]-(p:Person)
WHERE d.title CONTAINS 'Störung'
RETURN DISTINCT p.name, proj.name;
Globale Zusammenfassung – Community-Erkennung, dann jede Community zusammenfassen:
// Dicht verbundene Cluster finden (einmal ausführen, Community-ID auf Knoten speichern)
CALL show_tables(); // dann Community-Erkennung Ihres Graphen verwenden
Fassen Sie jede Community mit dem LLM zusammen: „Diese Entitäten gruppieren sich um thema X." Dies ist die GraphRAG-„globale Abfrage" – Fragen wie „Was sind die Hauptthemen in diesen Dokumenten?"
5. Mit dem LLM antworten
Das funktionierende Abfragemuster:
- Der Agent übersetzt die Frage in 1-3 Cypher-Abfragen
- Die Ergebnisse kommen als strukturierte Zeilen zurück
- Das LLM synthetisiert die Antwort aus den Zeilen unter Angabe von Knoten-/Kantenbelegen
- Wenn eine Abfrage nichts zurückgibt, formuliert der Agent sie um – niemals Graphinhalte halluzinieren
Zeitliches Wissen (Agentengedächtnis)
Für das agentsübergreifende Gedächtnis fügen Sie den Kanten Zeitstempel hinzu: VALID_FROM /
VALID_TO-Zeitstempel, überholte Fakten werden markiert statt gelöscht. Dies ist das
zeitliche Wissensgraph-Muster (siehe Graphiti/Zep): „Der Benutzer früher X bevorzugt,
jetzt Y" bleibt abfragbar, anstatt überschrieben zu werden.
Anti-Patterns
- Extrahieren ohne Schema. Freiform-Extraktion erzeugt einen Graphen, den niemand abfragen kann.
- GraphRAG für alles. Einzelfakten aus sauberen Dokumenten? Vektorsuche ist günstiger und besser. Nutzen Sie den Graphen dort, wo Beziehungen wichtig sind.
- Blindes Vertrauen in die Extraktion. Jede Pipeline braucht eine Stichproben- Schleife; Extraktionsfehler summieren sich unbemerkt.
- Riesen-Chunks. Die Entitätsextraktion verschlechtert sich ab ~1000 Token – das Modell lässt Beziehungen weg. Kleinere Chunks, mehr davon.
- Keine Deduplizierung beim Laden. „Hans Schmidt", „H. Schmidt", „Schmidt" als drei Knoten zerstören stillschweigend Multi-Hop-Abfragen.