Criando um agente GraphRAG com Neo4j e Milvus
Este blog foi originalmente publicado na Neo4j e republicado aqui com permissão
Visão geral
Esta postagem de blog detalha como criar um agente GraphRAG usando o banco de dados de grafos Neo4j e o banco de dados vetorial Milvus. Este agente combina o poder dos bancos de dados de grafos e da busca vetorial para fornecer respostas precisas e relevantes às consultas dos usuários. Neste exemplo, usaremos LangGraph, Llama 3.1 8B com Ollama e GPT-4o.
Sistemas tradicionais de Geração Aumentada por Recuperação (RAG) dependem exclusivamente de bancos de dados vetoriais para recuperar documentos relevantes. Nossa abordagem vai além ao incorporar Neo4j para capturar relações entre entidades e conceitos, oferecendo uma compreensão mais nuançada das informações. Queremos criar um sistema RAG mais robusto e informativo combinando essas duas técnicas.
Criando o agente RAG
Nosso agente segue três conceitos-chave: roteamento, mecanismos de fallback e autocorreção. Esses princípios são implementados por meio de uma série de componentes LangGraph:
Roteamento – Um mecanismo de roteamento dedicado decide se deve usar o banco de dados vetorial, o grafo de conhecimento ou uma combinação de ambos com base na consulta.
Fallback – Em situações em que a recuperação inicial é insuficiente, o agente recorre a uma busca na web usando Tavily.
Autocorreção – O agente avalia suas próprias respostas e tenta corrigir alucinações ou imprecisões.
Em seguida, temos outros componentes, como:
Recuperação – Usamos Milvus, um banco de dados vetorial de código aberto e alto desempenho, para armazenar e recuperar trechos de documentos com base na similaridade semântica com a consulta do usuário.
Aprimoramento do grafo – Neo4j é usado para construir um grafo de conhecimento a partir dos documentos recuperados, enriquecendo o contexto com relações e entidades.
Integração de LLMs – Llama 3.1 8B, um LLM local, é usado para gerar respostas e avaliar a relevância e a precisão das informações recuperadas, enquanto GPT-4o é usado para gerar Cypher, a linguagem de consulta usada pelo Neo4j.
A arquitetura GraphRAG
A arquitetura do nosso agente GraphRAG pode ser visualizada como um fluxo de trabalho com vários nós interconectados:
Roteamento de perguntas – O agente primeiro analisa a pergunta para determinar a melhor estratégia de recuperação (busca vetorial, busca em grafo ou ambas).
Recuperação – Com base na decisão de roteamento, documentos relevantes são recuperados do Milvus, ou informações são extraídas do grafo Neo4j.
Geração – O LLM gera uma resposta usando o contexto recuperado.
Avaliação – O agente avalia a resposta gerada quanto à relevância, precisão e possíveis alucinações.
Refinamento (se necessário) – Se a resposta for considerada insatisfatória, o agente pode refinar sua busca ou tentar corrigir erros.
Exemplos de agentes
Para demonstrar as capacidades dos nossos agentes LLM, vamos analisar dois componentes diferentes: Graph Generation e Composite Agent .
Embora o código completo esteja disponível no final desta postagem, estes trechos fornecerão uma melhor compreensão de como esses agentes funcionam dentro do framework LangChain.
Geração de grafo
Este componente é projetado para melhorar o processo de perguntas e respostas usando os recursos de um Neo4j. Ele responde a perguntas aproveitando o conhecimento incorporado no banco de dados de grafos Neo4j. Veja como funciona:
1. GraphCypherQAChain – Permite que o LLM interaja com o banco de dados de grafos Neo4j. Ele usa o LLM de duas maneiras:
cypher_llm– Esta instância do LLM é responsável por gerar consultas Cypher para extrair informações relevantes do grafo com base na pergunta do usuário.Validação – Garante que as consultas Cypher sejam validadas para assegurar que estejam sintaticamente corretas.
2. Recuperação de contexto – As consultas validadas são executadas no grafo Neo4j para recuperar o contexto necessário.
3. Geração de resposta – O modelo de linguagem usa o contexto recuperado para gerar uma resposta à pergunta do usuário.
### 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})
Este componente permite que o sistema RAG acesse o Neo4j, o que pode ajudar a fornecer respostas mais abrangentes e precisas.
Agente Composto, Grafo e Vetor 🪄
É aqui que a mágica acontece: Nosso agente pode combinar resultados do Milvus e do Neo4j, permitindo uma melhor compreensão das informações e levando a respostas mais precisas e nuançadas. Veja como funciona:
Prompts – Definimos um prompt que instrui o LLM a usar o contexto tanto do Milvus quanto do Neo4j para responder à pergunta.
Recuperação – O agente recupera informações relevantes do Milvus (usando busca vetorial) e do Neo4j (usando Geração de Grafo).
Geração de resposta – O Llama 3.1 8B processa o prompt e gera uma resposta concisa, aproveitando o conhecimento combinado dos bancos de dados vetorial e de grafo com a cadeia composta.
### 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,
)
Vamos dar uma olhada nos resultados da nossa busca, combinando os pontos fortes dos bancos de dados de grafo e vetorial para aprimorar nossa descoberta de artigos de pesquisa.
Começamos com nossa busca em grafo usando Neo4j:
# Example input data
question = "What paper talks about Multi-Agent?"
generation = graph_rag_chain.invoke({"query": question})
print(generation)
> Entrando na nova cadeia GraphCypherQAChain...
Cypher gerado:
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
> Cadeia finalizada.
{'query': 'Qual artigo fala sobre Multi-Agent?', 'result': [{'PaperTitle': 'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary': 'Neste trabalho, nosso objetivo é elevar o limite superior da capacidade de raciocínio dos LLMs propondo um framework de prompting colaborativo multiagente e com múltiplos caminhos de raciocínio (CoMM). Especificamente, solicitamos que os LLMs desempenhem diferentes papéis em uma equipe de resolução de problemas e incentivamos diferentes agentes de role-play a resolver colaborativamente a tarefa-alvo. Em particular, descobrimos que aplicar diferentes caminhos de raciocínio para diferentes papéis é uma estratégia eficaz para implementar abordagens de prompting few-shot em cenários multiagente. Resultados empíricos demonstram a eficácia dos métodos propostos em dois problemas de ciências de nível universitário em comparação com baselines competitivos. Nossa análise adicional mostra a necessidade de solicitar que os LLMs desempenhem diferentes papéis ou especialistas de forma independente.', 'URL': 'https://github.com/amazon-science/comm-prompt'}]
A busca em grafo é excelente para encontrar relacionamentos e metadados. Ela pode identificar rapidamente artigos com base em títulos, autores ou categorias predefinidas, fornecendo uma visão estruturada dos dados.
Em seguida, recorremos à nossa busca vetorial para uma perspectiva diferente:
# Dados de entrada de exemplo
question = "Qual artigo fala sobre Multi-Agent?"
# Obter respostas vetoriais + de grafo
docs = retriever.invoke(question)
vector_context = rag_chain.invoke({"context": docs, "question": question})
> O artigo discute "Adaptive In-conversation Team Building for Language Model Agents" e fala sobre Multi-Agent. Ele apresenta um novo paradigma adaptativo de formação de equipes que oferece uma solução flexível para criar equipes de agentes LLM para resolver tarefas complexas de forma eficaz. A abordagem, chamada Captain Agent, forma e gerencia dinamicamente equipes para cada etapa do processo de resolução de tarefas, utilizando conversas em grupo aninhadas e reflexão para garantir expertise diversa e evitar resultados estereotipados.
A busca vetorial é muito boa em compreender contexto e similaridade semântica. Ela pode revelar artigos que estão conceitualmente relacionados à consulta, mesmo que não contenham explicitamente os termos de busca.
Por fim, combinamos ambos os métodos de busca:
Esta é uma parte crucial do nosso agente RAG, tornando possível usar tanto bancos de dados vetoriais quanto de grafos.
composite_chain = prompt | llm | StrOutputParser()
answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context})
print(answer)
> O artigo "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework" fala sobre Multi-Agent. Ele propõe um framework que solicita que LLMs desempenhem diferentes papéis em uma equipe de resolução de problemas e incentiva diferentes agentes de role-play a resolver colaborativamente a tarefa-alvo. O artigo apresenta resultados empíricos que demonstram a eficácia dos métodos propostos em dois problemas de ciências de nível universitário.
Ao integrar buscas em grafo e vetoriais, aproveitamos os pontos fortes de ambas as abordagens. A busca em grafo fornece precisão e navega por relacionamentos estruturados, enquanto a busca vetorial adiciona profundidade por meio da compreensão semântica.
Este método combinado oferece várias vantagens:
Melhor recall: Ele encontra artigos relevantes que poderiam ser perdidos por qualquer um dos métodos isoladamente.
Contexto aprimorado: Ele fornece uma compreensão mais sutil de como os artigos se relacionam entre si.
Flexibilidade: Ele pode se adaptar a diferentes tipos de consultas, desde buscas por palavras-chave específicas até explorações conceituais mais amplas.
Resumindo
Nesta postagem do blog, mostramos como criar um Agente GraphRAG usando Neo4j e Milvus. Ao combinar os pontos fortes de bancos de dados de grafos e busca vetorial, este agente fornece respostas precisas e relevantes às consultas dos usuários.
A arquitetura do nosso agente RAG, com seu roteamento dedicado, mecanismos de fallback e capacidades de autocorreção, o torna robusto e confiável. Os exemplos dos componentes Geração de Grafos e Agente Composto demonstram como este agente pode acessar tanto bancos de dados vetoriais quanto de grafos para fornecer respostas abrangentes e sutis.
Esperamos que este guia tenha sido útil e inspire você a explorar as possibilidades de combinar bancos de dados de grafos e busca vetorial em seus próprios projetos.
O código atual está disponível no GitHub.
Acompanhe
Continue lendo

Migrating Self-Managed Milvus to Zilliz Cloud for >99% Latency Reduction
Step-by-step guide to migrating 50M vectors from self-managed Milvus to Zilliz Cloud using milvus-backup. Achieve >99% query latency reduction with zero data loss.

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.

Building RAG Pipelines for Real-Time Data with Cloudera and Milvus
explore how Cloudera can be integrated with Milvus to effectively implement some of the key functionalities of RAG pipelines.




