最新動向

Microsoft「GraphRAG」とLangchainの知識グラフを活用したRAGを比較

Microsoft ResearchによってGraphRAGのライブラリが公開されました。GraphRAGは知識グラフを利用した検索拡張生成Retrieval Augmented Generation; RAG手法です。

知識グラフを利用することでRAGの検索部分を改善し、従来のベクトルベースの手法に比べてより関連性の高いコンテンツを取得できるとされます。

今回は公開されたMicrosoftのGraphRAGと以前から公開されていたLangchainによる知識グラフを活用したRAG手法を比較し、どのような違いがあるかを検証していきます。

目次

参考:Welcom to GraphRAG[1]

Microsoft GraphRAG の特徴

GraphRAGはLLMを用いてドキュメントから知識グラフを構築し、クエリに着目した要約(Query-Focused Summarization; QFS)を行うRAG手法です。この手法は質問応答を行うために、以下の手順をとります。

  1. ドキュメントから知識グラフを生成
  2. 知識グラフのコミュニティ要約を事前に生成し、これをもとに応答する

これにより、GraphRAGは質問に対してコミュニティ要約を用いてコミュニティごとの回答を生成し、これらを統合することで複数の知識を横断した総合的な応答が可能となります。

検索方法

GraphRAGには「Local Search」と「Global Search」の二つの検索方法があります。 Local Search は、知識グラフと原文を組み合わせて回答を生成する手法であり、文書に記載されている特定のエンティティ(知識ネットワーク内の情報を表す構成要素)の理解を必要とする質問に適するとされています。また、Global Searchは コミュニティ要約を検索することで回答を生成する手法であり、データセット全体を理解する必要がある質問に対して適切な回答が得られるとされています。

Microsoft GraphRAG の性能

Microsoft Researchチームによって、GraphRAG(C0〜C3)の性能について従来のRAG手法(SS)やテキスト要約手法(TS)との比較が行われています。C0~C3の4つのGraphRAG手法はそれぞれクエリ生成に用いるコミュニティ要約が異なり、続く数字が大きくなるにつれてコミュニティ要約のコンテキストウィンドウサイズが大きくなります。評価は包括性(Comprehensiveness:質問の暗黙の文脈の枠組みの中での完全性)、多様性(Diversity:提起された質問に対する異なる視点や角度の提供)、エンパワーメント(Empowerment:裏付けとなるソース資料やその他の文脈情報の提供)、直接性(Directness)を指標としており、各観点において片方の手法の回答よりも優れているとSelfCheckGPT[2]よって判断された回数が表に示されています。結果として、包括性及び多様性においてGraphRAG手法が従来手法に比べて優れたパフォーマンスが得られることが示唆されています。


詳細はMicrosoft Researchのレポート[3]ご確認ください。

Microsoft GraphRAG の実装方法

GraphRAGの主な手順は以下のようになります。これらの一連の流れはMicrosoftのGraphRAGリポジトリに実装されているため、いくつかの設定を行うだけで簡単にGraphRAGを利用することができます。

  1. テキストの抽出及びチャンク分割
  2. LLMを利用し、エレメントインスタンスを抽出及び要約
  3. 知識グラフのコミュニティを生成及び要約
  4. 知識グラフのコミュニティ要約を用いた質問応答

詳細な処理方法はMicrosoftResearchのレポート[4]ご確認ください。

それでは、実際にGraphRAGを実装してみましょう。

実装

MicrosoftのGraphRAGリポジトリにあるGet started[5]したがって実装していきましょう。

pip install graphrag  

まずは、初期設定を行う必要があります。以下のコマンドを実行することで、RAGの対象となるファイルを格納するinputディレクトリの作成と各種設定ファイルの生成が行われます。 

mkdir -p ./ragtest/input 
python -m graphrag.index --init --root ./ragtest 

さらに作成したinputディレクトリ内に対象のtxtファイルを配置します。また、上記の手順によって.env及びsettings.yamlが作成されるため、こちらの設定を変更します。今回は.envに GRAPHRAG_API_KEY=$YOUR_API_KEY(OpenAIのAPIキー)、 settings.yamlにgraphml=true`を設定します。graphml=trueを設定することで生成された知識グラフを.graphml形式で取得することができます。

以上の設定を終えた後、以下のコマンドで知識グラフを行います。 

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

生成された知識グラフは ./ragtest/output内に保存されます。今回は.graphml形式を指定しているため、.graphmlに対応した可視化ツールを用いることで内容を確認できます。

(.parquetの可視化方法については graph-visualization.ipynb[6]紹介されています)

最後に作成した知識グラフに基づいた質問応答を行います。methodにglobalもしくはlocalを設定することで、質問応答の方法を選択できます。 

python -m graphrag.query \ 

--root ./ragtest \ 

--method global \ 

"What are the top themes in this story?" 

以上で、GraphRAGを実装することができます。

Microsoft GraphRAG で質問してみる

それでは、実際にGraphRAGに対して質問をしてみましょう。今回は「走れメロス」を題材にLocalSearchとGlobalSearchの二つの手法で質問をします。また、Langchain+Neo4jでの知識グラフ活用手法との比較も行います(実装方法の詳細は以前の記事に掲載)。

各手法は回答の元となる知識グラフから抽出されたコンテキストがあり、LocalSearchは「Entity」「Relationship」「Source」、GlobalSearchは「Report」、Langchain+Neo4jはCypherクエリをもっています。今回は応答結果に加えてこれらの一部を記載しています。

質問1:メロスとセリヌンティウスの関係を教えて

Local Search

### メロスとセリヌンティウスの関係

メロスとセリヌンティウスの関係は、深い友情と信頼に基づいています。彼らは幼少期からの友人であり、メロスがシラクスの市を訪れた際に再会します。セリヌンティウスは石工として働いており、メロスは彼を訪ねることを楽しみにしていました [Data: Entities (5, 0, 6)]。

#### 深い友情と信頼

メロスとセリヌンティウスの友情は、物語の中で何度も試されます。メロスはセリヌンティウスを人質として王に差し出し、自分が戻ってくるまでの間、彼の命を保証します。この行動は、メロスがセリヌンティウスをどれほど信頼しているかを示しています [Data: Sources (11)]。また、セリヌンティウスもメロスを信じ、彼が戻ってくることを疑いませんでした [Data: Sources (39, 40)]。

#### 危機の中での絆

物語のクライマックスでは、セリヌンティウスが処刑される直前にメロスが駆けつけ、彼を救います。このシーンは、二人の友情の強さとメロスの決意を象徴しています。メロスはセリヌンティウスを救うために全力で走り、最終的に間に合います [Data: Sources (51, 52, 53)]。この行動は、メロスがセリヌンティウスをどれほど大切に思っているかを示しています。

#### 感情の交流

メロスとセリヌンティウスの間には、深い感情の交流も見られます。メロスがセリヌンティウスに自分を殴るように頼むシーンでは、二人の間の信頼と理解が強調されています。セリヌンティウスはメロスを殴り、その後二人は抱き合い、涙を流します [Data: Sources (54)]。このシーンは、二人の友情が単なる表面的なものではなく、深い絆で結ばれていることを示しています。

### 結論

メロスとセリヌンティウスの関係は、深い友情と信頼、そして互いに対する強い思いやりに基づいています。彼らの絆は、物語の中で何度も試され、そのたびに強化されます。メロスの決意とセリヌンティウスの信頼は、二人の関係を象徴する重要な要素です。

Entities (質問に関連するエンティティ)

Relationships (質問に関連するエンティティ同士の関係)

Sources (質問に関連する原文)

※文字化けテキストがありますが、これはチャンク分割によるものと考えられます

Global Search

### メロスとセリヌンティウスの関係

メロスとセリヌンティウスの関係は、深い友情と忠誠心に基づいています。メロスはセリヌンティウスを救うために王城に向かい、彼の処刑を阻止するために全力を尽くします。この行動は、二人の間の強い絆と相互理解を示しています [Data: Reports (6, 0)]。

### 信頼と忠誠心

セリヌンティウスはメロスに対して揺るぎない信頼と忠誠心を持っています。彼はメロスが自分を救うために戻ってくることを信じており、その信頼は物語の中心的なテーマとなっています [Data: Reports (0)]。メロスもまた、セリヌンティウスを救うために自らを人質として差し出し、セリヌンティウスに対して贖罪として自分を打つように頼むなど、彼らの関係は深い相互理解と犠牲の精神に基づいています [Data: Reports (0)]。

### 物語のテーマと影響

メロスとセリヌンティウスの関係は、物語の中で重要な役割を果たし、友情、信頼、忠誠心といったテーマを強調しています。彼らの関係は、物語の進行とキャラクターの動機に大きな影響を与えています [Data: Reports (6, 0)]。 このように、メロスとセリヌンティウスの関係は、物語全体のテーマとメッセージを深く支えるものであり、読者に強い印象を与える要素となっています。

Reports (質問に関連するコミュニティ要約)

Langchain+Neo4j

Query: cypher MATCH (a:Person {id: 'メロス'})-[r]-(b:Person {id: 'セリヌンティウス'}) RETURN type(r), r

Context: [{'type(r)': '友人', 'r': ({}, '友人', {})}, {'type(r)': '人質', 'r': ({}, '人質', {})}, {'type(r)': '友', 'r': ({}, '友', {})}, {'type(r)': '友', 'r': ({}, '友', {})}, {'type(r)': 'FRIEND', 'r': ({}, 'FRIEND', {})}, {'type(r)': 'TRUSTS', 'r': ({}, 'TRUSTS', {})}, {'type(r)': 'TRUSTS', 'r': ({}, 'TRUSTS', {})}, {'type(r)': 'CLIMBED_TO', 'r': ({}, 'CLIMBED_TO', {})}]

回答:メロスとセリヌンティウスは友人であり、互いに信頼し合っています。

どちらの手法においても「メロスとセリヌンティウスが友人関係である」のような二人の関係性について説明できており、Langchain+Neo4jの方法に比べて詳細に述べられていることがわかります。Langchain+Neo4jではCypherクエリが単一であり一つのエンティティの組のみが参照されているのに対して、MicrosoftのGraphRAGでは様々なEntityやRelationshipが参照されています。

また、LocalSearchではメロスとセリヌンティウスが関わっている出来事について詳細に触れられているのに対して、GlobalSearchではそれぞれの出来事よりも全体を通してある程度まとめた形で提示されているようにみられます。

質問2:メロスはどんな場所を通りましたか

Local Search

メロスの旅路は、彼の決意と勇気を象徴する多くの場所を通過します。以下に、メロスが通った主要な場所をまとめます。

### 村 (Village)

メロスの旅は、彼の故郷である村から始まります。村はメロスと彼の妹が住んでいる場所であり、彼の出発点です [Data: Entities (0, 28)]。

### 野原 (Field)

村を出発したメロスは、野原を横切ります。野原では宴席が開かれており、メロスはその宴席を駆け抜けていきます [Data: Entities (64, 65); Sources (45)]。

### 森 (Forest)

野原を越えた後、メロスは森を通り抜けます。この森は彼の旅の一部であり、彼の決意を試す場所でもあります [Data: Sources (25)]。

### 隣村 (Neighboring Village)

メロスは隣村に到達し、ここで一時的に休息を取ります。隣村は彼の旅の途中の重要な地点です [Data: Entities (42); Relationships (25)]。

### 川岸 (Riverbank)

メロスは川岸に到達し、ここで濁流を目の当たりにします。川の増水と橋の破壊は彼の旅に大きな障害をもたらしますが、彼はゼウスに祈りを捧げ、川を渡る決意をします [Data: Entities (46); Relationships (29, 97); Sources (28, 29)]。

### シラクスの市 (City of Syracuse)

メロスの最終目的地はシラクスの市です。ここには彼の友人セリヌンティウスが待っており、メロスは彼を救うために急ぎます。シラクスの市は、メロスが暴君と対峙する場所でもあります [Data: Entities (2, 6, 66); Relationships (87); Sources (0, 2, 46)]。

### 王城 (Royal Castle)

最終的に、メロスは王城に到達します。ここで彼は友人を救い、暴君と対峙します。王城は物語のクライマックスの舞台です [Data: Entities (19); Sources (51)]。

メロスの旅は、彼の決意と勇気を試す多くの場所を通過し、最終的に彼の友人を救うための壮大な冒険となります。

Entities (質問に関連するエンティティ)

Relationships (質問に関連するエンティティ同士の関係)

Sources (質問に関連する原文)

Global Search

メロスの旅路には、いくつかの重要な場所が含まれています。以下にその詳細を説明します。

### 王城 (Royal Castle)

メロスの旅の最終目的地は王城です。ここは物語の重要な舞台であり、メロスが友人セリヌンティウスを救うために到達しなければならない場所です [Data: Reports (6)]。

### シラクス (Syracuse)

メロスはシラクスという都市を通ります。この都市は物語の主要な舞台の一つであり、メロスがナビゲートする場所です [Data: Reports (6)]。

### 川岸 (Riverbank)

メロスは川岸を通り、濁流を観察します。この場所はメロスの旅の中で重要な障害となります [Data: Reports (7)]。

### 村 (Village)

メロスは村を通ります。この村はメロスの故郷であり、彼の旅の出発点です [Data: Reports (9)]。

### 豪雨による氾濫 (Flooding due to Heavy Rain)

メロスは豪雨によって川が氾濫し、橋が破壊された場所を通ります。この自然災害はメロスの旅に大きな影響を与えます [Data: Reports (8)]。

これらの場所は、メロスの旅の過程で重要な役割を果たし、彼の試練や挑戦を象徴しています。

Reports (質問に関連するコミュニティ要約)

Langchain+Neo4j

Query: cypher MATCH (p:Person {id: 'メロス'})-[:TRAVELED_TO]->(pl:Place) RETURN pl 

Context: [{'pl': {'id': '村'}}, {'pl': {'id': '野'}}, {'pl': {'id': '森'}}, {'pl': {'id': '隣村'}}]

回答:メロスは村、野、森、隣村を通りました。

質問1と同様にどちらも質問に回答できていますが、Local Searchの方がより多くの要素について言及されています。LocalSearchで抽出されたエンティティ及びRelationshipの中に「メロス」「メロス(MELOS)」が同時に存在しており、同じ意味を持つエンティティが複数登録されていることが確認できます。

Microsoft GraphRAG のまとめ

本記事では、Microsoftが公開した知識グラフ活用手法であるGraphRAGについてご紹介しました。

MicrosoftのGraphRAGを活用することでデータセット内のエンティティの関係に則して回答することができています。また、データセット内の関連情報を多数参照されており、 参照が少なく簡素な回答となる場合が多いLangchainによる手法に比べて詳細な回答が得られています。

RAG手法では、キーワード検索やベクトル検索といった検索手法を複数利用するハイブリッド検索が行われるケースが多いですが、MicrosoftのGraphRAGでは他手法と併用する必要がないかもしれません。

今回の例では、LocalSearchにおいてより詳細で適切な回答が得られているように思われました。これは、今回の質問が「メロス」や「セリヌンティウス」といったエンティティの具体的な情報を必要とする性質をもっていたためだと考えられます。

対して、GlobalSearchは公式ドキュメントではデータセット全体ついてまとめて回答するような必要がある場合に適しているとされています。GraphRAGは質問の性質によって適切な手法が異なるため、高いパフォーマンスを得るためにはどういった性質の用途で用いるかを判断してから使うことが重要になりそうです。



【参考文献】

[1] Welcome to GraphRAG

[2]SelfCheckGPT([2303.08896] SelfCheckGPT: Zero-Resource Black-Box Hallucination Detection for Generative Large Language Models (arxiv.org)

[3][2404.16130] From Local to Global: A Graph RAG Approach to Query-Focused Summarization (arxiv.org)

[4][2404.16130] From Local to Global: A Graph RAG Approach to Query-Focused Summarization (arxiv.org)

[5]Get started

[6]graph-visualization.ipynb


記事を書いた人
釣部 勇人

理工学専攻の大学院生で、主に言語AIを扱っています。大学では、生成AIを用いた学習支援アドバイスの生成について研究しています。