paint-brush
Construcció d'un agent RAG híbrid amb Neo4j Graphs i Milvus Vector Searchper@neo4j
Nova Història

Construcció d'un agent RAG híbrid amb Neo4j Graphs i Milvus Vector Search

per Neo4j8m2024/11/05
Read on Terminal Reader

Massa Llarg; Per llegir

Aquesta guia explora la creació d'un agent RAG híbrid amb Neo4j i Milvus per aprofitar bases de dades de gràfics i vectors, millorant la precisió i la rellevància de la resposta mitjançant mètodes de cerca combinats i mecanismes d'autocorrecció.
featured image - Construcció d'un agent RAG híbrid amb Neo4j Graphs i Milvus Vector Search
Neo4j HackerNoon profile picture
0-item
1-item


Aquesta publicació del bloc detalla com crear un agent GraphRAG mitjançant la base de dades de gràfics Neo4j i la base de dades vectorials Milvus . Aquest agent combina el poder de les bases de dades de gràfics i la cerca vectorial per proporcionar respostes precises i rellevants a les consultes dels usuaris. En aquest exemple, utilitzarem LangGraph, Llama 3.1 8B amb Ollama i GPT-4o.


Els sistemes tradicionals de generació augmentada de recuperació ( RAG ) depenen únicament bases de dades vectorials per recuperar els documents pertinents. El nostre enfocament va més enllà incorporant Neo4j per capturar relacions entre entitats i conceptes, oferint una comprensió més matisada de la informació. Volem crear un sistema RAG més robust i informatiu combinant aquestes dues tècniques.

Construint l'Agent RAG

El nostre agent segueix tres conceptes clau: encaminament, mecanismes de reserva i autocorrecció. Aquests principis s'implementen mitjançant una sèrie de components LangGraph:


  • Encaminament : un mecanisme d'encaminament dedicat decideix si s'utilitza la base de dades vectorial, el gràfic de coneixement o una combinació d'ambdós segons la consulta.
  • Fallback : en situacions en què la recuperació inicial és insuficient, l'agent torna a una cerca web amb Tavily.
  • Autocorrecció : l'agent avalua les seves pròpies respostes i intenta corregir les al·lucinacions o les inexactituds.


Aleshores tenim altres components, com ara:


  • Recuperació : fem servir Milvus, una base de dades vectorials de codi obert i d'alt rendiment, per emmagatzemar i recuperar fragments de documents basats en la similitud semàntica amb la consulta de l'usuari.
  • Millora de gràfics : Neo4j s'utilitza per construir un gràfic de coneixement a partir dels documents recuperats, enriquint el context amb relacions i entitats.
  • Integració de LLMs : Llama 3.1 8B, un LLM local, s'utilitza per generar respostes i avaluar la rellevància i la precisió de la informació recuperada, mentre que GPT-4o s'utilitza per generar Cypher, el llenguatge de consulta utilitzat per Neo4j.

L'arquitectura GraphRAG

L'arquitectura del nostre agent GraphRAG es pot visualitzar com un flux de treball amb diversos nodes interconnectats:


  • Encaminament de preguntes : l'agent analitza primer la pregunta per determinar la millor estratègia de recuperació (cerca de vectors, cerca de gràfics o ambdues).
  • Recuperació : en funció de la decisió d'encaminament, es recuperen els documents rellevants de Milvus o s'extreu informació del gràfic Neo4j.
  • Generació : el LLM genera una resposta utilitzant el context recuperat.
  • Avaluació : l'agent avalua la resposta generada per a la rellevància, la precisió i les al·lucinacions potencials.
  • Refinament (si cal) - Si la resposta es considera insatisfactòria, l'agent pot afinar la cerca o intentar corregir errors.

Exemples d'agents

Per mostrar les capacitats dels nostres agents LLM, analitzem dos components diferents: Graph Generation i Composite Agent .

Tot i que el codi complet està disponible a la part inferior d'aquesta publicació, aquests fragments proporcionaran una millor comprensió de com funcionen aquests agents dins del marc de LangChain.

Generació de gràfics

Aquest component està dissenyat per millorar el procés de preguntes i respostes utilitzant les capacitats d'un Neo4j. Respon a preguntes aprofitant el coneixement integrat a la base de dades de gràfics Neo4j. Així és com funciona:


  1. GraphCypherQAChain : permet que el LLM interactuï amb la base de dades de gràfics Neo4j. Utilitza el LLM de dues maneres:

    • cypher_llm : aquesta instància del LLM és responsable de generar consultes de Cypher per extreure informació rellevant del gràfic en funció de la pregunta de l'usuari.

    • Validació : s'assegura que les consultes de Cypher estan validades per assegurar-se que són sintàcticament correctes.


  2. Recuperació de context : les consultes validades s'executen al gràfic Neo4j per recuperar el context necessari.


  3. Generació de respostes : el model de llenguatge utilitza el context recuperat per generar una resposta a la pregunta de l'usuari.


 ### 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})


Aquest component permet al sistema RAG aprofitar Neo4j, que pot ajudar a proporcionar respostes més completes i precises.

Agent compost, gràfic i vector 🪄

Aquí és on passa la màgia: el nostre agent pot combinar els resultats de Milvus i Neo4j, permetent una millor comprensió de la informació i conduint a respostes més precises i matisades. Així és com funciona:


  1. Indicacions: definim una indicació que indica al LLM que utilitzi el context tant de Milvus com de Neo4j per respondre la pregunta.
  2. Recuperació: l'agent recupera la informació rellevant de Milvus (utilitzant la cerca vectorial) i Neo4j (utilitzant la generació de gràfics).
  3. Generació de respostes: Llama 3.1 8B processa la pregunta i genera una resposta concisa, aprofitant el coneixement combinat de les bases de dades de vectors i gràfics amb la cadena 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, )


Fem una ullada als resultats de la nostra cerca, combinant els punts forts de les bases de dades de gràfics i vectors per millorar el descobriment del nostre treball de recerca.


Comencem amb la nostra cerca de gràfics amb 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 cerca de gràfics destaca per trobar relacions i metadades. Pot identificar ràpidament articles basats en títols, autors o categories predefinides, proporcionant una visió estructurada de les dades.


A continuació, passem a la nostra cerca vectorial per a una perspectiva diferent:


 # 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 cerca vectorial és molt bona per entendre el context i la similitud semàntica. Pot descobrir articles relacionats conceptualment amb la consulta, encara que no continguin explícitament els termes de cerca.


Finalment, combinem els dos mètodes de cerca:


Aquesta és una part crucial del nostre agent RAG, que fa possible utilitzar bases de dades vectorials i gràfics.


 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.


Mitjançant la integració de cerques de gràfics i vectors, aprofitem els punts forts d'ambdós enfocaments. La cerca de gràfics proporciona precisió i navega per relacions estructurades, mentre que la cerca vectorial afegeix profunditat mitjançant la comprensió semàntica.


Aquest mètode combinat ofereix diversos avantatges:


  1. Recuperació millorada : troba documents rellevants que només es poden perdre per qualsevol dels mètodes.
  2. Context millorat : proporciona una comprensió més matisada de com es relacionen els articles.
  3. Flexibilitat : es pot adaptar a diferents tipus de consultes, des de cerques de paraules clau específiques fins a exploracions conceptuals més àmplies.

Resumint-ho

En aquesta publicació del bloc, hem mostrat com crear un agent GraphRAG amb Neo4j i Milvus. En combinar els punts forts de les bases de dades de gràfics i la cerca vectorial , aquest agent proporciona respostes precises i rellevants a les consultes dels usuaris.


L'arquitectura del nostre agent RAG, amb el seu enrutament dedicat, mecanismes de reserva i capacitats d'autocorrecció, el fa robust i fiable. Els exemples dels components de generació de gràfics i d'agent compost demostren com aquest agent pot aprofitar les bases de dades de gràfics i de vectors per oferir respostes completes i matisades.


Esperem que aquesta guia us hagi estat útil i us inspiri a comprovar les possibilitats de combinar bases de dades de gràfics i cerca vectorials en els vostres propis projectes.


El codi actual està disponible a GitHub .


Per obtenir més informació sobre aquest tema, uneix-te a nosaltres a NODES 2024 el 7 de novembre, la nostra conferència virtual gratuïta per a desenvolupadors sobre aplicacions intel·ligents, gràfics de coneixement i IA. Registra't ara!