⛓️

【Prompt Engineering】LLMを効率的に動かす「ReAct」論文徹底分解!😎

2023/02/08に公開

ReActとは?

LLMのpromptingの方法の一つです。LLMに質疑応答させたり、意思決定させたりという場面で力を発揮するほか、外部データベースや外部APIとLLMを組み合わせる場合にも使えます。
また、LangChainでもReActの考え方は多く活用されています(エージェントなど)

https://twitter.com/LangChainAI/status/1622107948343513088

今回はReActが提案された論文REACT: SYNERGIZING REASONING AND ACTING IN LANGUAGE MODELSを細かくチェックしていきます!

論文のソースはこちら:
https://arxiv.org/abs/2210.03629

この記事を見て分かること

  • CoT、ReActのノリが分かる
  • ReActの限界と能力の向上方法について理解できる

Let's Go!

元の論文の各章の内容要約+一言コメントでまとめています。ちょっとLangChainとか齧った方なら理解できる程度のものだと思います。(内容要約が分からなかったら所感だけ見てもノリは掴める!)

※要約についてですが、元の論文から大事そうな部分をピックアップしているので多少表現が違っていたり、細かい部分が割愛されている場合があります。ご了承ください。

概要

内容要約

LLMは凄まじい成果を発揮しているが、推論(Chain of Thoughtなど)と行動(検索・計画の生成などなど)については別テーマとして研究されてきた。本論文では、LLMを使用して推論と行動の両者を活用し、2つの相乗効果を生む方法(ReAct)を提案する。
 ReActを様々な言語タスクと意思決定タスクに適用し、効率性を実証する。具体的には、質疑応答と事実検証においてWikipediaAPIを活用して種々の問題を克服する。更に、2つの対話型の意思決定ベンチマーク(ALFWorldとWebShop)について、promptに1つか2つの例を入れるのみで、模倣学習と強化学習に対して34%と10%の成功率の向上を上げた。

所感

CoTだけでは解決できなかったような問題も、ReActを使えば解決出来るらしいです。また、模倣学習と強化学習よりも圧倒的に高いスコアをあげており、ReActは色々強いらしいです😎まぁとにかく本編を見よう。。

INTRODUCTION



内容要約

人間は行動と推論をシームレスに組み合わせる能力を持つ。キッチンで料理をする場合で例えると、2つの行動の間において、進捗を捉えて(材料を全て切ったので鍋の水を加熱しよう)、例外を処理して(塩が無いので醤油と胡椒を代わりに使おう)、外部情報が必要な時に対処する(生地を作る方法が分からないので検索しよう)といったように推論することが出来る。他にも、質問に対する回答として「行動」を示すこともある(「今すぐ作れる料理は何?」に対する回答として、冷蔵庫を開けるなど)。
「Chain of Thought(CoT)」を利用してLLMが様々な質問に対する回答を推論することが可能であるが、この手法はモデルの内部的な推論に依存する方法であり、反応的に推論することや、知識を更新する能力が制限される。このため、推論のプロセスにおいて事実を捻じ曲げたり、誤りを伝搬するといった問題が生じる(図1(1b))
 タスクの解決のために推論と行動を組み合わせる研究は無かったため、本論文では多様な言語推論・意思決定タスクを解決する為にReActを提案する(図1)。ReActによってモデルは動的な推論を行うことが可能であり、必要な場合にWikipediaの情報を推論に取り入れる、といったことが実現できる。

所感

人間は自然言語で考えたり次の行動を決めたりするのが強みだが、LLMもそのようにしてみてはどうか?という考えがReActの発端だと思います。同じような手法にCoTがありますが、CoTだと問題点があるため、改善の必要があるとのこと。更に、ReActでは外部の情報も推論に取り入れることが可能であるという強みがあると述べられています。
図1ではReActとその他の手法の比較が載っています。(Apple Remoteが何か分からなかったので検索する羽目になったのですが、)ReActであれば正確に思考できていることが伺えますね。

ReAct:SYNERGIZING REASONING + ACTING


内容要約

一般的なタスクの解決においてエージェントの振る舞いを考える。時刻tに環境oを受け取って行動aをポリシーπ(a|c)に基づいて実行する。ここで、cは過去の環境と行動からエージェントに与えられるコンテキストである。
ReActのアイデアは単純である。ReActはエージェントの行動空間Aを言語空間Lに拡張する。図1では有用な例が示されている。例えば、タスクの目標を分解して行動目標を作成したり(2B, Act1; 1d, Thought1)、タスクの解決に必要な常識的な知識の抽出(2b, Act1)、環境から重要な要素を取り出す(1d, Thought2, 4)、進捗管理や行動計画を立てる(2b, Act8)、例外に対処し行動計
画を調整する(1d, Thought3)などなど。

言語空間Lは無限であり、この拡張行動空間での学習は困難である。そこで、本論文ではPaLM-540Bを使い、few-shotの例を与えることで、ドメイン固有の行動と自由形式の言語思考をタスクの解決のために生成する。推論が重要なタスクでは、思考と行動を交互に生成し、タスク解決が複数の思考-行動-観察ステップから構成されるようにする。一方、多数の行動を伴う可能性がある意思決定タスクでは、思考と行動が非同期に生成されるようにLLM自身に決定させる。

所感

ここは抽象的な話なので、よく分からん!って方は次章に行ってしまっても良いかと思います。次章は具体的にReActが何で、どういうものかが解説されます😎

 一般的なタスクの解決においてエージェントの振る舞いを考える。時刻tに環境oを受け取って行動aをポリシーπ(a|c)に基づいて実行する。ここで、cは過去の環境と行動からエージェントに与えられるコンテキストである。
 ReActのアイデアは単純である。本論文ではエージェントの行動空間Aを言語空間Lに拡張する。図1では有用な例が示されている

ReActは、言語に関するあらゆる「行動」を実行できることに根差して設計されているということです。例えば、Wikipedia等々から必要な知識の引き出す・目標を小目標に分解する、などなど。これまでは行動aが出来る幅はこんなに広くなかったが、ReActでは言語に関すること一般に拡張したという主張だと思います。

言語空間Lは無限であり、この拡張行動空間での学習は困難である。そこで、本論文ではPaLM-540Bを使い、few-shotの例を与えることで、ドメイン固有の行動と自由形式の言語思考をタスクの解決のために生成する。推論が重要なタスクでは、思考と行動を交互に生成し、タスク解決が複数の思考-行動-観察ステップから構成されるようにする。一方、多数の行動を伴う可能性がある意思決定タスクでは、思考と行動が非同期に生成されるようにLLM自身に決定させる。

言語に関することは何でも出来る!と言っても現在のLLMでは限界があるので、タスクに応じたfew-shotによる例示や、推論と行動の組み合わせ方法を調整することで、汎用性+専門性を担保しているよ、ということだと思います。

KNOWLEDGE-INTENSIVE REASONING TASKS





内容要約

ReActを用いて、知識集約型の推論タスクと事実検証を行う。

セットアップ
データセット:
(1)HotPotQA Wikipediaによる数回の推論を必要とする質問回答ベンチマーク
(2)FEVER データセットの主張を検証するWikipediaの文章が存在するかどうかに対して「支持する」「支持しない」「情報が無い」の3つに分類するベンチマーク

行動:
WikipediaAPIから情報を引き出すサポートを行う3つの行動を設計した。
(1)search[内容] 対応するwikiページがあれば最初の5文を返し、そうでなければWikipediaの類似する上位5つのページを提案する
(2)lookup[文字列] ブラウザのCtrl+F機能を模倣して特定の文字列を含む文章を返す
(3)finish[回答] 現在のタスクを終了させる。

具体的には以下のようなイメージでprompting&回答をさせます。

HotpotQAに関する例を見てみましょう!

まずはデータセットにある質問と回答の例です。

Q. コロラド造山帯の東部が広がる地域の標高差はどのくらいか?
A. 1,800 to 7,000 ft

各手法による例です。今回の問題についてはどの手法も正解しています。
例示として以下のようなものをpromptに突っ込むと、各手法を実装できます。

Actの場合

Q. コロラド造山帯の東部が広がる地域の標高差はどのくらいか?

Action 1 Search[コロラド造山帯]
Observation 1 コロラド造山は、コロラド州とその周辺地域で起こった造山活動(造山活動)のことである。
Action 2 Lookup[東部]
Observation 2 (結果1/1)東部は高地平原に広がり、中央平原造山と呼ばれる
Action 3 Search[高地] 
Observation 3  高地は、2つの異なる土地地域のうちの1つを指す
Action 4 Search[ハイプレインズ(アメリカ)] 
Observation 4 ハイプレインズはグレートプレインズの小地域である。東から西へ、ハイプレインズはおよそ1,800から7,000フィート (550 から 2,130 m) の標高に上昇する[3]。
Action 5 Finish[1,800 to 7,000 ft]

CoTの場合

Question コロラド造山帯の東部が広がる地域の標高差はどのくらいか?

Thought ステップバイステップで考えてみよう。コロラド造山帯の東部はハイプレインズに広がっています。High Plainsは約1,800から7,000 ftまで標高が上がるので、答えは1,800から7,000 ftとなります。
Answer 1,800 to 7,000 ft

ReActの場合

Question コロラド造山帯の東部が広がる地域の標高差はどのくらいか?

Thought1 コロラド・オロジニーで検索して、コロラド・オロジニーの東側が伸びている地域を探し、その地域の標高範囲を調べたいのですが。
Action1 Search[コロラド造山帯]
Observations1 コロラド造山は、コロラド州とその周辺地域で起こった造山活動(造山活動)のことである。
Thought2 東部地区については触れられていない。だから、東部地区を調べる必要があるんだ。
Action2 Lookup[eastern sector]
Observation2 (結果1/1)東部は高地平原に広がり、中央平原造山と呼ばれる。
Thought3 コロラド造山帯の東部はハイプレインズまで伸びています。そこで、ハイプレインズを検索し、その標高域を見つける必要がある。
Action3 Search[高地]
Observations3 高地は、2つの異なる土地地域のうちの1つを指します。
Thought4 代わりにハイプレインズ(アメリカ合衆国)を検索する必要があります。
Action4 Search[ハイプレインズ(アメリカ)]
Observations4 ハイプレインズはグレートプレインズの小地域である。東から西へ、ハイプレインズはおよそ1,800から7,000フィート (550 から 2,130 m) の標高に上昇する[3]。
Thought5 ハイプレインズは標高が約1,800から7,000フィートまで上昇するので、答えは1,800から7,000フィートとなる。
Action5 Finish[1,800 to 7,000 ft]

方法
上記データセットのうち数件を引っ張り、ReActのフォーマットに則る考え方の例をプロンプトとし
て与えた。そのうえで、各手法でデータセットの問題をLLMで回答する。

比較対象:今回は「Standard:普通にpromptを作った場合」「CoT:CoTで回答させる場合(検索するといった行動や現在の状況の把握をしない)」「Act:行動のみでpromptを作った場合(上記の行動のみをひたすら実行する)」の3つとReActを比較する。CoTに関しては複数の答えを生成して多数決を取って回答を出す、CoT-SCについても比較に追加した。

内部知識と外部知識を組み合わせる:CoT-SCは内部知識によって誤りを犯してしまうため、ReActとCoT-SCの組み合わせを提案する。ReActで所定のステップ以内に回答を返せなかった場合はReAct→CoT-SCに切り替えて、CoT-SCが所定の回数以下で過半数の回答にならなかった場合、CoT-SC→ReActに切り替える、といった方法で組み合わせる。これらも比較対象に加えた。

Finetunning:規模が大きくなると推論と行動を手動で指示するのは厳しくなってくる。そこで、ReActで生成した3000の思考・行動・観察の流れを用いて、LLMをfinetuningする。

結果と観察

ReActは常に行動を上回る:表1は2つのデータセットによる結果である。両者ともReActがActより優れている。

ReAct vs CoT:ReActはFeverデータセットではCoTを上回るスコアであるが、HotpotQAデータセットではわずかに下回る結果となっている。HotpotQAにおいてそれぞれの振る舞いの違いを検証した。表2はそれぞれの結果のまとめである。CoTでは「幻覚(無関係なテキストを生成してしまう)」が主な問題点である。ReActは前の思考や行動を繰り返してしまうという問題点がある。また、検索結果によっては思考を狂わせることとなり、正しい思考が出来なくなる場合がある。

promptのみだとReAct+CoT-SCがベストである:最も上手く行った方法はReAct→CoT-SCとCoT→ReActであることが分かった。図2ではそれぞれの手法がどのような結果をもたらしたかを示している。横軸はCoT-SCのサンプル数である。内部知識(CoT)と外部知識(検索など)を組み合わせることが強力であることが示されている。

finetuningにおいてはReActがベストである:図3はpromptingとfinetuningにおけるスケーリングの効果を示している。パラメータ数が少ない場合、ReActを解釈できるほどLLMが賢くないないため、効果を発揮しない。finetuningして540bのモデルを使用した場合、ReActは全ての方法の中で最も効果を発揮する。8bと64bで他の手法の結果が悪いのは、finetuningを通してWikipediaの「事実」をモデルに教えるからである。ReActはWikipediaから「情報を収集する方法」を教えるという違いがある。

所感

具体的な方法論や実験に関する章でした。実例もあったので、ReActが何なのか理解できたと思います。まさしく「推論」と「行動」の組み合わせですね!実験結果をまとめると、PromptだけならReAct+CoT-SCが最強、finetuningならReActが最強ということです。
ただ、ReAct等々を用いてもSoTAには届かないスコアなので、LLMの進化がまだまだ求められます。多分GPt-3.5とかで同じ実験をすると、大きくスコアが伸びるのではないでしょうか。

以下は細かい補足です。

CoT-SCについて

 CoTに関しては複数の答えを生成して多数決を取って回答を出す、CoT-SCについても比較に追加した。

アンサンブルで議論させる版のCoTです。LLMのtemperatureを0.7に設定して実装したらしいです(temperatureの値によってはアンサンブルが不可能になるため)

ReActとCoT-SCの組み合わせについて
 ReAct+CoT-SCが最強と述べましたが、具体的にどのようにそれを実現するのか、補足します。

内部知識と外部知識を組み合わせる:
CoT-SCには内部知識によって誤りを犯してしまうため、ReActとCoT-SCの組み合わせを提案する。
ReActで所定のステップ以内に回答を返せなかった場合はReAct→CoT-SCに切り替えて、CoT-SCが所定の回数以下で過半数の回答にならなかった場合、CoT-SC→ReActに切り替える、といった方法で組み合わせる。

まさにここに書かれた内容ですが、初めはReActを使うと決めておいて○○の時にCoT+SCに切り替える、みたいな感じで組み合わせを実現します。それぞれの詳細は以下。

初めがReActの時:ReActが〇回のステップで質問の回答を出せなかった場合、CoT-SCに切り替えます。今回はHotpotQAデータセットでは7回、Feverデータセットでは5回にしていたようです。
初めがCoT-SCの時:CoT-SCで思考させる場合、n個の回答を同時に生成してその中の多数決で結論を決めます。この時、多数決となる回答がn/2回以上生まれなかったらReActに切り替えます。6人が食べたいものを同時に言って、3回やって多数決となる食べ物が出なかったら切り替える的な

細かい実装が書いていないので何とも言えませんが、CoT-SCをpromptとして与えたLLMとReActをpromptとして与えたLLMを用意しておいて、上記の条件に応じて制御していたのではないでしょうか。

意思決定タスク



内容要約

2つの言語ベースの意思決定タスクにおいてReActを検証した。今回はReActとActの比較。

ALFWorld:テキストベースのゲーム(TRPG的なノリのゲームだと解釈しました。詳細は以下の画像を参照)今回はデータセットから3つのタスクについて、(1)目標を分解(2)小目標の進捗を管理(3)次の小目標を決定(4)一般常識を活用して推論、の流れでタスクを解く例示をpromptに入れ込んだ。

実際に使われたprompt

あなたは部屋の真ん中にいます。 周りをすばやく見ると、キャビネット 6、キャビネット 5、キャビネット 4、キャビネット 3、キャビネット 2、キャビネット 1、コーヒーマシン 1、カウンター 3、カウンター 2、カウンター 1、引き出し 3 が見えます。 、引き出し2、引き出し1、冷蔵庫1、ゴミ箱1、電子レンジ1、棚3、棚2、棚1、流し台1、コンロ4、コンロ3、コンロ2、a ストーブバーナー 1、トースター 1. 
あなたのタスクは次のとおりです: きれいなナイフをカウンタートップに置きます。

> Thought: 問題を解決するには、ナイフを見つけて取り、洗面器できれいにしてから、カウンターに置く必要があります。 OK。
> Thought: まず、ナイフを見つける必要があります。 キャビネット(1~6)、引き出し(1~3)、カウンター(1~3)、冷蔵庫(1)、ゴミ箱(1)、棚(1~3)、洗面台(1)にナイフが出現しやすい 、コンロ (1-4)、トースター (1)。 キャビネット 1 から順番に確認できます。
> go to:キャビネット 1 に移動 キャビネット 1 に、ボウル 1 が表示されます。
> go to:キャビネット 2 に移動 キャビネット 2 は閉じています。
~割愛~
> go to:カウンタートップ 2 に移動 カウンタートップ 2 には、カップ 1、皿スポンジ 1、ガラス瓶 3、ナイフ 1、皿 2、ジャガイモ 3、彫像 1 があります。
> Thought: 今、私はナイフを見つけました (1)。 次に、私はそれを取る必要があります。 OK。
>カウンター 2 からナイフ 1 を取り出す カウンター 2 からナイフ 1 を取り出します。
> Thought: 今、私はナイフを取ります (1)。 次に、シンク (1) に行って掃除する必要があります。 OK。
> go to:流し台 1 に行く 流し台 1 には、フォーク 3、レタス 3、スパチュラ 2 があります。
> take:シンク 1 でナイフ 1 をクリーニングする シンク 1 を使用してナイフ 1 をクリーニングします。
> Thought: 今、私はナイフをきれいにしています (1)。 次に、カウンタートップ 1 に/上に置く必要があります。OK。
> go to:カウンタートップ 1 に移動 カウンタートップ 1 には、レタス 2、マグカップ 2、ペッパー シェーカー 1、スプーン 2 があります。
> put:ナイフ 1 をカウンタートップ 1 に/上に置きます。

WebShop:ReActが現実世界の問題に対処できるかどうかを検証するため、WebShopベンチマークの調査を行う。これは現実世界の1.18Mの商品と12kの人間の指示を持つweb shoppingサイトの環境であり、ここからユーザーの指示に基づいて製品を購入する。「検索」「商品を選ぶ」「オプションを選ぶ」「買う」という行動を定義した。

ReActとActによる実際の購入までの例:

結果:
ReActはALFWorldでもWebShopでもActを圧倒する結果となった。ALFWorldに関してみると、ReActは71%の成功率に達しており、ActとBUTLER(ALFWorldが提供するエージェント)より顕著な結果である。Actは正しく目標を解釈することや、状況を正確に把握することに失敗していた。

(ReAct-IMについては後述)

WebShopにおいてもReActは非常に良い結果を残しており、IL(模倣学習)やIL+RL(模倣楽手+強化学習)のスコアを圧倒している。ただ、人間のスコアにはまだほど遠い。

内部推論と外部のフィードバックの価値について
ReActはLLMを使って推論と行動を組み合わせた初のデモである。最も近い先行研究は「Inner Monologue(IM)」であるが、IMは観察と明確な行動のみにしか対応できない。そのため、ReActとIMを組み合わせたReAct-IMでは思考や行動に制限が掛かり、高いスコアを発揮することができていない。

Human-in-the-Loopによる行動修正例
人間がReActの推論をチェックして編集できることを検討した。以下の図では、ReActが起こした誤りを人間が修正し、タスクを成功させることができている様子を示している。LLMのパラメータを調整することができない分、Actなどの手法ではこういった修正を行うことは難しい。

所感

ALFWorldというゲームと、WebShopという商品購入タスクにおいてReActを検証しています。Actよりは確実にReActが良いことが示されています。また、強化学習等々の方法でもReActは優位性があり、promptを調整するだけでそのような結果が出てしまうことは非常に驚きではないでしょうか。。

人間のフィードバックについて

 Human-in-the-Loopによる行動修正例
人間がReActの推論をチェックして編集できることを検討した。以下の図では、ReActが起こした誤りを人間が修正し、タスクを成功させることができている様子を示している。LLMのパラメータを調整することができない分、Actなどの手法ではこういった修正を行うことは難しい。

ReActだと人間がプロンプトを編集して意図した方向にLLMを誘導しやすいということが示唆されています。確かにActだと「○○を検索→XXについて文字を抜き出す→…」みたいな単調な動作の連続なので、モデル自体を弄らないと思考を調整するのが難しそうです。一方、ReActであれば、思考の流れが事細かに記述されるので、promptレベルで調整しやすいと思われます。

結論(関連研究は割愛)

内容要約

我々は、大規模な言語モデルにおいて推論と行動を相乗的に行うための、シンプルかつ効果的な手法であるReActを提案した。質疑応答や意思決定タスクなどの実験を通して、ReActが高いパフォーマンスと解釈可能性を提供することを示す。しかし、大規模で複雑なタスクになるとpromptによる例示等々が入力長制限を超えてしまう。また、HotpotQAにおいてfinetuningを試したが、さらなる能力向上には人間による質の高いアノテーションが求められる。
ReActを様々なタスクの学習に拡張し、強化学習等々と組み合わせることによって、より強力なエージェントが生まれ、LLMの可能性をより多くのアプリケーションで解放することができるだろう。

所感

ReActと論文の概要、ReActの欠点と示唆について述べられています。ReActの欠点ですが、promptの入力長制限に関しては凄い重たそうですよね。過去の思考の流れもpromptに書き込む必要があると思うので、日本語だとかなりカツカツになりそう...
最後の一文ですが、ReActの未来に関する示唆が述べられています。例えば、ReActを様々なタスクに適用して、それぞれについて人間によるフィードバックを与えて修正して、出来たpromptをfinetuningでLLMに学習させればもっと強くなる、とかそういうことだと思います。

まとめ

地味に長かった、、ですが、ReActやCoTについて学ぶことが出来たのではないかと思います。ReActのpromptの例は元の論文のAppendixに沢山転がっているので、実装したい方はそれを参考にしましょう。すぐReAct実装編の記事も書いてみようかと思います。

解釈が間違っている部分等々があれば是非コメント頂けたら嬉しいです!😎

Discussion