弁護士ドットコム株式会社 Creators’ blog

弁護士ドットコムがエンジニア・デザイナーのサービス開発事例やデザイン活動を発信する公式ブログです。

GraphRAG を使ってみる

GraphRAGを使ってみる こんにちは。弁護士ドットコム株式会社リーガルブレイン開発室の井出です。 リーガルブレイン開発室では生成 AI などの技術を利用して企業法務や弁護士の課題解決のためのサービスを開発しております。 今回は弊社で研究を進めている GraphRAG がどういったものか、環境を構築し、実際にサンプルデータを処理するまでの手順をご紹介します。

GraphRAG を研究することになった背景

さて、弁護士ドットコム株式会社で生成 AI を使用したサービスがはじめて出てからおよそ 1 年半が経ちました。

【Professional Tech Lab】弁護士ドットコム、世界初の日本語版※、AI法律相談チャットサービス『弁護士ドットコム チャット法律相談(α版)』を5月12日より試験提供開始

その間に LLM は凄い勢いで性能を上げましたが、下記のような課題点は依然として残りました。

  • ハルシネーション(幻覚)と呼ばれる、それっぽい嘘を出力してしまう
  • 最新の情報を踏まえた回答ができない
  • 専門的な質問に回答できない

それらを解決する手法の 1 つとして Retrieval-augmented generation(RAG)が注目されました。 ご存じの方も多いと思うので説明は割愛いたしますが、これにより LLM 単独では回答できなかった問題の回答や、ハルシネーションを軽減することが可能になりました。

RAG を採用しているシステムの多くは検索手法としてベクトル検索を使用していると思います。 しかしこの検索手法には課題があり、ベクトル類似性のあるデータを集めることは出来ますが、個々のデータの関係性は考慮されておりません。 その結果、弊社では下記のような課題が出ました。

  • ある法令に関係する法令を正確に引いてこられない
  • 判例と法令の関係性を考慮した回答が難しい

これからの問題を解決する技術の 1 つとして GraphRAG というものがあります。 今回は GraphRAG がどういったものか、百聞は一見にしかずということで、実際に検証した Microsoft の GraphRAG を使ってみます。

グラフについて

説明すると非常に長くなるため、グラフのデータ構造および理論についての詳細は割愛いたしますが、簡単に説明します。

グラフ(英: Graph)とは、ノード(頂点)群とノード間の連結関係を表すエッジ(枝)群で構成される抽象データ型、and・orその実装である具象データ型である。

wikipedia より抜粋)

ノードAノードBエッジノードとエッジの説明図

ノードにはデータが、エッジにはノード間の関係性が記述されています。 よく説明に挙げらていますが、ソーシャルネットワークを例にすると下記のようになります。

AさんBさん友人ソーシャルネットワークを例としたグラフの説明図

またエッジに方向性を持たせることも可能です。

AさんBさん好き有向グラフの説明図

我々エンジニアにとって馴染みのあるグラフといえばフローチャートになりますので、そちらを想像したほうが理解しやすいかもしれません。

そして、これらグラフに関する数学の理論が グラフ理論 となります。

Microsoft GraphRAG

今回使用するのは Microsoft GraphRAG です。 詳細は下記リンクを参照してください。

Microsoft GraphRAG: microsoft.github.io

このフレームワークは Azure OpenAI を使用するため、実際に試す場合はサブスクリプションおよびリソースを作成してください。

また AWS や Neo4j を使用しているという方は、LangChain の Graphs や LlamaIndex の PropertyGraphIndex を利用すれば GraphRAG を試すことが可能です。

LangChain Graphs: python.langchain.com

LlamaIndex PropertyGrapshIndex: docs.llamaindex.ai

Microsoft GraphRAG 構築準備

検証した動作環境

Apple M2 Pro + Azure OpenAI

Python インストール

Python を使用するためインストールしてください。 参考までに動作確認できたバージョンは下記です。

% python --version
Python 3.12.5

gcc インストール

特定のモジュールを arm プロセッサ向けにビルドする必要があるため、 gcc をインストールします。 参考までに動作確認できたバージョンは下記です。

sh
% gcc --version
Apple clang version 15.0.0 (clang-1500.3.9.4)
Target: arm64-apple-darwin23.6.0
Thread model: posix

Rust インストール

特定のモジュールを arm プロセッサ向けにビルドする必要があるため、 Rust をインストールします。 古いバージョンだとビルドが失敗するため、新しいバージョンをインストールしてください。 参考までに動作確認できたバージョンは下記です。

sh
% rustc --version
rustc 1.76.0 (07dca489a 2024-02-04)

Azure OpenAI

Microsoft の GraphRAG は Azure OpenAI を利用します。 そのため、Azure OpenAI のリソースを作成し、利用可能な状態にしておいてください。

Azure OpenAI LLM モデル

GraphRAG で使用できるモデルは JSON モードに対応している必要があります。 対応しているモデルは下記です。

learn.microsoft.com

対応しているモデルを Azure OpenAI にデプロイしておいてください。

Microsoft GraphRAG セットアップ

基本設定

基本的には下記公式ドキュメントの手順になります。

microsoft.github.io

  1. GraphRAG 実行用のフォルダを作成してください
  2. フォルダに入り、Python の仮想環境(venv)を作成してください
  3. 仮想環境を Activate してください
  4. GraphRAG モジュールをインストールしてください
    • pip install graphrag
  5. サンプルデータの準備をしてください
    • mkdir -p ./ragtest/input
    • curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt
  6. ワークスペースを初期化してください
    • python -m graphrag.index --init --root ./ragtest

アプリケーション設定

ragtest ディレクトリには下記 2 つの設定ファイルが存在していると思います。

  • .env
  • settings.yaml

.env ファイル

.env ファイルはデフォルトでは項目が足りていないので項目を追加して、下記の状態にしてください。

.env
GRAPHRAG_API_KEY=
GRAPHRAG_LLM_DEPLOYMENT_NAME=
GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=

GRAPHRAG_API_KEY

Azure OpenAI の API キーを設定してください。

GRAPHRAG_LLM_DEPLOYMENT_NAME

Azure OpenAI でデプロイした LLM モデルのデプロイ名を設定してください。

GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME

Azure OpenAI でデプロイした埋め込みモデルのデプロイ名を設定してください。

設定例:

GRAPHRAG_API_KEY={ご使用のリソースの API キー}
GRAPHRAG_LLM_DEPLOYMENT_NAME=gpt-4
GRAPHRAG_EMBEDDING_DEPLOYMENT_NAME=text-embedding-ada-002

settings.yaml ファイル

GraphRAG のドキュメントをみて必要な項目を埋めてください。

microsoft.github.io

ドキュメントに書かれていませんが重要な項目は下記になります。

sleep_on_rate_limit_recommendation

デフォルトでは目一杯 API リクエストを投げるため、rate limit エラーになることがあります。 エラーが発生する場合はこの項目を true にして rate limit を有効化させ、下記関連項目を設定してください。

concurrent_requests

rate limit を有効化させたら、並列でリクエストを投げる量を制御します。 rate limit エラーが発生しない範囲で設定してください。

batch_size

rate limit を有効化させたら、一度のリクエストで送信するドキュメントサイズを制御します。 エラーが発生しない範囲で設定してください。

Microsoft GraphRAG 実行

下記公式ドキュメントの手順を実行します。

microsoft.github.io

事前処理

下記コマンドで事前処理を行います。

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

rate limit や実行環境の状態、データ量によって処理時間が長くなるので注意してください。

クエリエンジンの使用

下記コマンドでクエリを投入できます。

sh
python -m graphrag.query \
--root ./ragtest \
--method global \
"What are the top themes in this story?"

問題なければ応答が返ってくるので確認してください。

実行結果1 - サンプルデータ

チュートリアルで用意されているデータを試した結果は下記になります。 データはクリスマスキャロルに関するものです。

クリスマスキャロル: ja.wikipedia.org

チュートリアルとは違って日本語で質問していますが、きちんと回答が返ってきました。

応答

python -m graphrag.query \
--root ./ragtest \
--method global \
"この物語の重要なテーマはなんですか?日本語で答えてください。"

SUCCESS: Global Search Response: この物語には、いくつかの重要なテーマが含まれています。それぞれのテーマは、人間の経験と成長に深く関わっています。

### 人間の変容と救済

物語の中心的なテーマの一つは、人間の変容と救済です。スクルージのキャラクターを通じて、彼の性格と人生の変化が描かれ、最終的には救済を見出します。このテーマは、過去の霊たちの訪問を通じてスクルージが変化し、より良い人間になることを選択する過程を通しても強調されます [Data: Reports (18, 12, 20, 7)]。

### 家族の絆と愛情

家族の絆と愛情も、この物語の重要なテーマです。クラチット家は、経済的な困難にもかかわらず、愛と団結でクリスマスを祝うことで、このテーマを象徴しています。さらに、クラチット家族やスクルージの甥との関係が、スクルージの変化に影響を与えることで、家族との絆の重要性が強調されます [Data: Reports (20, 30, 31, 12)]。

### クリスマスの精神

クリスマスの精神とその影響力も、物語の中で重要なテーマです。クリスマスを通じて人々が結びつき、善意や慈悲の精神が強調されます。また、フェジウィグのクリスマスイブのパーティーは、コミュニティ内での喜びと慈善の精神を示すイベントとして描かれています [Data: Reports (12, 5, 27, 28)]。

### 社会的責任と慈善

社会的責任と慈善の重要性も、物語のテーマに含まれています。スクルージは自分の行動が他人に与える影響を理解し、より良い社会の一員となることを学びます。希望と社会的変化の可能性もテーマとして挙げられ、タイニー・ティムのキャラクターは、個人の幸福が集団の幸福にどのように影響を与えるかを象徴しており、社会全体の改善への希望を示しています [Data: Reports (18, 31, 30)]。

### 過去、現在、未来を通じた自己反省

最後に、過去、現在、未来を通じた自己反省の重要性が描かれています。スクルージは幽霊たちの導きにより、自分自身と向き合い、変化する機会を得ます。このテーマは、スクルージの人生のさまざまな段階を通じて、人間関係や選択が彼の現在にどのように影響を与えているかが探求されることで、さらに深められます [Data: Reports (14, 16, 6)]。

これらのテーマは、物語を通じて織り交ぜられ、読者に深い洞察と教訓を提供します。

グラフ

クリスマスキャロルのグラフ
クリスマスキャロルのグラフ

考察

右下のオレンジの大きな円は主人公のスクルージになります。 クリスマスキャロルはスクルージを中心とした物語ですので、上手くグラフが生成されて質問に答えられていることが分かります。 また回答を見るとスクルージと登場人物の関係性にも触れられており、グラフがうまく活用できているように見えます。

実行結果2 - 判例データ

下記の公開されている岡口基一裁判官懲戒申立て事件の判例を使って GraphRAG を実行してみました。

https://www.courts.go.jp/app/files/hanrei_jp/658/089658_hanrei.pdf

応答

plaintext
(graphrag) 00ide@00ide graphrag % python -m graphrag.query --root ./ragtest2 --method global "被申立人に対する決定はどのようなものですか。また、なぜそのような決定になったのですか。教えてください。"

SUCCESS: Global Search Response: ### 概要

最近、東京高等裁判所と最高裁判所の大法廷は、裁判官の行動に関して重要な決定を下しました。これらの決定は、裁判所の透明性、情報の保護、および裁判官の行動基準に関する複雑な問題を浮き彫りにしました。

### 東京高等裁判所の決定

東京高等裁判所は、Facebook上で不適切な投稿を行った裁判官に対して懲戒処分を行いました。この決定は、公衆の信頼を損なう可能性のある行動に対する裁判所の容認しない姿勢を強調し、オンライン上での専門職としての行動規範の重要性を示しています [Data: Reports (1)]。

### 最高裁判所の大法廷の役割

この問題は、さらに最高裁判所の大法廷によって審査され、裁判官に対するさらなる懲戒が行われました。これは、司法の整合性を維持し、裁判官が最高水準の行動規範に従うことを保証するためのシステムのチェックとバランスの重要な役割を示しています [Data: Reports (1)]。

### 透明性と情報保護のバランス

また、東京高等裁判所は性犯罪事件に関連する判決文書を公開したことで批判を受けました。この行動は、透明性と敏感な情報の保護という、裁判所が維持しなければならない微妙なバランスを強調し、司法への公衆の信頼と裁判所の評判に影響を与えました [Data: Reports (2)]。

### 裁判所の決定の影響

裁判所の公式ウェブサイト上での司法決定の公開に関する論争は、透明性、情報の普及、および個々の裁判官の行動が司法の開放性と説明責任の広範な認識にどのように影響を与えるかという複雑さを示しています [Data: Reports (1)]。

### 結論

東京高等裁判所の決定、特に懲戒処分に関するものは、最高裁判所の大法廷によって見直されることがあります。この監督メカニズムは、高等裁判所の行動が国家の法的基準と原則に沿っていることを保証し、司法内の説明責任と整合性を確保します [Data: Reports (2)]。

これらの決定は、裁判所が直面する透明性とプライバシーの保護、裁判官の行動規範、および公衆の信頼の維持という課題を浮き彫りにし、司法システムの健全性を保つための継続的な努力の重要性を示しています。

グラフ

判例のグラフ
判例のグラフ

考察

情報量が少ないため、グラフはクリスマスキャロルと比較して非常にシンプルな形になっています。 また判例文章のみからでは情報量が足りず、被申立人が岡口基一裁判官であることが分からないため当然ながら名前は出てきておりません。 これらの結果から、判例のみでは情報量が少なすぎるため、実際に使う際には周辺情報を補強してあげる必要があると考えられます。

まとめ 

LLM を使用してグラフを構築し、グラフを検索して回答を生成するという体験は面白いと思いましたがいかがでしたでしょうか。 データの関係性に注目して検索する、というのは特定のドメインで非常に強力に働くと考えられます。 ベクトル類似性を使った RAG だとなんか上手くいかない……という場合などに検討してみると良いかもしれません。

リーガルブレイン開発室では判例や法令、法令間の関係性に着目してグラフに関する研究を進めています。 メンバー募集中ですので、面白そうだと思われた方の応募をお待ちしております。

hrmos.co