在這個章節我們要繼續延續前一個已經完成的工具調用擴展,升級為「會自己決定跑幾輪」的 Agent,理解 Memory、規劃
其核心原則:Agent = 一個「Thought → Action → Observation」不斷循環、直到任務完成的迴圈

首先,Agent 的本質就是 ReAct 迴圈(Reasoning + Acting):

85282-hz8vauukk25.png

Thought(想:我現在需要什麼?)
   → Action(做:呼叫哪個工具、什麼參數)
      → Observation(看:工具回了什麼)
         → 回到 Thought…(資訊夠了嗎?不夠繼續,夠了就 Final Answer)

Memory(記住上下文與長期事實)+ Planning(把大任務拆成小步驟)。

接下來就來進行 ReAct 探討與開發

ReAct 迴圈

python agent_lab.py react --task "台北現在幾度?再幫我把那個溫度乘以 2"

執行結果:

任務:台北現在幾度?再幫我把那個溫度乘以 2
(真實 LLM ReAct)

[第1步]
Thought: 用戶想知道台北現在的溫度,之後再將該溫度乘以 2。我需先取得台北的天氣資訊。
Action: get_weather
Action Input: {"city": "台北"}

           Observation:28°C

[第2步]
Thought: 已取得台北目前氣溫為 28°C,接下來將該溫度乘以 2,即 28 × 2 = 56。
Final Answer: 台北現在 28°C,乘以 2 後是 **56**。

相關代碼:

def real_react(task):
    cli, model = _client()
    messages = [{"role": "system", "content": REACT_SYS}, {"role": "user", "content": task}]
    for step_i in range(1, 7):
        # 不傳 temperature:部分模型(如 kimi-k2.6)只接受預設值 1,傳 0 會 400
        out = cli.chat.completions.create(model=model, messages=messages).choices[0].message.content
        print(f"[第{step_i}步]\n{out}\n")
        if "Final Answer:" in out:
            return
        m = re.search(r"Action:\s*(\w+).*?Action Input:\s*(\{.*?\})", out, re.S)
        if not m:
            messages.append({"role": "user", "content": "格式不符,請依規定格式回覆。"}); continue
        tool, targs = m.group(1), json.loads(m.group(2))
        obs = TOOLS.get(tool, lambda **k: "未知工具")(**targs)
        print(f"           Observation:{obs}\n")
        messages.append({"role": "assistant", "content": out})
        messages.append({"role": "user", "content": f"Observation: {obs}"})

任務規劃

python agent_lab.py plan --task "幫公司做一個客服知識庫問答機器人"

執行結果:

任務:幫公司做一個客服知識庫問答機器人
(真實 LLM 規劃)

規劃出的子任務(有序):
  1. 需求梳理與知識源盤點,明確客服場景並收集原始文件、FAQ與歷史對話紀錄
  2. 數據清洗與知識結構化,去重脫敏並建立標準化QA對與文件集
  3. 知識庫向量化與索引構建,完成文件分塊、Embedding及向量資料庫部署
  4. RAG問答引擎開發,設計檢索策略、Prompt模板與多輪對話管理邏輯
  5. 前後端系統開發整合,搭建客服聊天介面並對接現有IM或工單系統
  6. 全鏈路測試驗收與上線部署,完成準確率評測、壓力測試及生產環境發布

要點:Agent 的『規劃』就是把模糊大任務拆成可逐一執行、可驗收的小步驟。

相關代碼:


# ── 任務規劃 ─────────────────────────────────────────────────────────────────
PLAN_SYS = """你是一個任務規劃器(Planner)。把使用者給的大任務拆成 4~8 個有序、可逐一執行、可驗收的子任務。
只輸出 JSON 陣列,每個元素是一個字串(子任務描述),不要任何其他文字。
例:["蒐集並清洗文件", "切割 + 嵌入建向量庫"]"""


def real_plan(task):
    """交給 LLM 規劃;解析失敗回傳 None,由呼叫端降級成規則版。"""
    cli, model = _client()
    try:
        out = cli.chat.completions.create(
            model=model,
            messages=[{"role": "system", "content": PLAN_SYS}, {"role": "user", "content": task}],
        ).choices[0].message.content
        steps = json.loads(re.search(r"\[.*\]", out, re.S).group())
        return [str(s) for s in steps] or None
    except Exception as e:
        print(f"⚠ LLM 規劃失敗({e}),降級成規則版骨架。\n")
        return None

無標籤

關注作者:

新增評論