LangChainとNeo4jによるGraphRAGの構築:AIにデータ関係の深い理解が必要な理由

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

従来のRAGの課題:ベクトルだけでは不十分な理由

RAG(Retrieval-Augmented Generation)アプリケーションを作成したことがあるなら、データをベクトルに変換し、ベクトルデータベースに保存し、類似性(セマンティック検索)に基づいて検索するというプロセスに馴染みがあるでしょう。この方法は、単一の情報を検索する場合には非常に有効です。しかし、プロジェクトを実用化すると、より複雑な要求がシステムを悩ませ始めます。

1万件の人事記録と数百の社内プロジェクトをRAGシステムに読み込ませたと想像してください。「プロジェクトAの管理者は誰ですか?」という質問には、AIはすぐに答えます。しかし、「過去2年間にプロジェクトAの管理者と一緒に仕事をしたPythonエンジニア5人をリストアップしてください」と尋ねると、システムは誤った回答をし始めることがよくあります。その理由は、ベクトルデータベースは意味の近いテキスト断片を探すだけで、従業員、スキル、時間、プロジェクトの間に張り巡らされた複雑な関係ネットワークを理解できないからです。

従来のRAGはデータの論理構造を無視しています。すべての情報を多次元空間に浮かぶ断片的なテキストとして扱います。これを根本的に解決するには、これらのデータポイントを互いに接続するKnowledge Graph(ナレッジグラフ)が必要です。

コア概念:ナレッジグラフとGraphRAGの進化

ナレッジグラフは、データをリストやフラットなテーブル形式で保存しません. 情報をNode(エンティティ)とRelationship(関係)として整理します。例えば、「Alice」というノードは、「AIプロジェクト」というノードと「管理している(MANAGES)」という関係を通じて接続されます。

GraphRAGは、ナレッジグラフの厳格な構造とLLMの言語能力を融合させたものです。類似するテキスト断片をスキャンする代わりに、システムはグラフ上のパス(経路)を直接クエリします。これにより、論理性高く、より正確な情報を抽出することが可能になります。

実際の導入事例では、GraphRAGは企業データに対するAIの「ハルシネーション(幻覚)」現象を70〜80%削減することが示されています。AIが返す情報はすべて、単語の確率に基づく推測ではなく、あらかじめ定義された実際の関係に基づいています。

Vector RAGとGraphRAGの実際の違い:

  • Vector RAG: 意図に基づく検索には優れていますが、多層的な関係(マルチホップ)の抽出には弱いです。
  • GraphRAG: 論理とエンティティに強く、メモリ内では離れていても管理上または業務上で関連のあるデータを接続する能力があります。

実践ガイド:ナレッジグラフとLangChainの統合

最もポピュラーなグラフデータベースであるNeo4jと、処理フローを調整するためにLangChainを使用します。

1. 環境構築

必要なPythonライブラリをインストールします。互換性を確保するために、Python 3.9以上を使用することをお勧めします。

pip install langchain langchain-community langchain-openai neo4j python-dotenv

Neo4jを最も早く利用する方法は、Dockerを使用して数秒でローカル環境を構築することです:

docker run --name neo4j -p 7474:7474 -p 7687:7687 -d -e NEO4J_AUTH=neo4j/password neo4j:latest

2. LangChainとNeo4jの接続

Neo4jGraphオブジェクトを使用して接続を作成します。ここでLangChainはデータベースにクエリコマンドを送信します。

import os
from langchain_community.graphs import Neo4jGraph

os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "password"

graph = Neo4jGraph()

3. サンプルデータの構築

Cypher言語を使用してプロジェクト管理のシナリオをシミュレートしましょう。これが、AIが後に推論ステップを実行するための基盤となります:

graph.query("""
MERGE (p1:Person {name: "Alice"})
MERGE (p2:Person {name: "Bob"})
MERGE (p3:Person {name: "Charlie"})
MERGE (s1:Skill {name: "Python"})
MERGE (s2:Skill {name: "React"})
MERGE (proj:Project {name: "AI Platform"})

MERGE (p1)-[:HAS_SKILL]->(s1)
MERGE (p2)-[:HAS_SKILL]->(s1)
MERGE (p3)-[:HAS_SKILL]->(s2)
MERGE (p1)-[:MANAGES]->(proj)
MERGE (p2)-[:WORKS_ON]->(proj)
MERGE (p3)-[:WORKS_ON]->(proj)
""")

4. GraphCypherQAChainの実装

LangChainの強力な機能はGraphCypherQAChainにあります。このコンポーネントは、ユーザーの日本語の質問を正確なCypherコマンドに自動的に翻訳します。

from langchain_openai import ChatOpenAI
from langchain.chains import GraphCypherQAChain

llm = ChatOpenAI(model="gpt-4o", temperature=0)

chain = GraphCypherQAChain.from_llm(
    llm=llm, 
    graph=graph, 
    verbose=True,
    allow_dangerous_requests=True 
)

# 質問を実行
response = chain.invoke({"query": "AI Platformプロジェクトを管理しているのは誰で、その人はどの言語が得意ですか?"})
print(response["result"])

実行時、システムは以下の4つのステップをバックグラウンドで自動的に実行します:

  1. LLMが「Alice」や「AI Platform」といった重要なエンティティを抽出します。
  2. MANAGESHAS_SKILLの関係を探すためのCypherコードを自動生成します。
  3. Neo4jに直接クエリを発行して生データを取得します。
  4. LLMが回答を自然な日本語にまとめます:「管理者はAliceで、彼女はPythonのスキルを持っています。」

なぜこの手法が効果的なのか?

透明性は最大の利点です。通常のRAGでは、top_kthresholdといったパラメータを直感的に微調整する必要があります。GraphRAGでは、論理は関係性の糸によって固定されています。グラフがAliceを管理者として確認すれば、AIがBobと間違えることは決してありません。

さらに、両方を組み合わせることも可能です。ベクトル検索で開始点を見つけ、ナレッジグラフを使用して検索を拡張します。このハイブリッド検索(Hybrid Search)方式は、現在の企業向けAIシステムの標準になりつつあります。

結論

LangChainのエコシステムに慣れていれば、GraphRAGの構築は決して難しくありません。ベクトル埋め込みのサイズを大きくして精度を上げようとするよりも、データをグラフ形式で再構築する方が、はるかに画期的な結果をもたらすことが多いです。

プロジェクトに関係性の論理における絶対的な正確さが必要な場合は、今すぐNeo4jの統合を試してみてください。あなたのプロダクトへの導入が成功することを願っています。

Share: