Creación de un agente GraphRAG con Neo4j y Milvus
Este blog se publicó originalmente en Neo4j y se republicó aquí con permiso
Descripción general
Esta publicación de blog detalla cómo crear un agente GraphRAG usando la base de datos de grafos Neo4j y la base de datos vectorial Milvus. Este agente combina el poder de las bases de datos de grafos y la búsqueda vectorial para proporcionar respuestas precisas y relevantes a las consultas de los usuarios. En este ejemplo, utilizaremos LangGraph, Llama 3.1 8B con Ollama y GPT-4o.
Los sistemas tradicionales de Generación Aumentada por Recuperación (RAG) se basan únicamente en bases de datos vectoriales para recuperar documentos relevantes. Nuestro enfoque va más allá al incorporar Neo4j para capturar relaciones entre entidades y conceptos, ofreciendo una comprensión más matizada de la información. Queremos crear un sistema RAG más robusto e informativo combinando estas dos técnicas.
Creación del agente RAG
Nuestro agente sigue tres conceptos clave: enrutamiento, mecanismos de respaldo y autocorrección. Estos principios se implementan mediante una serie de componentes de LangGraph:
Enrutamiento – Un mecanismo de enrutamiento dedicado decide si usar la base de datos vectorial, el grafo de conocimiento o una combinación de ambos según la consulta.
Respaldo – En situaciones en las que la recuperación inicial es insuficiente, el agente recurre a una búsqueda web usando Tavily.
Autocorrección – El agente evalúa sus propias respuestas e intenta corregir alucinaciones o imprecisiones.
Luego tenemos otros componentes, como:
Recuperación – Usamos Milvus, una base de datos vectorial de código abierto y de alto rendimiento, para almacenar y recuperar fragmentos de documentos según la similitud semántica con la consulta del usuario.
Mejora con grafos – Neo4j se utiliza para construir un grafo de conocimiento a partir de los documentos recuperados, enriqueciendo el contexto con relaciones y entidades.
Integración de LLMs – Llama 3.1 8B, un LLM local, se utiliza para generar respuestas y evaluar la relevancia y precisión de la información recuperada, mientras que GPT-4o se utiliza para generar Cypher, el lenguaje de consulta usado por Neo4j.
La arquitectura GraphRAG
La arquitectura de nuestro agente GraphRAG puede visualizarse como un flujo de trabajo con varios nodos interconectados:
Enrutamiento de preguntas – El agente primero analiza la pregunta para determinar la mejor estrategia de recuperación (búsqueda vectorial, búsqueda en grafos o ambas).
Recuperación – Según la decisión de enrutamiento, se recuperan documentos relevantes de Milvus o se extrae información del grafo de Neo4j.
Generación – El LLM genera una respuesta usando el contexto recuperado.
Evaluación – El agente evalúa la respuesta generada en cuanto a relevancia, precisión y posibles alucinaciones.
Refinamiento (si es necesario) – Si la respuesta se considera insatisfactoria, el agente puede refinar su búsqueda o intentar corregir errores.
Ejemplos de agentes
Para mostrar las capacidades de nuestros agentes LLM, analicemos dos componentes diferentes: Graph Generation y Composite Agent .
Aunque el código completo está disponible al final de esta publicación, estos fragmentos proporcionarán una mejor comprensión de cómo funcionan estos agentes dentro del framework LangChain.
Generación de grafos
Este componente está diseñado para mejorar el proceso de preguntas y respuestas utilizando las capacidades de un Neo4j. Responde preguntas aprovechando el conocimiento integrado dentro de la base de datos de grafos Neo4j. Así es como funciona:
1. GraphCypherQAChain – Permite que el LLM interactúe con la base de datos de grafos Neo4j. Utiliza el LLM de dos maneras:
cypher_llm– Esta instancia del LLM es responsable de generar consultas Cypher para extraer información relevante del grafo en función de la pregunta del usuario.Validación – Se asegura de que las consultas Cypher sean validadas para garantizar que sean sintácticamente correctas.
2. Recuperación de contexto – Las consultas validadas se ejecutan en el grafo Neo4j para recuperar el contexto necesario.
3. Generación de respuestas – El modelo de lenguaje utiliza el contexto recuperado para generar una respuesta a la pregunta del usuario.
### 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 el sistema RAG aproveche Neo4j, lo que puede ayudar a proporcionar respuestas más completas y precisas.
Agente compuesto, grafo y vector 🪄
Aquí es donde ocurre la magia: Nuestro agente puede combinar resultados de Milvus y Neo4j, lo que permite una mejor comprensión de la información y conduce a respuestas más precisas y matizadas. Así es como funciona:
Prompts – Definimos un prompt que indica al LLM que use el contexto tanto de Milvus como de Neo4j para responder la pregunta.
Recuperación – El agente recupera información relevante de Milvus (usando búsqueda vectorial) y Neo4j (usando generación de grafos).
Generación de respuestas – Llama 3.1 8B procesa el prompt y genera una respuesta concisa, aprovechando el conocimiento combinado de las bases de datos vectoriales y de grafos con la cadena compuesta.
### 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,
)
Echemos un vistazo a los resultados de nuestra búsqueda, combinando las fortalezas de las bases de datos de grafos y vectoriales para mejorar nuestro descubrimiento de artículos de investigación.
Comenzamos con nuestra búsqueda en grafos usando Neo4j:
# Example input data
question = "What paper talks about Multi-Agent?"
generation = graph_rag_chain.invoke({"query": question})
print(generation)
> Entrando en nueva cadena GraphCypherQAChain...
Cypher generado:
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
> Cadena finalizada.
{'query': '¿Qué artículo habla sobre Multi-Agent?', 'result': [{'PaperTitle': 'Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework', 'Summary': 'En este trabajo, buscamos llevar al límite superior la capacidad de razonamiento de los LLMs proponiendo un framework de prompting colaborativo multi-agent y multi-reasoning-path (CoMM). Específicamente, indicamos a los LLMs que desempeñen diferentes roles en un equipo de resolución de problemas, y alentamos a diferentes agentes de role-play a resolver colaborativamente la tarea objetivo. En particular, descubrimos que aplicar diferentes rutas de razonamiento para diferentes roles es una estrategia eficaz para implementar enfoques de prompting few-shot en escenarios multi-agent. Los resultados empíricos demuestran la eficacia de los métodos propuestos en dos problemas de ciencias de nivel universitario frente a baselines competitivos. Nuestro análisis adicional muestra la necesidad de indicar a los LLMs que desempeñen diferentes roles o expertos de forma independiente.', 'URL': 'https://github.com/amazon-science/comm-prompt'}]
La búsqueda en grafos destaca al encontrar relaciones y metadatos. Puede identificar rápidamente artículos basándose en títulos, autores o categorías predefinidas, proporcionando una vista estructurada de los datos.
A continuación, pasamos a nuestra búsqueda vectorial para obtener una perspectiva diferente:
# Datos de entrada de ejemplo
question = "¿Qué artículo habla sobre Multi-Agent?"
# Obtener respuestas vectoriales + de grafo
docs = retriever.invoke(question)
vector_context = rag_chain.invoke({"context": docs, "question": question})
> El artículo analiza "Adaptive In-conversation Team Building for Language Model Agents" y habla sobre Multi-Agent. Presenta un nuevo paradigma adaptativo de creación de equipos que ofrece una solución flexible para construir equipos de agentes LLM con el fin de resolver tareas complejas de manera eficaz. El enfoque, llamado Captain Agent, forma y gestiona dinámicamente equipos para cada paso del proceso de resolución de tareas, utilizando conversaciones grupales anidadas y reflexión para garantizar una experiencia diversa y evitar resultados estereotípicos.
La búsqueda vectorial es realmente buena para comprender el contexto y la similitud semántica. Puede descubrir artículos que están conceptualmente relacionados con la consulta, incluso si no contienen explícitamente los términos de búsqueda.
Finalmente, combinamos ambos métodos de búsqueda:
Esta es una parte crucial de nuestro agente RAG, que hace posible usar tanto bases de datos vectoriales como de grafos.
composite_chain = prompt | llm | StrOutputParser()
answer = composite_chain.invoke({"question": question, "context": vector_context, "graph_context": graph_context})
print(answer)
> El artículo "Collaborative Multi-Agent, Multi-Reasoning-Path (CoMM) Prompting Framework" habla sobre Multi-Agent. Propone un framework que indica a los LLMs que desempeñen diferentes roles en un equipo de resolución de problemas y alienta a diferentes agentes de role-play a resolver colaborativamente la tarea objetivo. El artículo presenta resultados empíricos que demuestran la eficacia de los métodos propuestos en dos problemas de ciencias de nivel universitario.
Al integrar búsquedas en grafos y vectoriales, aprovechamos las fortalezas de ambos enfoques. La búsqueda en grafos proporciona precisión y navega por relaciones estructuradas, mientras que la búsqueda vectorial añade profundidad mediante la comprensión semántica.
Este método combinado ofrece varias ventajas:
Recuperación mejorada: Encuentra artículos relevantes que podrían pasar desapercibidos usando solo uno de los métodos.
Contexto enriquecido: Proporciona una comprensión más matizada de cómo se relacionan los artículos entre sí.
Flexibilidad: Puede adaptarse a diferentes tipos de consultas, desde búsquedas específicas por palabras clave hasta exploraciones conceptuales más amplias.
Resumiendo
En esta publicación del blog, hemos mostrado cómo construir un Agente GraphRAG usando Neo4j y Milvus. Al combinar las fortalezas de las bases de datos de grafos y la búsqueda vectorial, este agente proporciona respuestas precisas y relevantes a las consultas de los usuarios.
La arquitectura de nuestro agente RAG, con su enrutamiento dedicado, mecanismos de respaldo y capacidades de autocorrección, lo hace robusto y fiable. Los ejemplos de los componentes Generación de Grafos y Agente Compuesto demuestran cómo este agente puede aprovechar tanto las bases de datos vectoriales como las de grafos para proporcionar respuestas completas y matizadas.
Esperamos que esta guía haya sido útil y te inspire a explorar las posibilidades de combinar bases de datos de grafos y búsqueda vectorial en tus propios proyectos.
El código actual está disponible en GitHub.
Sigue el tutorial
Sigue leyendo

How to Choose the Best Embedding Model for RAG in 2026: 10 Models Benchmarked
We benchmarked 10 embedding models on cross-modal, cross-lingual, long-document, and dimension compression tasks. See which one fits your RAG pipeline.

Why Not All VectorDBs Are Agent-Ready
Explore why choosing the right vector database is critical for scaling AI agents, and why traditional solutions fall short in production.

What is the K-Nearest Neighbors (KNN) Algorithm in Machine Learning?
KNN is a supervised machine learning technique and algorithm for classification and regression. This post is the ultimate guide to KNN.




