{"notes":[{"id":"transformers/react","category":"transformers","legacyPath":"","legacySlug":"","legacyPaths":[],"title":"ReAct","subtitle":"知行合一","author":"Z. Yuan","paperDate":"2022-10-06","publishedOn":"2026-07-03","world":"external/react","paperTitle":"ReAct: Synergizing Reasoning and Acting in Language Models","paperUrl":"https://arxiv.org/abs/2210.03629","bibliography":{"title":"ReAct: Synergizing Reasoning and Acting in Language Models","authors":["Shunyu Yao","Jeffrey Zhao","Dian Yu","Nan Du","Izhak Shafran","Karthik Narasimhan","Yuan Cao"],"url":"https://arxiv.org/abs/2210.03629","pdfUrl":"https://arxiv.org/pdf/2210.03629v3","codeUrl":null,"preprint":{"id":"2210.03629","submittedOn":"2022-10-06","url":"https://arxiv.org/abs/2210.03629"},"publication":null,"citation":"@misc{transformersreact2022,\n  title = {{ReAct: Synergizing Reasoning and Acting in Language Models}},\n  author = {Shunyu Yao and Jeffrey Zhao and Dian Yu and Nan Du and Izhak Shafran and Karthik Narasimhan and Yuan Cao},\n  year = {2022},\n  eprint = {2210.03629},\n  archivePrefix = {arXiv},\n  url = {https://arxiv.org/abs/2210.03629}\n}\n","citationPath":"/content/papers/citations/transformers/react.0a6bd417f7a8.bib"},"thumbnail":{"src":"/content/papers/assets/ae2cd6d5c68df8887227719a0ac6c5dee8763fa902af5af73260fdc0f1ca81cc.png","width":1122,"height":489},"locale":"zh-hant","path":"/content/papers/zh-hant/transformers/react.05389826d0f1.md","headings":[{"id":"定義問題","text":"定義問題","depth":2},{"id":"解決問題","text":"解決問題","depth":2},{"id":"把想也當成一種動作","text":"把「想」也當成一種動作","depth":3},{"id":"一個極簡的維基百科工具","text":"一個極簡的維基百科工具","depth":3},{"id":"怎麼讓模型這樣做","text":"怎麼讓模型這樣做？","depth":3},{"id":"什麼時候該相信自己","text":"什麼時候該相信自己？","depth":3},{"id":"討論","text":"討論","depth":2},{"id":"知識任務的結果","text":"知識任務的結果","depth":3},{"id":"錯在哪裡","text":"錯在哪裡？","depth":3},{"id":"小模型微調後反而最好","text":"小模型微調後反而最好","depth":3},{"id":"不只是問答","text":"不只是問答","depth":3},{"id":"不靠框架也做得出來","text":"不靠框架也做得出來","depth":3},{"id":"結論","text":"結論","depth":2}],"anchorAliases":{},"guide":null,"relatedReading":[]}],"text":"2022 年，Chain-of-Thought（CoT）讓大家發現：請大型語言模型「一步一步想」，它在算術、常識推理上的表現會明顯變好。\n\n但 CoT 有個問題：它只在自己腦袋裡想。\n\n模型用的是參數裡記住的知識，想到一半記錯了一件事，後面每一步都會建立在這個錯誤上，最後很有條理地推出一個錯誤答案。\n\n另一邊，也有研究讓語言模型在環境裡**行動**：規劃機器人的動作、在網頁上點按鈕、呼叫搜尋引擎。但這些做法多半只預測動作，很少讓模型停下來想一想現在的狀況。\n\n這篇來自普林斯頓大學與 Google Research（Brain 團隊）的論文，發表於 ICLR 2023，提議把兩件事交錯著做：**想一步，做一步，看結果，再想下一步**。作者把它叫做 ReAct，取自 Reasoning 加 Acting。\n\n這也是後來許多「會自己查資料的 agent」最常被追溯的起點之一。\n\n## 定義問題\n\n先看論文用來說明問題的例子。題目來自 HotpotQA，一個需要結合多份維基百科資料的多跳問答資料集：\n\n> 除了 Apple Remote 之外，還有什麼裝置可以控制 Apple Remote 原本設計要搭配的程式？\n\n要回答這題，得先知道 Apple Remote 原本是搭配哪個程式，再查那個程式還能用什麼控制。\n\n作者讓模型用四種方式回答：\n\n[![HotpotQA 問題的四種解法比較：Standard、CoT、Act-Only 皆答錯，ReAct 交錯思考與搜尋後答對](/content/papers/assets/ae2cd6d5c68df8887227719a0ac6c5dee8763fa902af5af73260fdc0f1ca81cc.png)](/content/papers/assets/ae2cd6d5c68df8887227719a0ac6c5dee8763fa902af5af73260fdc0f1ca81cc.png)\n\n*原論文 Figure 1(1)，取自 [**v3 PDF 第 2 頁**](https://arxiv.org/pdf/2210.03629v3#page=2)，CC BY 4.0。紅色標示錯誤或幻覺，綠色標示從搜尋得到的正確資訊；原圖下半部的 ALFWorld 例子未截取。*\n\n**(1a) Standard**：直接回答「iPod」。錯。\n\n**(1b) CoT**：模型開始一步一步想：「Apple Remote 原本是設計來搭配 Apple TV 的；Apple TV 可以用 iPhone、iPad 和 iPod Touch 控制。」推理過程很流暢，但第一句就是錯的，紅色標起來的部分都是幻覺。答案當然也錯了。\n\n**(1c) Act-Only**：只搜尋、不思考。模型搜了 Apple Remote，又搜了 Front Row，甚至找到了「Front Row (software)」。但它沒辦法從這些觀察中整理出答案，最後回答「yes」。\n\n**(1d) ReAct**：\n\n- **Thought 1**：我需要搜尋 Apple Remote，找出它原本是搭配哪個程式。\n- **Act 1**：`Search[Apple Remote]`\n- **Obs 1**：Apple Remote 是 Apple 在 2005 年推出的遙控器……原本設計用來控制 **Front Row 媒體中心**程式。\n- **Thought 2**：原本是搭配 Front Row。接下來要搜尋 Front Row，看還有什麼能控制它。\n- **Act 2**：`Search[Front Row]`\n- **Obs 2**：找不到 [Front Row]。類似的條目：「Front Row Seat to Earth」、「Front Row Motorsports」、「Front Row (software)」……\n- **Thought 3**：找不到 Front Row，我改搜 Front Row (software)。\n- **Act 3**：`Search[Front Row (software)]`\n- **Obs 3**：Front Row 是一個已停止開發的媒體中心軟體……\n- **Thought 4**：Front Row (software) 可以用 Apple Remote 或**鍵盤功能鍵**控制。所以答案是鍵盤功能鍵。\n- **Act 4**：`Finish[keyboard function keys]`\n\n答對了。\n\n這四種方式對照下來，問題就很清楚：\n\n- **只想不查**（CoT），會被自己記錯的事實帶偏。\n- **只查不想**（Act），拿到了資料卻不知道怎麼用。\n\n作者想知道的是：**讓推理和行動交錯進行，能不能各補對方的缺點？**\n\n## 解決問題\n\n### 把「想」也當成一種動作\n\n作者先用代理人（agent）的框架描述問題。\n\n在時間 $t$，代理人收到環境的觀察 $o_t$，根據到目前為止的脈絡 $c_t=(o_1,a_1,\\dots,o_{t-1},a_{t-1},o_t)$ 選擇動作 $a_t$。\n\nReAct 的想法只有一句話：**把動作空間擴大，加入語言。**\n\n$$\n\\hat{\\mathcal{A}}=\\mathcal{A}\\cup\\mathcal{L}\n$$\n\n$\\mathcal{A}$ 是原本能對環境做的動作，例如搜尋；$\\mathcal{L}$ 是語言空間。從 $\\mathcal{L}$ 選出來的「動作」，就是一段**思考**（thought）。\n\n思考不會改變環境，所以不會得到新的觀察。它的作用是整理目前的脈絡，把結果寫進去，讓下一步可以用：\n\n$$\nc_{t+1}=(c_t,\\hat{a}_t)\n$$\n\n上面的例子裡，思考做了好幾種事：拆解問題（Thought 1）、從觀察裡抓出重點（Thought 2、4）、遇到例外時調整計畫（Thought 3）、最後整理出答案（Thought 4）。\n\n### 一個極簡的維基百科工具\n\n在 HotpotQA 和 FEVER 這兩個知識任務上，作者設計了一個很陽春的維基百科 API，只有三個動作：\n\n1. **`search[entity]`**：如果有這個條目，回傳頁面的前 5 句；沒有的話，列出搜尋引擎找到的前 5 個相似條目。\n2. **`lookup[string]`**：回傳目前頁面中下一個包含這個字串的句子，就像在瀏覽器裡按 Ctrl+F。\n3. **`finish[answer]`**：提交答案，結束任務。\n\n作者特別說明，這組動作大多只能憑精確的條目名稱取回一小段內容，遠比當時最好的詞彙或神經檢索器弱。這是刻意的：他們想模擬人類查維基百科的方式，逼模型用語言推理決定該查什麼。\n\nFEVER 是事實查核資料集，每個陳述要判斷為「支持」、「反駁」或「資訊不足」。兩個任務都只給模型問題或陳述，不給任何參考段落。\n\n### 怎麼讓模型這樣做？\n\n這篇論文沒有訓練新模型。主要實驗使用凍結的 PaLM-540B，只靠提示詞裡的少量示範。\n\n作者從訓練集隨機挑出 HotpotQA 6 題、FEVER 3 題，人工寫出完整的「思考、動作、觀察」軌跡，放在提示詞裡當範例。作者也提到，再多放範例並沒有幫助。\n\n推論時的流程，可以寫成一個迴圈：\n\n```python\ndef react(question, llm, tools, examples, max_steps=7):\n    prompt = examples + f\"Question: {question}\\n\"\n    for step in range(1, max_steps + 1):\n        # 模型接著寫出這一步的思考與動作，例如：\n        # \"Thought 2: ...\\nAct 2: Search[Front Row]\"\n        output = llm(prompt, stop=[f\"Obs {step}:\"])\n        prompt += output\n\n        action, arg = parse_action(output)          # 例如 (\"search\", \"Front Row\")\n        if action == \"finish\":\n            return arg\n\n        observation = tools[action](arg)            # 呼叫維基百科 API\n        prompt += f\"\\nObs {step}: {observation}\\n\"  # 觀察結果接回提示詞\n    return None                                     # 步數用完還沒答出來\n```\n\n這段程式是本文依論文描述整理的示意。關鍵在 `stop`：模型寫完思考和動作後就停下，由程式真正去執行搜尋，再把結果當成觀察接回去。觀察是環境給的，不是模型自己編的。\n\n\n> [!TIP]\n> \n> **思考要多密？**\n> \n> HotpotQA 和 FEVER 這類以推理為主的任務，作者讓思考和動作嚴格交替，每一步都先想再做。\n> \n> 但在 ALFWorld 這種文字冒險遊戲裡，完成一個任務可能需要幾十個動作，像是「走到流理台 1」、「打開抽屜 2」。每一步都想一遍並不實際，所以作者讓模型自己決定什麼時候插入思考，通常是在規劃、追蹤進度或計畫需要改變的時候。\n\n\n### 什麼時候該相信自己？\n\n作者在分析結果時發現，ReAct 和 CoT 各有長處：ReAct 比較依據事實，CoT 比較擅長組織推理結構。\n\n所以他們設計了兩種混合方式。這裡的 CoT-SC 是 CoT 的自我一致性（self-consistency）版本：以溫度 0.7 抽樣 21 條推理，取多數決的答案。\n\n- **ReAct → CoT-SC**：ReAct 在限定步數內答不出來，就退回 CoT-SC。HotpotQA 限 7 步，FEVER 限 5 步；作者統計，答對的軌跡中需要用滿 7 步或 5 步的，只佔 0.84% 和 1.33%。\n- **CoT-SC → ReAct**：如果 $n$ 個 CoT-SC 樣本中，多數答案出現的次數少於 $n/2$，代表模型對自己的知識沒把握，就改用 ReAct 去查。\n\n## 討論\n\n### 知識任務的結果\n\n| 方法 | HotpotQA（EM） | FEVER（準確率） |\n| --- | ---: | ---: |\n| Standard | 28.7 | 57.1 |\n| CoT | 29.4 | 56.3 |\n| CoT-SC | 33.4 | 60.4 |\n| Act | 25.7 | 58.9 |\n| ReAct | 27.4 | 60.9 |\n| CoT-SC → ReAct | 34.2 | **64.6** |\n| ReAct → CoT-SC | **35.1** | 62.0 |\n| 監督式 SoTA | 67.5 | 89.5 |\n\n*整理自原論文 Table 1，模型為 PaLM-540B。*\n\n先看 ReAct 和 Act：兩個任務上 ReAct 都比較好。一樣能搜尋，多了思考，最後整理答案的能力就不同。\n\n再看 ReAct 和 CoT：FEVER 上 ReAct 贏（60.9 對 56.3）；HotpotQA 上反而略輸（27.4 對 29.4）。作者的解釋是，FEVER 的「支持」和「反駁」有時只差一點細節，查到準確的資料特別重要。\n\n最好的結果來自兩種混合方式：HotpotQA 是 ReAct → CoT-SC 的 35.1，FEVER 是 CoT-SC → ReAct 的 64.6。作者另外畫了隨抽樣數變化的曲線，兩種混合方式只要 3 到 5 個樣本，就能達到 CoT-SC 用 21 個樣本的成績。\n\n但也要注意最後一列：這些提示方法都離監督式訓練的最佳模型很遠。HotpotQA 的 67.5、FEVER 的 89.5，都是專門訓練的系統。\n\n### 錯在哪裡？\n\n為了理解 ReAct 和 CoT 在 HotpotQA 上的差異，作者從兩者各抽 50 條答對、50 條答錯的軌跡，共 200 條，人工標註成功與失敗的類型：\n\n| 類型 | 說明 | ReAct | CoT |\n| --- | --- | ---: | ---: |\n| 成功：真陽性 | 推理和事實都正確 | 94% | 86% |\n| 成功：假陽性 | 答對了，但推理或事實是編的 | 6% | 14% |\n| 失敗：推理錯誤 | 推理錯誤，包括陷入重複步驟出不來 | 47% | 16% |\n| 失敗：搜尋結果錯誤 | 搜尋沒有回傳，或沒有有用資訊 | 23% | — |\n| 失敗：幻覺 | 推理或事實是編的 | 0% | 56% |\n| 失敗：標籤歧義 | 答案是對的，但和標準答案用字不同 | 29% | 28% |\n\n*整理自原論文 Table 2。成功與失敗各自計算比例。*\n\n這張表很值得細看。\n\n**幻覺是 CoT 最大的問題**。CoT 答錯的案例裡，56% 是幻覺；就算答對，也有 14% 是靠編出來的推理碰巧答對。ReAct 答錯的案例裡，幻覺是 0%。\n\n**但 ReAct 有自己的毛病**。它的推理錯誤佔失敗的 47%，遠高於 CoT 的 16%。作者觀察到一個 ReAct 特有的錯誤模式：模型不斷重複先前的思考和動作，跳不出迴圈。思考、動作、觀察交錯的結構，讓推理更有依據，也讓推理比較不靈活。\n\n**搜尋失敗會讓 ReAct 脫軌**。23% 的失敗來自搜尋沒找到有用的資訊，模型很難從這種情況中重新組織思路。\n\n作者也發現，有些 HotpotQA 題目的標準答案已經過時。\n\n### 小模型微調後反而最好\n\n只用提示詞的話，ReAct 在 PaLM-8B 和 62B 上是四種方法裡最差的：小模型很難只從幾個範例就同時學會推理和行動。\n\n作者接著用 ReAct 自己產生、而且答對的 3,000 條軌跡來微調小模型。結果翻轉了：\n\n- 微調後的 PaLM-8B ReAct，勝過所有 PaLM-62B 的提示方法。\n- 微調後的 PaLM-62B ReAct，勝過所有 PaLM-540B 的提示方法。\n\n微調 Standard 或 CoT 的效果則差很多。作者的解釋是，前者等於教模型背下（可能有幻覺的）事實，後者教的是「怎麼推理、怎麼去維基百科查」，是比較能推廣的技能。\n\n### 不只是問答\n\n作者也在兩個互動式決策任務上測試：\n\n- **ALFWorld**：文字版的居家任務遊戲，例如找到胡椒罐放進抽屜。最好的 ReAct 試驗平均成功率 71%，只行動不思考的 Act 最好是 45%，模仿學習方法 BUTLER 是 37%。\n- **WebShop**：一個有 118 萬件真實商品的模擬購物網站，依使用者描述找出符合條件的商品。\n\n摘要總結：在這兩個任務上，只用一到兩個示範的 ReAct，成功率分別比模仿學習與強化學習方法高出 34 與 10 個百分點，而後者用了 $10^3$ 到 $10^5$ 筆的任務資料訓練。\n\n### 不靠框架也做得出來\n\nReAct 的另一個吸引力，是它簡單到幾乎不需要框架。\n\n2023 年 3 月，Simon Willison 寫了一篇[**簡單的 Python 實作**](https://til.simonwillison.net/llms/python-react-pattern)：用 `gpt-3.5-turbo`，系統提示要求模型依序輸出 Thought、Action、PAUSE、Observation，最後給出 Answer；程式用正規表示式抓出 `Action:` 那一行，執行對應的工具（維基百科搜尋、他自己的部落格搜尋、計算機），再把結果當成 `Observation:` 送回去，最多跑五輪。\n\n他也在文中提醒，計算機工具直接用了 Python 的 `eval()`，非常危險，應該放進 WebAssembly 這類沙盒；整個實作也還很不穩健。\n\n讓模型決定要呼叫什麼工具，安全與穩健性就成了工程上必須面對的事。這點在論文裡著墨不多。\n\n## 結論\n\nReAct 的核心只有一個改動：**把「思考」加進代理人的動作空間**，讓語言模型在推理和行動之間交錯進行。\n\n論文的證據顯示：\n\n1. **只查不想，用不好資料**。同樣能搜尋，ReAct 在 HotpotQA 和 FEVER 都勝過只行動的 Act。\n2. **只想不查，容易幻覺**。CoT 答錯的案例中 56% 是幻覺，ReAct 是 0%；但 ReAct 的推理錯誤較多，也會陷入重複迴圈。\n3. **兩者互補效果最好**。依信心或步數在 ReAct 與 CoT-SC 之間切換，在兩個知識任務上都拿到最佳的提示結果。\n4. **微調能放大效果**。用 3,000 條軌跡微調後，小模型的 ReAct 勝過大模型的各種提示方法。\n\n這些提示方法仍然遠落後於專門訓練的系統，所用的維基百科工具也刻意做得很弱。\n\n但「想一步，查一步，看結果，再想下一步」這個迴圈留了下來。後來會自己搜尋檔案、執行指令的 coding agent，做的事情大致也是這樣，只是工具從三個維基百科動作，換成了 grep、讀檔和終端機。\n","imageSizes":{"/content/papers/assets/ae2cd6d5c68df8887227719a0ac6c5dee8763fa902af5af73260fdc0f1ca81cc.png":{"width":1122,"height":489}}}
