ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从“生成“到“选择“:结构化动作空间如何重塑 AI 在智能体工作流中的价值

从“生成“到“选择“:结构化动作空间如何重塑 AI 在智能体工作流中的价值

从"生成"到"选择":结构化动作空间如何重塑 AI 在智能体工作流中的价值

【免费下载链接】jev-ultrafastFastest and cheapest web agent项目地址: https://gitcode.com/gh_mirrors/je/jev-ultrafast

过去两年,让大模型"自己写代码、自己调工具"的生成式 Agent 路线迅速走红,但伴随而来的却是两条无法回避的曲线:token 成本随步骤数指数膨胀,以及自由生成动作带来的不可控幻觉。当模型每走一步都要重新生成"下一步做什么"的自由文本时,一次浏览器自动化任务可能消耗上万 token,还可能在某个不存在的选择器或坐标上戛然而止。就在这种背景下,社区里悄然出现了一类反向思路——把"下一步"从生成问题改造成选择题。以 TypeSafe 的 Jev 决策模型为底座、由 browser-use 生态实现的 jev-ultrafast,用 7.1 秒跑完一次真实的 Google Flights 机票查询,并把浏览器协议调用量压掉了 90.8%。本文结合该仓库源码与社区实测情报,拆解"选择式决策"这一范式究竟改写了 Agent 工作流中的哪些环节,以及它为什么正在从浏览器向更广的决策引擎蔓延。

生成式 Agent 的成本与幻觉之痛:为什么业界开始转向"选择"

典型的生成式浏览器 Agent 走的是"截图 → 多模态推理 → 输出自然语言动作 → 解析执行"的链路。每一步都要把整页截图和长上下文喂给大模型,动作以自由文本或结构化 JSON 形式生成,再由外围代码解析成可执行指令。这套链路有三个结构性代价:

  1. 协议调用爆炸:一次点击往往伴随多次 DOM 查询、坐标计算与状态轮询。jev-ultrafast 的实测对照里,旧版完成一次机票查询需要1,092 次浏览器协议调用,而新架构只要101 次——削减了 90.8%(docs/performance.md)。
  2. 上下文臃肿:多模态截图与滚动文本让每轮推理的输入 token 居高不下。相反,选择式决策每轮只消费一份结构化的"元素表 + 目标 + 最近动作",精简上下文带来的直接收益是决策延迟中位数仅178 ms。
  3. 幻觉被"自由格式"放大:当模型有权输出选择器、坐标甚至脚本时,任何一个编造的目标都会导致失败或误操作。这也是社区对 Jev 类模型"只做选择题"的讨论焦点——头条与知乎侧的热议文章反复强调其"速度快 193 倍、成本低 444 倍"(社区情报:Jev 全量开放),而 CSDN 的实测文章也把"规避多模态截图与幻觉风险"列为该架构最核心的收益。

成本侧的数字同样直观:在 jev-ultrafast 的机票任务中,两次真实的文本生成(城市名 Zurich / London)经 OpenRouter 计费仅0.00006272 美元(docs/performance.md)。社区流传的"Jev 1 万次判断大约 3 块钱"正是这套分工的写照——决策交给专门的选择模型,文本才交给生成模型,各司其职,互不越界。

Jev 的范式内核:结构化动作空间、严格 JSON 契约与可审计性

jev-ultrafast 的自我定位非常明确——"A browser agent that chooses instead of generating"(pyproject.toml)。整个闭环由四个文件构成:agent.py 承载主循环、snapshot.js 负责原子化快照、model.py 实现动态操作/目标双头决策、browser.py 负责安全执行。

把页面变成"编号选择题"

每一次页面观察,snapshot.js 会在一次浏览器调用内读取可见控件、名称、取值与文本,产出一张带编号的元素表:

[1] button Change ticket type · Round trip [2] combobox Where from? · San Francisco [3] combobox Where to? · empty [4] textbox Departure · empty ...

每个真实 DOM 节点通过WeakMap获得代码所有的身份 ID(window.__jevFast),Map则保存用于执行的活动引用;节点被替换会获得新身份、断开的引用被裁剪、导航会重置缓存。快照还包含page_key与逐控件的guards(文档、表单值、选中态、附近上下文等语义指纹),供执行前做新鲜度校验——而不是靠统计 DOM 突变次数来判定页面是否变化。

关键约束在于:模型只看到编号与语义描述,永远看不到选择器或坐标。动作空间被收敛为CLICK、TYPE_TEXT、SELECT、SCROLL_UP、SCROLL_DOWN、WAIT、DONE、BLOCKED这 8 种预定义操作,且只开放与控件能力匹配的候选——输入框才有 TYPE_TEXT,下拉框的 SELECT 目标还附带代码侧维护的选项索引。正如 README.md 所写:"Model output never becomes selectors, coordinates, shell commands, or executable JavaScript."

推测性扇出:操作与目标,一次网络往返

选择式决策的精髓在 model.py 的choose()中体现得淋漓尽致。一次请求同时携带操作头与每个操作各自的目标头(speculative fan-out):

  • operation头回答"下一步执行哪个操作";
  • 每个操作对应一个独立的目标头(如click_target、type_text_target、select_target),各自只包含兼容的候选元素;
  • 执行器只消费选中操作对应的目标头——未使用的目标头即使输出了荒谬答案也无法触发任何动作;
  • 目标头无法读取操作头的答案,因此其提示词会显式声明"本问题假设执行的操作是 X"。

这套设计的直接收益是:两个决策(操作 + 目标)合并为一次网络往返,且天然杜绝了"操作与目标不匹配"的经典错误。离线测试对此有专门覆盖——test_all_heads_are_one_request_and_only_matching_head_executes断言一次请求内同时包含操作与各目标头,test_click_cannot_consume_a_text_target验证 CLICK 操作永远无法消费 TYPE_TEXT 目标(tests/test_agent.py)。

严格 JSON 契约:验证比提示词更可靠

选择式架构的另一半,是"输出必须通过严格校验才能被执行"。

决策侧,validate_choice()(model.py)逐项检查:choice必须存在于候选集合、概率键集合与候选完全一致、概率值有限且非负、概率和与 1 的偏差小于 0.02、置信度落在 0~1、被选中的候选概率必须接近最大值。任何一项不满足,整次决策直接抛错且不执行任何动作。测试用unknown / nan / missing / negative / non_max / confidence六种变异逐一验证了拒绝路径(tests/test_agent.py)。

文本侧同样苛刻:只有操作是 TYPE_TEXT 时,才把"目标 + 页面上下文 + 最近动作"交给一个小型 OpenAI 兼容模型(默认 DeepSeek,示例配置为 Mercury)。其输出必须解析为恰好一个键的 JSON 对象{"text": "..."},多一个键、非字符串、超过 2000 字符或为空都直接拒绝,"nothing typed"——代码不提取引号字面量,也不允许执行器猜测文本(tests/test_agent.py 中test_text_helper_rejects_invalid_values覆盖了Thinking: Zurich、{"text":null}、多余键、非字符串四种攻击样本)。

执行侧的护栏在 browser.py:动作执行前重新解析目标几何、校验可见性与点击遮挡(elementFromPoint命中测试),点击前比对语义指纹;原生下拉框的中断执行被视为不可重试的失败,因为 change 事件可能已经触发。

可审计性:每一步都留下证据

选择式决策天然可审计——因为动作空间是有限的、可枚举的。每轮循环在 agent.py 中把以下字段写入history:执行的 action、kind、选中项、目标概率、操作概率、置信度、模型延迟、token 用量、页面指纹是否变化。执行先记录、再观察,即使随后的观察遭遇导航中断,已执行的动作也不会被抹掉(test_stale_observation_preserves_executed_action覆盖此场景)。

更重要的原则是:DONE 从来不是成功证据。examples/flights.py 内置独立的verify(),从结果页 URL 解码tfs参数核对日期、比对 One way / Zürich / London / "Sun, Sep 20" 的控件取值,并检查可见的航班结果标签——任何一项不满足即判定失败并退出。这正是 AGENTS.md 反复强调的纪律:"Verify actual final outcomes independently. A DONE choice is not proof of success."

实测:一次真实任务的三组数字

仓库保留了完整的匹配对照实验(docs/performance.md):6 次交替运行、同一任务、同一浏览器配置、同一组模型,原始版与优化版各通过独立验证 3/3。结果如下:

指标原始版优化版变化
任务耗时中位数9.450 s7.092 s−25.0%
浏览器协议调用中位数1,092101−90.8%
TypeSafe 请求中位数2217−22.7%

最终发布的演示录像为一次7,073 ms的完整 Google Flights 查询:苏黎世 → 伦敦、单程、2026-09-20、一名成人经济舱,文本生成两次(Zurich 581 ms、London 346 ms),全部为真实速度、无剪辑加速。同策略还在 2.798 s 内打开了维基百科的哥德尔不完全性定理条目,并以 1.896 s 通过了本地酒店筛选夹具。

范式扩散:从浏览器到决策引擎的路径

值得注意的不仅是 jev-ultrafast 本身,而是"选择式决策"正在从单一浏览器智能体演变为一整类架构共识。社区开源热榜(2026-09-21 周榜)中,与 Jev 范式同批上榜的项目已达 7 个:除浏览器智能体 jev-ultrafast 外,还包括上下文压缩(fast-jev-compaction)、类型化决策引擎(laya)、语义 if 接口(SemIf)等。它们的共同技术词条高度一致——结构化动作空间、单次前向传播类型决策、logits 直接评分、多语言路由与置信度校准,技术栈以 Python 与 TypeScript 为主,卖点都是"低幻觉、高时效、可审计、轻量部署"。

这条扩散路径的逻辑是清晰的:浏览器只是结构化动作空间最容易验证的落地场景(控件天然可枚举),而 laya 把同样的"类型化决策"下沉为通用引擎,SemIf 则把"语义判断"接口化——从'生成一段话让人解析',到'在枚举选项里直接打分取最大值'。决策模型本身(TypeSafe 的 Jev)也因此被社区视为独立的"决策小脑":具身智能、RPA、自动化测试等一切"意图 → 操作"映射场景都在尝试接入。竞争与演进信号同样密集:Intern-Decision 以多模态决策 SOTA 挑战 Jev、Cloudflare 推出 Clef 决策模型、Decitron 代表另一条决策技术路线——这都从侧面印证,选择式决策已从个例变成了赛道。

当然,范式红利有明确边界。选择式架构的适用前提是动作空间可枚举:它擅长确定性 UI 交互,却不支持复杂跨页推理与任意文本生成。仓库也坦承其局限:DOM 读取器未实现完整 accessible-name 规范,shadow root、frame、canvas、上传、弹出标签页、嵌套滚动与任意键盘控件均不支持;6 次运行样本是"受控输入对比",而非通用可靠性基准;一次成功的公开工作流不能代表广袤网页的平均水平(docs/design.md)。

从"生成"到"选择",本质是把 Agent 的可靠性问题从概率性的语言生成转移到确定性的枚举决策上:模型不再为世界编造下一步,而只在代码已经确认可能的世界里挑一个。配合严格 JSON 契约、执行前语义校验与独立结果验证,选择式 Agent 把"大模型 + 浏览器"这条最不可控的自动化链路,改造成了一条可度量、可审计、成本可预测的流水线。对于所有正在构建智能体工作流的团队,这或许才是比"更强的模型"更值得先落地的工程决策。

【免费下载链接】jev-ultrafastFastest and cheapest web agent项目地址: https://gitcode.com/gh_mirrors/je/jev-ultrafast

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进