Bu blog yazısı, Neo4j grafik veritabanı ve Milvus vektör veritabanı kullanılarak bir GraphRAG aracısının nasıl oluşturulacağını ayrıntılı olarak açıklamaktadır. Bu aracı, kullanıcı sorgularına doğru ve alakalı yanıtlar sağlamak için grafik veritabanlarının ve vektör aramasının gücünü birleştirir. Bu örnekte, LangGraph, Llama 3.1 8B with Ollama ve GPT-4o kullanacağız.
Geleneksel Geri Alma Artırılmış Üretim ( RAG ) sistemleri yalnızca
Ajanımız üç temel kavramı takip eder: yönlendirme, geri dönüş mekanizmaları ve kendi kendini düzeltme. Bu ilkeler bir dizi LangGraph bileşeni aracılığıyla uygulanır:
Daha sonra şu gibi diğer bileşenlerimiz var:
GraphRAG aracımızın mimarisi, birbirine bağlı birkaç düğümden oluşan bir iş akışı olarak görselleştirilebilir:
LLM ajanlarımızın yeteneklerini sergilemek için iki farklı bileşene bakalım: Graph Generation
ve Composite Agent
.
Kodun tamamı bu yazının sonunda mevcut olsa da, bu kod parçacıkları bu ajanların LangChain çerçevesi içinde nasıl çalıştığına dair daha iyi bir anlayış sağlayacaktır.
Bu bileşen, Neo4j'in yeteneklerini kullanarak soru-cevaplama sürecini iyileştirmek için tasarlanmıştır. Neo4j grafik veritabanına gömülü bilgiden yararlanarak soruları yanıtlar. İşte nasıl çalıştığı:
GraphCypherQAChain
– LLM'nin Neo4j grafik veritabanıyla etkileşime girmesine izin verir. LLM'yi iki şekilde kullanır:
cypher_llm
– LLM'nin bu örneği, kullanıcının sorusuna dayalı olarak grafikten ilgili bilgileri çıkarmak için Cypher sorguları oluşturmaktan sorumludur.
Doğrulama – Cypher sorgularının sözdizimsel olarak doğru olduğundan emin olmak için doğrulandığından emin olur.
Bağlam alma – Doğrulanmış sorgular, gerekli bağlamı almak için Neo4j grafiğinde yürütülür.
Cevap oluşturma – Dil modeli, alınan bağlamı kullanarak kullanıcının sorusuna bir cevap oluşturur.
### 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})
Bu bileşen, RAG sisteminin Neo4j'den yararlanmasını sağlayarak daha kapsamlı ve doğru yanıtlar sağlanmasına yardımcı olabilir.
İşte sihir burada gerçekleşir: Temsilcimiz Milvus ve Neo4j'den gelen sonuçları birleştirebilir, bu da bilgilerin daha iyi anlaşılmasını ve daha doğru ve ayrıntılı yanıtların elde edilmesini sağlar. İşte nasıl çalıştığı:
### 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, )
Araştırma makalemizin keşfini geliştirmek için grafik ve vektör veri tabanlarının güçlü yönlerini bir araya getirerek yaptığımız aramanın sonuçlarına bir göz atalım.
Neo4j kullanarak grafik aramamıza başlayalım:
# 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'}]
Grafik araması, ilişkileri ve meta verileri bulmada mükemmeldir. Başlıklara, yazarlara veya önceden tanımlanmış kategorilere göre makaleleri hızla belirleyebilir ve verilerin yapılandırılmış bir görünümünü sağlayabilir.
Şimdi farklı bir bakış açısı için vektör aramamıza geçelim:
# 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.
Vektör araması bağlamı ve anlamsal benzerliği anlamada gerçekten iyidir. Arama terimlerini açıkça içermeseler bile, sorguyla kavramsal olarak ilişkili makaleleri ortaya çıkarabilir.
Son olarak her iki arama yöntemini birleştiriyoruz:
Bu, hem vektör hem de grafik veritabanlarını kullanmayı mümkün kılan RAG aracımızın önemli bir parçasıdır.
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.
Grafik ve vektör aramalarını entegre ederek, her iki yaklaşımın da güçlü yanlarından yararlanıyoruz. Grafik araması kesinlik sağlar ve yapılandırılmış ilişkilerde gezinirken, vektör araması anlamsal anlayış yoluyla derinlik katar.
Bu birleşik yöntem birçok avantaj sunuyor:
Bu blog yazısında, Neo4j ve Milvus kullanarak bir GraphRAG Agent'ın nasıl oluşturulacağını gösterdik. Grafik veritabanlarının ve vektör aramasının güçlü yönlerini birleştirerek, bu agent kullanıcı sorgularına doğru ve alakalı yanıtlar sağlar.
RAG aracımızın mimarisi, özel yönlendirme, geri dönüş mekanizmaları ve kendi kendini düzeltme yetenekleriyle onu sağlam ve güvenilir hale getirir. Grafik Oluşturma ve Bileşik Aracı bileşenlerinin örnekleri, bu aracının kapsamlı ve ayrıntılı yanıtlar sağlamak için hem vektör hem de grafik veritabanlarından nasıl yararlanabileceğini gösterir.
Bu rehberin faydalı olmasını ve kendi projelerinizde grafik veritabanları ile vektör aramayı birleştirme olanaklarını incelemeniz için size ilham vermesini umuyoruz.
Güncel kod GitHub'da mevcuttur.
Bu konu hakkında daha fazla bilgi edinmek için 7 Kasım'da akıllı uygulamalar, bilgi grafikleri ve yapay zeka üzerine ücretsiz sanal geliştirici konferansımız olan NODES 2024'e katılın. Hemen Kaydolun!