ReAct(Reasoning + Acting) 是當前自主 Agent 最核心的基礎執行迴圈。
傳統 Prompt 做法中,模型要么只會「光說不練」(純 Reasoning,如 Chain-of-Thought),要么只會「瞎盲目執行」(純 Acting,直接生成 Tool Call)。而 ReAct 框架透過將 思考(Thought) 與 行動(Action) 交織在一起,讓 LLM 能夠邊思考、邊呼叫工具、邊根據真實世界的回傳結果動態修正下一步策略。
┌────────────────┐
│ User Request │
└───────┬────────┘
│
┌───────────────────────┴───────────────────────┐
▼ │
1. Thought ───► 2. Act (Tool Call) ───► 3. Observe │ (Loop)
(邏輯推理) (發出指令與參數) (環境/API回傳) │
▲ │
└───────────────────────────────────────────────┘
│
[最終結果 (Final Answer)]
Action: web_search(query="Microsoft current stock price market cap")
Observation: {"symbol": "MSFT", "price": "$430.50", "market_cap": "$3.20T"}
假設使用者提問:「請幫我找出並計算 Python requests 專案最新 Release 版本的發佈日期與今天的差距天數。」
ReAct 引擎會生成如下的內部執行軌跡(Trajectory):
User: 請幫我找出並計算 Python requests 專案最新 Release 版本的發佈日期與今天的差距天數。
Thought: 我需要分成三個步驟:1. 查詢 requests 專案的最新 release 日期;2. 取得今天的日期;3. 計算天數差。首先,我先查詢 requests 的最新 release。
Action: get_github_latest_release(repo="psf/requests")
Observation: {"tag_name": "v2.32.3", "published_at": "2024-05-20"}
Thought: 我已經取得 requests 最新版本 (v2.32.3) 的發布日期是 2024-05-20。現在我需要取得今天的日期來計算差距。
Action: get_current_date()
Observation: {"current_date": "2026-10-02"}
Thought: 現在我有兩個日期:2024-05-20 和 2026-10-02。我需要呼叫日期計算工具來算出相差的天數。
Action: calculate_date_difference(start_date="2024-05-20", end_date="2026-10-02")
Observation: {"days_difference": 865}
Thought: 我已經得到了所有必要的資訊。可以整理最終答案回答使用者了。
Final Answer: Python `requests` 最新版本 (v2.32.3) 發布於 2024 年 5 月 20 日,距離今天(2026 年 10 月 2 日)已經過了 865 天。
Thought 步驟,工程師能清楚知道 Agent 的推理過程與除錯(Debug)切入點。404 Not Found 或參數錯誤,Agent 會在下一個 Thought 中自動感知失敗,並修正參數重新發送 Action。Thought → Act → Observe 都是一次完整的 LLM API 呼叫,極易累積高額 Token 與等待時間。Thought → Act 間無窮迴圈直到 Context 上限溢出。為了在生產環境中解決 ReAct 的缺陷,業界目前通常會結合以下幾種優化機制:
Action: ...,而是強制約束輸出 JSON Schema(如 OpenAI/Claude 的 Native Tool Calling),消滅 99% 的格式錯誤。max_turns = 5),避免無效探索。