はじめに——「社内のRAG、もう作った。でも『関係性』が取れない」
社内ドキュメントをベクトル化し、ハイブリッド検索とクエリリライトでチューニングし、評価駆動で改善し、マルチモーダルにも対応した——ここまで来たRAGチームから、2026年に入ってよく聞くようになった悩みがあります。
「『田中部長が関わってるプロジェクトと、その下請けベンダーが過去に起こした品質問題を全部教えて』みたいな質問に、まったく答えられない」
これは、フラットなベクトルRAGの構造的な限界です。社内文書には「組織図」「契約関係」「技術依存関係」「上下関係」「時系列の変化」といった関係性の情報が大量に埋め込まれていますが、チャンク単位でベクトル化した瞬間、その関係性は消えてしまいます。
この「関係性の盲点」を埋める技術として、2024年にMicrosoft Researchが発表したのが GraphRAG です。2025年にはAmazon Bedrock Knowledge Bases × Neptune Analyticsの GraphRAG が GA し、Neo4j もMicrosoft Fabric や主要クラウドとの統合を進めました。2026年に入ってからは LazyGraphRAG など「フルGraphRAGの高コスト問題」を解決する派生手法も普及フェーズに入っています。
この記事では、エンタープライズRAGを次のレベルに引き上げたい開発者・アーキテクト向けに、以下を整理します。
- フラットなベクトルRAGの「4つの構造的限界」
- GraphRAGのアーキテクチャ(Community Summary / Global Search / Local Search)
- Microsoft GraphRAG・Neo4j・Amazon Neptune Analytics の比較と使い分け
- 社内文書からエンティティ・関係を自動抽出するLLMパイプライン
- Ollama+ローカルLLMでクラウドに出さない構成
- フラットRAG vs GraphRAG の判断チャート
- 前提知識——「ベクトルRAG」と「GraphRAG」は何が違うのか
- フラットなベクトルRAGの「4つの構造的限界」
- GraphRAG のアーキテクチャ——Microsoft GraphRAG の3つの中核概念
- 主要GraphRAG実装の比較——Microsoft・Neo4j・Amazon Neptune Analytics
- 実装ステップ1:Microsoft GraphRAG をローカルで動かす
- 実装ステップ2:Neo4j をベクトルDB兼グラフDBとして使う
- 実装ステップ3:Amazon Bedrock Knowledge Bases + Neptune Analytics
- 社内文書からエンティティ・関係を抽出するパイプライン設計
- Ollama + ローカルLLM で GraphRAG を構築する
- フラットRAG vs GraphRAG 使い分け判断チャート
- 運用上のハマりどころと対策
- よくある質問(Q&A)
- まとめ——「フラットRAGの先」を狙うべきタイミング
- 参考リンク
前提知識——「ベクトルRAG」と「GraphRAG」は何が違うのか
ベクトルRAG:似ているチャンクを引っ張ってくる仕組み
従来のRAGは、文書をチャンクに分割し、それぞれを埋め込みベクトルに変換してベクトルDBに格納します。質問が来ると、質問もベクトル化し、コサイン類似度の高いチャンクを上位N件取り出して、LLMに渡します。
シンプルで高速、ほとんどのFAQ的用途には十分です。しかし、「文書AとBに別々に書かれている情報を組み合わせないと答えられない質問」に対しては、原理的に弱いという問題があります。
GraphRAG:エンティティと関係を構造化してから検索する仕組み
GraphRAG は、LLMを使って文書からエンティティ(人・組織・製品・概念など)と関係(所属する・担当する・依存する・派生するなど)を抽出し、ナレッジグラフを構築します。
質問が来たときは、ベクトル類似度だけでなく、グラフ上のノードと関係をたどって関連情報を集め、それをLLMに渡します。「2ホップ・3ホップ先の情報」をきちんと取れるのが、フラットRAGとの最大の違いです。
フラットなベクトルRAGの「4つの構造的限界」
具体的に、フラットRAGはどんな質問に弱いのか。エンタープライズ現場でよく出るパターンを4つに整理します。
限界1:多段推論(マルチホップ推論)
「A社が買収したB社の元CEOが、現在どのプロジェクトを担当しているか」のような、複数の事実を連鎖させないと答えられない質問。
フラットRAGは「A社の買収」「B社の元CEO」「現在のプロジェクト」がそれぞれ別チャンクに散らばっていると、関連性のないTop-Nが返ってきて答えにたどり着けません。GraphRAGはノード間をたどることで、明示的にこの推論を支援できます。
限界2:エンティティ間の関係性
「田中部長と山田課長は、どのプロジェクトで一緒に仕事をしたことがあるか」「このシステムが障害を起こした場合、影響を受ける下流サービスは何か」など、関係そのものを問う質問。
ベクトル類似度は「単語の意味的近さ」しか測れないので、関係の有無や強さは取得できません。グラフのエッジ(関係)として明示的に表現するGraphRAGの得意領域です。
限界3:時系列・因果関係の変化
「2024年と2026年では、このプロジェクトの責任者はどう変わったか」「この障害の根本原因が、どの設計変更に遡れるか」など、時間の流れや原因→結果の連鎖を問う質問。
フラットRAGはチャンクのスナップショットしか持たないため、変化の前後関係を表現できません。GraphRAGでは時系列プロパティや因果関係エッジとして構造化することで対応できます。
限界4:階層構造を持つ文書
組織図、製品の構成図、契約の階層、技術スタックの依存関係——これらは本質的にツリーやDAG(有向非巡回グラフ)です。
これをチャンクに切ってフラットに並べると、「親子関係」「兄弟関係」「依存関係」がすべて失われます。階層情報そのものがクエリの答えになる場合、GraphRAGでないと話になりません。
GraphRAG のアーキテクチャ——Microsoft GraphRAG の3つの中核概念
GraphRAG の実装にはいくつか流派がありますが、最も整理されているのが Microsoft Research の GraphRAG です。ここでは3つの中核概念を押さえます。
1. Community Summary(コミュニティ要約)
文書から抽出したエンティティ・関係でグラフを構築した後、Leiden アルゴリズムなどのコミュニティ検出を使って、密につながったノードのクラスタ(コミュニティ)を見つけます。
そして、各コミュニティに対してLLMが「このコミュニティは何についての話か」を要約します。これにより、データセット全体を「テーマ別の地図」として持つことができます。
2. Global Search(グローバル検索)
「この社内文書集全体から、品質問題に関する主要なテーマは何か」のような、データセット全体を俯瞰するような質問に答えるためのモード。
コミュニティ要約をmap-reduce的に集約しながら回答を生成します。フラットRAGが最も弱い「全体傾向を聞く質問」に強いのが特徴です。
3. Local Search(ローカル検索)
「田中部長が関わっているプロジェクトを教えて」のような、特定のエンティティを起点にする質問のためのモード。
エンティティをグラフ上で見つけ、隣接ノードや関連チャンクをたどりながらコンテキストを集めます。ベクトル類似度とグラフ探索のハイブリッドで動きます。
派生:LazyGraphRAG と DRIFT Search
フルGraphRAG の弱点は事前インデックス構築の高コストです。大規模コーパスでは数万円〜数十万円規模のLLM API費用がかかるケースもあります。
これに対し Microsoft は2025年に LazyGraphRAG を発表しました。事前にコミュニティ要約を作らず、クエリ時に必要な部分だけを動的に処理する方式で、インデックス構築コストはベクトルRAG並みに抑えつつ、品質は維持するというアプローチです。
DRIFT Search は Local と Global のいいとこ取りを狙ったハイブリッドモードで、「最初は広く探索し、関連が見つかったら深く掘る」動作をします。
主要GraphRAG実装の比較——Microsoft・Neo4j・Amazon Neptune Analytics
2026年現在、エンタープライズで現実的に選択肢となる GraphRAG 実装は大きく3系統あります。
| 実装 | 位置づけ | 強み | 注意点 |
|---|---|---|---|
| Microsoft GraphRAG (Python OSS) | Microsoft Research 由来のリファレンス実装 | Community Summary・Global/Local Search の概念実装が完備。Azure OpenAI と相性◎ | インデックス構築コストが高い。本番運用は自前でハードニング必要 |
| Neo4j GraphRAG | グラフDB専業ベンダーのフルスタック | ベクトルDB機能を統合済み。Cypher で柔軟なクエリ。AWS・Azure・GCP 全部に対応 | ライセンス(コミュニティ版 vs エンタープライズ版)の検討が必要 |
| Amazon Bedrock Knowledge Bases + Neptune Analytics | AWS の GraphRAG マネージドサービス | 2025年3月にGA。Bedrock が裏でエンティティ抽出までやってくれる。AWSスタック完結 | AWS ロックインが前提。料金体系は Bedrock + Neptune + S3 の積み上げ |
使い分けの大まかな指針は以下の通りです。
- 研究・PoC・カスタム性重視 → Microsoft GraphRAG(Python OSS)
- 本番運用&グラフDB機能をフル活用したい → Neo4j GraphRAG
- AWS スタックで完結させたい・運用負荷を最小にしたい → Bedrock Knowledge Bases + Neptune Analytics
実装ステップ1:Microsoft GraphRAG をローカルで動かす
まずは概念を掴むため、Microsoft GraphRAG の Python パッケージを使って最小構成を動かす流れを紹介します。
インストールと初期化
# Python 3.11以上の仮想環境で
pip install graphrag
# プロジェクトディレクトリを初期化
mkdir ./my_graphrag_project
graphrag init --root ./my_graphrag_project
初期化すると、設定ファイル settings.yaml、プロンプトテンプレート、入力ディレクトリ input/ が生成されます。
Azure OpenAI または OpenAI API の設定
.env ファイルに API キーを設定します(Azure OpenAI を使う場合)。
GRAPHRAG_API_KEY=<your-azure-openai-key>
GRAPHRAG_API_BASE=https://<your-resource>.openai.azure.com
GRAPHRAG_API_VERSION=2024-02-15-preview
GRAPHRAG_LLM_MODEL=gpt-4o
GRAPHRAG_EMBEDDING_MODEL=text-embedding-3-large
インデックス構築
input/ ディレクトリに対象の社内文書(.txt や .md)を配置し、インデックスを構築します。
graphrag index --root ./my_graphrag_project
このコマンドが、エンティティ抽出 → 関係抽出 → グラフ構築 → コミュニティ検出 → コミュニティ要約まで一気通貫で実行します。コーパスが大きいと数十分〜数時間、API費用も馬鹿にならないので、最初は小さなサブセットで動作確認することを強く推奨します。
検索クエリの実行
# データセット全体に関する質問(Global Search)
graphrag query --root ./my_graphrag_project --method global \
--query "この文書群で議論されている主要なリスクテーマは何か"
# 特定のエンティティ起点の質問(Local Search)
graphrag query --root ./my_graphrag_project --method local \
--query "プロジェクトAlphaの責任者と関連する部署は"
実装ステップ2:Neo4j をベクトルDB兼グラフDBとして使う
Microsoft GraphRAG はインデックスをパーケットファイルや独自フォーマットに保存しますが、本番運用ではクエリ可能なグラフDBに乗せたくなります。ここで Neo4j が選ばれるケースが多いです。
Neo4j の強み:ベクトルインデックスとグラフを1つのDBで
Neo4j 5系以降はネイティブでベクトルインデックスをサポートしており、ノードに埋め込みベクトルを持たせて類似検索ができます。これにより以下が同じDBで完結します。
- チャンクのベクトル類似検索(従来のRAG的な部分)
- エンティティ・関係のグラフ探索(GraphRAGの中核)
- Cypher による複雑なクエリ(多段ホップ、条件絞り込み)
最小実装:Python から Neo4j に書き込む
from neo4j import GraphDatabase
driver = GraphDatabase.driver(
"neo4j://localhost:7687",
auth=("neo4j", "password")
)
def create_entity_with_embedding(tx, name, entity_type, embedding):
tx.run("""
MERGE (e:Entity {name: $name})
SET e.type = $entity_type,
e.embedding = $embedding
""", name=name, entity_type=entity_type, embedding=embedding)
def create_relationship(tx, src, dst, rel_type, description):
tx.run("""
MATCH (a:Entity {name: $src})
MATCH (b:Entity {name: $dst})
MERGE (a)-[r:RELATED {type: $rel_type}]->(b)
SET r.description = $description
""", src=src, dst=dst, rel_type=rel_type, description=description)
# LLMで抽出したエンティティ・関係をループで書き込む
with driver.session() as session:
for ent in extracted_entities:
session.execute_write(
create_entity_with_embedding,
ent["name"], ent["type"], ent["embedding"]
)
for rel in extracted_relations:
session.execute_write(
create_relationship,
rel["src"], rel["dst"], rel["type"], rel["description"]
)
ハイブリッド検索のクエリ例
「質問ベクトルに近いエンティティをまず見つけ、そこから2ホップ先までの関連情報を取得する」典型的なハイブリッド検索です。
// $query_embedding はクエリの埋め込みベクトル
CALL db.index.vector.queryNodes(
'entity_embedding_index',
5,
$query_embedding
) YIELD node AS seed, score
MATCH (seed)-[r*1..2]-(related)
RETURN seed.name, related.name, type(r), score
LIMIT 50
実装ステップ3:Amazon Bedrock Knowledge Bases + Neptune Analytics
「自前でエンティティ抽出パイプライン組むのはしんどい、運用負荷も下げたい」というチームには、AWS のマネージドサービスが現実的です。
セットアップの流れ
- S3 に対象ドキュメントをアップロード
- Neptune Analytics のグラフリソースを作成
- Bedrock Knowledge Bases で Knowledge Base を作成し、ベクトルストアとして Neptune Analytics を選択
- 初期同期を実行(Bedrock が裏でチャンキング・埋め込み生成・エンティティ抽出・グラフ構築を実施)
- Agent Runtime API またはコンソールから retrieve-and-generate を呼ぶ
長所と短所
- 長所:エンティティ抽出を Bedrock が自動でやってくれるので、初期コードがほぼゼロ。Neptune の運用も完全マネージド。
- 短所:内部パラメータの調整余地が少なく、「うちのドメイン用にエンティティスキーマをカスタムしたい」のような要件には不向き。Bedrock のモデル呼び出し料金 + Neptune メモリユニット + S3 で、PoC でもそれなりに費用が嵩む。
社内文書からエンティティ・関係を抽出するパイプライン設計
GraphRAG の品質は「エンティティ抽出と関係抽出の品質」でほぼ決まります。ここを雑にやるとグラフがノイズだらけになり、Local Search が全く意味を成さなくなるので、最も時間をかけるべき工程です。
ステップ1:エンティティスキーマの設計
抽出するエンティティの種類を、ドメインに合わせてあらかじめ決めます。汎用的な「人」「組織」だけでは粗すぎるので、業界特有の型を入れるのがポイントです。
- 製造業:製品、部品、サプライヤー、工場、品質問題、規格
- 金融:顧客、商品、取引、規制、リスクイベント、コンプライアンス文書
- 法務:契約、当事者、条項、判例、関連法令、係争案件
- IT/SI:システム、サービス、API、依存ライブラリ、インシデント、リリース
ステップ2:抽出プロンプトの設計
LLM に対して、「このチャンクから上記スキーマに該当するエンティティをすべて抽出し、JSON で出力せよ」と指示します。Few-shot で良質な例を3〜5個入れると精度が大幅に上がります。
関係抽出は同じチャンクの中で「主語エンティティ、関係の種類、目的語エンティティ、根拠となる文」をセットで出力させます。「根拠となる文」を必ず出させることで、後でグラフから元文書にトレーサビリティを持たせられるのが重要なポイントです。
ステップ3:エンティティ解決(Entity Resolution)
「田中」「田中部長」「田中太郎」「Tanaka」が同一人物として扱われないと、グラフが断片化します。以下のような手法を組み合わせます。
- 表記揺れの正規化ルール(敬称除去、フルネーム照合)
- 埋め込みベクトルの類似度で候補をクラスタリング
- 同一コンテキスト(同じ部署・同じプロジェクト)で出現するかで判定
- 最終判断を LLM にゆだねる「LLM-as-a-Judge」
ステップ4:人手レビューのワークフロー
初回構築時は、抽出されたエンティティ・関係のサンプルを必ず人が見て、明らかな誤抽出・誤統合をフィードバックします。本番投入後も、ユーザーのクエリログから「答えられていない質問」を抽出し、グラフの欠損を埋める運用フローを設計しておくと品質が安定します。
Ollama + ローカルLLM で GraphRAG を構築する
「機密文書を OpenAI や Anthropic の API に出せない」という要件がある日本企業は少なくありません。エンティティ抽出だけでも数千〜数万チャンクを LLM に投げるので、API 利用は実質ボトルネック兼セキュリティリスクになりがちです。
この場合、Ollama などのローカルLLM ランタイムで GraphRAG を完結させる構成が現実的になってきました。
推奨スタック例
- LLM:Ollama で動かす Llama 3.x 70B、Qwen 2.5 72B、または日本語強化版モデル(社内文書が日本語中心の場合)
- 埋め込みモデル:multilingual-e5-large、BGE-M3 などローカル動作可能なもの
- グラフDB:オンプレ Neo4j Community Edition、または社内に閉じた Neo4j Enterprise
- オーケストレーション:Microsoft GraphRAG(OpenAI API互換エンドポイントに Ollama を指せる)または LangChain/LlamaIndex のGraphRAG実装
留意点
- エンティティ抽出の精度は GPT-4o より落ちるのが普通。Few-shot例の充実とドメイン特化プロンプトでカバーする。
- GPU リソースの確保が前提。70Bクラスを快適に動かすには A100/H100クラスのGPU、または複数台構成が必要。
- クエリ時のレスポンス品質も検証必須。「Global Search でデータセット全体を俯瞰する質問」では、要約品質がモデル能力に直結するため、必ず比較評価する。
フラットRAG vs GraphRAG 使い分け判断チャート
「全部 GraphRAG にすべき」ではありません。GraphRAG はインデックス構築・運用ともコストが高いので、向き不向きを見極めることが重要です。
| 質問の特性 | フラットRAG | GraphRAG |
|---|---|---|
| 単一の事実を引く(「就業規則の有給日数は?」) | ◎ | △(オーバースペック) |
| 定型FAQ(「申請の手順は?」) | ◎ | △ |
| 多段推論が必要(「A→B→Cと連鎖して答える」) | × | ◎ |
| 関係性そのものを問う(「誰と誰が一緒にやった?」) | × | ◎ |
| 全体傾向の要約(「主要なテーマは何か」) | △ | ◎(Global Search) |
| 時系列の変化(「過去と現在でどう変わった?」) | × | ◎(時系列プロパティ) |
| 階層構造を持つ文書(組織図、契約階層) | × | ◎ |
| 小規模コーパス(<1万文書) | ◎ | ○(コストはかかる) |
| 大規模コーパス(>100万文書) | ○ | △(LazyGraphRAGなど工夫必要) |
現実的には「フラットRAG+GraphRAGのハイブリッド」が落とし所になることが多いです。質問の種類で自動的に振り分ける Router を前段に置き、単純な事実問い合わせはフラットRAGで高速応答、複雑な関係性クエリは GraphRAG にルーティングする構成です。
運用上のハマりどころと対策
ハマりどころ1:インデックス構築コストの暴走
フルGraphRAG は、文書1チャンクごとに「エンティティ抽出 + 関係抽出 + 要約」のLLM呼び出しが発生します。1万文書クラスでも数万円〜数十万円のAPI費用が普通にかかります。
対策:
- 必ず最初は 100〜500チャンク程度のサブセットでドライラン
- 抽出モデルに
gpt-4o-miniやclaude-haikuなどコスト効率の高いモデルを使う - LazyGraphRAG など事前要約を作らないアプローチも検討
- 差分インデックス(増分更新)の仕組みを最初から設計に入れる
ハマりどころ2:エンティティ過剰抽出によるグラフの肥大化
抽出プロンプトを甘くすると、「会議」「資料」のような汎用名詞までエンティティ化されてグラフがノイズだらけになります。
対策:
- エンティティタイプを厳格にホワイトリスト化
- 抽出後に頻出ノード上位を目視レビューし、ストップワード扱いするものを決める
- 1回しか出現しない孤立ノードは思い切って削除する閾値運用も検討
ハマりどころ3:評価指標が定まらない
フラットRAGなら Recall@K や MRR で評価できますが、GraphRAG は「多段推論ができたか」「グラフ探索が適切だったか」など評価軸が複雑です。
対策:
- GraphRAG-Bench などの公開ベンチマークを参考にする
- 「フラットRAGでは答えられなかったが GraphRAG では答えられた質問」の数と質を主要KPIにする
- LLM-as-a-Judge で網羅性(comprehensiveness)と多様性(diversity)を評価する
よくある質問(Q&A)
Q1. 既存のフラットRAGを GraphRAG に置き換えるべき?
原則「併用」を推奨します。フラットRAG は単純な事実問い合わせに対して高速・低コストで、捨てるのは惜しい。Router で質問を振り分けるハイブリッド構成が現実的です。
Q2. グラフDBの選定は Neo4j 一択?
ベクトル機能との統合度・ドキュメントの充実度では Neo4j が頭一つ抜けています。ただし AWS スタックで完結したい場合は Amazon Neptune Analytics、軽量で組み込みたい場合は Kuzu や LanceDB などのオプションもあります。
Q3. 小規模チームでも GraphRAG は現実的?
「人数」より「コーパス規模と質問の複雑さ」が判断軸です。数千〜数万文書で関係性クエリが本当に欲しいなら、3〜5人のチームでも十分構築可能です。逆に、単純なFAQ用途なら GraphRAG を入れる必要はありません。
Q4. グラフを構築したら、元の文書はもう不要?
不要にはなりません。エンティティ・関係には必ず根拠となる元文書のチャンクへのリンクを持たせるべきです。LLM が生成した回答に対して「この情報源は本当に正しいか」をトレース可能にする目的でも、出典管理は重要です。
Q5. グラフは時間とともにどう更新する?
差分更新の設計が最大の課題です。新規文書を追加するたびにグラフ全体を再構築するのはコスト的に非現実的なので、以下のような戦略を組み合わせます。
- 新規文書のみエンティティ抽出 → 既存エンティティとマージ(エンティティ解決を再実行)
- 影響を受けるコミュニティの要約のみ再生成
- 一定期間ごと(月次など)にフル再構築でドリフトをリセット
まとめ——「フラットRAGの先」を狙うべきタイミング
GraphRAG は万能薬ではありません。インデックス構築コスト、エンティティ抽出パイプラインの複雑さ、評価指標の難しさなど、フラットRAGに比べて参入障壁は明らかに高いです。
しかし、以下のシグナルが組織で出始めているなら、GraphRAG の検討時期です。
- 「うちのRAG、関連する複数の事実を組み合わせる質問が苦手」という声がエンドユーザーから上がっている
- 組織図・契約関係・技術依存関係のような本質的に関係性の集合であるデータを扱う必要がある
- 「全体傾向を要約せよ」のような俯瞰的な質問がエンタープライズの意思決定者から繰り返される
- RAGの評価をしていて「Top-K に正解チャンクが入ってるのに、LLM が点と点を結べていない」ケースが多発する
2026年は、Microsoft GraphRAG の安定化、Amazon Bedrock × Neptune Analytics のGA、Neo4j の各クラウド統合により、GraphRAG が「研究フェーズ」から「実装フェーズ」に明確に移行する年になりました。RAGをすでに運用しているチームにとっては、「次の一手」として腰を据えて検討する価値が十分にあるテーマです。
参考リンク
- Microsoft GraphRAG 公式ドキュメント
- Microsoft GraphRAG GitHub リポジトリ
- LazyGraphRAG: setting a new standard for quality and cost (Microsoft Research)
- Neo4j 公式サイト
- Amazon Neptune(Neptune Analytics)公式
- Amazon Bedrock Knowledge Bases 公式
免責事項:本記事は2026年5月時点の公開情報に基づく情報提供であり、特定の製品・サービスの導入を推奨するものではありません。各プロダクトの仕様・料金・GA状況は変更される可能性があるため、実装にあたっては各公式ドキュメントの最新版を必ず確認してください。

コメント