Erstellung eines GraphRAG-Agenten mit Neo4j und Milvus
Dieser Blog wurde ursprünglich auf Neo4j veröffentlicht und hier mit Genehmigung erneut veröffentlicht
Überblick
Dieser Blogbeitrag beschreibt detailliert, wie man einen GraphRAG-Agenten mit der Neo4j-Graphdatenbank und der Milvus-Vektordatenbank erstellt. Dieser Agent kombiniert die Leistungsfähigkeit von Graphdatenbanken und Vektorsuche, um genaue und relevante Antworten auf Benutzeranfragen zu liefern. In diesem Beispiel verwenden wir LangGraph, Llama 3.1 8B mit Ollama und GPT-4o.
Traditionelle Retrieval-Augmented-Generation-(RAG)-Systeme verlassen sich ausschließlich auf Vektordatenbanken, um relevante Dokumente abzurufen. Unser Ansatz geht weiter, indem er Neo4j einbezieht, um Beziehungen zwischen Entitäten und Konzepten zu erfassen und so ein nuancierteres Verständnis der Informationen zu ermöglichen. Wir möchten ein robusteres und informativeres RAG-System schaffen, indem wir diese beiden Techniken kombinieren.
Aufbau des RAG-Agenten
Unser Agent folgt drei Schlüsselkonzepten: Routing, Fallback-Mechanismen und Selbstkorrektur. Diese Prinzipien werden durch eine Reihe von LangGraph-Komponenten umgesetzt:
Routing – Ein dedizierter Routing-Mechanismus entscheidet anhand der Anfrage, ob die Vektordatenbank, der Wissensgraph oder eine Kombination aus beiden verwendet werden soll.
Fallback – In Situationen, in denen der anfängliche Abruf unzureichend ist, greift der Agent auf eine Websuche mit Tavily zurück.
Selbstkorrektur – Der Agent bewertet seine eigenen Antworten und versucht, Halluzinationen oder Ungenauigkeiten zu korrigieren.
Dann haben wir weitere Komponenten, wie zum Beispiel:
Abruf – Wir verwenden Milvus, eine quelloffene und leistungsstarke Vektordatenbank, um Dokumentabschnitte basierend auf der semantischen Ähnlichkeit zur Anfrage des Benutzers zu speichern und abzurufen.
Graph-Erweiterung – Neo4j wird verwendet, um aus den abgerufenen Dokumenten einen Wissensgraphen zu erstellen und den Kontext mit Beziehungen und Entitäten anzureichern.
LLM-Integration – Llama 3.1 8B, ein lokales LLM, wird zum Generieren von Antworten und zur Bewertung der Relevanz und Genauigkeit abgerufener Informationen verwendet, während GPT-4o zur Generierung von Cypher verwendet wird, der von Neo4j verwendeten Abfragesprache.
Die GraphRAG-Architektur
Die Architektur unseres GraphRAG-Agenten kann als Workflow mit mehreren miteinander verbundenen Knoten visualisiert werden:
Frage-Routing – Der Agent analysiert zunächst die Frage, um die beste Abrufstrategie zu bestimmen (Vektorsuche, Graphsuche oder beides).
Abruf – Basierend auf der Routing-Entscheidung werden relevante Dokumente aus Milvus abgerufen oder Informationen aus dem Neo4j-Graphen extrahiert.
Generierung – Das LLM generiert mithilfe des abgerufenen Kontexts eine Antwort.
Bewertung – Der Agent bewertet die generierte Antwort auf Relevanz, Genauigkeit und potenzielle Halluzinationen.
Verfeinerung (falls erforderlich) – Wenn die Antwort als unbefriedigend eingestuft wird, kann der Agent seine Suche verfeinern oder versuchen, Fehler zu korrigieren.
Beispiele für Agenten
Um die Fähigkeiten unserer LLM-Agenten zu demonstrieren, betrachten wir zwei verschiedene Komponenten: Graph Generation und Composite Agent .
Während der vollständige Code am Ende dieses Beitrags verfügbar ist, vermitteln diese Ausschnitte ein besseres Verständnis dafür, wie diese Agenten innerhalb des LangChain-Frameworks funktionieren.
Graph Generation
Diese Komponente wurde entwickelt, um den Frage-Antwort-Prozess durch die Nutzung der Fähigkeiten von Neo4j zu verbessern. Sie beantwortet Fragen, indem sie das in der Neo4j-Graphdatenbank eingebettete Wissen nutzt. So funktioniert es:
1. GraphCypherQAChain – Ermöglicht dem LLM die Interaktion mit der Neo4j-Graphdatenbank. Es verwendet das LLM auf zwei Arten:
cypher_llm– Diese Instanz des LLM ist dafür verantwortlich, Cypher-Abfragen zu generieren, um relevante Informationen basierend auf der Frage des Benutzers aus dem Graphen zu extrahieren.Validierung – Stellt sicher, dass die Cypher-Abfragen validiert werden, um zu gewährleisten, dass sie syntaktisch korrekt sind.
2. Kontextabruf – Die validierten Abfragen werden auf dem Neo4j-Graphen ausgeführt, um den notwendigen Kontext abzurufen.
3. Antwortgenerierung – Das Sprachmodell nutzt den abgerufenen Kontext, um eine Antwort auf die Frage des Benutzers zu generieren.
### Generate Cypher Query
llm = ChatOllama(model=local_llm, temperature=0)
# Chain
graph_rag_chain = GraphCypherQAChain.from_llm(
cypher_llm=llm,
qa_llm=llm,
validate_cypher=True,
graph=graph,
verbose=True,
return_intermediate_steps=True,
return_direct=True,
)
# Run
question = "agent memory"
generation = graph_rag_chain.invoke({"query": question})
Diese Komponente ermöglicht es dem RAG-System, Neo4j zu nutzen, was dazu beitragen kann, umfassendere und genauere Antworten bereitzustellen.
Zusammengesetzter Agent, Graph und Vektor 🪄
Hier geschieht die Magie: Unser Agent kann Ergebnisse aus Milvus und Neo4j kombinieren, was ein besseres Verständnis der Informationen ermöglicht und zu genaueren und nuancierteren Antworten führt. So funktioniert es:
Prompts – Wir definieren einen Prompt, der das LLM anweist, den Kontext aus sowohl Milvus als auch Neo4j zu verwenden, um die Frage zu beantworten.
Abruf – Der Agent ruft relevante Informationen aus Milvus (mithilfe der Vektorsuche) und Neo4j (mithilfe der Graph-Generierung) ab.
Antwortgenerierung – Llama 3.1 8B verarbeitet den Prompt und generiert eine prägnante Antwort, indem es das kombinierte Wissen aus den Vektor- und Graphdatenbanken mit der zusammengesetzten Chain nutzt.
### Composite Vector + Graph Generations
cypher_prompt = PromptTemplate(
template="""You are an expert at generating Cypher queries for Neo4j.
Use the following schema to generate a Cypher query that answers the given question.
Make the query flexible by using case-insensitive matching and partial string matching where appropriate.
Focus on searching paper titles as they contain the most relevant information.
Schema:
{schema}
Question: {question}
Cypher Query:""",
input_variables=["schema", "question"],
)
# QA prompt
qa_prompt = PromptTemplate(
template="""You are an assistant for question-answering tasks.
Use the following Cypher query results to answer the question. If you don't know the answer, just say that you don't know.
Use three sentences maximum and keep the answer concise. If topic information is not available, focus on the paper titles.
Question: {question}
Cypher Query: {query}
Query Results: {context}
Answer:""",
input_variables=["question", "query", "context"],
)
llm = ChatOpenAI(model="gpt-4o", temperature=0)
# Chain
graph_rag_chain = GraphCypherQAChain.from_llm(
cypher_llm=llm,
qa_llm=llm,
validate_cypher=True,
graph=graph,
verbose=True,
return_intermediate_steps=True,
return_direct=True,
cypher_prompt=cypher_prompt,
qa_prompt=qa_prompt,
)
Schauen wir uns die Ergebnisse unserer Suche an, bei der die Stärken von Graph- und Vektordatenbanken kombiniert werden, um unsere Entdeckung von Forschungsarbeiten zu verbessern.
Wir beginnen mit unserer Graphsuche mit Neo4j:
# Example input data
question = "What paper talks about Multi-Agent?"
generation = graph_rag_chain.invoke({"query": question})
print(generation)
> Betrete neue GraphCypherQAChain-Kette...
Generiertes Cypher:
cypher
MATCH (p:Paper)
WHERE toLower(p.title) CONTAINS toLower("Multi-Agent")
RETURN p.title AS PaperTitle, p.summary AS Summary, p.url AS URL
> Kette abgeschlossen.
{'query': 'Welches Paper spricht über Multi-Agent?', 'result': [{'PaperTitle': 'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary': 'In dieser Arbeit zielen wir darauf ab, die Obergrenze der Schlussfolgerungsfähigkeit von LLMs zu erweitern, indem wir ein kollaboratives Multi-Agent-, Multi-Reasoning-Path-(CoMM)-Prompting-Framework vorschlagen. Konkret veranlassen wir LLMs dazu, verschiedene Rollen in einem Problemlösungsteam zu spielen, und ermutigen verschiedene Role-Play-Agenten, die Zielaufgabe gemeinsam zu lösen. Insbesondere stellen wir fest, dass die Anwendung unterschiedlicher Schlussfolgerungspfade für verschiedene Rollen eine effektive Strategie ist, um Few-Shot-Prompting-Ansätze in Multi-Agent-Szenarien umzusetzen. Empirische Ergebnisse zeigen die Effektivität der vorgeschlagenen Methoden bei zwei wissenschaftlichen Problemen auf College-Niveau im Vergleich zu wettbewerbsfähigen Baselines. Unsere weitere Analyse zeigt die Notwendigkeit, LLMs dazu zu veranlassen, verschiedene Rollen oder Experten unabhängig voneinander zu spielen.', 'URL': 'https://github.com/amazon-science/comm-prompt'}]
Die Graphsuche ist hervorragend darin, Beziehungen und Metadaten zu finden. Sie kann Papers schnell anhand von Titeln, Autoren oder vordefinierten Kategorien identifizieren und bietet eine strukturierte Sicht auf die Daten.
Als Nächstes wenden wir uns unserer Vektorsuche zu, um eine andere Perspektive zu erhalten:
# Beispiel-Eingabedaten
question = "Welches Paper spricht über Multi-Agent?"
# Vektor- + Graph-Antworten erhalten
docs = retriever.invoke(question)
vector_context = rag_chain.invoke({"context": docs, "question": question})
> Das Paper behandelt "Adaptive In-conversation Team Building for Language Model Agents" und spricht über Multi-Agent. Es stellt ein neues adaptives Team-Building-Paradigma vor, das eine flexible Lösung für den Aufbau von Teams aus LLM-Agenten bietet, um komplexe Aufgaben effektiv zu lösen. Der Ansatz, Captain Agent genannt, bildet und verwaltet dynamisch Teams für jeden Schritt des Aufgabenlösungsprozesses und nutzt verschachtelte Gruppengespräche sowie Reflexion, um vielfältige Expertise sicherzustellen und stereotype Ausgaben zu verhindern.
Die Vektorsuche ist wirklich gut darin, Kontext und semantische Ähnlichkeit zu verstehen. Sie kann Papers aufdecken, die konzeptionell mit der Anfrage verwandt sind, auch wenn sie die Suchbegriffe nicht explizit enthalten.
Schließlich kombinieren wir beide Suchmethoden:
Dies ist ein entscheidender Teil unseres RAG-Agenten, der es ermöglicht, sowohl Vektor- als auch Graphdatenbanken zu verwenden.
composite_chain = prompt | llm | StrOutputParser()
answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context})
print(answer)
> Das Paper "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework" spricht über Multi-Agent. Es schlägt ein Framework vor, das LLMs dazu veranlasst, verschiedene Rollen in einem Problemlösungsteam zu spielen, und verschiedene Role-Play-Agenten ermutigt, die Zielaufgabe gemeinsam zu lösen. Das Paper präsentiert empirische Ergebnisse, die die Effektivität der vorgeschlagenen Methoden bei zwei wissenschaftlichen Problemen auf College-Niveau demonstrieren.
Durch die Integration von Graph- und Vektorsuche nutzen wir die Stärken beider Ansätze. Die Graphsuche bietet Präzision und navigiert strukturierte Beziehungen, während die Vektorsuche durch semantisches Verständnis Tiefe hinzufügt.
Diese kombinierte Methode bietet mehrere Vorteile:
Verbesserter Recall: Sie findet relevante Papers, die von einer der beiden Methoden allein möglicherweise übersehen würden.
Erweiterter Kontext: Sie bietet ein nuancierteres Verständnis dafür, wie Papers miteinander in Beziehung stehen.
Flexibilität: Sie kann sich an verschiedene Arten von Anfragen anpassen, von spezifischen Keyword-Suchen bis hin zu umfassenderen konzeptionellen Erkundungen.
Zusammenfassung
In diesem Blogbeitrag haben wir gezeigt, wie man einen GraphRAG-Agenten mit Neo4j und Milvus erstellt. Durch die Kombination der Stärken von Graphdatenbanken und Vektorsuche liefert dieser Agent genaue und relevante Antworten auf Benutzeranfragen.
Die Architektur unseres RAG-Agenten mit ihrem dedizierten Routing, Fallback-Mechanismen und Selbstkorrekturfähigkeiten macht ihn robust und zuverlässig. Die Beispiele der Komponenten Graph Generation und Composite Agent zeigen, wie dieser Agent sowohl Vektor- als auch Graphdatenbanken nutzen kann, um umfassende und differenzierte Antworten zu liefern.
Wir hoffen, dass dieser Leitfaden hilfreich war und Sie dazu inspiriert, die Möglichkeiten der Kombination von Graphdatenbanken und Vektorsuche in Ihren eigenen Projekten zu erkunden.
Der aktuelle Code ist auf GitHub verfügbar.
Mitmachen
Weiterlesen

Why and How to Migrate from Self-Hosted Milvus to Zilliz Cloud
A simple, step-by-step guide to migrating from Milvus to Zilliz Cloud. Learn both endpoint and backup methods for a smooth, scalable vector database migration.

DeepSeek-OCR Explained: Optical Compression for Scalable Long-Context and RAG Systems
Discover how DeepSeek-OCR uses visual tokens and Contexts Optical Compression to boost long-context LLM efficiency and reshape RAG performance.

Announcing VDBBench 1.0: Open-Source VectorDB Benchmarking with Your Real-World Production Workloads
Discover VDBBench 1.0, an open-source tool for benchmarking vector databases with real-world production data, streaming ingestion, and concurrent workloads.




