上一篇的 Chain of Thought (CoT) 推理與逐步思考介紹,讓 AI 可以拓展他的思路,也能讓我們看到他是如何推導出結論的,這樣 AI 的輸出不再是黑箱作業,而是能公開在太陽底下 XXD。不過即使透過 CoT 讓 AI 有了推理能力,也都是在他所知的資料中來回推導,卻無法從外吸取知識並與之互動,所以某些情況下仍稍嫌不足。
因此在多數任務中,我們還希望 AI 可以根據思路採取行動,例如從網路上搜尋資料、執行對應的指令,或是和外部工具互動 ... 等等,所以就這樣誕生了 ReAct 模式 (Reasoning + Acting)。
ReAct 模式結合了推理 (Reasoning) 和行動 (Acting),除了希望 AI 模擬思考過程中,也期望 AI 可以在必要時觸發一些操作,並且將結果納入下一步的推理中。
簡單來說,AI 在 ReAct 模式下就像是一個 Agent 助手,可以根據邏輯判斷決定是否要向外部取得資料?該搜尋什麼資料?然後再回到推理過程中,繼續他的下一步思考。
如果做成循環圖就像這樣:
我們今天想要分析蘋果公司 2023 年的財報,我使用 CoT 請 AI 進行分析,使用以下的提示詞:
分析蘋果公司 2023 年財報。請一步步思考並詳細說明你的分析過程,最後再給出總結。
AI 會寫出他的思考過程並提供一份包含營收成長、各產品線比較,未來展望 ... 等的完整總結,雖然看起來很完整,但 AI 是根據他腦袋的資訊作答,可能過時或不準確
改用 ReAct 模式的話,即使給他一段簡單的提示詞,他也會採取行動,例如:
分析蘋果公司 2023 年的財報
ReAct 就會用我們剛剛講到的循環來運作:Thought -> Action -> Observation。他的第一個思考 (Thought) 可能是「我需要取得蘋果 2023 年的財報資料」,然後觸發行動 (Action) 去搜尋 Apple 2023 annual report 之類的關鍵字,再觀察 (Observation) 資料發現「Apple 營收 3830 億美元,較去年下降 3%」。
AI 接收到以上資訊後,再產生下一個思考 (Thought),然後行動、觀察.... 直到他覺得找到了正確的答案為止:
Thought: 我需要先取得蘋果公司 2023 年的財報數據
Action: 搜尋 Apple 2023 annual report
Observation: 找到官方財報,營收 3830 億美元,較去年下降 3%
Thought: 需要進一步了解各產品線的表現
Action: 查找 Apple 2023 iPhone iPad Mac revenue breakdown
Observation: iPhone 營收 2006 億,下降 2.4%;服務營收 851 億,成長 8.2%
Thought: 現在我有足夠數據進行分析了
Action: 整合資料撰寫分析報告
(基於最新、最準確的資料進行分析)
這種邊想邊做的特性還蠻符合人類的,所以也能讓 AI 處理多步驟、高互動的複雜任務,也讓 AI 從單純的語言模型變成了一個能主動代理我們事務的助手 (Agent)
介紹到此,大家可能隱約感覺到 ReAct 模式好像是偏向系統層面的能力,那我們可以透過提示詞請 AI 模擬 ReAct 嗎?答案是可以的!最簡單的指令是在提示詞中寫下:
請先解釋你的推理過程,然後列出需要採取的行動,最後根據行動的結果更新答案
進階的技巧是將可用的行動定義清楚,並且在提示詞明確告知 AI 可以使用的工具,例如:
你可以執行以下行動:
- Search[關鍵字]:網路搜索
- Calculate[表達式]:數學計算
請用以下格式:
Thought: [你的思考過程]
Action: [行動名稱和參數]
Observation: [行動結果]
... (重複直到完成任務)
當然也能結合我們前面一再提到的 Few-shot 少量範例,這次要提供 AI 的是一個完整的 ReAct 範例,從 Thought 到 Action 再到 Observation,然後再讓他依樣畫葫蘆,處理我們指定的任務:
你是一個基於 ReAct (Reasoning and Acting) 原則的 AI,需通過迭代的推理 (Thought)、行動 (Action) 和觀察 (Observation) 來解決問題。請嚴格遵循以下格式回答:
範例任務:「查詢今天台北的氣溫並生成一個簡單的圖表展示」
你可以執行以下行動:
- Search[關鍵字]:網路搜索
- GenerateChart[圖表參數]:生成數據可視化的圖表
Thought: 我需要先查詢今天台北的氣溫數據。
Action: Search[台北 2025 年 9 月 16 日 氣溫]
Observation: 根據搜尋結果,2025 年 9 月 16 日台北的氣溫預報為 29°C 至 33°C,白天多雲,夜間晴朗。
Thought: 我已經取得了氣溫數據,現在需要產生一個圖表來顯示日間和夜間的氣溫。
Action: GenerateChart[{ labels: ["Day", "Night"], data: [33, 29], type: "bar", title: "Taipei Temperature on Sep 16, 2025", yAxis: "Temperature (°C)" }]
Observation: 圖表已生成,顯示白天氣溫 33°C,夜間氣溫 29°C。
你的任務:請處理以下任務,並按照上述 ReAct 格式回答:
「[你的具體任務]」
我的具體任務是希望他「查詢 2025 年 8 月台北的氣溫並生成一個簡單的圖表展示」,這是 Gemini 2.5 pro 的回應:
大家可以發現,雖然用了 ReAct 提示詞,但 AI 並沒有真的去搜尋或產生圖表,因為他的首要任務是學會並複製這個格式,而不是真的呼叫自己的工具。如果今天我們的需求是觸發 ReAct 中的工具,就不需要提供這麼複雜的 ReAct 模板,直接下達任務就可以,例如:
查詢 2025 年 8 月台北的氣溫並生成一個簡單的圖表展示
AI 就會自動搜尋並產生圖表:
讓我們來下個結論:
當我希望 AI 學習一個固定的思考框架時,我可以定義不存在的行動,例如 AnalyzeStrengths[data]
或 AnalyzeWeaknesses[data]
,並要求 AI 使用 ReAct 格式幫我完成一個 SWOT 商業分析,AI 就會模擬執行這些步驟,一步步的展示他的商業洞察過程。
而在進一步的實務應用上,ReAct 的設計會搭配工具調用的框架 (例如 LangChain 或自動代理系統),直接執行模型輸出的行動指令,形成一個真正的 ReAct 流程。因此以上述例子來說,我只要輸入一句提示詞:查詢 2025 年 8 月台北的氣溫並生成一個簡單的圖表展示
,就能調用工具解決我的需求。
模擬是為了教 AI 如何思考,真實觸發是為了解決問題(任務),這是兩者之間的差別。
ReAct 是一種系統架構,一般使用者不需要手動寫 ReAct,因為整個流程是在後台自動發生的。但對於想要打造工具的開發者,我們可以自己設計 ReAct 流程,並將其寫入到系統提示詞中。
如果我們想做一個可以串接工具的 AI 應用,例如可以自動訂機票的 AI 助理,這時候 ReAct 的設計就派上用場了,我們會在系統提示詞中教 AI 如何在我們設計的環境中執行。實務流程可以這樣看:
我們先定義 AI 可以使用的工具有哪些
def google_search(query): ...
def query_database(sql): ...
def send_email(to, subject, body): ..
我們會在這裡設計 ReAct 提示詞
你是一個強大的 AI 助理。你可以使用以下工具:
- Search[關鍵字]:...
- SendEmail[收件者, 主旨, 內容]:...
當你需要使用工具時,請嚴格按照以下格式回應:
- Thought: [你的思考]
- Action: [工具名稱[參數]]
當你獲得所有資訊,請用 Final Answer: 格式回答。
我們程式會這樣執行:
1. 拿著使用者問題和系統提示詞去問 AI。
⬇️
2. AI 回應的不是答案,而是一串文字,例如 Thought: ... Action: Search[...]
⬇️
3. 程式會解析這串文字,並執行 Google Search(...)
⬇️
4. 程式把搜尋結果 (Observation) 打包再丟回給 AI。
⬇️
5. AI 收到 Observation 後產生新的 Thought 和 Action...,以上步驟不斷循環,直到 AI 覺得資訊足夠了,最後它會回應 Final Answer: XXXX 答案。
ReAct 讓 AI 從單純的一問一答變成可以推理並採取行動的代理,補足了 CoT 的不足。
在這過程要注意的是定義行動邊界,讓 AI 安全有效的行動,而不是拿到無限上綱的權限,因為當推理與行動結合的那一刻起,AI 就不再只是知識的搬運工,而是與你相輔相成的協作者。