見出し画像

2024年7月にMicrosoftから一般公開されたGraphRAG(OSS)を爆速で検証してみた!!

こんにちは。アバナードの廣瀬です!
GraphRAGのオープンソース化に伴い、その使用感を紹介していきます!

GraphRagとは?既存RAGとの違い

既存のRAG(Retrieval-Augmented Generation)はドキュメントの検索と生成を組み合わせて情報を提供しますが、GraphRAGはこれに加えて、グラフ構造を用いてデータ間の関係を明確にする方法になります。
これにより、複雑なデータの文脈や関連性をより深く理解でき、生成される回答の正確性と関連性が向上するとされています。

まず初めに使用感や課題

使用感

  • Azure OpenAI Serviceから提供されているモデルに対応しているので組織環境から利用しやすい

  • データ処理フローが自動化されているのでCLIなどを利用して簡単に構築しやすく、またLLM(GPT)のパラメータやチャンクサイズなどの細かな設定が可能である

  • データ処理のためのプロンプト自体も開発者によって簡単に変更できるため、プロンプトチューニングが可能である

課題

文書をエンティティ、関係、主張からなる構造化された知識グラフに変換するだけでなく、コミュニティ構造や要約とグラフ埋め込みなどもLLM(GPT)側で行っています。
そのため、GraphRAG用のデータに変換するために以下の課題を感じました。

  • 初期コストが高い

  • データ作成に時間がかかる

  • データ処理の再現性が不確か

品質、コスト、速度を考えると、
GraphRAGを実際に導入・開発する場合は一部LLMを利用しない形
やローカルモデルが必要かなと思いました。

例えば、エンティティや関係をルールベースやBERTを用いて抽出するなどが挙げられます。

*今回、GPT-4oを利用して10件(1件あたり約3万文字)のデータを用いましたが、約1000円ほど利用料金がかかり、データ作成にも10分ほど時間がかかりました。

実際に使ってみる

0. 利用環境・事前条件

下記のローカル環境を利用して動作を確認しました。
・デバイス:Windows11
・Python環境:Python 3.11.8

また、事前条件として、
・Azure OpenAI Serviceが利用可能であること

1. セットアップ

GraphRAG用のモジュールインストールを行います。

pip install graphrag

2. 利用データの準備

今回、サンプルデータとしてEDINET APIから取得した10件程度の有価証券報告書を利用してみます。

まず、Powershellなどを利用してデータの入力用フォルダを作成します。

mkdir -p ./yuuka/input

3. GraphRAG用ワークスペースの設定

次にワークスペースを作成するためにPythonで以下のコマンドを実行します。

python -m graphrag.index --init --root ./yuuka

コマンド実行すると初期化され、以下のようにフォルダが作成されます。

inputファルダ:入力したいtxtやcsvファイルを設置
outputファルダ:データ処理後の結果がparquet形式として自動保存
promptsフォルダ:ワークスペース作成時に4つのプロンプトtxtが作成
.env: 環境変数の設定
setting.yaml:データ処理のワークフローを設定

inputフォルダ

以下のようにinputフォルダに有価証券報告書のCSVファイルを保存します。

データは以下のような形で会社名、事業の内容、事業等の課題を利用してみます。

promptsフォルダ

entity_extraction.txt、claim_extraction.txt、 summarize_descriptions.txt、community_report.txtの4つのプロンプトがあります。

文書からエンティティ、関係、クレームの抽出やコミュニティの概要とレポートを生成するために利用します。

デフォルトではプロンプトが英語なので日本語を利用する場合、プロンプトチューニングが必須になります。

setting.yaml

GPTのパラメータやチャンクサイズなどの細かな設定を行うことが可能です。今回は、以下をデフォルト設定からカスタマイズしています。
・llmの設定でAzure OpenAIサービスを利用
・inputの設定でcsvファイル、特定のカラムを利用

encoding_model: cl100k_base
skip_workflows: []
llm:
  api_key: ${Azure OpenAIサービスのAPIキー}
  type: azure_openai_chat
 model: gpt-4-turbo-preview
  api_base: ${Azure OpenAIサービスのエンドポイント}
  api_version: 2024-02-15-preview
  deployment_name: ${Azure OpenAIサービスのチャット用のモデル名}
  model_supports_json: true
parallelization:
  stagger: 0.3
async_mode: threaded
embeddings:
  async_mode: threaded
  llm:
    api_key: ${Azure OpenAIサービスのAPIキー}
    type: azure_openai_embedding
    api_base: ${Azure OpenAIサービスのada用のモデル名}
    api_version: 2024-02-15-preview
    deployment_name: text-embedding-ada-002
  
chunks:
  size: 300
  overlap: 100
  group_by_columns: [id]
    
input:
  type: file
  file_type: csv
  base_dir: "input"
  file_encoding: utf-8
  file_pattern: ".*\\.csv$"
  title_column: "会社名"
  text_column: "事業等のリスク"
  document_attribute_columns: ["事業の内容"]

cache:
  type: file
  base_dir: "cache"

storage:
  type: file
  base_dir: "output/${timestamp}/artifacts"

reporting:
  type: file
  base_dir: "output/${timestamp}/reports"

entity_extraction:
  ## llm: override the global llm settings for this task
  ## parallelization: override the global parallelization settings for this task
  ## async_mode: override the global async_mode settings for this task
  prompt: "prompts/entity_extraction.txt"
  entity_types: [organization,person,geo,event]
  max_gleanings: 0

summarize_descriptions:
  prompt: "prompts/summarize_descriptions.txt"
  max_length: 500

claim_extraction:
  prompt: "prompts/claim_extraction.txt"
  description: "Any claims or facts that could be relevant to information discovery."
  max_gleanings: 0

community_report:
  prompt: "prompts/community_report.txt"
  max_length: 2000
  max_input_length: 8000

cluster_graph:
  max_cluster_size: 10

embed_graph:
  enabled: false
umap:
  enabled: false

snapshots:
  graphml: false
  raw_entities: false
  top_level_nodes: false

local_search:

global_search:

上記の設定を行ったら、次にインデックス作成のためにPythonで以下のコマンドを実行します。

python -m graphrag.index --root ./yuuka

実行すると、以下のようにデータ処理が行われます。
*GPT-4o利用した場合でも、10件のデータで約10分ほど時間がかかりました。

実行後、新たにcacheフォルダが作成され、データ処理の過程で作成されたデータが保存されています。またoutputフォルダには、最終的な実行結果が保存されます。
artifactsフォルダには、最終的なGraphRAGを利用した検索に必要なparquetファイル群が作成されています。


4. GraphRAGでの検索

例えば、CLIでは以下のコマンドで実行できます。
今回はグローバルで検索してみます。
*GPT-4o利用した場合にも約10秒ほど時間がかかります。

python -m graphrag.query --root ./yuuka --method global "ゴルフ場はどんな課題を抱えていますか?"

検索結果の内容としては、有価証券報告書の内容に基づいてゴルフ場の課題を答えてくれている形でした。

今回はデータセット全体の推論を行うグローバル検索を使いましたが、
特定のエンティティ理解を必要とする質問に適しているローカル検索も行うことが可能です。

また、検索パラメータのチューニングなどで検索速度や検索精度も変わってきそうです。

5. 今後の展望

今後は、より大規模なデータセットでの検証や、特定の業界・分野に特化した質問への対応能力の評価調査を行っていきたいと思います。

例えば、有価証券報告書だと以下のような高度な分析が可能になるかの検証などを考えています。
・類似の事業構造を持つ企業を容易に特定できるのかどうか
・業界全体の共通課題や各企業固有の課題を明確に区別できるのかどうか
・異なる業界間で共通する事業課題を抽出することができるのかどうか

まとめ

今回、Microsoftから発表されたGraphRAGを使用してみました。
体感としては、初期導入にはコストと時間がかかるものの、
複雑な関係性を持つデータセットに対する深い洞察を得るためのツールとなるポテンシャルがあるなと感じました。
今後の発展と実用化に向けた取り組みを引き続き注視したいと思います。

また、Azure上にGraphRAGをデプロイするオープンソースのGraphRag Acceleratorも公開されているので、興味があれば試してみてください。

参考資料等

EDINET API

Azure OpenAI Serviceの使い方

クイック スタート - Azure OpenAI Service で GPT-35-Turbo と GPT-4 の使用を開始する - Azure OpenAI Service | Microsoft Learn

GraphRAGについてのMSプログ

GraphRAGについてのドキュメント

GraphRAGのリボジトリ

GraphRAG Acceleratorのリボジトリ


この記事が参加している募集

この記事が気に入ったらサポートをしてみませんか?