ベクトル検索を超えて:Microsoft GraphRAGとPythonでナレッジグラフを構築する

AI tutorial - IT technology blog
AI tutorial - IT technology blog

従来のRAGが複雑なデータで壁に突き当たる理由

多くの開発者は、PineconeやMilvusのようなベクトルデータベースを使用した標準的な検索拡張生成(RAG)から始めます。これは、42ページ目にある特定のサーバー設定を見つけるような、「干し草の山から針を探す」ようなクエリには非常に優れています。

しかし、システム全体を俯瞰した要約を求めたとき、これらのシステムが崩壊するのを私は見てきました。標準的なRAGに対して「これら500件のインシデントレポートにおける、上位3つの大きなアーキテクチャ上のリスクは何ですか?」と尋ねても、たいてい上手くいきません。いくつかの関連する断片を抽出はしますが、別々のファイルにまたがる点と点をつなぎ合わせることができないのです。

問題は、標準的なRAGがデータを「独立した、孤立したチャンク(塊)の集合」として扱う点にあります。1月のログに記載されたメモリリークが、6月に報告されたシステムクラッシュの根本原因であるという関係性を知る術がありません。このリレーションシップ(関係性)への認識不足が、断片的で浅い回答につながります。Microsoft GraphRAGは、非構造化テキストを構造化されたナレッジグラフにマッピングすることで、これを解決します。これにより、LLMはエンティティとその接続を大規模なスケールで推論できるようになります。

GraphRAGの3つの柱

GraphRAGは、単に名前がかっこいいだけのベクトル検索ではありません。マルチステージのインデックス作成パイプラインを使用して、生のテキストを多層的なインテリジェンスマップに変換します。その仕組みは以下の通りです:

  • エンティティ抽出: システムは人物、組織、特定の技術コンポーネントを特定します。単にキーワードを見つけるだけでなく、「サービスA」を重要なノードとして認識します。
  • リレーションシップマッピング: 相互作用を検出します。「Auth-Service(認証サービス)」が存在することを知るだけでなく、「Auth-ServiceがGateway-API의トークンを検証する」という関係をマップ化します。
  • コミュニティ検出(Leidenアルゴリズム): これがエンジン真の力です。GraphRAGはLeidenアルゴリズムを使用して、関連するエンティティを階層的な「コミュニティ」にグループ化します。そして、これらのクラスターに対して要約を生成します。広範な質問を投げかけると、システムは個々のテキストチャンクを力技で調べるのではなく、事前に生成されたこれらの要約に対してクエリを実行します。

50件のドキュメントセットで行ったテストでは、このアプローチにより、LLMが一度に多くの切り離されたデータを統合しようとしたときに発生しがちな「ハルシネーション(もっともらしい嘘)」が解消されました。回答は非常に根拠があり、構造的なものでした。

実践:最初のGraphRAGパイプラインの構築

一旦、標準的なLangChainのパターンは忘れてください。Microsoftは専用のCLIツールを通じて重労働を処理してくれます。このウォークスルーではバックエンドにGPT-4oを使用しましたが、GPUの余裕があればローカルのOllamaインスタンスを指すことも可能です。

1. 環境構築

新しい仮想環境から始めます。現在のgraphragライブラリとの互換性を考慮し、Python 3.10または3.11を推奨します。

python -m venv venv
source venv/bin/activate
pit install graphrag

2. プロジェクトの初期化

ワークスペースを初期化します。この雛形(スキャフォールド)により、グラフの状態を管理するために必要なフォルダとYAMLファイルが作成されます。

mkdir microservices-analysis
cd microservices-analysis
python -m graphrag.index --init --root .

3. 設定とAPIキー

ルートディレクトリに.envファイルがあります。そこにAPIキーを入力してください。LiteLLMを使用してローカルモデルにブリッジする場合は、ここでカスタムベースURLを定義します。

GRAPHRAG_API_KEY=ここにAPIキーを入力

settings.yamlでは、インデックス作成フェーズにgpt-4oを使用することをお勧めします。インデックス作成は認知負荷が高く、安価なモデルでは微妙なエンティティ間の関係を見逃すことが多いためです。実際のクエリ実行時には、コストを抑えるためにgpt-4o-miniに切り替えることができます。

4. データの読み込み

テキストファイルを./inputディレクトリに配置します。今回の実行では、最近のマイクロサービス移行に関する45件の社内技術レポートを使用しました。手動のタグ付けなしで、12の異なるサービス間の依存関係をマッピングできるかを確認したかったのです。

5. インデクサーの実行

ここがリソースを消費する部分です。インデクサーがグラフを構築し、Leidenアルゴリズムを実行します。以下を実行してください:

python -m graphrag.index --root .

ターミナルに注目してください。extract_graph_entitiescreate_final_communitiesが進んでいくのがわかります。私の45件のドキュメントテストでは、プロセスに約7分かかり、トークン使用料は約0.45ドルでした。

6. ナレッジグラフへのクエリ実行

GraphRAGは、目的に応じて2つの異なる検索モードを提供します。

グローバル検索(Global Search): 「全体像」の統合に使用します。コミュニティの要約を活用して、広範な質問に答えます。

python -m graphrag.query --root . --method global "デプロイパイプラインで繰り返し発生しているボトルネックは何ですか?"

ローカル検索(Local Search): 特定の詳細に使用します。特定のノードとその隣接するノードに焦点を当てます。

python -m graphrag.query --root . --method local "Payment Serviceに実装されているリトライロジックを説明してください。"

結論:そのオーバーヘッドに見合う価値はあるか?

同じ「ボトルネック」のクエリを標準的なベクトルRAGで実行したところ、ランダムなJiraチケットの箇条書きリストが返されるだけでした。対照的にGraphRAGは、ボトルネックの真の原因がAuth-ServiceとUser-DB間の循環参照にあることを説明しました。単にテキストを見つけただけでなく、データに隠された「理由」を見つけ出したのです。その出力は、すべてのページを実際に読んだリードアーキテクトが書いたかのような質でした。

スケーラビリティとメンテナンス

インデックス作成は静的なスナップショットであることに注意してください。データが1時間ごとに変わる場合、再インデックスのコストが負担になる可能性があります。しかし、ドキュメントライブラリ、法務アーカイブ、あるいはプロジェクトのポストモーテム(事後分析)などでは、洞察の深さが計算時間を正当化します。本番環境では、これらのインデックス作成ジョブをオンデマンドで実行するのではなく、毎晩のCI/CDパイプラインの一部としてスケジュールするのが一般的です。

最後に

もしあなたのAIアプリケーションが「全体像」を捉えた論理構築に苦労しているなら、GraphRAGへの移行が次の論理的なステップです。ナレッジグラフの構造的な整合性とLLMの言語的な柔軟性を融合させることで、単純なドキュメント検索の先へ進むことができます。Microsoftのフレームワークは、グラフ理論の博士号を持たないあらゆるPython開発者に門戸を開いています。データが相互に関連しているなら、データそのものとして扱うべきなのです。

Share: