Costruire un agente GraphRAG con Neo4j e Milvus
Questo blog è stato originariamente pubblicato su Neo4j e ripubblicato qui con autorizzazione
Panoramica
Questo post del blog descrive in dettaglio come costruire un agente GraphRAG utilizzando il database a grafo Neo4j e il database vettoriale Milvus. Questo agente combina la potenza dei database a grafo e della ricerca vettoriale per fornire risposte accurate e pertinenti alle query degli utenti. In questo esempio, useremo LangGraph, Llama 3.1 8B con Ollama e GPT-4o.
I sistemi tradizionali di Retrieval Augmented Generation (RAG) si basano esclusivamente sui database vettoriali per recuperare documenti pertinenti. Il nostro approccio va oltre incorporando Neo4j per catturare le relazioni tra entità e concetti, offrendo una comprensione più sfumata delle informazioni. Vogliamo creare un sistema RAG più robusto e informativo combinando queste due tecniche.
Costruire l'agente RAG
Il nostro agente segue tre concetti chiave: routing, meccanismi di fallback e autocorrezione. Questi principi sono implementati attraverso una serie di componenti LangGraph:
Routing – Un meccanismo di routing dedicato decide se utilizzare il database vettoriale, il grafo della conoscenza o una combinazione di entrambi in base alla query.
Fallback – In situazioni in cui il recupero iniziale è insufficiente, l'agente ricorre a una ricerca web usando Tavily.
Self-correction – L'agente valuta le proprie risposte e tenta di correggere allucinazioni o imprecisioni.
Abbiamo poi altri componenti, come:
Retrieval – Usiamo Milvus, un database vettoriale open-source e ad alte prestazioni, per archiviare e recuperare chunk di documenti in base alla similarità semantica con la query dell'utente.
Graph enhancement – Neo4j viene utilizzato per costruire un grafo della conoscenza dai documenti recuperati, arricchendo il contesto con relazioni ed entità.
LLMs integration – Llama 3.1 8B, un LLM locale, viene utilizzato per generare risposte e valutare la pertinenza e l'accuratezza delle informazioni recuperate, mentre GPT-4o viene utilizzato per generare Cypher, il linguaggio di query usato da Neo4j.
L'architettura GraphRAG
L'architettura del nostro agente GraphRAG può essere visualizzata come un workflow con diversi nodi interconnessi:
Question routing – L'agente analizza innanzitutto la domanda per determinare la migliore strategia di recupero (ricerca vettoriale, ricerca su grafo o entrambe).
Retrieval – In base alla decisione di routing, i documenti pertinenti vengono recuperati da Milvus, oppure le informazioni vengono estratte dal grafo Neo4j.
Generation – L'LLM genera una risposta usando il contesto recuperato.
Evaluation – L'agente valuta la risposta generata in termini di pertinenza, accuratezza e potenziali allucinazioni.
Refinement (se necessario) – Se la risposta è ritenuta insoddisfacente, l'agente può perfezionare la sua ricerca o tentare di correggere gli errori.
Esempi di agenti
Per mostrare le capacità dei nostri agenti LLM, esaminiamo due componenti diversi: Graph Generation e Composite Agent .
Sebbene il codice completo sia disponibile in fondo a questo post, questi snippet forniranno una migliore comprensione di come questi agenti funzionano all'interno del framework LangChain.
Generazione del grafo
Questo componente è progettato per migliorare il processo di question-answering utilizzando le capacità di un Neo4j. Risponde alle domande sfruttando la conoscenza incorporata nel database a grafo Neo4j. Ecco come funziona:
1. GraphCypherQAChain – Consente all'LLM di interagire con il database a grafo Neo4j. Usa l'LLM in due modi:
cypher_llm– Questa istanza dell'LLM è responsabile della generazione di query Cypher per estrarre informazioni rilevanti dal grafo in base alla domanda dell'utente.Validazione – Si assicura che le query Cypher siano validate per garantire che siano sintatticamente corrette.
2. Recupero del contesto – Le query validate vengono eseguite sul grafo Neo4j per recuperare il contesto necessario.
3. Generazione della risposta – Il modello linguistico utilizza il contesto recuperato per generare una risposta alla domanda dell'utente.
### 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})
Questo componente consente al sistema RAG di attingere a Neo4j, il che può aiutare a fornire risposte più complete e accurate.
Agente composito, grafo e vettore 🪄
È qui che avviene la magia: il nostro agente può combinare i risultati di Milvus e Neo4j, consentendo una migliore comprensione delle informazioni e portando a risposte più accurate e sfumate. Ecco come funziona:
Prompt – Definiamo un prompt che istruisce l'LLM a utilizzare il contesto sia di Milvus sia di Neo4j per rispondere alla domanda.
Recupero – L'agente recupera informazioni rilevanti da Milvus (utilizzando la ricerca vettoriale) e da Neo4j (utilizzando la generazione del grafo).
Generazione della risposta – Llama 3.1 8B elabora il prompt e genera una risposta concisa, sfruttando la conoscenza combinata dei database vettoriali e a grafo con la catena composita.
### 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,
)
Diamo un'occhiata ai risultati della nostra ricerca, combinando i punti di forza dei database a grafo e vettoriali per migliorare la scoperta dei nostri articoli di ricerca.
Iniziamo con la nostra ricerca su grafo utilizzando Neo4j:
# Example input data
question = "What paper talks about Multi-Agent?"
generation = graph_rag_chain.invoke({"query": question})
print(generation)
> Entering new GraphCypherQAChain chain...
Generated 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
> Finished chain.
{'query': 'What paper talks about Multi-Agent?', 'result': [{'PaperTitle': 'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary': 'In this work, we aim to push the upper bound of the reasoning capability of LLMs by proposing a collaborative multi-agent, multi-reasoning-path (CoMM) prompting framework. Specifically, we prompt LLMs to play different roles in a problem-solving team, and encourage different role-play agents to collaboratively solve the target task. In particular, we discover that applying different reasoning paths for different roles is an effective strategy to implement few-shot prompting approaches in the multi-agent scenarios. Empirical results demonstrate the effectiveness of the proposed methods on two college-level science problems over competitive baselines. Our further analysis shows the necessity of prompting LLMs to play different roles or experts independently.', 'URL': 'https://github.com/amazon-science/comm-prompt'}]
La ricerca nel grafo eccelle nel trovare relazioni e metadati. Può identificare rapidamente articoli in base a titoli, autori o categorie predefinite, fornendo una vista strutturata dei dati.
Successivamente, passiamo alla nostra ricerca vettoriale per una prospettiva diversa:
# Example input data
question = "What paper talks about Multi-Agent?"
# Get vector + graph answers
docs = retriever.invoke(question)
vector_context = rag_chain.invoke({"context": docs, "question": question})
> The paper discusses "Adaptive In-conversation Team Building for Language Model Agents" and talks about Multi-Agent. It presents a new adaptive team-building paradigm that offers a flexible solution for building teams of LLM agents to solve complex tasks effectively. The approach, called Captain Agent, dynamically forms and manages teams for each step of the task-solving process, utilizing nested group conversations and reflection to ensure diverse expertise and prevent stereotypical outputs.
La ricerca vettoriale è davvero efficace nel comprendere il contesto e la somiglianza semantica. Può individuare articoli concettualmente correlati alla query, anche se non contengono esplicitamente i termini di ricerca.
Infine, combiniamo entrambi i metodi di ricerca:
Questa è una parte cruciale del nostro agente RAG, che rende possibile utilizzare sia database vettoriali sia database a grafo.
composite_chain = prompt | llm | StrOutputParser()
answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context})
print(answer)
> The paper "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework" talks about Multi-Agent. It proposes a framework that prompts LLMs to play different roles in a problem-solving team and encourages different role-play agents to collaboratively solve the target task. The paper presents empirical results demonstrating the effectiveness of the proposed methods on two college-level science problems.
Integrando ricerche su grafo e vettoriali, sfruttiamo i punti di forza di entrambi gli approcci. La ricerca su grafo offre precisione e naviga relazioni strutturate, mentre la ricerca vettoriale aggiunge profondità attraverso la comprensione semantica.
Questo metodo combinato offre diversi vantaggi:
Miglioramento del recall: trova articoli rilevanti che potrebbero essere persi da uno dei due metodi usato da solo.
Contesto potenziato: fornisce una comprensione più sfumata di come gli articoli siano collegati tra loro.
Flessibilità: può adattarsi a diversi tipi di query, dalle ricerche per parole chiave specifiche a esplorazioni concettuali più ampie.
Riassumendo
In questo post del blog, abbiamo mostrato come creare un agente GraphRAG usando Neo4j e Milvus. Combinando i punti di forza dei database a grafo e della ricerca vettoriale, questo agente fornisce risposte accurate e pertinenti alle query degli utenti.
L'architettura del nostro agente RAG, con il suo routing dedicato, i meccanismi di fallback e le capacità di autocorrezione, lo rende robusto e affidabile. Gli esempi dei componenti Graph Generation e Composite Agent dimostrano come questo agente possa attingere sia ai database vettoriali sia a quelli a grafo per fornire risposte complete e sfumate.
Ci auguriamo che questa guida sia stata utile e ti ispiri a esplorare le possibilità di combinare database a grafo e ricerca vettoriale nei tuoi progetti.
Il codice attuale è disponibile su GitHub.
Segui passo passo
Continua a leggere

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.

OpenAI o1: What Developers Need to Know
In this article, we will talk about the o1 series from a developer's perspective, exploring how these models can be implemented for sophisticated use cases.

Why Deepseek is Waking up AI Giants Like OpenAI And Why You Should Care
Discover how DeepSeek R1's open-source AI model with superior reasoning capabilities and lower costs is disrupting the AI landscape and challenging tech giants like OpenAI.




