iT邦幫忙

2026 iThome 鐵人賽

DAY 18
0
自我挑戰組

AI Agent 從零開始系列 第 18 篇

ReAct Think Act Observe

  • 分享至 

  • xImage
  •  

ReAct(Reasoning + Acting) 是當前自主 Agent 最核心的基礎執行迴圈。

傳統 Prompt 做法中,模型要么只會「光說不練」(純 Reasoning,如 Chain-of-Thought),要么只會「瞎盲目執行」(純 Acting,直接生成 Tool Call)。而 ReAct 框架透過將 思考(Thought) 與 行動(Action) 交織在一起,讓 LLM 能夠邊思考、邊呼叫工具、邊根據真實世界的回傳結果動態修正下一步策略。


一、 ReAct 的標準三部曲:Thought $\rightarrow$ Act $\rightarrow$ Observe

                       ┌────────────────┐
                       │  User Request  │
                       └───────┬────────┘
                               │
       ┌───────────────────────┴───────────────────────┐
       ▼                                               │
 1. Thought  ───►  2. Act (Tool Call)  ───►  3. Observe │ (Loop)
   (邏輯推理)          (發出指令與參數)         (環境/API回傳)  │
       ▲                                               │
       └───────────────────────────────────────────────┘
                               │
                       [最終結果 (Final Answer)]

1. Thought(思考 / 推理)

  • 任務:LLM 分析當前目標與歷史紀錄,進行「下一步該做什麼」的推理。
  • 範例:「使用者詢問微軟目前的股價與市值,但我沒有即時網路資料。我需要先搜尋微軟(MSFT)的最新股價資訊。」

2. Act(行動 / 執行工具)

  • 任務:根據 Thought 的決策,輸出結構化的工具呼叫指令(Tool Name + Arguments)。
  • 範例:Action: web_search(query="Microsoft current stock price market cap")

3. Observe(觀察 / 環境反饋)

  • 任務:外部系統執行該 Action 後,將 API 或函式回傳的真實結果(Observation)餵回給 LLM 的 Context Window 中。
  • 範例:Observation: {"symbol": "MSFT", "price": "$430.50", "market_cap": "$3.20T"}

二、 ReAct 實戰:以「解決實際問題」為例的完整對話軌跡

假設使用者提問:「請幫我找出並計算 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 天。


三、 ReAct 的核心優勢與痛點分析

🌟 核心優勢

  1. 高可解釋性(Explainability):透過可視化的 Thought 步驟,工程師能清楚知道 Agent 的推理過程與除錯(Debug)切入點。
  2. 動態容錯性(Error Recovery):如果 Observation 回傳 404 Not Found 或參數錯誤,Agent 會在下一個 Thought 中自動感知失敗,並修正參數重新發送 Action。
  3. 可擴充性(Extensibility):LLM 不需要硬記全世界的資料,只需具備正確推理與對應 API 規格的調用能力。

⚠️ 落地痛點與潛在風險

  1. 高延遲與 Token 消耗:每一輪 Thought → Act → Observe 都是一次完整的 LLM API 呼叫,極易累積高額 Token 與等待時間。
  2. 無限死迴圈(Infinite Loop):當 API 持續丟出不合預期的異常值(例如 API 限流 429)時,若無監控機制,Agent 可能會在 Thought → Act 間無窮迴圈直到 Context 上限溢出。
  3. 動作幻覺(Action Hallucination):模型可能發送不存在的工具名稱,或傳入不符合 JSON Schema 的參數。

四、 現代工程如何優化 ReAct?

為了在生產環境中解決 ReAct 的缺陷,業界目前通常會結合以下幾種優化機制:

  1. Structured Outputs / Native Function Calling:
    不讓模型用純文字格式輸出 Action: ...,而是強制約束輸出 JSON Schema(如 OpenAI/Claude 的 Native Tool Calling),消滅 99% 的格式錯誤。
  2. Max Iterations Guardrail(極限輪次防護):
    在 Engine 中設定最大迴圈次數(例如 max_turns = 5),避免無效探索。
  3. ReAct + Reflection(自我反思):
    當 ReAct 迴圈連三次遭遇相同錯誤時,觸發高階模型的 Reflection 機制,主動評估是否需要更換解決問題的策略方向。

上一篇
Agent 到底需要 Planning 嗎?
系列文
AI Agent 從零開始 共 18 篇
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言