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
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:
Aleshores tenim altres components, com ara:
L'arquitectura del nostre agent GraphRAG es pot visualitzar com un flux de treball amb diversos nodes interconnectats:
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.
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:
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.
Recuperació de context : les consultes validades s'executen al gràfic Neo4j per recuperar el context necessari.
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.
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:
### 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:
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!