はじめに
RAGの精度改善はとても難しいと言う話があります。
実際僕もRAGを作っていて、全然精度が上がらない…ということがありました。
この時問題になってくるのは、ナレッジベースの チャンク分割 です。
チャンク分割とは
通常のRAG(ここではnaive RAGのこと)では、巨大なデータセットをチャンクという単位に分割しています。分割の仕方は固定長やsemanticなど様々なものがありますが、ここでは固定長を考えてみましょう。
ここで、チャンク1に「資料1を参照のこと」、チャンク2に資料1の内容が書かれていた場合、チャンク1が取得されるだけだと資料1の内容を知ることができなくなってしまいます。
取得するチャンクはプロンプトをvector DBの中にembeddingすることで決めているため、naive RAGのようにワークフローの中に組み込まれたRAGでは、用語の定義が不確かになってしまうことがあります。
このように、固有名詞がおおいナレッジベースに対しRAG(特にチャンク分割)は相性が悪いため、固有名詞を遡れる仕組みが必要となります。
それを解決する考え方の一つがGraphRAGです。
GraphRAGとは
GraphRAGは、グラフ検索をナレッジベースに追加することにより、データを構造的に扱うことができるようになるRAGの手法の一つです。
通常のRAG:
GraphRAG:
このような関係性の把握により、よりハルシネーションを減らし、正確な内容を出力することができるようになりました。
このグラフをナレッジグラフ(Knowledge Graph)と呼び、langchainを用いたナレッジグラフの構築などが知られています。
MS GraphRAGとは
これとは別の概念で、Microsoft GraphRAGという概念があります。
MS GraphRAGではKnowledge Graphを使っていないとのこと。
arXiv
GraphRAGのリサーチ論文
https://arxiv.org/abs/2501.00309
RAGとGraphRAGどちらが良いのか?の論文。用途によっては通常のRAGの方が精度が良いらしい。
https://arxiv.org/abs/2502.11371