GraphRAG
GraphRAGは、ドキュメントからナレッジグラフを構築し、エンティティ、関係性、コミュニティの要約を検索して、多段階の推論が必要な質問や全体的な質問に回答します。
GraphRAG(グラフ検索拡張生成)は、検索拡張生成(RAG)の一種です。ベクトル検索で見つけたテキストチャンクの代わり、またはそれに加えて、ナレッジグラフから情報を検索します。まず大規模言語モデル(LLM)が、人物、企業、部品、場所などのエンティティと、それらの関係をドキュメントコレクションから抽出します。質問時には、システムが関連するエンティティ、関係の経路、またはグラフ全体のクラスターの要約を検索し、コンテキストとしてLLMに渡します。この名称は、2024年に発表され、オープンソース実装も公開された、Microsoft Researchのクエリに焦点を当てた要約のためのGraphRAG手法と特に強く結び付いています。また、グラフ上を検索するあらゆるRAGシステムにも使われます。
ベクトルRAGにグラフが必要な理由#
標準的なRAGでは、ドキュメントチャンクを埋め込みに変換してベクトルデータベースに保存し、質問に最も類似する少数のチャンクを検索します。この方法は、1つの文章で答えられる質問には適していますが、次の2種類の質問には対応しにくいという課題があります。
- マルチホップ質問:回答には、共通エンティティを介してのみ関連付けられる複数のドキュメントに分散した事実が必要です。たとえば、嵐で港が閉鎖された場合に、その港の近くのサプライヤーに依存する工場を特定する質問です。単一のチャンクが質問全体と類似することはありません。
- 全体に関する質問:「5,000件のインシデントレポート全体に共通する主なテーマは何ですか?」のようなコーパス全体に関する質問には、すべてのドキュメントの情報が必要です。一方、ベクトル検索で取得されるのは上位数件のチャンクだけです。
グラフでは事実間のリンクを明示的に保存するため、それらをたどって検索できます。また、グラフコミュニティの要約を使うことで、コーパス全体をカバーできます。
GraphRAGの仕組み#
MicrosoftのGraphRAGでは、4つのステップでインデックスを構築します。ドキュメントをテキスト単位に分割し、LLMに各単位からエンティティ、関係、主張を抽出させます。これはLLMを利用した固有表現認識と関係抽出の手法です。複数の単位に登場するエンティティの説明を統合し、それぞれに1つのノードを作成します。続いて階層的Leidenコミュニティ検出を実行し、密につながったエンティティを入れ子状のコミュニティに分類します。最後に、LLMに各階層の各コミュニティについて要約レポートを作成させます。
クエリには、次の2つの検索方法があります。
- ローカル検索:質問に含まれるエンティティを起点として、隣接ノード、関係、コミュニティレポート、およびそのエンティティに言及する元のテキスト単位を収集します。
- グローバル検索:コミュニティレポートを対象に、MapReduce方式で処理します。各レポートから関連度スコア付きの部分回答を生成し、関連度の高い部分回答を組み合わせて最終回答を作成します。
約100万トークン規模のデータセットでは、論文によると、グローバル検索はコーパス全体に関する質問に対し、従来型のRAGベースラインよりも大幅に包括的で多様な回答を生成しました。
ローカル検索の中核はグラフ走査です。このPythonの例では、NetworkXを使い、LLMが個別のドキュメントから抽出する可能性のあるトリプルを保存し、質問に含まれるエンティティから外向きに関係をたどります。
import networkx as nx
# Entity-relationship triples that an LLM extracted from separate documents
triples = [
("Typhoon", "closed", "Kaohsiung port"),
("Kaohsiung port", "ships parts for", "Supplier A"),
("Supplier A", "makes", "bearing B-17"),
("bearing B-17", "is used at", "Ohio plant"),
("Texas plant", "uses", "motor M-4"),
]
graph = nx.DiGraph()
for head, relation, tail in triples:
graph.add_edge(head, tail, relation=relation)
# Question: "Which plants could the typhoon disrupt?"
# Local search: follow relationships outward from the entity named in the question
edges = nx.bfs_edges(graph, "Typhoon")
context = [f"{head} {graph[head][tail]['relation']} {tail}" for head, tail in edges]
print("\n".join(context))「Typhoon closed Kaohsiung port」から「bearing B-17 is used at Ohio plant」までの4ホップの連鎖が出力されます。このつながりは単一のソースドキュメントには記載されておらず、無関係なTexas plantは含まれません。LLMはこれらの行を根拠付けのコンテキストとして受け取り、Ohio plantがリスクにさらされていると回答できます。
GraphRAGと関連手法の比較#
- 知識グラフ: エンティティと型付き関係のデータ構造です。GraphRAGは、LLM向けのコンテキストを取得するために、専用の知識グラフを構築または再利用します。
- ハイブリッド検索: テキストチャンクに対して、キーワード検索とベクトル検索を組み合わせます。本番環境のGraphRAGシステムの多くは、ハイブリッド検索と並行してグラフをたどります。
- エージェント型RAG: エージェントが、複数のステップにわたって、何をいつ取得するかを判断します。グラフクエリは、そのツールの1つになり得ます。
- グラフニューラルネットワーク (GNNs): 学習を通じてグラフ構造から学び、リンク予測などのタスクを行います。GraphRAGは学習を行わず、検索時にグラフを使用します。
実際のアプリケーション#
- 創薬: 遺伝子、タンパク質、化合物、疾患を結び付けるグラフを使うと、研究者は何千もの論文を横断する質問ができます。たとえば、疾患の経路にあるタンパク質を標的とする承認済み薬剤はどれか、といった質問です。
- 金融調査: アナリストは、ペーパーカンパニーや共通の取締役を介した所有関係をたどり、疑わしい取引の背後にあるネットワークをLLMに要約させます。
- サプライチェーンのリスク: サプライヤー、部品、拠点、輸送ルートを関連付けることで、どの製品が単一の工場に依存しているかなどの質問に答えられます。
- 企業ナレッジ: 大量のレポート、チケット、議事録をテーマ別に検索できるようにし、コミュニティ要約を使ってコレクション全体に関する質問に答えます。
グラフにはカメラが捉えた内容も保持でき、動画を対象とするマルチモーダルRAGの基盤になります。エンティティ解決、つまり2つの言及が同じものを指していると判断する処理は、動画における物体追跡に相当します。Ultralytics YOLO26の追跡機能は、フレームをまたいで各人物や車両に永続的なIDを割り当てます。そのため、動画グラフではフレームごとにノードを作るのではなく、追跡対象ごとに1つのノードを保持し、他の対象の隣にいつ、どこで現れたかをエッジとして保存できます。
コストとトレードオフ#
インデックス作成が主なコストです。LLMがすべてのテキスト単位を読み取ってエンティティを抽出し、さらにすべてのコミュニティレポートを作成するため、大規模なコーパスでは、ベクトル化よりインデックス作成のほうがはるかに高コストになります。同じ名前の別人を統合するなどの抽出エラーは、その人物に関係するすべての回答に波及します。また、ドキュメントを変更すると、影響を受けるグラフ部分の再抽出と再要約が必要です。MicrosoftのLazyGraphRAGは、名詞句抽出とグラフ統計を使って概念グラフを構築し、LLMの利用をクエリ時まで先送りすることでコストに対処します。そのため、インデックス作成コストはベクトルRAGと同等で、完全なGraphRAGの0.1%になります。










