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フォルダ
以下のように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のリボジトリ