Agent 状态与停止条件
Agent 状态不应只写成“模型还在思考”。至少区分 running、waiting_tool、completed、failed、cancelled 和 budget_exhausted。停止条件同时保护质量和资源:任务验收通过可以结束,预算、deadline、最大步数、重复调用、权限拒绝和用户取消也必须结束。模型说“完成”只能作为候选信号,不能替代业务验收。
第一个可运行实验:可解释的停止原因
保存为 stop.py,用 Python 3.12 运行。
python
def should_stop(state):
if state['cancelled']:
return 'cancelled'
if state['now'] >= state['deadline']:
return 'deadline'
if state['steps'] >= state['max_steps']:
return 'step_budget'
if state['permission_denied']:
return 'permission_denied'
if state['goal_verified']:
return 'completed'
return None
base = {'cancelled': False, 'now': 3, 'deadline': 10,
'steps': 1, 'max_steps': 4, 'permission_denied': False,
'goal_verified': False}
assert should_stop(base) is None
assert should_stop({**base, 'goal_verified': True}) == 'completed'
assert should_stop({**base, 'steps': 4}) == 'step_budget'
assert should_stop({**base, 'permission_denied': True}) == 'permission_denied'
print('stop reasons passed')停止原因要写入运行记录,用户才能知道是完成、超时还是权限拒绝。重规划只能处理可恢复的资料失败;越权、预算耗尽和用户取消不应通过再问一次模型绕过。停止后迟到的模型或工具事件必须按 run_id 丢弃或单独审计。
变体实验
同时满足 goal_verified 和 permission_denied 时,按安全顺序让拒绝优先。再让 deadline 已过但模型声称完成,要求系统返回 deadline,而不是 completed。
练习
- 增加总成本和最大成本两个字段,并说明哪个停止原因优先。
- 设计重复相同工具参数且没有新证据时的停止条件。
- 区分“工具执行未知”和“工具明确失败”对重规划的影响。