讓 Agent 處理長任務:檢查點、分段與進度回報
需要跑三十分鐘的任務,不能用跑三十秒的架構。
長任務(批次處理、大量檔案分析、多階段研究)的挑戰不在模型,而在工程:上下文會爆、中途會失敗、使用者會失去耐性。
三個對策:把任務切成有邊界的階段、每階段結束存檢查點、以及持續回報進度。
階段化設計
STAGES = [
{'name': 'scan', 'desc': '掃描並列出待處理項目', 'max_steps': 5},
{'name': 'process', 'desc': '逐項處理', 'max_steps': 3, 'per_item': True},
{'name': 'verify', 'desc': '檢查結果一致性', 'max_steps': 4},
{'name': 'report', 'desc': '產出總結報告', 'max_steps': 2},
]每個階段是一次獨立的 Agent 執行,有自己的上下文與步數上限。階段之間只傳遞結構化結果,不傳遞完整對話歷史——這是控制上下文膨脹的關鍵。
逐項處理的檢查點
def process_stage(items, run_id):
done = store.completed_items(run_id) # 續跑時跳過已完成的
for it in items:
if it['id'] in done:
continue
try:
result = run_agent(f"處理項目:{it}", max_steps=3)
store.save_item(run_id, it['id'], result, status='ok')
except Exception as e:
store.save_item(run_id, it['id'], None, status='failed', error=str(e))
emit_progress(run_id, done=len(done) + 1, total=len(items))注意失敗的項目也要記錄並繼續,不要讓一個壞掉的項目中斷整批。最後在報告階段列出失敗清單。
進度回報的三個層次
- 階段層級:目前在第幾階段、共幾階段。
- 項目層級:已完成 47 / 320 項。
- 當前動作:「正在分析 invoice_0048.pdf」。
第三層特別重要。使用者看到具體的檔名在跳動,就知道系統還活著;只有進度條時,卡住三分鐘就會被當成當機。
上下文預算
def stage_context(prev_results, budget_tokens=6000):
# 只傳遞摘要與關鍵欄位,不傳完整內容
summary = summarize_results(prev_results, max_tokens=budget_tokens // 2)
stats = {'total': len(prev_results),
'ok': sum(r['status'] == 'ok' for r in prev_results),
'failed_ids': [r['id'] for r in prev_results if r['status'] != 'ok'][:20]}
return {'summary': summary, 'stats': stats}可中斷與可恢復
- 使用者可以隨時暫停,已完成的部分保留。
- 恢復時從最後一個檢查點續跑,不重做已完成的項目。
- 取消時要清楚說明「已完成的部分是否保留」。
長任務的成本要在開始前估算並告知使用者。跑了二十分鐘才發現要花掉整月預算,是無法向使用者交代的。
訂閱後繼續閱讀全文
本篇為訂閱者專屬內容。訂閱後可取得下列權限:
- 解鎖全部內容權限
- 閱讀不限篇數
- 全站移除廣告
月卡
NT$240
開通 30 天
一次付清,開通 30 天
季卡
NT$620
開通 90 天
一次付清,開通 90 天,每天約 NT$7
年卡
NT$2,160
開通 365 天
一次付清,開通 365 天,每天約 NT$6
一次性付款,付款成功後立即開通,到期自動結束,不會再次扣款,也不需要取消訂閱。
立即訂閱
金額均為新臺幣(TWD),即實際扣款金額,不另收手續費
支援信用卡 · Apple Pay · Google Pay · WebATM · ATM 轉帳
購買須知與退款政策