Microsoft GraphRAGとOllamaの構築:100%ローカルなナレッジグラフを自作する

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

従来のRAGでは満足できない理由とは?

RAG(Retrieval-Augmented Generation)を使ってチャットボットを構築した際、ドキュメント全体の概要について質問すると、うまく答えられなかった経験はありませんか?従来のRAGは、細かい詳細については非常にうまく答えてくれます。しかし、「この500ページの資料の主要な内容は何か?」といった質問を投げると、途端に困惑し始めます。

その原因は、ベクトル類似性検索(vector similarity search)という仕組みにあります。従来のRAGは質問に最も似ているテキストের断片を探し出しますが、全体像を把握する能力に欠けています。Microsoft GraphRAGは、そのギャップを埋めるために誕生しました。単に断片を保存するのではなく、データから巨大なナレッジグラフ(Knowledge Graph)を構築するのです。

従来のRAGとGraphRAGの比較

深みのある回答が求められるAIプロジェクトにおいて、なぜGraphRAGが新たな「武器」になりつつあるのか、その理由は以下の通りです:

  • 従来のRAG (Baseline RAG):
    • 仕組み:テキストを細かく分割(チャンキング)し、ベクトル検索を行う。
    • メリット:レスポンスが速く、導入が非常に容易.
    • デメリット:離れた場所にあるアイデア同士の繋がりを理解できない。
  • GraphRAG (Microsoft):
    • 仕組み:エンティティを抽出し、関係性を構築して、コミュニティ(Communities)を作成する。
    • メリット:データセット全体にわたる「なぜ」「どのように」といった質問に対して、優れた回答を生成する。
    • デメリット:インデックス作成(Indexing)に5〜10倍の時間がかかり、計算リソースを多く消費する.

Ollamaでローカル実行:メリットとデメリット

MicrosoftはGraphRAGをOpenAI優先で設計しています。しかし、企業の機密データを扱う場合、すべてをクラウドにアップロードするのは大きなリスクです。Ollamaと組み合わせることで、データを完全に手元で管理できる最適なソリューションとなります。

メリット:

  • セキュリティ: データがコンピュータの外に出ることはありません。
  • コスト削減: OpenAIのトークン費用が一切かかりません。GraphRAGはインデックス作成時に膨大なトークンを消費するため、これは非常に重要です。
  • 自由度: Llama 3からMistral、Phi-3などへ、モデルを瞬時に切り替えることができます。

デメリット:

  • ハードウェア: インデックス作成を現実的な時間で終わらせるには、最低でも12GBのVRAMを搭載したGPU(RTX 3060など)が必要です。
  • 設定: OllamaとGraphRAGを「連携」させるために、若干の微調整が必要です。

実践レポート

200ページを超える社内の技術資料でこの方法をテストしてみました。結果として、システムは第1章から最終章までの業務ロジックを首尾一貫して結びつけることができました。データが外部に漏れる心配がないため、上司も非常に満足しています。もし32GBのRAMとまともなグラフィックボードをお持ちなら、これは今最も投資価値のある方向性だと言えます。

詳細な導入手順

ステップ1: Ollamaの準備

ollama.comからOllamaをダウンロードします。その後、推論用とベクトル生成(Embedding)用の2つの重要なモデルをプルします。

# 言語処理用のメインモデル
ollama pull llama3

# ベクトル生成用の専用モデル
ollama pull nomic-embed-text

ステップ2: GraphRAG環境の構築

Python 3.10以上を使用してください。システムをクリーンに保つために、仮想環境の使用をお勧めします。

# 仮想環境の作成と有効化
python -m venv graphrag-env
source graphrag-env/bin/activate # Windowsの場合: graphrag-env\Scripts\activate

# メインライブラリのインストール
pip install graphrag

ステップ3: プロジェクトの初期化

作業ディレクトリを作成し、GraphRAGに設定ファイルの雛形を生成させます。

mkdir my-graphrag-project
cd my-graphrag-project
mkdir input

# 構成の初期化
python -m graphrag.index --init --root .

ステップ4: settings.yaml の設定

ここがGraphRAGをOllamaと連携させるための最も重要な部分です。settings.yamlを開き、以下のパラメータを更新します。

encoding_model: cl100k_base
llm:
  type: openai_chat
  api_base: http://localhost:11434/v1
  api_key: ollama # チェックをパスするためのダミーキーを入力
  model: llama3
  model_supports_json: true # 正確なエンティティ抽出に不可欠

embeddings:
  async_mode: threaded
  llm:
    type: openai_embedding
    api_base: http://localhost:11434/api # 埋め込み専用のエンドポイント
    api_key: ollama
    model: nomic-embed-text

ステップ5: インデックス作成(Indexing)の実行

input/フォルダに.txtファイルを投入します。その後、ナレッジグラフの構築を開始します。

python -m graphrag.index --root .

注意:50個のテキストファイルがある場合、GPUの性能によりますが、30分から1時間程度かかることがあります。ターミナルでワークフローが次々と実行されても、焦らずにお待ちください。

ステップ6: データへのQ&A

インデックス作成が完了すると、2つの優れたクエリモードが利用可能になります。

Global Search: ドキュメント全体を俯瞰するような質問に使用します。

python -m graphrag.query --root . --method global "ドキュメントの主要な3つの論点を要約して"

Local Search: 特定の人物や出来事を深く掘り下げる際に使用します。

python -m graphrag.query --root . --method local "AとBの関係は何ですか?"

パフォーマンス最適化のためのヒント

実際に運用してみたところ、Llama 3の8B版では、時としてエンティティの抽出が過剰になることがあります。もし強力なグラフィックボード(24GB以上のVRAM)をお持ちなら、ぜひ Llama 3 70B を試してみてください。結果はより正確で鋭いものになります。

もう一つのコツとして、医療や法律などの専門性の高いドキュメントを扱う場合は、設定ファイルの chunk_size を600程度まで下げてみてください。これにより、短い文章間の複雑な関係性をモデルが見落としにくくなります。

オフラインでの実行は、最初は設定に手間がかかるように感じるかもしれません. しかし、自分のノートPC上で強力なAIシステムを完全にコントロールできる感覚は、それだけの価値が十分にあります。構築の成功を祈っています!

Share: