昨日、最近話題となったGraphRAGを試しました。
GraphRAGとは、データをナレッジグラフの形式で保管し、RAGで検索する際にはナレッジグラフで回答を探すという技術です。通常のRAGと比べると、基本的には正しい情報だけが含まれているため、精度が高くなります。マイクロソフトも先日RAGとGraphRAGを比較する研究レポートを発表しました。⇩(GraphRAGの特徴と、どんな場合にRAGより精度高いのかを多角的に説明しています。)
ナレッジグラフ(Knowledge Graph)とNeo4j
ナレッジグラフは主に、ノード(node)とリレーションシップ(relationship)で構成されて、単語ごとの関係を表しています。(GoogleやYahooなどの検索エンジンもナレッジグラフに基づいて検索を行っています)
ナレッジグラフを自動的に作成するために最もよく使われているライブラリはNeo4jです。Neo4jにテキストデータとパラメーターを設定して渡したら、自動的にナレッジグラフを作成してくれます。(イメージとしては⇩)
こちらは、WikipediaのAPIを使って”toyota”に関して検索した結果をNeo4jで生成したナレッジグラフです。真ん中には”Toyota”というノードがあり、それに関連する他のノードが周りに配置されています。それらの間にはリレーションシップが示されています。例えば、ToyotaとLexusの間のリレーションシップはproduces(生産する)となっています。Lexusに関するデータをさらに追加すれば、Lexusの周りにも他のリレーションシップが広がります。(日本語wikipediaで試しましたが、なぜかエラーが出てうまくいかなかったので、英語で作りました)
Graph RAGの処理フロー
⇩の図は、LangChainが公開されたGraph RAGの処理フローです。(Graph RAGと通常のRAGを両方組み合わせしています)
流れとしては、ユーザーのprompt文をナレッジグラフと通常のベクトルストアの両方で答えを探し、LLMに結果を渡してoutputを生成する感じです。
実際ナレッジグラフから検索されたデータ(LLMに渡した内容)は以下のようです。
"トヨタはどのような会社ですか"と検索すると、先の図に示されていた”toyota”に関連する内容がテキスト形式(node⇒relationship⇒node)で整理されて返ってきます。
1個質問を試したら間違いなく回答できました。
興味ある方:
Deeplearning.aiのGraph RAGコース