最近、RAGの精度を向上させる新たな手法「ChunkRAG」を扱った論文を読みました。内容がなかなか興味深かったので、ここで簡単にまとめてご紹介します。
ChunkRAGは、RAGにおける回答精度向上を目的としたアプローチです。ざっくり言うと、RAGが取得した「チャンク(文章の断片)」をLLMで評価し、関連性が低いチャンクを除去することで、最終的な回答の品質を高める手法です。
従来、RAGでは取得した文書をそのままLLMに渡すことが多く、余計な情報が入り込み、回答が冗長になったり的外れになったりする問題がありました。ChunkRAGは、文書を細かく区切ってから役に立たない部分を取り除くことで、この問題を解決しようとしています。
下記の図は、その効果をわかりやすく示しています。左側は不要な情報が混入して回答が冗長になっていますが、右側では事前の分割とフィルタリングによって回答が簡潔かつ的確になっています。
続いて、ChunkRAG全体のフローチャートがこちらです。(下図参照)
これを踏まえつつ、各ステップを簡単に説明します。
1. Semantic Chunking
まず、文章全体をsent_tokenizeなどで文ごとに分割し、隣り合う文同士の類似度(0.7以上など)に基づいてチャンクとしてまとめます。この際、チャンクが大きくなりすぎないよう、500文字以内などの制約も設けています。
こうしたやり方で意味的につながりがある文をひとまとめにし、余計な情報が混在しないチャンクを作成します。
2. Query Rewriting
次に、ユーザの問い合わせ(クエリ)をより明確で検索しやすい形に書き直します。
これはRAGでよく使われる手法で、曖昧なクエリを明確化して、以降の処理をしやすくする役割があります。
3. Filtering
続いて、取得したチャンクをフィルタリングします。
まずはチャンク間の類似度が0.9以上になった場合、重複とみなして除去し、冗長な情報をカットします。
その後、LLMを用いて各チャンクとクエリの関連度をスコアリングします。
ここでSelf-Reflection(LLMが自分の評価を見直す)やCritic LLM Scoring(別のLLMが評価の妥当性を判断)といった手法も使い、チャンクの関連度評価をより正確にします。
最終的に一定の基準を下回るチャンクは「関連性が低い」として除外します。
4. Hybrid Search and Rerank
その後、ベクトル検索結果を補強するため、キーワードベースの検索結果を0.5:0.5の比率で組み合わせるハイブリッド検索を行い、結果を統合します。(キーワード検索は固有名詞などに強いため、ベクトル検索が弱い質問をカバーします)
最後にCohereなどのrerankモデルを用いて並べ替えを行い、最終的にLLMが回答を生成します。
5. Evaluation
この一連の処理によって、ChunkRAGは既存手法より10〜15%程度の精度向上を達成したと報告されています(評価にはPopQAというRAG評価で有名なオープンデータセットが用いられています)。
まとめ(懸念事項):
- 小規模モデル(7B、13Bクラス)ではChunkRAGの効果が顕著ですが、高性能なモデル(例:GPT-4)では、もともとモデル自体がある程度情報選別可能なため、フィルタリングの効果は相対的に小さくなる可能性が高いと思われます。
- また、コスト面の問題もあります。すべてのチャンクに対してLLMでスコアリングするため、処理時間やAPIコストがかなり膨大になります。
とはいえ、この論文を読むことでRAGの基本的な問題点や改善手法を学ぶことができるため、一読の価値はあると思います。
興味ある方: