CCCMKホールディングス TECH LABの Tech Blog

TECH LABのエンジニアが技術情報を発信しています

ブログタイトル

"DeepRAG: Thinking to Retrieval Step by Step for Large Language Models"という論文を読みました。

こんにちは、CCCMKホールディングスTECH LABの三浦です。

最近日本の歴史の漫画を読んでいました。子どもの頃は近代~現代の内容は難しい、と感じていたのですが、大人になってから改めて見ると学ぶことがとても多く、考えさせられることがたくさんあるんだな、と感じました。

はじめに

前回"The Surprising Effectiveness of Test-Time Training for Abstract Reasoning"という論文をご紹介しました。

techblog.cccmkhd.co.jp

この論文ではLLMの推論時にLoRAチューニングを実行し、パズル形式の問題に対する精度を高める、というアプローチが提案されていました。前回の記事の中でも触れたのですが、最近LLMの周りで事前学習だけでなく、推論(Test-Time)を拡張することで精度を高めようとするアプローチをよく見るようになりました。

LLMに外部データを参照させて回答させる、Retrieval-Augmented Generation(RAG)においても似たようなアプローチがあるのかな、と調べていたところ、RAGに関する面白いアプローチを提案している論文を見つけました。

それがこちらの論文です。

Title: DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Author: Xinyan Guan, Jiali Zeng, Fandong Meng, Chunlei Xin, Yaojie Lu, Hongyu Lin, Xianpei Han, Le Sun, Jie Zhou
Submitted: 3 Feb 2025
arXiv: https://arxiv.org/abs/2502.01142

この論文では、ユーザーの質問に回答するために、1回の検索と回答生成で対応するのではなく、複数のサブタスクに分割し、サブタスクごとに必要に応じて検索処理を行いながらサブタスクに対する回答生成をし、次のサブタスクの生成を逐次行いながら最終的な回答に到達するアプローチであるDeepRAGが提案されています。

DeepRAGのように、メインタスクをサブタスクに分割して逐次処理、または並列処理で実行し、回答に近づける手法は他にもあるのですが、DeepRAGの特徴は"いかに効率的に検索を行わせるのか"という点にあります。

今回の記事ではこのDeepRAGのアプローチについてご紹介したいと思います。

検索は、本当にいつも必要なのか?

論文の中では従来のRAGの問題点として、不必要な検索処理によってLLMが受け取る情報にノイズが含まれてしまい、それによってLLMの回答の質の低下や回答速度の低下が生じてしまうことが挙げられています。

この問題点は私も日頃感じている課題で、RAGによって大量の参照情報がプロンプトに組み込まれると、細かい指示(たとえば"こういう文言は入れないで","500文字以内でまとめて"など)が効かなくなってしまう、といったことが、特に小さいサイズのLLMだと頻繁に発生するように感じます。

一方、質問によっては外部知識ではなくLLMが持っている知識によって回答出来るものがあります。たとえば論文の中で例として挙げられていたのですが、「映画ロードオブザリングシリーズのトータルの上映時間は?」という質問に対し、ロードオブザリングシリーズの各タイトルの上映時間は外部の情報を参照する必要がある一方、ロードオブザリングシリーズの全タイトルはLLMの知識の中に含まれている、といったケースです。

DeepRAGのアプローチは、メインタスクをサブタスクに分割しながら、各サブタスクを解くのにLLMの知識で答えられるのか、外部の情報が必要なのかを適切に判断し、さらに出来るだけ検索回数が少なくなるようなサブタスクの生成とそれに対する回答生成の実現を目指しています。

DeepRAGのステップ

DeepRAGはユーザーから与えられたメインタスクを解くために、サブタスクを逐次解きながらメインタスクの回答にたどり着くアプローチを取っています。次のステップでどんなタスクをどのように解決するのかは、前のステップの結果に基づいて決定するという、マルコフ決定過程に従っています。

  • 前のステップの状態には、メインタスクとこれまでのステップのサブタスクと行動結果が含まれる
  • 前のステップの状態から、今回のステップのサブタスクを生成する
  • サブタスクを解決するために、LLMの知識で解けるのか、外部の情報が必要かという行動の決定をする
  • 行動の結果を今回のサブタスクの結果として記録する。外部情報を参照した場合はその情報も保持する

また、この一連のプロセスで最終的にメインタスクを解決出来た場合には検索回数に応じた評価値を与えます。1回検索を実行すると1ポイント減算される評価値となっていて、メインタスクを解決出来たかどうかだけでなく、より効率的なプロセスはどれなのかを判定することが出来るようになります。

DeepRAGでは最終的に以下のような回答形式で回答が生成されます。

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models, Answer format

DeepRAGの最適化

DeepRAGは先ほどのマルコフ決定過程に従い、より評価値の高い方法でメインタスクを解くことを目指し効率的なRAGを実現するのですが、これを実現するために2段階のチューニングを実行します。

一つが"Imitation Learning"でもう一つが"Chain of Calibration"です。"Imitation Learning"ではサブタスクの生成とそれに対する回答生成の最適化を行い、"Chain of Calibration"ではサブタスクに対してLLMの知識で解けるか外部情報が必要かの判断の最適化を行います。

これらのチューニングの為に必要になるデータセットの構築は、LLMを使って人工的に生成しています。

データセットの生成

データセットの生成では、質問と正解の回答、参照情報を元に、質問から正解にたどり着くまでにもっとも検索回数が少ないルートを探索し、その中間ステップ(サブタスク、回答、もし検索した場合は検索情報)を取得します。質問と回答に対し、この中間ステップを辿ることが最も検索回数の少ない効率的なプロセスと捉えることが出来るので、これをチューニング用のデータセットとして利用し、LLMの回答プロセスの最適化を"Imitation Learning"と"Chain of Calibration"で行うことが出来ます。

データセット生成のより詳細なアルゴリズムは以下の様になっています。

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models, Algorithm 1

Imitation Learning

Imitation Learningでは、生成した最適な中間プロセスを含むデータを用いて、中間のサブタスクの生成とそれに対する回答の最適化を行います。

Chain of Calibration

Chain of Calibrationは、サブタスクに対してLLMの知識で解けるのか、外部情報が必要かを判断できるようにするチューニングです。LLMに自分の知識の限界を認識させるチューニングと捉えることが出来ます。

具体的には、もし自身の知識で答えられる場合は"Intermediate Answer:"というフレーズを生成し、外部の情報(たとえばWikipedia)が必要な場合は"Let's search the question on Wikipedia"というフレーズを生成出来るようにします。

生成されたデータセットは、回答にたどり着くまでの最も効率的なプロセスと捉えることが出来ます。データセット内の各サブタスク対する自身の知識が必要か、外部情報が必要かの判断結果を"望ましい回答"、反対の判断を"望ましくない回答"と考えれば、DPO(Direct Preference Optimization)によるチューニングが可能になります。

DPOはLLMの回答をより人にとって好ましい形に調整する事後学習の手法です。以前こちらの記事で調べたことをまとめたことがあります。

techblog.cccmkhd.co.jp

このように、LLMが問題を解くために必要なサブタスクの生成、それに対して自身の知識で答えられるかの判断、そして最適な回答を生成出来るようにチューニングするのが"Imitation Learning"と"Chain of Calibration"で、DeepRAGの重要な要素であると考えることが出来ます。

まとめ

今回はDeepRAGという、回答に外部情報が必要になる問題をサブタスクに分解し外部情報が必要な時だけ検索を行うことで処理の効率化や回答精度の向上を実現する手法について論文を読んで調べたことをまとめました。 データセットの生成方法やチューニングの方法がとても興味深く、この部分だけでも色々な課題解決に活用出来そうだな、と思いました。今度自分でも実装にチャレンジしてみたいと思います。