AI・機械学習
上級

Graph RAG コミュニティ検出(グラフラグコミュニティケンシュツ)

Graph RAGにおけるコミュニティ検出とは、構築されたナレッジグラフに対してLeidenアルゴリズムを適用し、密に接続されたノード群(コミュニティ)を自動的に同定するプロセスである。検出されたコミュニティに対して階層的なサマリが生成され、Global Searchの基盤となる。

0 回閲覧
0 いいね

コミュニティ検出の概要

Graph RAGにおけるコミュニティ検出は、ナレッジグラフのノード群を意味的に関連するクラスタ(コミュニティ)に分割するプロセスである。このステップがGraph RAGの最大の差別化要因であり、Global Search(コーパス全体を俯瞰する質問への回答)を可能にする技術的基盤となっている。

コミュニティ検出により、大規模なナレッジグラフが管理可能な単位に分割される。各コミュニティはLLMによるサマリ生成の単位となり、クエリ時にはこれらのサマリをMap-Reduceパターンで処理することで、コーパス全体の知識を効率的に参照できる。

Microsoft ResearchのGraph RAG論文では、Leidenアルゴリズムを採用してコミュニティ検出を行い、検出された各コミュニティに対して階層的なサマリを生成している。この階層構造により、異なる粒度レベルでの情報アクセスが可能になる。

Leidenアルゴリズムの詳細

アルゴリズムの背景

Leidenアルゴリズムは、2019年にV.A. Traag, L. Waltman, N.J. van Eckによって提案されたグラフクラスタリングアルゴリズムである。Louvainアルゴリズムの後継として設計され、Louvainが生成する可能性のある「不正に接続されたコミュニティ(badly connected communities)」の問題を解決している。

名前はオランダのライデン大学に由来し、ネットワーク科学分野で最も広く使用されるコミュニティ検出アルゴリズムの一つである。

アルゴリズムの動作原理

Leidenアルゴリズムは、以下の3フェーズを反復的に実行する。

フェーズ処理内容目的
ローカル移動各ノードを隣接コミュニティに試行移動し、モジュラリティ利得が最大のコミュニティに割り当てる初期コミュニティの形成
リファインメントコミュニティ内のノードをサブパーティションに分割し、接続性を改善するLouvainの欠陥回避
集約コミュニティをスーパーノードに圧縮し、新しい縮小グラフを生成する次の反復への入力

この3フェーズを収束(コミュニティ割り当てが変化しなくなる)まで繰り返すことで、最終的なコミュニティ分割が得られる。

モジュラリティの数学的定義

Leidenアルゴリズムが最適化するモジュラリティQは以下の式で定義される。

Q = (1/2m) × Σ[Aij - (ki × kj)/(2m)] × δ(ci, cj)

ここで、Aijは隣接行列の要素、ki はノードiの次数、mはグラフのエッジ総数、ci はノードiが属するコミュニティ、δはクロネッカーのデルタ関数(同じコミュニティなら1、異なれば0)である。モジュラリティ値は-0.5〜1.0の範囲を取り、値が高いほどコミュニティ構造が明確であることを示す。

解像度パラメータ

Leidenアルゴリズムには解像度パラメータ(resolution parameter, γ)があり、検出されるコミュニティの粒度を制御する。

解像度γコミュニティサイズコミュニティ数用途
0.1〜0.5大(粗粒度)少全体テーマの把握
1.0(デフォルト)中中標準的な分析
2.0〜5.0小(細粒度)多詳細トピック分析
10.0以上極小極多マイクロトピック

Graph RAGでは複数の解像度レベルでコミュニティ検出を実行し、階層的なコミュニティ構造を生成する。

Louvainアルゴリズムとの比較

LeidenがLouvainから改良した主要な点は以下のとおりである。

比較項目LouvainLeiden
接続性保証なし(不正接続コミュニティが発生しうる)あり(リファインメントフェーズで保証)
計算速度O(n log n)O(n log n)(同等、実測では高速)
解の安定性低(実行ごとに異なりやすい)高(リファインメントで安定化)
階層構造生成可能だが品質にばらつき高品質な階層構造を安定生成
実装成熟度多数のライブラリで利用可能igraph、leidenalg等で利用可能

階層的サマリ生成

サマリ生成プロセス

コミュニティ検出後、各コミュニティに対してLLMを用いたサマリが生成される。サマリ生成は以下のステップで行われる。

  1. コンテキスト収集: コミュニティに属するエンティティの説明文、エンティティ間の関係の説明文、関連するテキストチャンクを収集
  2. プロンプト構築: 収集したコンテキストを含むサマリ生成プロンプトを構築
  3. LLM呼び出し: LLMにコミュニティの包括的なサマリを生成させる
  4. 品質検証: サマリがコンテキストの内容を適切に反映しているか検証

サマリの構造

各コミュニティサマリには以下の情報が含まれる。

要素説明用途
タイトルコミュニティの主題を簡潔に表現検索時のプレビュー
概要コミュニティ全体の要約(200〜500語)Global Searchのコンテキスト
主要エンティティコミュニティ内の中心的なエンティティリストLocal Searchとの連携
主要関係重要な関係のリスト構造的理解の支援
インパクト評価コミュニティの重要度スコア検索結果のランキング

階層レベル間の関係

低レベルのコミュニティは高レベルのコミュニティに包含される入れ子構造を形成する。Global Searchでは、質問の粒度に応じて適切なレベルのサマリを選択する。全体傾向に関する質問には高レベルのサマリを、特定トピックの詳細には低レベルのサマリを参照する。

Graph RAGにおけるコミュニティの役割

コミュニティはGraph RAGにおいて以下の3つの重要な役割を果たす。

知識の圧縮

大規模ナレッジグラフ(数万〜数百万ノード)を、管理可能な数十〜数千のコミュニティサマリに圧縮する。これにより、LLMのコンテキストウィンドウの制約内で、コーパス全体の知識を参照可能にする。

トピック構造の可視化

コミュニティ階層は、コーパス内のトピック構造を自動的に可視化する。高レベルのコミュニティが主要テーマを、低レベルのコミュニティがサブトピックを表現し、コーパスのトピックランドスケープを俯瞰できる。

クエリルーティング

クエリの性質に応じて、参照すべきコミュニティを効率的に特定する。エンティティベースのルーティング(クエリに含まれるエンティティが属するコミュニティを優先)とセマンティックルーティング(サマリの類似度に基づくコミュニティ選択)の2つのアプローチがある。

パフォーマンス最適化

最適化手法効果実装難易度推奨シーン
解像度パラメータ調整コミュニティ粒度の最適化低全プロジェクト
並列サマリ生成処理時間の短縮中大規模コーパス
サマリキャッシング再計算コスト削減低反復実験
増分コミュニティ更新更新時の再計算削減高頻繁な更新
多段階解像度検索精度の向上中本番運用

よくある質問(FAQ)

Q1: Leidenアルゴリズム以外のコミュニティ検出手法は使えますか?

原理的には他のコミュニティ検出手法(Infomap、Label Propagation、Spectral Clustering等)も使用可能である。ただし、Leidenは階層的なコミュニティ構造の生成に優れており、解像度パラメータによる粒度制御が容易なため、Graph RAGとの相性が特に良い。Infomapは情報理論に基づく手法で、フロー構造の検出に優れるが、階層構造の制御がLeidenほど直感的ではない。

Q2: コミュニティサマリの品質をどう評価すればよいですか?

定量評価として、サマリに含まれるエンティティのカバー率(コミュニティ内エンティティのうちサマリに言及されている割合)と、ファクトチェック(サマリの記述が元テキストと矛盾しないか)が基本指標となる。定性評価として、ドメイン専門家による読解性・網羅性・正確性のスコアリングが有効である。自動評価にはLLM-as-a-Judgeパターン(別のLLMにサマリの品質を評価させる)を活用できる。

Q3: コミュニティ数が多すぎる・少なすぎる場合はどう調整しますか?

解像度パラメータγの調整が最も直接的な方法である。コミュニティ数が多すぎる場合はγを下げ(例: 1.0→0.5)、少なすぎる場合はγを上げる(例: 1.0→2.0)。目安として、グラフノード数の5〜10%程度のコミュニティ数が適切とされるが、ドメインによって最適値は異なる。実験的に複数の解像度で検出を実行し、サマリの品質と検索結果の質を比較して最適値を決定する。