Agent 的停止條件:怎麼判斷任務真的完成了
跑不停與提早收工都是常見故障。停止條件需要明確設計,不能只靠模型自己決定。
Agent 最常見的兩種失敗:一是任務沒做完就宣告完成,二是在同一個問題上反覆嘗試直到耗盡步數。兩者都源於停止條件沒設計好。
四種停止條件
- 模型自述完成:最弱的一種,必須搭配驗證。
- 結構化完成訊號:要求模型呼叫一個
finish工具並帶上結果,比自然語言可靠。 - 程式驗證通過:例如檔案已產生、API 回傳 200、測試通過。這是最強的條件。
- 資源上限:步數、時間、成本任一超標即中止,是安全網而非正常路徑。
FINISH_TOOL = {
'name': 'finish',
'description': '任務完成時呼叫,並附上最終結果與依據。若尚未完成請勿呼叫。',
'parameters': {'type': 'object', 'properties': {
'result': {'type': 'string'},
'evidence': {'type': 'string', 'description': '支持結果的具體事實,例如工具回傳值'}
}, 'required': ['result', 'evidence']}
}偵測原地打轉
記錄每一步的「工具名+參數雜湊」,連續兩次完全相同就代表卡住了。這時應該中止並回報,而不是讓它繼續。
seen = []
sig = hashlib.md5(f'{call.name}:{json.dumps(call.arguments, sort_keys=True)}'.encode()).hexdigest()
if seen[-1:] == [sig]:
return '偵測到重複操作,已中止。'
seen.append(sig)資源上限一定要同時設「步數」與「累計成本」。只設步數時,一個會回傳巨量內容的工具仍然可以在八步內燒掉大量費用。