paint-brush
Construíndo un axente RAG híbrido con Neo4j Graphs e Milvus Vector Searchpor@neo4j
Nova historia

Construíndo un axente RAG híbrido con Neo4j Graphs e Milvus Vector Search

por Neo4j8m2024/11/05
Read on Terminal Reader

Demasiado longo; Ler

Esta guía explora a construción dun axente RAG híbrido usando Neo4j e Milvus para aproveitar bases de datos de gráficos e vectores, mellorando a precisión e a relevancia das respostas mediante métodos de busca combinados e mecanismos de autocorrección.
featured image - Construíndo un axente RAG híbrido con Neo4j Graphs e Milvus Vector Search
Neo4j HackerNoon profile picture
0-item
1-item


Esta publicación de blog detalla como construír un axente GraphRAG usando a base de datos de gráficos Neo4j e a base de datos de vectores Milvus . Este axente combina o poder das bases de datos de gráficos e a busca vectorial para proporcionar respostas precisas e relevantes ás consultas dos usuarios. Neste exemplo, utilizaremos LangGraph, Llama 3.1 8B con Ollama e GPT-4o.


Os sistemas tradicionais de xeración aumentada de recuperación ( RAG ) dependen unicamente dos sistemas bases de datos vectoriales para recuperar documentos relevantes. O noso enfoque vai máis aló incorporando Neo4j para captar relacións entre entidades e conceptos, ofrecendo unha comprensión máis matizada da información. Queremos crear un sistema RAG máis robusto e informativo combinando estas dúas técnicas.

Construíndo o Axente da RAG

O noso axente segue tres conceptos clave: enrutamento, mecanismos de reserva e autocorrección. Estes principios impléntanse mediante unha serie de compoñentes de LangGraph:


  • Enrutamento : un mecanismo de enrutamento dedicado decide se usar a base de datos vectorial, o gráfico de coñecemento ou unha combinación de ambos en función da consulta.
  • Fallback : nas situacións nas que a recuperación inicial é insuficiente, o axente volve a buscar na web mediante Tavily.
  • Autocorrección : o axente avalía as súas propias respostas e tenta corrixir as alucinacións ou inexactitudes.


Despois temos outros compoñentes, como:


  • Recuperación : usamos Milvus, unha base de datos vectorial de código aberto e de alto rendemento, para almacenar e recuperar fragmentos de documentos en función da semellanza semántica coa consulta do usuario.
  • Mellora de gráficos : Neo4j úsase para construír un gráfico de coñecemento a partir dos documentos recuperados, enriquecendo o contexto con relacións e entidades.
  • Integración de LLMs : Llama 3.1 8B, un LLM local, úsase para xerar respostas e avaliar a relevancia e precisión da información recuperada, mentres que GPT-4o úsase para xerar Cypher, a linguaxe de consulta utilizada por Neo4j.

Arquitectura GraphRAG

A arquitectura do noso axente GraphRAG pódese visualizar como un fluxo de traballo con varios nodos interconectados:


  • Enrutamento de preguntas : o axente analiza primeiro a pregunta para determinar a mellor estratexia de recuperación (busca vectorial, busca gráfica ou ambas).
  • Recuperación : en función da decisión de encamiñamento, os documentos relevantes son recuperados de Milvus ou a información extraída do gráfico Neo4j.
  • Xeración : o LLM xera unha resposta utilizando o contexto recuperado.
  • Avaliación : o axente avalía a resposta xerada para a súa relevancia, precisión e potenciais alucinacións.
  • Refinación (se é necesario): se a resposta non se considera satisfactoria, o axente pode refinar a súa busca ou tentar corrixir erros.

Exemplos de axentes

Para mostrar as capacidades dos nosos axentes de LLM, vexamos dous compoñentes diferentes: Graph Generation e Composite Agent .

Aínda que o código completo está dispoñible na parte inferior desta publicación, estes fragmentos proporcionarán unha mellor comprensión de como funcionan estes axentes no marco de LangChain.

Xeración de gráficos

Este compoñente está deseñado para mellorar o proceso de preguntas e respostas utilizando as capacidades dun Neo4j. Responde preguntas aproveitando o coñecemento incorporado na base de datos de gráficos Neo4j. Así é como funciona:


  1. GraphCypherQAChain : permite que o LLM interactúe coa base de datos de gráficos Neo4j. Usa o LLM de dúas formas:

    • cypher_llm : esta instancia do LLM é responsable de xerar consultas de Cypher para extraer información relevante do gráfico en función da pregunta do usuario.

    • Validación : asegúrese de que as consultas de Cypher están validadas para garantir que son sintácticamente correctas.


  2. Recuperación de contexto : as consultas validadas execútanse no gráfico Neo4j para recuperar o contexto necesario.


  3. Xeración de respostas : o modelo de linguaxe utiliza o contexto recuperado para xerar unha resposta á pregunta do 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 compoñente permite que o sistema RAG toque Neo4j, o que pode axudar a proporcionar respostas máis completas e precisas.

Axente composto, gráfico e vector 🪄

Aquí é onde sucede a maxia: o noso axente pode combinar os resultados de Milvus e Neo4j, o que permite comprender mellor a información e dar respostas máis precisas e matizadas. Así é como funciona:


  1. Indicacións: definimos unha indicación que lle indica ao LLM que use o contexto de Milvus e Neo4j para responder á pregunta.
  2. Recuperación: o axente recupera información relevante de Milvus (usando a busca vectorial) e Neo4j (usando a xeración de gráficos).
  3. Xeración de respostas: Llama 3.1 8B procesa a solicitude e xera unha resposta concisa, aproveitando o coñecemento combinado das bases de datos vectoriais e gráficas coa cadea 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, )


Vexamos os resultados da nosa busca, combinando os puntos fortes das bases de datos de gráficos e vectores para mellorar o descubrimento do noso traballo de investigación.


Comezamos coa nosa busca de gráficos 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'}]


A busca de gráficos destaca por atopar relacións e metadatos. Pode identificar rapidamente artigos baseados en títulos, autores ou categorías predefinidas, proporcionando unha vista estruturada dos datos.


A continuación, pasamos á nosa busca vectorial para buscar unha 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.


A busca vectorial é moi boa para comprender o contexto e a semellanza semántica. Pode descubrir artigos que están conceptualmente relacionados coa consulta, aínda que non conteñan explícitamente os termos da busca.


Finalmente, combinamos os dous métodos de busca:


Esta é unha parte crucial do noso axente RAG, que permite utilizar bases de datos vectoriais e 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.


Ao integrar buscas de gráficos e vectores, aproveitamos os puntos fortes de ambos enfoques. A busca de gráficos proporciona precisión e navega por relacións estruturadas, mentres que a busca vectorial engade profundidade a través da comprensión semántica.


Este método combinado ofrece varias vantaxes:


  1. Memoria mellorada : atopa documentos relevantes que poden perderse por calquera dos métodos.
  2. Contexto mellorado : ofrece unha comprensión máis matizada de como se relacionan os traballos entre si.
  3. Flexibilidade : pode adaptarse a diferentes tipos de consultas, desde buscas de palabras clave específicas ata exploracións conceptuais máis amplas.

Resumindo

Nesta publicación do blog, mostramos como construír un axente GraphRAG usando Neo4j e Milvus. Ao combinar os puntos fortes das bases de datos de gráficos e da busca vectorial , este axente ofrece respostas precisas e relevantes ás consultas dos usuarios.


A arquitectura do noso axente RAG, co seu enrutamento dedicado, mecanismos de reserva e capacidades de autocorrección, faino robusto e fiable. Os exemplos dos compoñentes de xeración de gráficos e axente composto demostran como este axente pode aproveitar bases de datos vectoriais e gráficas para ofrecer respostas completas e matizadas.


Agardamos que esta guía sexa útil e che inspire a comprobar as posibilidades de combinar bases de datos de gráficos e busca vectorial nos teus propios proxectos.


O código actual está dispoñible en GitHub .


Para obter máis información sobre este tema, únete a nós en NODES 2024 o 7 de novembro, a nosa conferencia virtual gratuíta para desenvolvedores sobre aplicacións intelixentes, gráficos de coñecemento e IA. Rexístrate agora!

L O A D I N G
. . . comments & more!

About Author

Neo4j HackerNoon profile picture
Neo4j@neo4j
Neo4j is the world's leading graph database, with native graph storage and processing..

Etiquetas colgantes

ESTE ARTIGO FOI PRESENTADO EN...