任務規劃與 write_todos:讓代理人先想清楚再做事

任務規劃與 write_todos:讓代理人先想清楚再做事

7 min read

你有沒有用 AI 做一個稍微複雜的任務,然後到一半發現它在繞圈——把同一件事做了兩次,或者跳過了某個關鍵步驟,然後在結尾偷偷補了一句「你可能還需要自己確認一下 X」?

這不是幻覺,也不是模型不夠強——是代理人在執行任務時,腦子裡沒有一張計畫。它只知道「現在這一步要做什麼」,不知道整個任務有幾步、走到哪了、還有什麼沒完成。

write_todos 就是把這張計畫表外部化的那個工具。

write_todos 是什麼

write_todos 是 Deep Agents 的內建工具之一,讓代理人可以:

  1. 把任務拆成具體步驟:在開始執行之前,先列出「這個任務需要做哪些事」
  2. 追蹤每個步驟的狀態:進行中、已完成、待處理
  3. 動態調整計畫:執行過程中如果發現需要加步驟或改順序,可以更新

計畫存在外部——不是靠 context 裡的文字維持。這意味著即使 context 很長、已經離最初的規劃很遠,代理人還是可以回頭看計畫、知道自己走到哪了。

代理人什麼時候會自己呼叫它

你不需要手動呼叫 write_todos——代理人會根據任務的複雜度自己決定要不要先規劃。

一般來說,任務有這些特徵的時候,代理人傾向於先呼叫 write_todos:

  • 有明確的「多個步驟」需要依序完成
  • 後面的步驟依賴前面步驟的結果
  • 任務的範圍比較廣,有多個子目標

反過來,簡單的問答或單步任務,代理人通常不會呼叫 write_todos,直接回應就好。

實際看一下它的執行過程

給一個需要多步驟的任務——

from deepagents import create_deep_agent
 
def read_codebase(path: str) -> str:
    """讀取指定路徑的程式碼檔案。"""
    return f"程式碼內容:{path} 的內容..."
 
def run_tests(test_file: str) -> str:
    """執行測試並回傳結果。"""
    return "測試結果:3 passed, 1 failed"
 
def write_report(content: str, filename: str) -> str:
    """把報告內容寫入檔案。"""
    return f"報告已儲存至 {filename}"
 
agent = create_deep_agent(
    tools=[read_codebase, run_tests, write_report],
    system_prompt="你是一個程式碼審查助理,負責分析程式碼、執行測試、產生報告。",
)
 
result = agent.invoke({
    "messages": [
        {"role": "user", "content": "幫我分析 src/ 目錄下的程式碼品質,執行測試,然後產生一份審查報告存到 review.md"}
    ]
})

這個任務有三個階段——分析、測試、報告。代理人在接到這個請求後,通常會先呼叫 write_todos 把三個步驟記下來,然後逐步執行,每完成一個步驟就更新狀態。

用 streaming 跑可以觀察到這個過程:

for chunk in agent.stream({
    "messages": [
        {"role": "user", "content": "幫我分析程式碼品質..."}
    ]
}):
    # chunk 裡會包含 write_todos 的呼叫和結果
    if "tool_calls" in str(chunk):
        print(chunk)

「先規劃」帶來的實際差距

來比較兩種情境:

沒有規劃的代理人:

接到任務 → 直接開始做第一步 → 做完想下一步 → 做到一半可能想起來還有什麼 → 結尾可能遺漏某些東西 → 用戶自己對比才發現缺了 step 2 的一半

有 write_todos 的代理人:

接到任務 → 先寫出計畫(3 個步驟)→ 執行 step 1(標記完成)→ 執行 step 2(標記完成)→ 執行 step 3(標記完成)→ 確認所有步驟都完成 → 完成

差距不是在速度,是在可靠性——有計畫的代理人不容易跳步,也更容易在中途被打斷後繼續(因為計畫還在)。

在 system_prompt 裡引導規劃行為

雖然代理人會自己決定要不要規劃,但你可以透過 system_prompt 影響這個行為:

agent = create_deep_agent(
    tools=[...],
    system_prompt="""你是一個嚴謹的研究助理。
    
    處理任何多步驟任務之前,先用 write_todos 把步驟列清楚,再開始執行。
    每完成一個步驟,更新 todo 狀態,確保沒有遺漏。""",
)

不用把規劃邏輯完全硬塞進 prompt,點明「複雜任務先規劃」這個習慣就夠了。

任務規劃讓 agent 從「衝動型」變成「有條理型」

這個比喻可能有點誇張,但確實接近真實情況:

沒有 write_todos 的代理人更像是一個剛接到需求就立刻開始寫程式的工程師——行動力強,但容易忽略沒想清楚的地方。

有了 write_todos,代理人有機會先停下來說:「好,這個任務有五個步驟,分別是 A、B、C、D、E,我先從 A 開始。」然後有條理地推進。

下一篇要解決的是另一個問題:任務過程中產生的大量資訊要放在哪?


上一篇:Quickstart:5 分鐘建立你的第一個 Deep Agent 下一篇:Filesystem 工具:用檔案管理 Context,不讓 Token 爆炸