请模型检查一张活动海报:时间、地点和报名链接是否与官网一致。它可以很快写出一段看似周全的意见,但如果根本没有打开官网,或者把旧通知当成新通知,这段意见还不构成完成任务。
前几章已经准备好外部资料、记忆、工具与连接协议。本章把它们接成一个持续过程:系统要知道目标是什么,当前已经确认什么,下一步允许做什么,以及出现什么证据才算结束。Agent的关键因此不是名字里多一个“智能”,而是模型参与选择动作,并根据新观察继续调整行动。
1.固定工作流与动态选择
先设计一条固定工作流:读取海报文字,打开预先指定的官方通知,逐项比较,再输出差异。步骤和顺序由程序事先规定,模型可以负责文字提取或语义比较,但未必决定去哪里、做几轮或何时换路。
这种方法有明显优点:输入稳定时容易检查,成本和失败点相对可预测。它也可以包含条件分支,例如链接无效就返回“链接检查失败”。有分支不代表已经成为开放式Agent;关键是路径是否主要由事先写好的规则限定。
动态Agent则可能发现官网首页没有日期,先搜索具体活动名;发现两份冲突公告,再查修订时间;发现报名页注明变更地点,就补读变更说明。下一步取决于前一步观察,事先未必能枚举所有页面和次数。
两者之间是一条连续光谱,常见系统会混合使用:外层固定权限、预算和交付格式,内层让模型选择资料与核验步骤。Anthropic的公开工程说明用“预定义路径”与“模型动态组织过程”区分工作流和Agent,也建议从足够简单的方案开始。工作流与Agent的公开工程说明
不要把固定工作流理解成低级方案。对于格式稳定、规则明确、需要严格一致的工作,减少自由选择可能更可靠。自主程度是设计变量,不是越高越好的质量分数。
2.把任务写成可检查的目标
“帮我看看海报”仍然模糊。我们把教学任务限定为:核对活动日期、开始时间、地点和报名链接四项;优先使用主办方正式页面;输出每项是否一致及证据;只读资料,不发布或修改海报。
这段说明同时包含目标、范围、证据标准和权限。目标回答想得到什么;权限回答允许改变什么。即使模型推断出海报写错,也不能因此把“指出差异”自动升级成“替用户在社交平台改图”。
完成条件也要具体。例如四项都有对应官方证据,冲突已经标明,无法确认项明确留空,最终报告能让人点开来源。报名入口还要拆开检查:当前主办方正式公告确实指向这个地址;实际打开后,页面可用且内容适用于这场活动。仅有页面内容相符,不能证明它是官方公布的入口。这里允许“有一项无法确认”成为诚实的终止结果,但不能把它归类为全部核对成功。
系统还需要区分成功、受阻、取消与预算耗尽。它们都可能结束一轮运行,却表达不同结果。把所有终止都打印成“已完成”,会在最重要的地方丢失信息。
3.内部状态怎样跟上外部变化
为了看清结构,给每轮编号t。t只表示第几轮,不是物理时间。我们用Sₜ表示这轮开始时的任务状态,用Aₜ表示选择的动作,用Oₜ₊₁表示动作返回的新观察。
整个关系可以写成:
当前状态Sₜ → 选择动作Aₜ → 外部执行 → 得到观察Oₜ₊₁ → 更新状态Sₜ₊₁
先把外部世界和内部状态分开。主办方在网页发布新地点,是外部变化;系统还没读到新页时,内部可能仍记录北厅。网页已经更新,并不意味着模型立即知道。反过来,一次读取也可能超时,或只返回旧缓存。因此本章固定的假设是:页面可更新,观察可失败,内部记录可能过时;需要通过新观察修正它,不能仅凭原计划推进。
状态不是模型脑中一个神秘的情绪。它可以是一份明确记录:已确认的三项事实、还缺的地点、访问过的页面、剩余预算、当前允许的工具与待处理错误。下一轮模型未必看到全部历史,系统会决定把哪些部分送入上下文。
动作是一个提议,例如“读取公告页面”,随后由执行层检查工具名、参数与权限,再真正访问。观察则是页面内容、错误或回执。模型说“我已经打开了”,不能替代外部执行产生的记录。
更新状态时,应把事实与推测分开。页面写“活动延期”,可以记录这个原文事实;推测“可能改到下周”需要另外标注,不能在下一轮摘要里变成正式日期。状态管理正好连接第29章的来源、时效和冲突处理。
看图1时,沿着“读到新公告”这条虚线走:真正改变内部结论的是带来源的观察,不是外部页面更新这个事件本身。

图1|外部页面与内部证据状态是两个对象。执行前先查权限,实际读取才带回观察;观察更新状态后,才决定继续还是停止。虚线表示观察进入内部,实线表示动作与控制路径。固定工作流也可以按这套边界执行,只是下一步由预设规则限定。
4.用纸笔运行一个小Agent
准备四张教学资料卡。海报卡写“10月18日14:00,北厅,报名入口L”;主办方旧公告写相同日期、时间与地点;已确认属于当前主办方的正式新公告写“活动仍为10月18日,改在南厅,本活动当前报名入口为L”,并明确链接到L;入口L所对应的报名页写“10月18日14:00,南厅”,且能够正常打开。新公告未另写开始时间。L只是纸笔标识,不是真实网址。这些卡片均为虚构资料,不对应真实活动。
初始状态四项都未确认,预算允许最多四次读取。第一轮读取旧公告,日期和时间获得支持,地点暂时与海报一致,但还没有证据证明它是最终版本。此时可以标注“旧公告支持”,不能把“暂未看到更新”当成“确定没有更新”。
第二轮按活动名查到新公告,状态发生实质变化:日期保持,地点出现版本冲突;入口L获得“当前正式公告明确指向”的来源证据,但是否可访问、内容是否适用仍待查。合理动作是保留旧公告的出处,标记地点已被更新,再读取L补齐后两项检查。不能删除冲突记录后装作所有资料从来一致。
第三轮读取正式新公告指向、且与海报所列一致的入口L,确认页面能正常打开,并核对活动身份、10月18日14:00和南厅。这样,“官方指向L”与“L可用且内容适用”才共同完成入口核验。剩余预算还有一次,但四项任务已具备足够证据,可以停止。预算是上限,不是必须用满的配额。
最终报告应说海报地点与最新公告不一致,其他三项核对结果各有来源。完成证据不是“模型连续想了三轮”,而是四个字段的核对记录和相应材料。如果报名入口访问失败,则应单独报告链接无法核实,不能只因地址看起来像网址就说可用。反过来,一张复制了全部活动文字、也能打开的非官方页面,只能通过内容与可用性检查;缺少当前正式公告到它的指向,仍不能当作已核实的官方入口。
这个实验最有价值的步骤,是故意把资料卡顺序调换。先看新公告,再看旧公告,结论应由适用版本决定,不能被最后看到的文字覆盖。若系统记忆只保存一段无来源摘要,这类顺序错误就很容易发生。
5.状态更新也需要不变量
不变量指整个过程中始终应成立的条件。例如“没有证据的字段不得标为已验证”“只能读取获准来源”“已知冲突不能默默丢弃”。它们不像任务计划会随观察变化,而是约束每次变化必须合法。
再加一条:“剩余读取次数=初始预算−已实际执行次数”。初始预算为4,三次读取后剩1。模型在文字里列出三个计划,不消耗三次外部读取;同一轮实际读取两个页面,则应该扣两次。预算计数最好由系统依据真实事件维护,而不是依赖模型回忆。
并行执行还需要调度。若只剩1次读取机会,两个候选动作不能各自看见“剩1次”后一起启动;执行层应先占用可用名额,再发起读取,并把已经发出的请求计入实际用量。模型负责提议下一步,调度器负责让并发中的总量也不越界。这里借用的是资源计数与状态约束,不是假定模型每次都会作出相同提议。
状态还应保留失败类型。暂时超时、目标不存在和权限不足,不应都变成“没有找到”。超时可以在允许范围内重试;不存在可能需要换来源;权限不足则需要止步或取得授权,不能换个入口绕过同一限制。
图2把预算和完成条件分开列出。先检查是否已经满足四项核对要求;若没有,再检查是否仍有获准且可用的读取机会。否则诚实结束,不把停止原因改成成功。

图2|虚构海报的四项证据台账随三次实际读取变化,预算从4降到1。第二次读取确立当前正式公告指向L,第三次再确认L可用且内容适用,两者共同完成入口核验。地点为南厅,故核对成功仍可发现海报不一致;缺证且无法继续时报告受阻,尚缺证且预算为零时报告预算耗尽。
还有一种必须处理的状态是“动作结果未知”。第30章的回执丢失已经说明,外部动作可能完成但系统没收到结果。对于只读任务,重复读取通常主要浪费资源;对于发消息或修改记录,盲目重试可能造成重复副作用。Agent循环不会自动消除这种分布式系统问题。
6.循环框架提供什么,不提供什么
OpenAI Agents SDK的运行说明公开列出一种执行循环:调用当前Agent使用的模型;遇到工具调用就执行并把结果加入后续输入;遇到移交就切换相应Agent;达到最终输出或触发轮数限制时结束。这是框架层的实际组织机制。Agents SDK执行循环
它帮助我们把一次模型输出与持续运行分开。框架知道如何接续事件,不等于知道海报地点的真实值;框架能返回一个最终输出对象,也不等于四项核对已满足业务标准。后者仍需我们定义并检查。
轮数限制同样不能代替全部资源限制。一轮可能触发多个工具,单个工具可能很慢,不同模型调用量也不同。因此实际预算可以同时约束模型轮数、工具次数、总时间与费用;任一项触及边界,就应进入明确的停止或求助路径。
人类接管是正常控制手段。材料冲突无法解决、权限不够、风险超出授权时,请用户作决定比继续猜更合理。把“从不提问、永不停止”当作自治能力,会让系统在不知道答案时仍不断扩大行动。
7.计划与环境为什么会脱节
回到图1的观察边界,模型只看见工具带回的部分环境。假如新公告已发布但读取失败,计划应记录“尚未核实当前版本”,不能假装内部状态已经与外部同步。
因此计划需要接受反馈。原计划“读取官网首页”失败后,合理重规划是寻找同一主办方的具体公告;若用户更改任务,只核对时间,旧计划中检查地点的步骤就可以取消。坚持执行过时计划,并不比没有计划更可靠。
但重规划也不能随意改成功标准。最初要求核对官方来源,遇到困难后偷偷改成“网上有人这样说”,就是降低证据要求。可以向用户说明无法达到原标准并提出替代方案,却不应在内部改完后宣称原任务成功。
这也对应软件工程中的状态机测试:给定同一旧状态和一次观察,检查新状态有没有保留来源、按适用版本更新字段,并准确扣除实际读取预算。将新旧资料的到达顺序反转,或注入一次超时,就能检验这些不变量,而不是只比较最终段落写得像不像。
这给了Agent评估一个更精确的问题:它在新观察出现时,是否修改了该修改的部分,同时守住了不该改变的约束?只看最终文字是否漂亮,无法回答这个问题;需要保留关键动作与证据的记录。
历史记录与当前状态也应分开。历史保留先后发生了什么,当前状态表示现在采用哪些结论。新公告取代旧地点时,当前值可以变成南厅,但历史仍应让人看见为什么发生更改。只保留当前值难以调查错误,只把全部历史丢给模型又容易混淆过期结论,两种记录各有职责。
状态还可以标注任务依赖:报名入口未验证,不必阻止已经完成的时间核对向用户报告;但不能宣称整项检查无遗漏。这让系统在受阻时仍交付可靠部分,同时清楚标出未完成边界。
8.什么时候值得增加自主性
如果每个输入都走同样三步,工具返回结构稳定,异常种类很少,固定工作流通常更容易验证。若相关资料分散、下一步取决于发现什么、任务长度不固定,动态选择更有价值。
也可以把开放部分限制在小范围内:允许模型在一组只读检索工具里选择,不允许任意发送或删除;允许探索三轮,仍由确定规则检查交付字段。这样得到的是有边界的灵活性,便于逐步评估收益和风险。
判断标准是实际任务是否改善:找到了原来漏掉的证据吗,错误是否更容易定位,成本与延迟是否可接受,失败时能否安全停止。工具数量、角色数量或持续运行时长,都不能单独回答这些问题。
本章练习
题目
问题1|分支由谁决定
一个流程预先写好“链接失效就返回失败,链接可用就逐项比较”。它属于固定工作流还是必然属于动态Agent?说明判断依据。
问题2|把新观察写进状态
已读旧公告一次,预算从4变为3;日期、时间、地点都标“旧公告支持”,入口L仍待查。第二次读到当前主办方正式新公告:日期不变、地点改南厅,并明确链接到当前报名入口L,未提开始时间。请更新四项状态与预算,选择下一步;第三次打开L,确认同一活动、10月18日14:00和南厅后,应走哪个出口?若只有一张内容相同且可打开的复制页,却没有当前正式公告指向它,能否作同样判断?
问题3|观察迟到以后
新公告已经发布,但本次读取超时。框架随后返回最终文字“核对完成”。这时内部地点应标什么状态?仅凭最终文字能否判成功,应检查哪些证据?
思考提示
提示1|对应问题1
找出谁规定下一步,而不是数一共有几个分支。
提示2|对应问题2
未提到的字段不要凭空获得新证据。把入口的来源关系与实际可用性分开;完成核对可以是找到了差异。
提示3|对应问题3
把外部事实、实际收到的观察、框架停止分别看待。
参考答案与解析
答案1|对应问题1
它可以是固定工作流。两个分支及其触发条件都由程序预先规定;有条件判断、有循环,都不足以证明模型在根据观察动态组织路径。
答案2|对应问题2
第二次读取后预算为2。日期得到新公告支持;时间仍只有旧公告支持;地点保留“旧北厅、新南厅”的冲突及版本关系;入口记为“当前正式公告指向L,可用性与内容待查”。下一步在权限内读取L。第三次读取后预算为1,来源关系、可用性与内容适用性都得到支持,四项核对已有适用证据,走核对成功出口,并报告海报地点不一致。无需用满第四次读取。复制页即使内容相同且能打开,也缺少当前正式公告的指向,不能据此判为已核实的官方入口。
答案3|对应问题3
内部不能仅凭“网页已经更新”就记为已核实南厅;应保留已有地点及来源,并标记当前版本未核实、读取超时。最终文字只说明运行结束,不能证明任务成功。需检查四字段证据、适用版本、冲突处理、实际工具返回与预算记录;仍有缺证就报告受阻或其他真实停止原因。
下一章
一个Agent已经要管理许多状态。如果再加入计划器、搜索分支和多位协作者,什么时候会更可靠,什么时候只是多了出错点?第33章用依赖关系、相关错误和通信成本来回答。