问题与目标
Agent 能继续调用工具,也就可能不断调用工具。真实任务需要同时回答两个问题:下一步怎样决定,以及什么时候必须停止。只在 Prompt 中写“不要死循环”无法形成可靠边界。
本篇比较 ReAct、先计划后执行和动态调整,并为任务设置步骤、时间、重复动作和成本预算。示例只记录可公开的动作与观察,不要求模型暴露隐藏推理过程。
核心概念
三种执行思路
- ReAct:根据当前观察选择下一项动作,适合工具结果会改变后续路径的任务。
- Plan-and-Execute:先产生结构化计划,再逐项执行,适合步骤相对稳定且需要进度展示的任务。
- 动态计划:保留计划,但工具失败或环境变化时允许修订剩余步骤。
生产日志应记录 action/tool/arguments/result/status,而不是依赖或展示模型内部思维链。可解释性来自结构化轨迹和证据。
四类停止条件
- 成功:程序验收条件满足;
- 拒绝:权限不足、目标不允许或输入无效;
- 预算终止:步骤、时间、Token 或成本达到上限;
- 停滞终止:连续重复同一动作、观察无变化或没有可执行动作。
可运行实现
python
import json
import time
def signature(action: dict) -> str:
return json.dumps(action, ensure_ascii=False, sort_keys=True)
def run_agent(goal: str, policy, execute, max_steps: int = 5, timeout: float = 2.0):
started = time.monotonic()
state = {"goal": goal, "trajectory": [], "observations": []}
previous_signature, repeats = None, 0
for step in range(1, max_steps + 1):
if time.monotonic() - started >= timeout:
return {**state, "status": "time_budget_exceeded"}
action = policy(state)
if action["name"] == "finish":
return {**state, "status": "completed", "answer": action["answer"]}
current = signature(action)
repeats = repeats + 1 if current == previous_signature else 0
if repeats >= 2:
return {**state, "status": "repeated_action"}
previous_signature = current
observation = execute(action)
state["trajectory"].append({"step": step, "action": action, "observation": observation})
state["observations"].append(observation)
return {**state, "status": "step_budget_exceeded"}
def demo_policy(state: dict) -> dict:
if not state["observations"]:
return {"name": "get_status", "device_id": "AX-3"}
return {"name": "finish", "answer": "AX-3 当前离线,需要人工检查网络。"}
def execute(action: dict) -> dict:
if action == {"name": "get_status", "device_id": "AX-3"}:
return {"online": False}
return {"error": "invalid_action"}
print(run_agent("判断 AX-3 是否需要处理", demo_policy, execute))
真实模型策略应返回结构化动作。程序在执行前检查工具、参数、权限和剩余预算;在执行后把精简观察写回状态。
常见问题与排查
每轮生成一份完整长计划
计划应是短小的结构化步骤,并允许状态变化后只修订剩余部分。长篇自然语言计划会占用上下文且难以校验。
达到步骤上限后仍返回“任务完成”
预算终止必须使用独立状态,向用户说明未完成和已完成步骤,不能伪装成成功。
工具失败就重复相同调用
为工具错误分类。瞬时错误有限重试,参数错误需要修复,权限错误立即停止;记录动作签名和观察变化来识别停滞。
只限制模型调用次数
还要限制工具调用、并发、单工具超时、总体截止时间、返回数据大小和可能产生的业务成本。
小结
规划决定 Agent 下一步做什么,预算与验收决定它何时停止。可靠 Agent 不追求无限自主,而是在有限步骤、有限权限和可验证完成条件中动态行动。
License: CC BY-NC 4.0
Updated 2 hours ago
Was this article helpful? Give it a like.
0 comments


