3.2 决策:模型凭什么选这个动作 本节摘要:决策拍是一张牌桌:模型拿到的牌是任务目标、历史轨迹、当前情报简报与可用动作清单,出的一张牌就是一个结构化动作(含编号、参数、思考理由)。你在牌桌边有三类旋钮——任务单措辞、动作空间、模型参数。行为漂移时按此顺序排查,十有八九能定位。 决策不是玄学,是一份提示词的函数 很多初学者把智能体的行为当成黑盒抽签,其实每一拍的决策高度确定地依赖于四样输入:任务单怎么写的、此前走过哪几步、现在页面的情报简报长什么样、军械库里登记了哪些动作。模型内部怎么算的你不用管,工程上只要记住一个函数关系:同样的输入给足,决策就稳定;行为漂移,必是四样输入之一变了。上一节查情报拍,这一节查剩下三样。
本节摘要:决策拍是一张牌桌:模型拿到的牌是任务目标、历史轨迹、当前情报简报与可用动作清单,出的一张牌就是一个结构化动作(含编号、参数、思考理由)。你在牌桌边有三类旋钮——任务单措辞、动作空间、模型参数。行为漂移时按此顺序排查,十有八九能定位。
很多初学者把智能体的行为当成黑盒抽签,其实每一拍的决策高度确定地依赖于四样输入:任务单怎么写的、此前走过哪几步、现在页面的情报简报长什么样、军械库里登记了哪些动作。模型内部怎么算的你不用管,工程上只要记住一个函数关系:同样的输入给足,决策就稳定;行为漂移,必是四样输入之一变了。上一节查情报拍,这一节查剩下三样。

模型的每次决策输出不是一句话,而是一段结构化数据:思考区(为什么这么走)加动作区(做什么、参数是什么)。一个值得知道的设计:一拍可以含多个动作,即连招——"点元素 3,输入关键词,点元素 8"三连发,省掉中间两拍。任务路径明确时连招降本提速;页面易变时连招容易踩空(第二击的编号在第一击后失效,呼应 3.1 的地图换版)。框架无法替你判断该不该连招,这写在任务单里由你引导。
旋钮一:任务单措辞。措辞是权重最大的旋钮。对比两组实验,同一站点同一目标:
# 措辞 A:目标模糊,产出没约定 task_a = "帮我看看这个网站" # 模型会漫游,几拍都停不下来 # 措辞 B:目标明确,产出可复核 task_b = "找到本月销量第一的商品名,只回答商品名" # 两三拍收兵
旋钮二:动作空间。可用动作越多,模型选错的面越大。若任务全程用不到开新标签页,就别把相关动作喂给它——动作空间是"减少选项=提高选择质量"的少数免费午餐,第 4 章自定义动作时会给出裁剪与扩充的具体代码。
旋钮三:模型参数。温度是头号嫌疑参数。操作类任务的黄金区间在 0 到 0.2:温度一高,决策的随机性放大,绕路、点错、幻觉按钮都会出现。换模型的判断标准同理:操作稳定性优先于聊天的聪明程度,一个听话的普通模型常常胜过一个恃才傲物的旗舰——这在低配场景(本地小模型)尤其明显。
把每拍的思考理由打印出来,漂移时这就是黑匣子记录仪:
def 黑匣子(state): # 取本拍模型的原始决策记录 last = state.history[-1] if state.history else None if last: print("模型思考:", (last.model_thoughts or "")[:120]) print("所选动作:", last.model_actions) result = agent.run(max_steps=10, on_step_end=黑匣子)
预期输出示意:
模型思考:页面上有两个"登录"字样,索引4是导航栏按钮,索引17是弹窗内链接,先点导航栏的 所选动作: 点击元素 索引 4
读到"模型思考"与你的预期分岔的那一刻,修哪个旋钮就清楚了。
把 3.2 的旋钮落成可抄的改写模板。左边是常见病句,右边是改法:
| 病句 | 病因 | 改法 |
|---|---|---|
| "帮我看看这个网站" | 无目标无产出 | "找到本月销量第一的商品名,只回答商品名" |
| "点那个按钮" | 指代含糊 | "点击文本为'提交订单'的按钮(不是'取消订单')" |
| "把信息都收集一下" | 范围发散 | "提取表格前五行的名称与价格两列" |
| "出错的话处理一下" | 处理方式未定义 | "报错就停止并原样报告错误文案,不要重试" |
注意最后一行:显式定义失败行为。默认情况下模型遇错会尝试自救,自救失败再换个法子,几下就烧掉半本预算。在任务单里把失败语义写死(停、报、不重试),复核拍就有了明确的停车线。
一拍连发多个动作能省步数,但每一击的编号依赖上一击后的页面状态——地图换版问题在连招里被放大。判断标准就一条:**第一击之后的页面是可预测的吗?**可预测(比如"点搜索框、输入关键词、点搜索"三连,中间不产生新页面)就放心连;不可预测(点完弹出广告层、跳转新页)就一拍一动作,让观察拍每步重新画图。省的那两步钱,抵不过一次踩空后的全部重来。
同一厂商的模型隔几个月换一代,操作风格就变一次;不同厂商的模型对同一任务单的理解差异更大。所以任务单不要按"某个模型的脾气"来调——按 3.2 的三要素写规范了,换模型只改配置不改文案。凡是"只在某个模型上灵"的任务单,都是埋了雷的。
四样输入里最容易被忽视的是历史轨迹——模型记得自己走过哪几步。这带来两个工程后果。其一,长任务的决策质量会衰减:轨迹越长,提示词越臃肿,模型对当前页面的注意力被稀释,6.3 里"步数涨、准确率跌"的现象多半源于此。这也是粒度拆解(3.3)的又一重价值:每场小仗的轨迹都是短的,决策质量全程在线。其二,历史里有毒会传染:任务中途的误操作会留在轨迹里影响后续决策,重跑时另起实例而不是续跑旧实例,就是为了让决策不带历史包袱。
给任务单加"阶段划分"是缓解注意力稀释的低成本手段:
阶段一:定位目标商品(只看不点) 阶段二:核对价格与库存(记录数值) 阶段三:汇报(只输出结论)
阶段声明让模型在每一拍都知道"现在这一仗打到哪了",决策的时距感明显变好——尤其适合多阶段流程任务,第二役会用到。
司令选完了牌,下一拍看牌桌裁判:复核怎么判成败、卡住时循环怎么体面收场。