モデル別実行レシピ

GraphRAGとは?文書間の関係とNeo4jの実例

GraphRAGは文書中の人・組織・出来事のつながりを回答に利用する検索方式です。

契約書にはA社とB社の取引が、別の通知にはB社を買収したC社が登場します。「A社の取引先を買収した会社は?」という質問には、両方の文書をつなぐ必要があります。GraphRAGは関係をグラフに保存し、必要なつながりと原文をLLM1に渡します。

実行条件と要点
  • グラフの点は会社などのエンティティ、線は契約・買収などの関係です。
  • 以下の小さな実習で関係検索を学び、文書抽出とLLM回答はその後につなぎます。
  • 関係を追加するときは根拠文書と日付も一緒に保存します。

段落検索から関係検索へ

ベクトル検索は質問に意味が近い段落を探すのが得意です。しかし契約書に買収の記載がなく、買収通知にA社が登場しないと、必要な2段落を一度に取得しにくい場合があります。グラフにA→契約→B、C→買収→Bを保存すると、Bを通じて両方の根拠をつなげられます。

Neo4j GraphRAG Pythonは検索器とLLMをつなぎます。ベクトル検索の後に関連エンティティを取得するVectorCypherRetrieverや、質問をCypherに変換するText2CypherRetrieverなどを選べます。まず小さな関係を手動で作ると、抽出すべき情報が分かりやすくなります。

書類の束・モニター・サーバーの間を矢印に沿って移動するページカード
質問にグラフ関係が必要か小さな文書群で先に試します。

ローカルで実習用Neo4jを起動する

Dockerが動いているMac・Windows・Linuxで始められます。以下はNeo4j Community 2026.09.0を取得し、両方のポートを自分のコンピューターにだけ公開します。実行前にreplace_this_passwordを自分で決めたパスワードに変更してください。実習データはgraphrag-demo-dataボリュームに保存されます。

実習用データベースを起動
docker run -d --name graphrag-demo \
  -p 127.0.0.1:7474:7474 -p 127.0.0.1:7687:7687 \
  -e NEO4J_AUTH=neo4j/replace_this_password \
  -v graphrag-demo-data:/data \
  neo4j:2026.09.0
実習専用の設定で、ポートは外部公開しません。

起動したらhttp://127.0.0.1:7474を開きます。

文書の一部が緑の帯で強調され、複数のカードに分割された図
テキスト抽出やchunkingの変更で関係抽出も変わる場合があります。

架空の3社をつなぎ答えを探す

ユーザー名neo4jと設定したパスワードでログインします。最初のクエリを入力欄で実行すると、Demo A・B・Cと契約・買収の関係が作られます。関係には架空の原文ファイル名、ページ、買収日も保存します。

架空の関係を保存
MERGE (a:DemoCompany {name: 'Demo A'})
MERGE (b:DemoCompany {name: 'Demo B'})
MERGE (c:DemoCompany {name: 'Demo C'})
MERGE (a)-[contract:CONTRACTED_WITH]->(b)
SET contract.source = 'demo-contract.pdf', contract.page = 1
MERGE (c)-[purchase:ACQUIRED]->(b)
SET purchase.date = '2026-10-01',
    purchase.source = 'demo-notice.pdf', purchase.page = 2
RETURN a, b, c;

2番目のクエリはAの取引先を探し、その取引先を買収した会社をたどります。期待する結果はDemo B、Demo C、2026-10-01と両方の原文ファイル名です。回答と根拠を一緒に返すことで、関係の誤りを原文で確認できます。

取引先と買収企業を取得
MATCH (:DemoCompany {name: 'Demo A'})-[contract:CONTRACTED_WITH]->(b)
MATCH (c:DemoCompany)-[purchase:ACQUIRED]->(b)
RETURN b.name AS supplier, c.name AS acquirer,
       purchase.date AS acquisition_date,
       contract.source AS contract_source,
       purchase.source AS notice_source;

PDFとOllamaをつなぐ際に加わる作業

実際のPDFでは、テキスト抽出とエンティティ・関係抽出を行ってからグラフに保存します。会社名の表記揺れを同じエンティティにまとめ、関係の向き・日付・出典を残します。まず2〜3文書だけで抽出関係を確認してください。買収関係の誤りが後の回答にも影響するためです。

Neo4j GraphRAGのOllamaLLMとOllamaEmbeddingsでローカルモデルを接続できます。チャットモデルが回答を作り、埋め込みモデルがベクトル検索を担当します。PythonをDocker内で実行する場合はOllamaの接続先を指定します。コンテナのlocalhostはホストではなく、そのコンテナを指します。

同じ文書と質問で比較し、単一の事実検索と文書間の関係質問を分けます。正しい根拠が取れるか、回答までの待ち時間を記録してください。関係質問に効果があればグラフを増やし、差が小さければベクトル検索を維持します。画面が開かない場合はdocker logs graphrag-demoで起動ログとポート競合を確認します。

文書から山・葉・岩のカードを経て植物カードへ進み、別のカードにはX印が付いた図
同じ文書と質問で根拠と回答までの時間を比べます。

用語の注釈

  1. 大規模言語モデル — 大量のテキストデータから言語パターンを学び、文脈に沿ったテキストを処理・生成するモデルです。

    本文に戻る

よくある質問

この記事で最初に確認すべきことは何ですか?
契約書にはA社とB社の取引が、別の通知にはB社を買収したC社が登場します。「A社の取引先を買収した会社は?」という質問には、両方の文書をつなぐ必要があります。GraphRAGは関係をグラフに保存し、必要なつながりと原文をLLMに渡します。