このブログ投稿では、Neo4j グラフ データベースとMilvusベクター データベースを使用して GraphRAG エージェントを構築する方法について詳しく説明します。このエージェントは、グラフ データベースとベクター検索のパワーを組み合わせて、ユーザーのクエリに対して正確で適切な回答を提供します。この例では、LangGraph、Llama 3.1 8B、Ollama、GPT-4o を使用します。
従来の検索拡張生成( RAG )システムは、
私たちのエージェントは、ルーティング、フォールバック メカニズム、自己修正という 3 つの主要な概念に従います。これらの原則は、一連の LangGraph コンポーネントを通じて実装されます。
他にも次のようなコンポーネントがあります。
GraphRAG エージェントのアーキテクチャは、複数の相互接続されたノードを持つワークフローとして視覚化できます。
LLM エージェントの機能を紹介するために、 Graph Generation
とComposite Agent
2 つの異なるコンポーネントを見てみましょう。
完全なコードはこの記事の下部に掲載されていますが、これらのスニペットにより、LangChain フレームワーク内でこれらのエージェントがどのように機能するかをより深く理解できるようになります。
このコンポーネントは、Neo4j の機能を使用して質問応答プロセスを改善するように設計されています。Neo4j グラフ データベースに埋め込まれた知識を活用して質問に回答します。仕組みは次のとおりです。
GraphCypherQAChain
– LLM が Neo4j グラフ データベースと対話できるようにします。LLM は 2 つの方法で使用されます。
cypher_llm
– この LLM インスタンスは、ユーザーの質問に基づいてグラフから関連情報を抽出するための Cypher クエリを生成する役割を担います。
検証– Cypher クエリが構文的に正しいことを確認するために検証します。
コンテキストの取得– 検証されたクエリは Neo4j グラフ上で実行され、必要なコンテキストが取得されます。
回答生成- 言語モデルは取得したコンテキストを使用して、ユーザーの質問に対する回答を生成します。
### 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})
このコンポーネントにより、RAG システムは Neo4j を活用できるようになり、より包括的で正確な回答を提供できるようになります。
ここで魔法が起こります。私たちのエージェントは Milvus と Neo4j の結果を組み合わせることで、情報をより深く理解し、より正確でニュアンスに富んだ回答を得ることができます。仕組みは次のとおりです。
### 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, )
グラフ データベースとベクター データベースの長所を組み合わせて研究論文の発見を強化した検索結果を見てみましょう。
まず、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'}]
グラフ検索は、関係性とメタデータの検索に優れています。タイトル、著者、または定義済みのカテゴリに基づいて論文をすばやく識別し、データの構造化されたビューを提供します。
次に、別の視点からベクトル検索を見てみましょう。
# 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.
ベクトル検索は、コンテキストと意味の類似性を理解するのに非常に優れています。検索用語が明示的に含まれていなくても、クエリに概念的に関連する論文を発見できます。
最後に、両方の検索方法を組み合わせます。
これは RAG エージェントの重要な部分であり、ベクター データベースとグラフ データベースの両方を使用できるようになります。
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.
グラフ検索とベクトル検索を統合することで、両方のアプローチの長所を活用します。グラフ検索は精度を提供し、構造化された関係をナビゲートし、ベクトル検索は意味理解を通じて深みを加えます。
この組み合わせ方法にはいくつかの利点があります。
このブログ記事では、Neo4j と Milvus を使用して GraphRAG エージェントを構築する方法を示しました。グラフ データベースとベクトル検索の長所を組み合わせることで、このエージェントはユーザーのクエリに対して正確で関連性の高い回答を提供します。
RAG エージェントのアーキテクチャは、専用のルーティング、フォールバック メカニズム、自己修正機能を備えており、堅牢で信頼性に優れています。グラフ生成および複合エージェント コンポーネントの例では、このエージェントがベクトル データベースとグラフ データベースの両方を活用して、包括的かつ微妙なニュアンスに富んだ回答を提供する方法を示しています。
このガイドがお役に立ち、グラフ データベースとベクトル検索を独自のプロジェクトで組み合わせる可能性を検討するきっかけになれば幸いです。
現在のコードはGitHubで入手できます。
このトピックについて詳しく知るには、11 月 7 日に開催されるインテリジェント アプリ、ナレッジ グラフ、AI に関する無料の仮想開発者会議 NODES 2024 にご参加ください。今すぐ登録してください。