HEROZ Tech Blog

日本将棋連盟公認「将棋ウォーズ」や、AIを活用したシステム企画・開発を行う、AI企業HEROZの公式テックブログです。

GraphRAGを試してみた

はじめに

GraphRAGはLLMによってナレッジ(知識)グラフを生成することで、複雑な情報のドキュメントから質疑応答を行う際の精度を向上させることができる手法ならびにソフトウェアです。
GraphRAGはマイクロソフトが開発しましたが、先日オープンソース化が発表されましたので、早速試してみました。
GraphRAGはAzureで動作させる方法(GraphRAG Accelerator)もありますが、今回はローカル(手元のMac)で動作させました。

GraphRAGが使用しているナレッジグラフは、ドキュメント内の複雑な情報の検索に向いていると言われています。
HEROZ ASKのドキュメント検索でも使用しているエンべディング(embedding)を用いた検索は、文意に基づく曖昧検索には向いているのですが、複雑な情報の検索ではカバーしきれないがあって気になりました。

インストール

インストールは公式のGet Startedや解説してくださっている動画(英語)の通りに実施すると、わりと簡単にできました。
python:3のdockerイメージ上で実施して気になったのは以下です。

  • Rustのインストールは個別で実施する必要がある
  • ragtest/.env: GRAPHRAG_API_KEYにOpenAIのAPIキーを書く(名前が紛らわしい)
  • ragtest/settings.yaml: GRAPHRAG_LLM_MODEL=gpt-4-turbo-previewをgpt-4oに変更する

実行結果

とりあえずは桃太郎の文章を読み込ませて、Get Startedの質問(What are the top themes in this story?)を和訳した「この物語の主なテーマは何ですか?」を問い合わせてみました。

# python -m graphrag.query --root ./ragtest --method global "この物語の主なテーマは何ですか?"

  :

SUCCESS: Global Search Response: ### 物語の主なテーマ

物語「桃太郎」にはいくつかの重要なテーマが含まれています。それぞれのテーマは物語の異なる側面を強調し、全体として豊かな物語を形成しています。

#### 勇気とリーダーシップ

桃太郎の鬼ヶ島征伐の使命は、勇気とリーダーシップのテーマを中心に展開されています。桃太郎の卓越した強さ、戦略的な手腕、そして仲間を鼓舞し導く能力は、物語の中で重要な役割を果たしています [Data: Reports (2, 4, 5)]。

#### 団結とチームワーク

桃太郎と彼の忠実な家来である犬、猿、キジの協力は、団結とチームワークのテーマを強調しています。彼らの結束したスキルと献身は、鬼たちがもたらす困難を乗り越えるために不可欠です [Data: Reports (2, 4, 5)]。

#### 家族の絆と育成

桃太郎と彼を育てた老夫婦との関係は、家族の絆と育成のテーマを象徴しています。老夫婦の支援と愛情は、桃太郎が旅に出るための準備において重要な役割を果たしています [Data: Reports (1, 2)]。

#### 神の介入と運命

老夫婦が桃太郎を神の贈り物と信じることから、物語には神の介入と運命のテーマが含まれています。これにより、物語に霊的な次元が加わり、運命と神の祝福のテーマが強調されます [Data: Reports (1)]。

#### 文化的意義

「桃太郎」の物語は日本の民間伝承に深く根ざしており、強さ、リーダーシップ、団結の力といったテーマを祝うものです。また、きびだんごなどの文化的要素も含まれています [Data: Reports (2)]。

### 結論

「桃太郎」の物語は、勇気、リーダーシップ、団結、家族の絆、神の介入、そして文化的意義といった多くのテーマを通じて、豊かで多層的な物語を提供しています。これらのテーマは、物語のキャラクターや出来事を通じて巧みに織り交ぜられ、読者に深い印象を与えます。

やや冗長ではありますが、かなり的を得た回答になっています。
そして、日本語でも大丈夫そうでした。

気づいたこと

思考言語

インデックス作成時の画面出力を見る限りでは、nodeのdescriptionが英語になっていたりするので、英語で思考している可能性があります。
付属のプロンプトは指示も例示も全て英語なので、プロンプトを改良すると日本語にできるかもしれません。

🚀 create_final_nodes
    level      title      type                                        description  ... graph_embedding                 top_level_node_id  x y
0       0    "おじいさん"  "PERSON"  おじいさん (Grandfather) is an elderly character wh...  ...            None  b45241d70f0e43fca764df95b2b81f77  0  0
1       0    "おばあさん"  "PERSON"  おばあさん is an elderly woman who plays a signific...  ...            None  4119fd06010c494caa07f439b333f4c5  0  0
2       0        "川"     "GEO"  "川 (river) is a geographical feature where おばあ...  ...            None  d3835bf3dda84ead99deadbeac5d0d7d  0  0
3       0        "桃"   "EVENT"  "\u6843" (peach) is a significant element in t...  ...            None  077d2820ae1845bcbb1803379a3d1eae  0  0

既存システムへの組み込み

GraphRAGは以下のような点で、既存のシステムに組み込むのは現段階では難しそうです。

  • Azureでの実行を前提としている部分が多い
  • データの保存形式がメモリ、ファイル(.parquet)、Azure blobの3択であり、既存のデータベースに載せる場合には自分で改造する必要がある
  • 検索もlangchainが対応していないので、自力でchainを定義する必要がある

おわりに

今回は出たばかりのGraphRAGを試してみましたが、思ったりよりも苦労せずに動作して良かったです。
まだ単純な例文でしか試していないですが、もう少し込み入った文章も入力してみて、従来のエンべディングの場合と比較してみようと思います。

また、GraphRAGはプロンプトの指示文や、例示文を書き換えることで、ドメイン適用も可能そうですので、そちらも試してみたいと思います。