qinghuan
← 回到知识探索

AI 直觉 / 动手实验

Agent 一直说“再查一次”,该何时停?

用预设观察重放一个小循环,把完成、无进展和预算耗尽分成不同结果。

展开本文目录
  1. 把“结束”拆成不同原因
  2. 重放几步观察,检查何时停止
  3. 真正的运行还需要时间与动作边界
  4. 记住这三点
  5. 别把例子用过头
  6. 自己试一小步
  7. 查原始资料
  8. 找一份资料继续练
开始前,会这些就够了
  • 理解循环与集合
  • 知道 Agent 会根据工具结果选择下一步
遇到不熟悉的词,先看这 3 个解释
Agent(智能体)
在语言模型应用中,围绕目标选择动作、读取执行结果,再决定下一步的软件系统。模型通常提出下一步,程序执行工具并维护状态,同时检查是否该结束。
工具调用
模型按工具说明提出要调用的功能和参数,由应用程序检查并执行,再把结果交回模型的交互方式。它把生成文字与查询、计算等实际操作连接起来。
评测
用事先确定的样本、任务和评分规则,检查模型或整个系统能否满足要求的过程。既可检查答案,也可检查工具操作和最终状态,结果要连同测试条件一起理解。
打开完整术语小抄 ↗

设想助手正在查两项活动信息,找到一项后不断重复搜索,屏幕上一直出现“我再确认一下”。调用次数越来越多,所需信息却没有增加。这是虚构情境:继续运行不一定意味着接近完成,而停止也不一定意味着成功。

Agent 往往在观察结果、选择动作和再次观察之间循环。设计它时除了让模型决定下一步,还要让应用清楚知道:哪些证据算完成,哪些情况需要暂停,以及最多允许继续投入多少资源。

把“结束”拆成不同原因

完成条件应连接到任务本身。例如活动时间与预约规则都已找到适用资料,并通过必要核对,才有条件提交答案;模型说一句“完成了”不能替代这些检查。ReAct 展示了动作与环境反馈交替的方式,但这种循环结构本身不保证每一步都有进展,也不保证任务一定可解。

还需要非成功的出口:资料不足、连续没有进展、需要补充授权、工具失败,或达到资源上限。Anthropic 的工程文章也提到最大迭代次数等停止条件。它们让运行有边界,却不应被转换成虚假的成功状态;退出时要说明已完成部分、缺失部分与真实原因。

重放几步观察,检查何时停止

下面只重放预先写好的观察,不调用模型或网络。required 是两个必需字段的名称;每步输入代表本例已经接受的字段。程序把字段齐全标为字段检查通过,把连续两步没有新增字段标为需要复核,同时最多处理三步。这个教学规则只能检查字段是否齐,不能自动检查内容是真是假。

三组输入分别演示字段补齐、持续停滞与步数用尽。注意重复返回已经知道的字段不会算新增进展,得到一个无关字段也不会满足必需集合。步数上限独立存在:即使还在增加别的字段,也不能无限运行。阈值只是自拟教学值,实际产品应依据任务成本和验证标准设定。

小实验 · python
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 而非宣称整项任务成功。
  • 重复查询可能合理,示例的两步停滞规则不是通用循环判定标准。

自己试一小步

怎样让一个循环停下时说清真实原因?

  1. 为自拟查资料任务列出必需字段与内容核对条件。
  2. 准备字段齐全、没有新增信息、预算耗尽和观察提前结束四组输入。
  3. 分别写出应返回的状态和仍缺少的证据,不让预算耗尽冒充成功。

做到这些,就算完成

  • 完成检查与资源上限互相独立。
  • 重复但合理的只读观察有明确适用条件。
  • 超时后未假设有副作用的动作一定没有执行。

查原始资料

想确认一个细节,先看这份资料对应的部分,不必从头读完所有文档。

找一份资料继续练

先选一项,按下面的范围继续学;不必从头读完整门课程。