开始前,会这些就够了
- 理解循环与集合
- 知道 Agent 会根据工具结果选择下一步
遇到不熟悉的词,先看这 3 个解释
- Agent(智能体)
- 在语言模型应用中,围绕目标选择动作、读取执行结果,再决定下一步的软件系统。模型通常提出下一步,程序执行工具并维护状态,同时检查是否该结束。
- 工具调用
- 模型按工具说明提出要调用的功能和参数,由应用程序检查并执行,再把结果交回模型的交互方式。它把生成文字与查询、计算等实际操作连接起来。
- 评测
- 用事先确定的样本、任务和评分规则,检查模型或整个系统能否满足要求的过程。既可检查答案,也可检查工具操作和最终状态,结果要连同测试条件一起理解。
设想助手正在查两项活动信息,找到一项后不断重复搜索,屏幕上一直出现“我再确认一下”。调用次数越来越多,所需信息却没有增加。这是虚构情境:继续运行不一定意味着接近完成,而停止也不一定意味着成功。
Agent 往往在观察结果、选择动作和再次观察之间循环。设计它时除了让模型决定下一步,还要让应用清楚知道:哪些证据算完成,哪些情况需要暂停,以及最多允许继续投入多少资源。
把“结束”拆成不同原因
完成条件应连接到任务本身。例如活动时间与预约规则都已找到适用资料,并通过必要核对,才有条件提交答案;模型说一句“完成了”不能替代这些检查。ReAct 展示了动作与环境反馈交替的方式,但这种循环结构本身不保证每一步都有进展,也不保证任务一定可解。
还需要非成功的出口:资料不足、连续没有进展、需要补充授权、工具失败,或达到资源上限。Anthropic 的工程文章也提到最大迭代次数等停止条件。它们让运行有边界,却不应被转换成虚假的成功状态;退出时要说明已完成部分、缺失部分与真实原因。
重放几步观察,检查何时停止
下面只重放预先写好的观察,不调用模型或网络。required 是两个必需字段的名称;每步输入代表本例已经接受的字段。程序把字段齐全标为字段检查通过,把连续两步没有新增字段标为需要复核,同时最多处理三步。这个教学规则只能检查字段是否齐,不能自动检查内容是真是假。
三组输入分别演示字段补齐、持续停滞与步数用尽。注意重复返回已经知道的字段不会算新增进展,得到一个无关字段也不会满足必需集合。步数上限独立存在:即使还在增加别的字段,也不能无限运行。阈值只是自拟教学值,实际产品应依据任务成本和验证标准设定。
required = {"time", "reservation"}
def replay(observations, max_steps=3):
known = set()
stale_steps = 0
for step, fields in enumerate(observations, start=1):
if step > max_steps:
return "step-budget", max_steps
fresh = set(fields) - known
known.update(fields)
stale_steps = 0 if fresh else stale_steps + 1
if required <= known:
return "fields-ready", step
if stale_steps >= 2:
return "needs-review", step
if step == max_steps:
return "step-budget", step
return "observations-ended", len(observations)
cases = {
"ready": [["time"], ["reservation"]],
"stalled": [["time"], ["time"], []],
"limited": [["time"], ["location"], ["organizer"]],
}
for name, observations in cases.items():
reason, steps = replay(observations)
print(name, reason, steps)
怎样运行:Python 3.10+;保存为 agent_stop_demo.py,在该目录运行 python agent_stop_demo.py。只用标准库,无需联网。
运行后对照结果
ready fields-ready 2
stalled needs-review 3
limited step-budget 3真正的运行还需要时间与动作边界
重复动作不必然等于死循环。例如等待状态变化时,同一个只读查询可以有意义;反过来,查询文字每次都换,也可能没有带来可验证进展。应结合任务状态、参数、返回结果与允许等待的条件判断。示例只按新字段计数,是刻意简化,不能拿来替代通用的循环检测器。
步数上限也管不到卡在单次工具调用里的时间。实际运行还应有总耗时预算、单次调用超时,以及有限的重试策略。涉及写入时,超时只说明客户端没有及时得到结果,不保证操作没有发生;继续之前需要核对状态,避免把“再试一次”变成重复执行。
LangGraph 的递归上限文档同时指出两种可能:逻辑形成无穷循环,或合法的复杂流程确实需要更多步。遇到上限应先检查运行记录,再决定是否调整预算,而不是一律调大。保存停止原因与最近可验证结果,才能让用户或后续流程知道该补资料、修逻辑,还是在获准后继续。
记住这三点
- 完成、需要复核与预算耗尽应保留不同状态。
- 进展要对应任务证据,重复说“继续”不算进展。
- 步数、单次超时和总预算处理不同问题,需要分别设置。
别把例子用过头
- 本例重放预设字段,不包含模型推理、事实核验或真实工具。
- 字段齐全不是内容正确,所以代码使用 fields-ready 而非宣称整项任务成功。
- 重复查询可能合理,示例的两步停滞规则不是通用循环判定标准。
自己试一小步
怎样让一个循环停下时说清真实原因?
- 为自拟查资料任务列出必需字段与内容核对条件。
- 准备字段齐全、没有新增信息、预算耗尽和观察提前结束四组输入。
- 分别写出应返回的状态和仍缺少的证据,不让预算耗尽冒充成功。
做到这些,就算完成
- 完成检查与资源上限互相独立。
- 重复但合理的只读观察有明确适用条件。
- 超时后未假设有副作用的动作一定没有执行。
查原始资料
想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。
- ReAct:交替推理与行动 (新标签页)↗
动作取得环境信息,再用于更新后续计划的循环思路。
- Anthropic:Building effective agents (新标签页)↗
依据环境反馈判断进度,并设置最大迭代次数等停止条件。
- LangGraph:GRAPH_RECURSION_LIMIT (新标签页)↗
达到步数上限可能源于循环,也可能是合法复杂流程,需要检查原因。
- AWS:超时、重试和抖动回退 (新标签页)↗
超时不保证副作用未发生,远程调用需要超时和有界重试。
找一份资料继续练
先选一项,按下面的范围继续学;不必从头读完整门课程。
Hugging Face Agents Course:选一套框架完成评测项目 (新标签页)↗
只读 Unit 4 的评测要求,为已有小助手记录每次工具调用和停止原因,再检查退出时是否真的完成任务。
查看学习准备与访问说明 →