Graph RAGをはじめからテキトーに

2024/08/05

こんにちは。今日はGraph RAGを研究で扱うことになったため何も知らないところから学んでいきたい人向けの記事になります。

Graph RAGとは

データをベクトル形式ではなく、ナレッジグラフの形式で保管し、そこから検索拡張生成を行う手法です。
https://qiita.com/xxyc/items/921805c7608c634f952f

背景として、通常のRAGは情報断片の表面的な類似性を評価するものであり、深く複雑な関連性を捉えることが困難です。

また、ベクトル化された情報は独立したエンティティとして扱われるため、文脈や意味的理解を行うことも困難です。そのため、期待される情報が引き出せなかったり、不十分な結果を生じることがあります。
https://qiita.com/Ruuchami/items/294d797798d4fca346ad#%E6%9C%AC%E8%A8%98%E4%BA%8B%E3%81%AE%E8%83%8C%E6%99%AF

これに対して、Graph RAGでは、ナレッジグラフを利用することで情報の関連付けや意味的理解の課題を克服し、精度の高い情報検索を実現します。

ナレッジグラフとは

ナレッジグラフとは、データに出現する「モノ」「イベント」「概念」などの登場人物について、それらの関係性を構造化して表現するデータ構造のことです。
https://techblog.cccmkhd.co.jp/entry/2024/06/11/153114

例えば、「清水さんが山田さんをフォローしている」という関係の場合、

(清水)-[:FOLLOWS]->(山田)

と表すことができます。

このようなデータの持ち方としてKnowledge-Graphがあり、そのベースとしてOntologyがあります。

Knowledge-GraphとOntology

データとして、山田くんの自己紹介があったとします。そこから構築されるナレッジグラフには、東京都出身、AIエンジニア、野球が趣味…といった「エンティティ」が山田くんと相互リンクされています。

ここで、「人物」に対して「出身地」「仕事」「趣味」といった概念が出現し、「人物」はそれらを属性として所持している関係性があります。

このように、ある領域における概念や、その概念の関係性を表現したものをOntologyと呼びます。Knowledge-Graphは、Ontologyを具体化したものであるとみなすことができます。
https://techblog.cccmkhd.co.jp/entry/2024/06/11/153114

ナレッジグラフとオントロジーの関係性は以下の記事の画像が非常にわかりやすいです。

https://www.nttdata.com/jp/ja/trends/data-insight/2020/0608/

すなわち、入力として文章データの内容をオントロジーに当てはめることでナレッジグラフが構成されます。

https://www.nttdata.com/jp/ja/trends/data-insight/2020/0608/

その手順として、インスタンス間の関係を抽出してから概念と関係を特定する場合と、あらかじめ設定して概念に対応するインスタンスを抽出してからインスタンスの関係を特定する場合があります。

これらは、用途に応じて使い分けることができます。

ナレッジグラフ全体の意味合いとして、次のように解釈することができます。

https://internet.watch.impress.co.jp/img/iw/docs/1608/736/html/004_o.png.html

Graph RAGにおけるナレッジグラフの構築方法

Graph RAGのブログでは、構築にLLMを使用していることが記載されています。

その例は、LangChainでも紹介されています。
Enhancing RAG-based application accuracy by constructing and leveraging knowledge graphs

以降はこちらの解説記事を参照してください。

LlamaIndexによる実装


今回は、Graph RAG 簡易バージョンを実装します。外部データとして桃太郎さんの物語を入れてみて、どのような応答ができるのか検証してみたいと思います。

また、ナレッジグラフを出力した結果このような構造になっていました。

"おじいさん": [
            [
                "おばあさんがありました",
                "あるところに"
            ],
            [
                "山へしば刈かりに",
                "まいにち"
            ],
            [
                "育てる",
                "桃太郎"
            ]
        ],
        "桃太郎": [
            [
                "成長する",
                "体"
            ],
            [
                "成長する",
                "だんだん"
            ],
            [
                "体が大きい",
                "ずっと"
            ],
            [
                "行く",
                "遠方"
            ],
            [
                "持つ",
                "きびだんご"
            ],
            [
                "ついて行きました",
                "犬"
            ],
            [
                "ついて行きました",
                "猿"
            ],
            [
                "勇いさみ立たって",
                "進すすんで行きます"
            ],
            [
                "したがえて",
                "犬"
            ],
            [
                "したがえて",
                "猿"
            ],
            [
                "攻め込む",
                "お城"
            ]
        ],
        "鬼": [
            [
                "逃げ回る",
                "痛い"
            ]
        ],
        "桃太郎ももたろう": [
            [
                "積つんだ",
                "宝物たからもの"
            ]
        ],
        "船ふね": [
            [
                "陸おかに着つきますと",
                "宝物たからもの"
            ]
        ]

元のデータが漢字にふりがながあったためおかしくなっていますが出力は大きな影響はありませんでした。

桃太郎、成長する、体、などは桃太郎が桃から生まれて育てられたことを洗わせています。
しかし、最初の

"おじいさん": [
            [
                "おばあさんがありました",
                "あるところに"
            ],

については、エンティティ同士の関係性を表すという原則からは外れてしまっています。

基本的には元の文章から抽出する形になるので、このようなオントロジーから外れてしまうインスタンスが生成されてしまうこともあるのですね。

よって、ナレッジグラフはただ生成するだけでなく、データに応じて適切な処理をする必要があるように思います。

また、いくつかの質問で通常のベクトル検索と比較を行いました。

質問0番目: 物語の概要を教えて
ベクトル検索:
この物語は、桃太郎という若者が犬、猿、きじという3匹の動物と共に鬼退治に挑む物語です。
桃太郎は鬼の大将を倒し、宝物を手に入れて帰国するまでの冒険を描いています。
桃太郎と仲間たちの勇気と協力が物語の中心となっています。

グラフ検索:
A story about an old man who raised a boy named Momotaro. 
Momotaro later gathered treasures after defeating demons.


質問1番目: 桃太郎と犬の関係は何?
ベクトル検索:
桃太郎と犬は主従関係にあります。桃太郎は犬を家来として連れて行き、
一緒に鬼と戦ったり、宝物を手に入れたりしています。犬は桃太郎の命令に従い、
船を漕いだり、戦ったりしています。

グラフ検索:
桃太郎と犬の関係は、犬が桃太郎について行き、また桃太郎にしたがえて行ったことが示されています。


質問2番目: 桃太郎と鬼の関係を教えて
ベクトル検索:
桃太郎は鬼の島に向かい、鬼たちを倒して宝物を手に入れました。
鬼たちは桃太郎とその家来たちに抵抗しましたが、最終的には桃太郎に降伏し、宝物を差し出しました。桃太郎は鬼たちを従わせ、勝利を収めたと言えます。

グラフ検索:
桃太郎は鬼に攻め込み、鬼は痛がって逃げ回る関係にあります。


質問3番目: おじいさんのしたことを教えて
ベクトル検索:
おじいさんは、桃太郎のためにおばあさんと一緒にお弁当を作り、
桃太郎が鬼退治に行く際に気をつけるように忠告しました。
また、桃太郎が出発する際に見送りをしていました。

グラフ検索:
The old man cut grass in the mountains every day and raised Momotaro.


質問4番目: おばあさんのしたことを教えて
ベクトル検索:
おばあさんは川で洗濯をしている最中に大きな桃を見つけ、それを持ち帰ろうとしました。
しかし、手が届かずに歌を歌いながら手拍子をしていると、桃が再びおばあさんの前に流れてきました。
おばあさんは喜んで桃を持ち帰り、おじいさんと一緒に食べるために洗濯物と一緒に家に持ち帰りました。

グラフ検索:
The grandmother had a peach that she raised.


質問5番目: なぜ鬼を退治しようと思ったの?
ベクトル検索:
桃太郎は鬼を退治しようと思ったのは、鬼が島に住んでいるため、
その鬼が悪さをしているという情報を聞いたからです。桃太郎は鬼を討伐することで、
島の人々を守り、平和を取り戻すために行動しました。

グラフ検索:
To protect the village from the mischief caused by the oni.

まとめ

  • Graph RAGとは、外部知識をナレッジグラフの構造で格納し検索拡張生成を行うフレームワーク

  • ナレッジグラフはインスタンスの関係性をもとに構造化したデータ形式

以上、Graph RAGを基礎から調査した結果でした。

この記事が気に入ったらサポートをしてみませんか?