本节摘要:本节把第 10.1 节的并发系统接上账本。先解剖单任务的 token 成本结构:三成分——感知(把页面喂给模型:结构化快照是文本表示、截图是图像表示,两者 token 量级差数倍——第 4 章与第 5 章的成本结论在这里汇总成账)、决策(模型生成动作与思考的输出)、重试放大(第 6.2 节每级回退都是成本的乘数;救援越深,单任务越贵)。然后是省钱三招:结构化快照优先(同一任务能走第 4 章通道就不走截图通道,感知成本立降)、observe 缓存(第 3.3 节——高频指令命中缓存零模型调用)、固化高频路径(第 9.1 节——整段流程搬进纯代码,零 token 零边际)。第四件是模型分级:常规步用便宜模型、难步(重定位、复杂抽取)用强模型,路由规则显式可查。最后是预算与熔断:每任务成本台账、预算超标转人工,双语实现一个成本记账器。末尾与《AI 网页与文档数据抽取实战》划界:读取型数据管线的成本大头在解析与入库、风险面在数据合规;本书操作型任务的成本大头在交互步数、风险面在动作后果——两种工程,别抄错账本。
一个浏览器智能体任务的 token 账单可以拆成三项:
单任务成本 ≈ Σ(感知输入 + 决策输出) × 重试放大系数 感知输入:页面表示进模型的 token ├─ 结构化快照:文本表示,token 少(第 4 章「比截图便宜」的机制) └─ 截图:图像表示,token 是文本的数倍(第 5.1 节成本结论) 决策输出:模型产出的思考与动作序列化 重试放大:第 6.2 节回退链每一级都是乘数 └─ L0 重试一次 ≈ 成本翻倍;进入 L1 重定位 ≈ 再加一轮感知加决策
三个推论直接可画:其一,通道选择决定感知底价——同一个「读一下页面」的动作,走第 4 章快照通道与走第 5 章截图通道,账单差数倍;其二,步数是线性项——任务每多一步,感知加决策整组再来一次,第 3 章「指令三原则」压缩步数省的是真金白银;其三,救援是指数项——失败一次进 L1 的任务,成本轻易翻倍,第 6.2 节「把救援预算钉死」既是稳定性设计也是成本设计。第 8.3 节的事件流在这里再领一份工:它就是成本台账的原始数据(每个动作一条记录,附模型调用的 token 数即可记账)。
| 招 | 砍的成分 | 机理 | 出处与前提 |
|---|---|---|---|
| 结构化快照优先 | 感知输入 | 能走文本通道不走图像通道 | 第 4 章;页面语义可读时 |
| observe 缓存 | 感知加决策 | 高频指令命中缓存,零模型调用 | 第 3.3 节;指令稳定有命名纪律 |
| 固化高频路径 | 全部 | 整段流程进纯代码,零 token | 第 9.1 节;过五维决策表 |
三招的层次关系是彻底程度递增、适用门槛递增:快照优先是通道选择,几乎无门槛;缓存要指令纪律与失效治理;固化要决策表过审加回归任务集接盘。叠加使用是常态:一段流程先全走快照通道,高频步上缓存,最稳定的头两步固化成代码——第 3.3 节的「固化覆盖率」曲线就是这种叠加的进度条。反向提醒也成立:三招都在砍适应性换确定性,砍过头会撞上第 3.3 节不固化清单的四堵墙(A/B、动态、长尾、他人页面)。
第二档省钱思路:同一次任务里,不是每一步都配得上最强的模型。分级路由:
| 级 | 步骤类型 | 模型档位(示意) |
|---|---|---|
| 常规 | 缓存未命中的标准操作、简单抽取 | 便宜档 |
| 难步 | L1 重定位、复杂抽取、歧义消解 | 强档 |
| 断言 | 感知断言(第 9.2 节) | 按误判代价选,关键流程强档 |
路由规则必须显式可查(配置或代码里的白名单),不许藏在提示词的措辞里——第 11.2 节要按级别统计成本与成功率,路由黑箱会让这两个指标都失真。切换点复用现成机制:第 6.2 节回退链进入 L1 时正是「难步」信号,此时切强模型,一次救援的花费买更高的救回率。
# cost_ledger.py —— token 成本记账与预算熔断(写法示意) import json import time from pathlib import Path LEDGER = Path("runs") / "cost.jsonl" class CostMeter: def __init__(self, run_id: str, budget_tokens: int = 200_000) -> None: self.run_id = run_id self.budget = budget_tokens # 单任务预算(示意值) self.used = 0 def record(self, step: str, tokens: int, mode: str = "snapshot") -> None: self.used += tokens LEDGER.parent.mkdir(exist_ok=True) with LEDGER.open("a", encoding="utf-8") as fh: fh.write(json.dumps({ "ts": time.strftime("%H:%M:%S"), "run_id": self.run_id, "step": step, "tokens": tokens, "mode": mode, }, ensure_ascii=False) + "\n") if self.used > self.budget: raise RuntimeError(f"预算熔断:已用 {self.used} 超过 {self.budget}") print(f"[{self.run_id}] {step}: +{tokens} tokens(mode={mode})") meter = CostMeter("task-0417") meter.record("observe 首页", 3_000, mode="snapshot") # 文本通道:便宜 meter.record("视觉兜底定位", 18_000, mode="screenshot") # 图像通道:数倍 print("累计:", meter.used)
// cost_ledger.mjs —— token 成本记账与预算熔断(写法示意) import { appendFileSync, mkdirSync } from "node:fs"; const LEDGER = "runs/cost.jsonl"; /** * 任务级成本记账器:超标抛错熔断 * @param {string} runId 任务标识 @param {number} [budget=200000] 预算(示意值) */ function createCostMeter(runId, budget = 200000) { let used = 0; return { /** 记一笔 @param {string} step 步骤 @param {number} tokens token 数 @param {string} mode 通道 */ record(step, tokens, mode = "snapshot") { used += tokens; mkdirSync("runs", { recursive: true }); appendFileSync( LEDGER, JSON.stringify({ ts: new Date().toISOString(), runId, step, tokens, mode }) + "\n", "utf8" ); if (used > budget) { throw new Error(`预算熔断:已用 ${used} 超过 ${budget}`); } console.log(`[${runId}] ${step}: +${tokens} tokens(mode=${mode})`); }, get used() { return used; }, }; } const meter = createCostMeter("task-0417"); meter.record("observe 首页", 3000, "snapshot"); // 文本通道:便宜 meter.record("视觉兜底定位", 18000, "screenshot"); // 图像通道:数倍 console.log("累计:", meter.used);
台账的聚合口径提前对齐第 11.2 节:按任务、按通道(mode)、按步骤类型三个维度各出均值与分布——「成本看板」的原料就是这份 JSONL。熔断的动作与第 6.2 节预算耗尽一致:转人工工单,任务标记「成本超限」,不默默吞掉。
与并行成书的《AI 网页与文档数据抽取实战》在此划界:那本书的主角是读取型数据管线——抓取、解析、清洗、入库,成本大头在解析与存储、优化方向在吞吐与增量调度、风险面在数据合规;本书的主角是操作型任务——登录、填报、提交、验证,成本大头在交互步数与救援、优化方向在固化与并发纪律、风险面在动作后果(不可逆、错误落账)。边界场景(抓取要登录、填报要抽数)两边的工具会互相借用,但账本别抄错:拿读取型的「吞吐优先」去跑操作型任务,会得到一堆半途而废的提交;拿操作型的「步步验证」去跑读取型管线,账单会多一个零。交叉阅读时按任务性质对号入座。
| 坑 | 现象 | 排查与处理 |
|---|---|---|
| 截图通道当默认 | 账单普遍偏贵 | 快照能读就走第 4 章通道,视觉做兜底 |
| 救援无成本上限 | 少数任务吃掉多数预算 | 第 6.2 节救援预算加本章熔断双层 |
| 模型路由藏在提示词里 | 成本统计失真 | 路由规则显式进配置 |
| 只看总账不看分布 | 均值正常、长尾失控 | 按任务与通道看出分布 |
| 抄错账本 | 操作任务跑成流水线 | 读取型与操作型对号入座 |
执行面与成本面都有了,最后一步是把它们变成可运维的系统:flake 不再是玄学、错误有分类学、发布有清单。下一章是全书工程线的收束——生产化。