🐨

Microsoftから提供されたGraphRAGを使ってみました

2024/07/28に公開

そもそもRAGとは

RAGとはユーザーからの質問に対して専門のナレッジデータから類似度の高い情報を検索・取得して、AIに回答を生成してもらう技術のこと。

RAGを使用することで、AIモデルのトレーニングセットに入っていない最新の情報や企業の機密情報、ネット上に公開されてない内容に対しても回答することができます
手法としてはキーワード検索やベクトル検索、二つを組み合わせたハイブリット検索などが使用されます。(「Baseline RAG」というらしい)

しかし膨大なドキュメントから回答を生成する必要がある時とか、ドキュメント通しの関連性が重要な情報を使った回答の時に精度がイマイチでないという課題がありました。

Graph RAGとは

RAG(Retrieval Augmented Generation)より精度・機能が拡張された検索拡張生成サービス

従来のベクトル検索を使ったアプローチではなく、構造化された階層型の検索アプローチをします。
データからナレッジグラフを作成して、より複雑な情報をもとに回答を生成したいときの精度を大幅に向上させることができます。

2024年2月に発表されたのですが、つい最近Microsoftよりツールが公開されましたので実際に触ってみようと思います。

https://microsoft.github.io/graphrag/

実践

今回はローカル環境で動かしてみます。
Azure環境ですぐ使える用のIaCが入ったリポジトリもありますので、デプロイして試してみたい場合は是非
https://github.com/Azure-Samples/graphrag-accelerator


1. プロジェクト作成

フォルダ作成

mkdir learn_graphrag


仮想環境作成

python -m venv .venv


仮想環境有効化

source .venv/bin/activate


2. ツール導入

graphragをインストール

pip install graphrag


3. サンプルデータ取り込み

フォルダ作成

mkdir -p ./ragtest/input


データ取り込み

curl https://www.gutenberg.org/cache/epub/24022/pg24022.txt > ./ragtest/input/book.txt


4. ワークスペースの設定

ワークスペースを初期化

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


ragtestフォルダ内に.envファイルが作成されたので、apiキーを入れる

GRAPHRAG_API_KEY=<your aoai key>
``

<br>

ragtestフォルダ内にsetting.yamlファイルが作成されたので使用するAIモデルの情報を入れる
```settings.yaml
llm:
  api_key: ${GRAPHRAG_API_KEY}
  type: azure_openai_chat
  api_base: <your aoai endpoint>
  api_version: 2024-02-15-preview
  deployment_name: <your chat model name>
  model: <your chat model>

embeddings:
  ## parallelization: override the global parallelization settings for embeddings
  async_mode: threaded # or asyncio
  llm:
    api_key: ${GRAPHRAG_API_KEY}
    type: azure_openai_embedding
    model: <your embedding model>
    api_base: <your aoai endpoint>
    api_version: 2024-02-15-preview
    deployment_name: <your embedding model name>


5. パイプライン実行

インデックスを作成します

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


以下のように成功されればOKです。


検証

検索の方法には「global」と「local」の2種類あるそうです。
まずは取り込んだデータ全体を俯瞰して回答を生成してくれる「global」を使ってみます。

globalで質問

「このお話の主なテーマは何か?」を聞いてみます。

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


globalでの回答

以下のように返ってきました。

物語のテーマ

この物語の中心的なテーマは、主人公Scroogeの変容です。彼の冷酷で貪欲な性格が、クリスマスの精神と他者への思いやりを通じて変わっていく過程が描かれています [Data: Reports (6, 0, 1, 4, 5, 6, 7, 8, 9, 10, +more)]。

寛大さと社会的責任

Scroogeの変容を通じて、寛大さと社会的責任の重要性が強調されています。彼の行動が他者に与える影響が描かれ、特に貧しい人々や社会的弱者への思いやりがテーマとなっています [Data: Reports (6, 1, 0, 2, 7)]。

クリスマスの精神

クリスマスの精神、すなわち喜び、寛大さ、そして他者への思いやりが、この物語の重要なテーマです。特に、クリスマスの幽霊たちがScroogeに見せる過去、現在、未来のビジョンを通じて、このテーマが強調されています [Data: Reports (6, 1, 0, 3)]。

貧困と社会の不平等

Scroogeの変容を通じて、貧困と社会の不平等に対する批判が描かれています。特に、Bob Cratchitとその家族、そして社会的機関との関わりがこのテーマを強調しています [Data: Reports (6, 0, 7)]。

過去の影響

Scroogeの過去の経験が彼の現在の性格にどのように影響を与えているかが描かれています。特に、Fezziwigのクリスマスイブの祝いが彼の若い頃の思い出として重要な役割を果たしています [Data: Reports (2)]。

これらのテーマを通じて、物語は読者に対して寛大さ、社会的責任、そして他者への思いやりの重要性を強く訴えかけています。


localで質問

次は登場人物にフォーカスした質問をしてみます。

python -m graphrag.query \
--root ./ragtest \
--method local \
"Scroogeとは誰ですか?そして彼の主な人間関係は何ですか?"


localでの回答

以下のように返ってきました。

Scroogeは、チャールズ・ディケンズの「クリスマス・キャロル」に登場する中心人物であり、物語の中で大きな変化を遂げるキャラクターです。彼は初め、冷酷で孤独な老人として描かれ、他人に対して冷淡で、貧しい人々に対する同情心も持ち合わせていません。彼は暗闇を好み、人間の温かさや交流を避ける傾向があります [Data: Entities (0)]。

物語の進行とともに、Scroogeは様々な霊との出会いを通じて自己反省を深め、最終的には寛大で人間味あふれる人物へと変貌します。特に、クリスマス・プレゼントの霊との出会いが彼の変化に大きな影響を与えます [Data: Entities (0); Relationships (14, 17, 18, 22)]。

主な人間関係

ジェイコブ・マーリー

ジェイコブ・マーリーは、Scroogeの亡くなったビジネスパートナーであり、彼の変革の旅の始まりを告げる重要な役割を果たします。マーリーの幽霊は、Scroogeに警告を与え、彼の行動を改めるよう促します。この出会いは、Scroogeに深い影響を与え、彼の心にマーリーの記憶と鎖の音が残ります [Data: Entities (55); Relationships (10, 24, 13)]。

クリスマスの霊たち

リスマス・パスト、クリスマス・プレゼント、そしてクリスマス・イエット・トゥ・カムの霊たちは、Scroogeの変革を導く重要な存在です。各霊は、Scroogeに彼の人生の異なる側面とその行動の結果を示します。特に、クリスマス・プレゼントの霊は、Scroogeに彼自身をより深く知るよう促し、彼の見方に大きな変化をもたらします [Data: Relationships (14, 17, 18, 22)]。

ボブ・クラチットとタイニー・ティム

ボブ・クラチットは、Scroogeの事務員であり、彼の息子タイニー・ティムは物語の中で貧しい人々の象徴として描かれます。Scroogeは、ボブ・クラチットに大きな七面鳥を送ることで、彼の成長する寛大さを示します。タイニー・ティムの弱々しい状態と楽観的な見方は、同情と社会的責任のテーマを強調します [Data: Entities (9); Relationships (1, 27, 28)]。

Scroogeの甥

Scroogeの甥は、陽気で温かい心を持つ人物であり、Scroogeにクリスマスの挨拶をしようとします。Scroogeは最初は冷淡な態度を示しますが、甥の粘り強さと親切心が最終的にScroogeの変革に寄与します [Data: Entities (1); Relationships (0)]。

貧しい人々と社会的機関

Scroogeの貧しい人々との関わりや、ユニオン・ワークハウスやトレッドミルといった社会的機関への言及は、彼の初期の同情心の欠如を強調します。これらの関わりは、貧しい人々の扱いに対する社会的コメントと、同情と寛大さの必要性を強調します [Data: Entities (17, 18, 19, 20); Relationships (5, 6, 7, 8)]。

Scroogeの物語は、彼が冷酷で孤独な老人から、寛大で人間味あふれる人物へと変わる過程を描いており、彼の人間関係がその変化に大きな影響を与えています。

最後に

今回はGPTを使った回答文が表示されただけなので、途中のglobalとlocalでそれぞれ検索かけたときにどのような値が取得できたのかがまだ見えてないので、そこが気になリマした。(オプションコマンドつけたりしたら見れるのかな?)
次回は自分で用意したデータで試してみようと思います~

ヘッドウォータース

Discussion