AIに調べものをさせるとき、一度に全部やらせるか、1手ごとに結果を見て次を決めるかで進め方が分かれます。後者がReActパターンです。
違いが出るのは、前提が途中で崩れたときです。今回は在庫0の商品について「いつ届くか」を答えさせました。一度に答える構成は「明日発送します」と返しました。在庫はありません。
前提が崩れる場面を用意して、2つの構成に答えさせました。観察をはさまない構成は、誤った前提のまま最後まで進みます。
ReActパターンの効果を確かめるため、実際に動かしました。題材は在庫が0の商品について「いつ届くか」を聞かれた場面です。
一度に答える構成では、最初に「在庫を確認する」「発送予定日を伝える」という計画を立てます。在庫があることを前提にした計画です。
function answerWithObservation(itemId) {
const steps = [];
const item = DB[itemId];
steps.push({ step: '在庫を確認する', observed: `stock=${item.stock}` });
if (item.stock > 0) {
return { answer: `${item.name}は明日発送します`, correct: true };
}
// 観察した結果に応じて、計画になかった手順へ切り替える
steps.push({ step: '在庫切れと判明。取り寄せ日数を確認する', observed: `restockDays=${item.restockDays}` });
return { answer: `${item.name}は在庫切れです。取り寄せに${item.restockDays}日かかります`, correct: true };
}
在庫0の商品について「いつ届くか」を聞かれたとき --- 一度に答える --- 1. 在庫を確認する 2. 発送予定日を伝える 回答: 青いシャツは明日発送します 正しいか: 誤り(在庫がないのに発送すると答えた) --- 観察をはさむ --- 1. 在庫を確認する → stock=0 2. 在庫切れと判明。取り寄せ日数を確認する → restockDays=14 3. 取り寄せを案内する → 案内文を作成 回答: 青いシャツは在庫切れです。取り寄せに14日かかります 正しいか: 正しい 手数: 2手 と 3手 正答: 0件 と 1件
答えが分かれました。一度に答える構成は「明日発送します」と返しています。在庫を確認する手順自体は実行しているのに、その結果を使っていません。
ここが分かりにくい点です。手順としては在庫を確認しています。ただ確認した結果に応じて次を変える仕組みがないため、計画どおり発送日を答えてしまいます。
観察をはさむ構成では、stock=0 という結果を見た時点で分岐します。計画には無かった「取り寄せ日数を確認する」手順が追加されました。
Anthropicはこの点を明確に述べています。実行の各段階で環境から確かな事実を得ることが、進捗を判断するうえで欠かせないとし、ツールの呼び出し結果やコードの実行結果を例に挙げています。
つまりReActの要点は、行動そのものではなく行動の結果を次の判断に使うことにあります。
確認する手順があっても、結果を使わなければ答えは変わらない。
During execution, it's crucial for the agents to gain "ground truth" from the environment at each step (such as tool call results or code execution) to assess its progress.原文Anthropic Engineering「Building effective agents」 この内容の有効期限2027-02-17
前提が崩れうる仕事だけです。崩れない仕事では答えが同じになり、手数と費用だけが増えます。
ReActパターンを採用するかどうかは、前提が崩れる場面があるかで決まります。前の節の実測に、その答えが出ています。
実は同じ実験を、在庫が5個ある商品でも行いました。結果はどちらの構成も正しく答えています。
計画どおりに進む場合、観察をはさんでも判断は変わりません。変わるのは手数だけで、1手多く呼び出すぶん費用と時間が増えます。
4番目に注意してください。定型の処理をReActにすると、遅くて高い構成になるだけです。
繰り返す構成には、終わらなくなるという固有のリスクがあります。観察して、また行動して、また観察して。条件が満たされないまま回り続けることがあります。
Anthropicも、完了で終わるのが通常だとしつつ、繰り返しの上限のような停止条件を設けて制御を保つのが一般的だと述べています。上限は必ず決めておいてください。
前提が崩れないなら、観察は手数を増やすだけ。まずそこを確かめる。
手順が決まっている場合の構成は決定的ワークフローの記事、先に計画を立てる進め方はPlan-and-Executeの記事で扱っています。
The task often terminates upon completion, but it's also common to include stopping conditions (such as a maximum number of iterations) to maintain control.原文Anthropic Engineering「Building effective agents」 この内容の有効期限2027-02-17
考える、動く、結果を見る。この3つを繰り返します。名前は Reasoning と Acting を組み合わせたものです。
ReActパターンは、考えることと動くことを交互に繰り返す進め方です。名前もReasoning(推論)とActing(行動)から来ています。
1周は3つの部分でできています。次に何をするかを考える、実際にツールを呼ぶ、返ってきた結果を見る。そして見た結果をもとに、また次を考えます。
人が調べものをするときの動きに近い形です。検索して、結果を見て、思っていたのと違えば別の言葉で検索し直す。その繰り返しをコードで表現したものになります。
繰り返しの途中で止めることも可能です。Anthropicは、エージェントが区切りの時点や行き詰まったときに、人の判断を求めて一時停止できると述べています。
この停止を組み込むと、危ない操作の前に確認を挟む構成になります。詳しくはHITLの記事で扱っています。
ReActという名前で紹介される実装でも、実際には結果を見ずに進んでいるものがあります。前の節の実測がその例で、在庫を確認する手順はあるのに結果を使っていませんでした。名前ではなく、分岐があるかどうかで判断するのが確実だと編集部は考えています。
Agents can then pause for human feedback at checkpoints or when encountering blockers.原文Anthropic Engineering「Building effective agents」 この内容の有効期限2027-02-17
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る