paint-brush
Creación de un agente RAG híbrido con gráficos Neo4j y búsqueda vectorial Milvuspor@neo4j
189 lecturas

Creación de un agente RAG híbrido con gráficos Neo4j y búsqueda vectorial Milvus

por Neo4j8m2024/11/05
Read on Terminal Reader

Demasiado Largo; Para Leer

Esta guía explora la construcción de un agente RAG híbrido utilizando Neo4j y Milvus para aprovechar las bases de datos gráficas y vectoriales, mejorando la precisión y relevancia de la respuesta a través de métodos de búsqueda combinados y mecanismos de autocorrección.
featured image - Creación de un agente RAG híbrido con gráficos Neo4j y búsqueda vectorial Milvus
Neo4j HackerNoon profile picture
0-item
1-item


En esta entrada del blog se detalla cómo crear un agente GraphRAG utilizando la base de datos de gráficos Neo4j y la base de datos de vectores Milvus . Este agente combina el poder de las bases de datos de gráficos y la búsqueda de vectores para brindar 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 recuperación de generación aumentada ( 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, lo que ofrece una comprensión más matizada de la información. Queremos crear un sistema RAG más sólido e informativo combinando estas dos técnicas.

Construyendo el agente RAG

Nuestro agente sigue tres conceptos clave: enrutamiento, mecanismos de respaldo y autocorrección. Estos principios se implementan a través de una serie de componentes de LangGraph:


  • Enrutamiento : un mecanismo de enrutamiento dedicado decide si utilizar la base de datos vectorial, el gráfico de conocimiento o una combinación de ambos en función de la consulta.
  • Respaldo : en situaciones donde la recuperación inicial es insuficiente, el agente recurre a una búsqueda web utilizando Tavily.
  • Autocorrección – El agente evalúa sus propias respuestas e intenta corregir alucinaciones o imprecisiones.


Luego tenemos otros componentes como son:


  • Recuperación : utilizamos Milvus, una base de datos vectorial de código abierto y de alto rendimiento, para almacenar y recuperar fragmentos de documentos en función de la similitud semántica con la consulta del usuario.
  • Mejora de gráficos : se utiliza Neo4j para construir un gráfico de conocimiento a partir de los documentos recuperados, enriqueciendo el contexto con relaciones y entidades.
  • Integración de LLM : 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 utilizado por Neo4j.

La arquitectura GraphRAG

La arquitectura de nuestro agente GraphRAG se puede visualizar 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 gráfica o ambas).
  • Recuperación : según la decisión de enrutamiento, se recuperan los documentos relevantes de Milvus o se extrae información del gráfico Neo4j.
  • Generación : el LLM genera una respuesta utilizando 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, veamos dos componentes diferentes: Graph Generation y Composite Agent .

Si bien 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 marco LangChain.

Generación de gráficos

Este componente está diseñado para mejorar el proceso de respuesta a preguntas mediante el uso de las capacidades de Neo4j. Responde preguntas aprovechando el conocimiento integrado en la base de datos de gráficos de Neo4j. Así es como funciona:


  1. GraphCypherQAChain : permite que el LLM interactúe con la base de datos de gráficos Neo4j. Utiliza el LLM de dos maneras:

    • cypher_llm – Esta instancia de LLM es responsable de generar consultas Cypher para extraer información relevante del gráfico en función de la pregunta del usuario.

    • Validación : se asegura de que las consultas Cypher estén validadas para garantizar que sean sintácticamente correctas.


  2. Recuperación de contexto : las consultas validadas se ejecutan en el gráfico 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 acceda a Neo4j, lo que puede ayudar a proporcionar respuestas más completas y precisas.

Agente compuesto, gráfico y vector 🪄

Aquí es donde ocurre la magia: nuestro agente puede combinar los 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:


  1. Indicaciones: definimos una indicación que indica al LLM que utilice el contexto tanto de Milvus como de Neo4j para responder la pregunta.
  2. Recuperación: el agente recupera información relevante de Milvus (usando búsqueda vectorial) y Neo4j (usando generación de gráficos).
  3. Generación de respuestas: Llama 3.1 8B procesa la solicitud y genera una respuesta concisa, aprovechando el conocimiento combinado de las bases de datos vectoriales y gráficas 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 gráficas y vectoriales para mejorar nuestro descubrimiento de artículos de investigación.


Comenzamos con nuestra búsqueda gráfica usando 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 búsqueda gráfica es excelente para encontrar relaciones y metadatos. Puede identificar rápidamente artículos en función de títulos, autores o categorías predefinidas, lo que proporciona una vista estructurada de los datos.


A continuación, pasamos a nuestra búsqueda de vectores para obtener una perspectiva diferente:


 # 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 búsqueda vectorial es muy útil 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 el uso de bases de datos tanto vectoriales como gráficas.


 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.


Al integrar búsquedas de gráficos y de vectores, aprovechamos las ventajas de ambos enfoques. La búsqueda de gráficos proporciona precisión y permite navegar por relaciones estructuradas, mientras que la búsqueda de vectores añade profundidad a través de la comprensión semántica.


Este método combinado ofrece varias ventajas:


  1. Recuperación mejorada : encuentra documentos relevantes que podrían pasarse por alto con cualquiera de los métodos por separado.
  2. Contexto mejorado : proporciona una comprensión más matizada de cómo se relacionan los artículos entre sí.
  3. Flexibilidad : puede adaptarse a diferentes tipos de consultas, desde búsquedas de palabras clave específicas hasta exploraciones conceptuales más amplias.

Resumiendo

En esta publicación del blog, mostramos cómo crear un agente GraphRAG con Neo4j y Milvus. Al combinar las ventajas de las bases de datos de gráficos y la búsqueda vectorial , este agente brinda 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 confiable. Los ejemplos de los componentes Graph Generation y Composite Agent demuestran cómo este agente puede aprovechar bases de datos tanto vectoriales como gráficas para brindar respuestas completas y matizadas.


Esperamos que esta guía te haya resultado útil y te inspire a comprobar las posibilidades de combinar bases de datos de gráficos y búsqueda vectorial en tus propios proyectos.


El código actual está disponible en GitHub .


Para obtener más información sobre este tema, únase a nosotros en NODES 2024 el 7 de noviembre, nuestra conferencia virtual gratuita para desarrolladores sobre aplicaciones inteligentes, gráficos de conocimiento e IA. ¡Regístrese ahora!