paint-brush
Neo4j グラフと Milvus ベクトル検索を使用したハイブリッド RAG エージェントの構築@neo4j
499 測定値
499 測定値

Neo4j グラフと Milvus ベクトル検索を使用したハイブリッド RAG エージェントの構築

Neo4j8m2024/11/05
Read on Terminal Reader

長すぎる; 読むには

このガイドでは、Neo4j と Milvus を使用してハイブリッド RAG エージェントを構築し、グラフ データベースとベクター データベースの両方を活用し、検索方法と自己修正メカニズムを組み合わせて応答の精度と関連性を高める方法について説明します。
featured image - Neo4j グラフと Milvus ベクトル検索を使用したハイブリッド RAG エージェントの構築
Neo4j HackerNoon profile picture
0-item
1-item


このブログ投稿では、Neo4j グラフ データベースとMilvusベクター データベースを使用して GraphRAG エージェントを構築する方法について詳しく説明します。このエージェントは、グラフ データベースベクター検索のパワーを組み合わせて、ユーザーのクエリに対して正確で適切な回答を提供します。この例では、LangGraph、Llama 3.1 8B、Ollama、GPT-4o を使用します。


従来の検索拡張生成( RAG )システムは、ベクターデータベース関連文書を取得します。私たちのアプローチは、 Neo4jを組み込むことでさらに進み、エンティティと概念の関係をキャプチャし、より微妙な情報の理解を提供します。私たちは、これら 2 つの手法を組み合わせることで、より堅牢で情報量の多い RAG システムを作成したいと考えています。

RAG エージェントの構築

私たちのエージェントは、ルーティング、フォールバック メカニズム、自己修正という 3 つの主要な概念に従います。これらの原則は、一連の LangGraph コンポーネントを通じて実装されます。


  • ルーティング- 専用のルーティング メカニズムが、クエリに基づいてベクター データベース、ナレッジ グラフ、またはその両方の組み合わせを使用するかどうかを決定します。
  • フォールバック- 最初の検索が不十分な状況では、エージェントは Tavily を使用して Web 検索にフォールバックします。
  • 自己修正– エージェントは自身の回答を評価し、幻覚や不正確さを修正しようとします。


他にも次のようなコンポーネントがあります。


  • 検索– オープンソースで高性能なベクター データベースである Milvus を使用して、ユーザーのクエリとの意味的類似性に基づいてドキュメント チャンクを保存および取得します。
  • グラフの拡張- Neo4j は、取得したドキュメントからナレッジ グラフを構築し、関係性とエンティティでコンテキストを強化するために使用されます。
  • LLM の統合- ローカル LLM である Llama 3.1 8B は、回答の生成と取得した情報の関連性と正確性の評価に使用され、GPT-4o は、Neo4j で使用されるクエリ言語である Cypher の生成に使用されます。

GraphRAG アーキテクチャ

GraphRAG エージェントのアーキテクチャは、複数の相互接続されたノードを持つワークフローとして視覚化できます。


  • 質問ルーティング– エージェントはまず質問を分析して、最適な検索戦略 (ベクトル検索、グラフ検索、またはその両方) を決定します。
  • 検索– ルーティングの決定に基づいて、Milvus から関連ドキュメントが取得されるか、Neo4j グラフから情報が抽出されます。
  • 生成– LLM は取得したコンテキストを使用して回答を生成します。
  • 評価– エージェントは、生成された回答の関連性、正確性、および潜在的な幻覚を評価します。
  • 絞り込み(必要な場合) - 回答が不十分であると判断された場合、エージェントは検索を絞り込んだり、エラーを修正したりすることがあります。

エージェントの例

LLM エージェントの機能を紹介するために、 Graph GenerationComposite Agent 2 つの異なるコンポーネントを見てみましょう。

完全なコードはこの記事の下部に掲載されていますが、これらのスニペットにより、LangChain フレームワーク内でこれらのエージェントがどのように機能するかをより深く理解できるようになります。

グラフ生成

このコンポーネントは、Neo4j の機能を使用して質問応答プロセスを改善するように設計されています。Neo4j グラフ データベースに埋め込まれた知識を活用して質問に回答します。仕組みは次のとおりです。


  1. GraphCypherQAChain – LLM が Neo4j グラフ データベースと対話できるようにします。LLM は 2 つの方法で使用されます。

    • cypher_llm – この LLM インスタンスは、ユーザーの質問に基づいてグラフから関連情報を抽出するための Cypher クエリを生成する役割を担います。

    • 検証– Cypher クエリが構文的に正しいことを確認するために検証します。


  2. コンテキストの取得– 検証されたクエリは Neo4j グラフ上で実行され、必要なコンテキストが取得されます。


  3. 回答生成- 言語モデルは取得したコンテキストを使用して、ユーザーの質問に対する回答を生成します。


 ### 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 の結果を組み合わせることで、情報をより深く理解し、より正確でニュアンスに富んだ回答を得ることができます。仕組みは次のとおりです。


  1. プロンプト –質問に答えるために、Milvus と Neo4j の両方のコンテキストを使用するように LLM に指示するプロンプトを定義します。
  2. 検索 –エージェントは、Milvus (ベクトル検索を使用) と Neo4j (グラフ生成を使用) から関連情報を取得します。
  3. 回答生成 – Llama 3.1 8B はプロンプトを処理し、ベクトル データベースとグラフ データベースからの知識と複合チェーンを組み合わせて、簡潔な回答を生成します。


 ### 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.


グラフ検索とベクトル検索を統合することで、両方のアプローチの長所を活用します。グラフ検索は精度を提供し、構造化された関係をナビゲートし、ベクトル検索は意味理解を通じて深みを加えます。


この組み合わせ方法にはいくつかの利点があります。


  1. 再現性の向上: どちらかの方法だけでは見逃してしまう可能性のある関連論文を見つけます。
  2. 強化されたコンテキスト: 論文同士がどのように関連しているかをより詳細に理解できます。
  3. 柔軟性: 特定のキーワード検索からより広範な概念の探索まで、さまざまな種類のクエリに適応できます。

まとめ

このブログ記事では、Neo4j と Milvus を使用して GraphRAG エージェントを構築する方法を示しました。グラフ データベースとベクトル検索の長所を組み合わせることで、このエージェントはユーザーのクエリに対して正確で関連性の高い回答を提供します。


RAG エージェントのアーキテクチャは、専用のルーティング、フォールバック メカニズム、自己修正機能を備えており、堅牢で信頼性に優れています。グラフ生成および複合エージェント コンポーネントの例では、このエージェントがベクトル データベースとグラフ データベースの両方を活用して、包括的かつ微妙なニュアンスに富んだ回答を提供する方法を示しています。


このガイドがお役に立ち、グラフ データベースとベクトル検索を独自のプロジェクトで組み合わせる可能性を検討するきっかけになれば幸いです。


現在のコードはGitHubで入手できます。


このトピックについて詳しく知るには、11 月 7 日に開催されるインテリジェント アプリ、ナレッジ グラフ、AI に関する無料の仮想開発者会議 NODES 2024 にご参加ください。今すぐ登録してください。