news 2026/9/4 14:06:54

Caveman Browse 基准测试详解:从 39.8 万 token 原始 AX 树到 121 token 聚焦快照的压缩账本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Caveman Browse 基准测试详解:从 39.8 万 token 原始 AX 树到 121 token 聚焦快照的压缩账本

Caveman Browse 基准测试详解:从 39.8 万 token 原始 AX 树到 121 token 聚焦快照的压缩账本

【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman

Caveman 的browse模块是一个本地浏览器交互 MCP 服务器,其核心卖点是通过压缩 Accessibility(AX)树来降低 agent 的 token 成本。本篇以仓库中的 browse/BENCHMARK.md 为主体,完整解读其 2026-08-10 版效率基准的测量口径、两组语料上的量化结果与可复现步骤,并结合 browse/session.go、browse/cdp.go 等源码说明每个数字是怎么算出来、以及哪些结论被刻意不宣称。

测量环境与计数口径

基准文档开头即声明了三项测量前提,这三条决定了如何解读后面所有数字:

  • 实测时间 2026-08-10,浏览器为 Google Chrome 151.0.7922.108,Playwright 基线锁定@playwright/test1.56.1;
  • token 计数使用 Caveman 的离线o200k_base计数器。从源码看,这是一个真实的 BPE 分词器,词表内嵌于引擎,定义在 engine/tokens/tokens.go 中,因此不依赖任何在线计费接口;
  • 所有数字都是单份快照的inferred(推断)token 数,不是provider 实际用量或计费值。

另外,每组数据来自5 次独立 Chrome 运行,表中报告的是中位数与[min–max]。文档解释了为何 Caveman 侧存在极小波动区间:随机的 CDP 节点 id 与 CCR(内容恢复存储)句柄本身会占用少量 token,而 Playwright 基线在 5 次运行中完全稳定。

大页面语料:200 行订单运营表格

第一个语料是 browse/testdata/order_dashboard.html——一张 200 行的运营表格,包含一个被查询的目标订单动作。从 fixture 源码看,页面用 JS 循环生成ORD-0000ORD-0199共 200 行,每行带一个aria-label="Review ORD-XXXX"的按钮,正好构成"大表中找一条记录"的典型 agent 场景。

基准结果(5 次运行的中位数与区间):

表示方式Token 数相对原始 AX相对 Playwright
原始Accessibility.getFullAXTreeJSON398,494[398,493–398,497]n/an/a
Playwrightlocator("body").ariaSnapshot()15,704少 96.06%n/a
Caveman 完整 agent 可见结果13,368[13,367–13,368]少 96.65%少 14.88%
Caveman 聚焦结果,查询ORD-0173121[121–122]少 99.97%少 99.23% / 小 129.8×

这里的关键对比点是第三行:Caveman 的"完整结果"并不只是压缩后的树,而是完整的 agent 可见交付物,包含紧凑 AX 文本、UID 列表、CCR 恢复句柄、精确的 agent 可见 token 计数与诚实性元数据(honesty metadata)。文档特别指出这一对比的不对称性:Playwright 基线只计其 ARIA 文本本身,不含 MCP 封装、动作引用(action refs)、恢复句柄或任何账目信息——这种不对称对 Playwright 有利,Caveman 在此仍小幅胜出。

而真正的量级差异出现在第四行:带query的聚焦结果只有 121 token,比原始 AX 树小 129.8 倍。

小页面语料:结算表单——一次诚实的"输"

第二个语料是 browse/testdata/agent_checkout.html:一个含 Email 输入框、Plan 下拉框和 Save order 按钮的小型结算表单。从 fixture 源码看,保存按钮带margin-top: 1400px样式,被刻意放到折叠线(fold)之外,以验证动作前的自动滚动。

结果:

表示方式Token 数相对原始 AX相对 Playwright
原始Accessibility.getFullAXTreeJSON4,186[4,183–4,188]n/an/a
Playwrightlocator("body").ariaSnapshot()67少 98.40%n/a
Caveman 完整 agent 可见结果157[156–159]少 96.25%大 2.34×
Caveman 聚焦结果,查询Email Plan Save order111[110–113]少 97.35%大 1.66×

基准文档没有回避这个结果,反而将其作为重要结论:当页面本身极小时,Caveman 的恢复句柄、精确计数器、诚实性依据与动作 UID 的开销会超过裸 Playwright ARIA 文本。文档的定性是:即使输给了裸 ARIA 文本,它相对原始 AX 仍节省 97.35%,且携带足以完成输入、选择、点击、验证与字节级恢复的状态;因此不宣称存在"仅凭快照的普适性胜利"

序列化回归锁:更小的捕获 fixture

基准还锁定了一个小捕获 fixture 的序列化回归数据,用于防止紧凑格式悄悄膨胀:

  • 此前的 Caveman JSON-lines 视图:380 token;
  • 紧凑缩进视图:58 token(比旧视图少 84.7%);
  • 精确交付负载(含 CCR/账目):126 token;
  • 原始 AX:5,351 token;
  • 四工具 MCP 目录(四个工具的 schema 描述):287 token。

"四工具 MCP 目录 287 token"这一数字单独锁定,因为它是每次会话的固定隐性成本——在解读快照数字时应当把它计入总账。

复现步骤

基准文档给出的复现路径分三步,均依赖本机 Chrome 路径环境变量CAVEMAN_BROWSE_CHROME

第一步,运行 Caveman 的实 Chrome 基准与功能回路(集成测试):

CAVEMAN_BROWSE_CHROME="/path/to/Chrome" \ go test -tags=integration -run 'TestCDPQueryScales|TestCDPFullTokenEfficient' -count=5 -v ./browse

第二步,用同一分词器计数锁定版本的 Playwright ARIA 基线:

CAVEMAN_BROWSE_CHROME="/path/to/Chrome" \ node browse/scripts/playwright-aria-baseline.mjs | \ CAVEMAN_CCR_DB=/tmp/caveman-browse-bench.db \ go run ./engine/cmd/caveman-engine compress --type no-such-type >/dev/null

第三步,向基线脚本传入agent_checkout.html作为参数即可复现小表单那一行结果。基线脚本 browse/scripts/playwright-aria-baseline.mjs 的逻辑很直接:读取browse/testdata/下指定 fixture,对order_dashboard.html会先等待tbody tr达到 200 行再输出page.locator("body").ariaSnapshot(),保证渲染完成后再计数。四工具 MCP 目录的 287 token 成本是另行锁定的。

源码级解读:数字从哪里来

token 计数为什么是"精确"的

tokens_after的含义是agent 实际可见的 JSON 结果的精确 token 数,而不是压缩后树的 token 数。browse/session.go 中的finalizeSnapshotPayload实现了一个不动点迭代:将snapshotPayload(含uidsrecovery_handletokens_beforeview_tokenstokens_afterratiobasis字段)序列化为 JSON 后用默认计数器计数,把计数结果回填进tokens_after再重新序列化,最多 8 轮直至自洽。这正是基准表中 Caveman 数字区间极窄的原因——交付物里包含了对自身的精确账目。同时view_tokens单独隔离了紧凑树本身的成本,与tokens_after区分开。

压缩管线与 fail-closed 语义

browser_snapshot的调用链是:CDP 驱动拉取原始树 → 引擎a11y类型压缩 → 交付。browse/cdp.go 的Snapshot直接调用accessibility.GetFullAXTree()并 JSON 序列化,这就是表中"原始 AX"一行的来源;browse/session.go 的snapshotTool则把它交给eng.Compress(raw, engine.Options{Mode: engine.ModeCompress, Type: engine.TypeA11y, Query: a.Query})query参数即"聚焦渐进披露"的入口。

值得注意的防御性设计:如果压缩后没有产出恢复句柄支撑的 UID 视图,或 agent 可见快照没有比原始 AX 更小,snapshotTool拒绝把数百 KB 的原始树透传给 agent,返回cave_browser_snapshot_uncompressed错误并保留上一份快照的 UID 缓存——宁可让这次快照失败,也不交付比"不用 Browse"更差的结果。

聚焦快照为什么能到 121 token

browser_snapshot.query保留与查询最匹配的可达节点及其祖先,同时 CCR(engine/ccr/store.go 支撑的恢复存储)保留完整原始树;紧凑输出使用[uid] role "name"格式的行,且 UID 只分配给可操作或未知自定义角色节点。因此聚焦视图不是"全树再裁剪",而是按需重建的最小可操作视图。

集成测试门槛:数字背后的功能回路

基准的"Reproduce"一节还列出集成测试覆盖的门槛,这些对应 browse/cdp_integration_test.go 中的具体断言:

  • TestCDPQueryScalesOnTwoHundredRowDashboard:断言聚焦交付物比完整交付物至少小 10 倍、聚焦tokens_after ≤ 160ratio ≥ 0.99,并验证聚焦结果仍持有可点击的Review ORD-0173目标;
  • TestCDPFullTokenEfficientReadActVerifyRecoverLoop:完整跑通"读取 → type → select → 折叠线下按钮的自动滚动点击 → 动作后聚焦验证"回路,断言每个动作都报告settled:false并要求重新快照验证,且恢复工具返回的字节与驱动捕获的原始 AX逐字节一致(byte-exact);
  • TestCDPActionabilityRejectsDisabledButtonTestCDPStaleUIDFailsClosedAfterDOMReplacement:分别验证禁用控件被拒、DOM 被替换后旧 UID 的 backend node id 必须 fail-closed;
  • 其余门槛覆盖:类型输入、下拉选择、离屏自动滚动点击、动作后聚焦验证、禁用控件拒绝、陈旧 UID 拒绝、字节级实时恢复、fresh-home 启动、跨进程直接 CLI 重附着与显式 Chrome 关闭。

其中settled:false是刻意的设计:browse/cdp.go 的dispatchedAction注释说明,CDP 确认了分发不等于应用状态已稳定,声称settled=true会让 agent 信任未经验证的结果——聚焦快照才是廉价的、携带证据的验证步骤。集成测试甚至断言交付物中不能出现"verified"字样,强制 Browse 路径保持inferred-only 的诚实口径。

声明边界:结论的适用前提

基准文档最后一段划定了结论边界,复用时必须遵守:

  • 结果仅适用于本语料与本工具链(Chrome 151 + 锁定版 Playwright + 离线计数器);
  • Phase 1 只覆盖同源、控件可预期的页面;OOPIF(跨域 iframe)、对话框、下载、任意站点的可操作性问题均被推迟;
  • 对大页面,query 聚焦渐进披露是默认策略;当任务意图未知时仍可提供全量快照。

配套的功能说明与安装方式见 browse/README.md:构建命令为go build ./browse/cmd/caveman-browse,可直接 CLI 使用(caveman-browse snapshot <url> [query]actrecoverclose),也可作为 MCP 服务器运行。需要注意的是browse的源码与二进制以 BSL 1.1 发布,属于 source-available 而非 OSI 开源,第三方托管/托管服务/嵌入用途需要商业许可。

总结

这篇基准的价值不在单一数字,而在于一套完整的"token 账本"方法论:锁定浏览器与基线版本、用同一离线分词器计数、报告多次运行的中位数与区间、明确声明每份交付物的构成差异、诚实呈现小页面上的劣势,并用集成测试把"聚焦视图 ≤160 token、至少 10× 缩减、字节级恢复"固化为可回归的断言。对引用 Caveman Browse 压缩数据的读者,最可靠的做法是照搬 BENCHMARK.md 的两条复现命令在本机重跑,而不是直接采信任何未经工具链验证的转述数字。

【免费下载链接】caveman🪨 why use many token when few token do trick — Claude Code skill that cuts 65% of tokens by talking like caveman项目地址: https://gitcode.com/GitHub_Trending/caveman1/caveman

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/4 14:06:37

linux系统操作

含义&#xff1a;查看当前时间 date 含义&#xff1a;查看系统盘磁盘空间占用大小 df -h 含义&#xff1a;端口监听信息查看 netstat -lntp netstat -lntp | grep 80 含义&#xff1a;查看哪个进程在监听80端口 netstat -lntp | grep nginx 含义&#xff1a;查看nginx监听的…

作者头像 李华
网站建设 2026/9/4 14:04:09

什么是网络编程中的阻塞和非阻塞?它们有什么区别?

阻塞和非阻塞是在网络编程中经常听到的两个词。它们其实描述的是当一个程序在等待某些事情发生时&#xff0c;它会怎么做。阻塞&#xff1a;想象你正在给一个好朋友打电话&#xff0c;但你的朋友正在忙&#xff0c;没有接电话。如果你选择“阻塞”方式&#xff0c;那就意味着你…

作者头像 李华
网站建设 2026/9/4 14:01:06

AI浏览器插件实战:用大模型整理B站收藏夹与关注列表

你有没有过这种体验&#xff1a;B站关注列表已经涨到几百个UP主&#xff0c;刷首页像在随机抽卡&#xff1b;收藏夹还叫“默认收藏夹”&#xff0c;里面塞了三年都找不回来的教程&#xff1b;而粉丝数明明不低&#xff0c;却完全不知道他们想让你更新什么内容。这其实是很多人忽…

作者头像 李华
网站建设 2026/9/4 14:00:46

BlenderMCP 完整指南:自然语言驱动 AI 3D 建模

BlenderMCP 完整指南&#xff1a;自然语言驱动 AI 3D 建模 【免费下载链接】blender-mcp Community plugin to control Blender 3D with any LLM of your choice 项目地址: https://gitcode.com/GitHub_Trending/bl/blender-mcp BlenderMCP 是一款通过 MCP&#xff08;模…

作者头像 李华
网站建设 2026/9/4 13:59:33

[AutoSar]BSW_OS 04 Autosar OS_ISR 中断

目录关键词平台说明一、中断简介1.2 vector中断概述二 、中断向量表三 、中断分类3.1 开关中断控制3.2 二类中断3.2.1 配置3.2.2 code3.2.3 Nesting of Category 2 Interrupts3.3 一类中断3.3.1 一类中断的实现3.3.2 注意事项3.4 0类中断3.4.1 0类中断的实现3.4.2 注意事项关键…

作者头像 李华
网站建设 2026/9/4 13:58:05

别划走OBS预览:OBS Studio窗口置顶功能的完整上手指南

别划走OBS预览&#xff1a;OBS Studio窗口置顶功能的完整上手指南 【免费下载链接】obs-studio OBS Studio - Free and open source software for live streaming and screen recording 项目地址: https://gitcode.com/GitHub_Trending/ob/obs-studio 直播开着&#xff…

作者头像 李华