# 保哥笔记 — AI编程与工具链 > 本分片含 35 篇文章,按发布日期倒序。全部分片索引见 https://zhangwenbao.com/llms-full.md **站点**:https://zhangwenbao.com/ **分类**:AI编程与工具链 **生成**:2026-09-12 16:00:11 CST --- ## 子代理省的从来不是时间,是上下文,可你派活那一刻账就已经算错了 - URL:https://zhangwenbao.com/subagent-spawn-decision-and-model-routing.html - 分类:AI编程与工具链 - 发布:2026-07-31 | 更新:2026-07-31 - 摘要:子代理不是加速器是上下文隔离。窗口、缓存门槛、权限继承三个硬约束,加五问派活清单与模型路由三维度。 - 关键词:缓存,子代理,成本优化 > **TLDR**:摘要:子代理最流行的那套用法是“探路派便宜模型、执行派贵模型”,而做这套工具的厂商自己已经把这条默认改了——官方内置的探索型子代理从某个版本起不再固定跑最便宜那档,改成继承主会话的模型并封顶,理由写在文档里:它永远不比你已经选的那个更贵,也不会更便宜到看不懂地形。更麻烦的是另一条被忽略的硬约束:最便宜那一档模型的上下文窗口只有旗舰档的五分之一,而子代理最经典的用法恰恰是往里塞几十万词元的日志。同样反直觉的还有缓存——三档模型的起缓存门槛不是一个数,最便宜那档的门槛是最贵那档的八倍,很多子代理的固定前缀正好卡在中间,主会话里能缓存,挪进子代理就静默失效且不报错。这篇把派活这件事拆成五个可以按顺序问的问题,给出装得下、判断力、缓存复用三条路由维度,并解释同一个派活接口为什么会同时存在两种完全相反的经济学。 > 摘要:子代理最流行的那套用法是“探路派便宜模型、执行派贵模型”,而做这套工具的厂商自己已经把这条默认改了——官方内置的探索型子代理从某个版本起不再固定跑最便宜那档,改成继承主会话的模型并封顶,理由写在文档里:它永远不比你已经选的那个更贵,也不会更便宜到看不懂地形。更麻烦的是另一条被忽略的硬约束:最便宜那一档模型的上下文窗口只有旗舰档的五分之一,而子代理最经典的用法恰恰是往里塞几十万词元的日志。同样反直觉的还有缓存——三档模型的起缓存门槛不是一个数,最便宜那档的门槛是最贵那档的八倍,很多子代理的固定前缀正好卡在中间,主会话里能缓存,挪进子代理就静默失效且不报错。这篇把派活这件事拆成五个可以按顺序问的问题,给出装得下、判断力、缓存复用三条路由维度,并解释同一个派活接口为什么会同时存在两种完全相反的经济学。 先摆两组打架的数据。 一组来自实践社区的共识:把子代理当上下文垃圾回收用,探路派便宜模型、执行留给贵模型,端到端成本能降一半以上。 另一组来自做这套系统的厂商自己的工程复盘:他们把研究型任务做成多智能体架构之后,词元消耗是普通对话的十五倍,换来的是相对单个旗舰模型高出九成的表现。 一个在省钱,一个在花钱,用的是同一个派活接口。 这不是谁错了。这是两件被同一个词盖住的不同的事,而分不清它们,正是大多数团队的词元账单失控的起点。 ## 子代理到底在替你省什么? 先把最容易搞混的一条讲清楚:子代理省的不是墙上时钟的时间,是主会话的上下文占用。 这不是我的个人偏好,官方文档里写得相当直白。在Claude Code关于创建自定义子代理的那篇文档 (https://code.claude.com/docs/en/sub-agents)里,“该用主会话还是该用子代理”那张对照里,“延迟”被明确放在了该留在主会话的那一侧,理由的原话是:子代理从零开始,可能需要时间去收集上下文。 厂商自己没把它当加速器。这句话值得抄在显示器上。 那它当什么用?同一篇文档开头给的定位是:当一个附带任务会用搜索结果、日志或者你之后再也不会引用的文件内容淹没主对话时,用子代理——它在自己的上下文里干完那摊活,只把摘要交回来。 ## 合适的形状:输入大、输出小、无状态 这三条要同时成立,缺一条价值就掉一大截。 - 输入大。子代理要读的东西比它要还的东西多一个数量级以上。读三个文件回答一句话,值;读一个文件回答一句话,不值。 - 输出小。能压成结构化摘要。如果输出的形状要看它读到什么才能定,说明你还没想清楚要它干什么。 - 无状态。它不需要知道主会话此刻的假设,主会话之后也不需要它的中间过程。 反过来读这三条,就得到了不该拆的场景。最典型的是迭代式排查:你在追一个问题,形成假设、验证、修正,每一步喂下一步。这里派子代理会把工作记忆切断——它继承不到你刚形成的那个假设,而摘要按定义就不包含那个假设。 第二典型的是父会话稍后还要再读一遍的情况。子代理返回“这五个文件要紧”,然后父会话把这五个文件全打开重读——同一份内容付了两次钱。这种事比想象中常见得多,而且在账单上完全看不出来,因为两笔都是正常的读取。 ## 被隔离掉的到底是什么东西 “污染”这个词用得有点笼统,值得拆一下。子代理隔离的其实不是无用信息,而是那些会让后续判断变差的中间产物——试错时读过又证明无关的十几个文件、检索时命中又被排除的一堆候选、报错重试留下的三份几乎相同的堆栈。 这些东西的共同点是:它们在当时是必要的,事后是负担,而且模型不会自己把它们标记成过期。站内那篇讲上下文工程真正的杠杆是删不是加 (https://zhangwenbao.com/context-engineering-subtraction-practice.html)的文章里有一条实证结论正好接在这儿——上下文变长带来的退化不是一条平滑曲线,是撞悬崖,有的模型在某个长度突然塌方;而且伤害大小取决于问题与目标信息的语义相似度。 把这两条合起来读就得到一个不太舒服的推论:你在短上下文里跑通的验证,对长上下文没有预测力。所以“这条流程我试过没问题”这句话,在会话跑长之后是不作数的——而子代理正是为数不多能把这条曲线按住的手段。 ## 为什么“并行更快”这个直觉在生产里几乎总是错的? Cognition团队2025年6月12日那篇被反复引用的《别造多智能体》 (https://cognition.com/blog/dont-build-multi-agents),作者Walden Yan给的两条原则原文很短: > Share context, and share full agent traces, not just individual messages. Actions carry implicit decisions, and conflicting decisions carry bad results. 翻成人话是:要共享上下文,而且要共享完整的执行轨迹而不只是单条消息;每一个动作都夹带着隐含的决策,而互相冲突的决策一定带来糟糕的结果。 他给的反例是造一个像素小鸟游戏:一个子任务的智能体误解了指令,做了一个类似超级马里奥的背景;另一个子任务的智能体做的小鸟角色风格完全不搭。最后主体被迫把这两个各自跑偏的产物整合起来。 他对失败原因的判断是:决策变得太分散,上下文没法被充分共享。他给的最简方案是单线程线性架构;任务太长装不下时,再引入一个专门的模型把行动与对话的历史压缩成关键细节。 ## 唯一的判据:交接契约能不能在派活之前写死 那个像素小鸟的例子里,真正出错的不是并行本身,是“背景该是什么风格”这个决策没有被任何人做出来,于是两个子代理各自做了一遍,做的还不一样。 由此得到一条能直接用的判据:只有当你在派活之前就能把每个子代理的返回结构写出来,才用并行派工。写不出来,说明有决策还没做,那就先在主会话里把它做掉。 站内那篇拆多智能体协作怎么配、三种并行方案怎么选 (https://zhangwenbao.com/claude-code-agent-teams.html)的文章讲的是配置层面的怎么做,这条判据补的是要不要做——两件事分开问,顺序别反。 ## 第三方框架把这件事拆成了两种拓扑 这条判据不是某一家的私货。LangGraph官方文档把多智能体系统归纳成监督者与交接两类拓扑 (https://langchain-ai.github.io/langgraph/agents/multi-agent/),区别正好落在决策权归谁:监督者模式里,由一个中心节点决定下一步交给谁,子节点只管干活;交接模式里,每个智能体自己决定要不要把控制权移交给另一个,以及移交时带上什么。 把它和前面那条判据对上就很清楚了:监督者模式要求你在设计期就把分工写死,交接模式把这个决定推迟到运行时。写得死的用监督者,写不死的说明你对任务的理解还不够,那用交接模式也只是把没做的决定丢给模型去做,而模型做这个决定的依据比你少。 这也解释了为什么那么多多智能体项目在演示里很漂亮、上生产就散架:演示用的是路径固定的任务,任何一种拓扑都跑得通;生产里的任务路径不固定,于是设计期写死的那份分工开始和实际需要的分工对不上,而没有人会在中途去改它。 ## 那厂商自己为什么反着来? 现在回到开头那组打架的数据,因为它是这篇文章里最值得琢磨的地方。 Anthropic工程博客那篇复盘自家多智能体研究系统怎么造出来 (https://www.anthropic.com/engineering/multi-agent-research-system)的文章给了几个很硬的数字:这套系统由一个旗舰档的主导智能体做规划,并行拉起三到五个次级档的子智能体,各自独立检索、各自评估工具结果、把发现交回主导者综合,最后还有一道单独的引用核对;内部评测里它比单个旗舰档模型高出九成以上。代价是词元消耗大约是普通对话的十五倍。 还有一个更值得注意的发现:在他们的浏览类评测里,光是词元用量这一个变量就解释了约八成的表现方差,工具调用次数和模型选择只解释剩下那部分。 把这两件事放在一起,事情就清楚了:他们不是在省钱,他们是在用钱买表现。而社区那套“子代理降本六成”的做法,目的是省钱。同一个接口,两个方向相反的目标。 ## 两种经济学,两套账 | 隔离噪声型 | 并行探索型 | 目的 | 让主会话不必背负这段上下文 | 用更多并行推理换更好的结果 | 典型形状 | 输入大、输出小、路径确定 | 输入不大、路径不确定、需要广度 | 成功指标 | 总成本下降,质量不掉 | 质量上升,成本可接受 | 词元走向 | 降 | 大幅升 | 用便宜模型 | 常常合适 | 常常是错的 | 做错的信号 | 成本没降 | 质量没升 | 这张表最有用的是最后一行。两种用法的失败长得完全不一样,所以只看总账单是判断不出来的。一条隔离噪声型的线,账单降了两成就算成功;一条并行探索型的线,账单降了两成大概率说明它根本没跑起来。 ## “词元用量解释八成方差”这句话该怎么读 那个八成的数字很容易被读成“多花钱就有用”,但它真正的含义要更刺一点。 它说的是:在那组评测里,一个系统表现好不好,主要不取决于它用了什么模型、调了几次工具,而取决于它总共处理了多少词元。工具调用次数和模型选择加起来只解释剩下的那部分。 这条对做架构的人有两个后果,方向相反: - 好消息是,并行确实有效——多个独立上下文窗口同时推理,加起来的处理量是单个窗口做不到的,这就是那九成提升的物理来源。 - 坏消息是,如果表现主要由处理量决定,那么任何以减少处理量为目标的优化,都是在拿表现换成本。“既省钱又提质”这种话在这个维度上不太成立,你只能在某一段区间里做得比别人更有效率。 所以这两派的分歧其实可以调和成一句话:省词元的做法能省的是无效处理量,省不到有效处理量头上。子代理隔离噪声,省的是主会话反复重读那堆废弃中间产物的量,这部分本来就没产生价值;而并行探索增加的是有效处理量,它买的是覆盖面。前者该省,后者省不得,把两者混成同一笔账才是问题所在。 ## 那条被两边都跳过的判据 社区那套建议是“调度用便宜模型,叶子节点用贵模型”,理由是调度只是路由和状态跟踪;厂商的做法正好相反,主导者用旗舰档。两边都对,因为它们说的“调度”不是一件事。 判据可以浓缩成一句:这个调度器要不要决定“问题是什么”。 - 如果它只是把已经定义好的三件事分给三个人,然后等结果拼起来——那是路由,便宜模型足够。 - 如果它要把一个模糊的问题拆成若干个可以并行的子问题,还要在结果回来之后判断哪些可信、哪些矛盾、缺了什么再派一轮——那是全场最难的一步,省在这里等于省错了地方。 厂商那套研究系统属于后者:把一个开放式的研究请求拆成子查询,本身就是整个任务里认知负荷最高的动作。社区那套博客写作管线属于前者:选题、调研、写作、配图这四步是人事先定死的。 ## 便宜模型探路这条默认路由,厂商自己已经改了 这一节是我核材料时最意外的一处。 官方内置了一个叫Explore的只读探索型子代理,用来在不改动任何东西的前提下搜索和理解代码库。早期版本它固定跑在最便宜那一档模型上——这正是社区那条“探路派便宜模型”建议的来源。 但从版本2.1.198起,这条默认被改掉了。现在的行为是:Explore继承主会话的模型,并且在官方接口上封顶在旗舰档——文档给的理由原话是,这样Explore永远不会跑在比你已经为这个会话选定的那个模型更贵的模型上。主会话跑在中档,Explore就跑中档;主会话跑在最便宜那档,Explore也跑那档。 注意这个改动的方向:默认值从“尽可能便宜”变成了“不比你贵”。这两句话听起来差不多,实际差得很远——前者是成本优先,后者是一致性优先,成本封顶。 ## 为什么会往这个方向改 文档没有解释动机,但从工程上不难推:便宜模型探回来的那份地形图,执行那一步的模型未必看得懂。 探路子代理的输出是一份高度压缩的摘要,压缩的过程本身就是一次判断——哪些细节值得留、哪些可以扔。压缩得越狠,对压缩者的判断力要求越高。一个能力档次明显低于执行者的模型做这件事,扔掉的可能恰恰是执行那一步唯一需要的那条线索。 这个失败模式在账单上完全看不见:探路那一步很便宜,执行那一步也正常完成了,只是结果差一点。你会以为是执行模型不行。 顺便,官方文档也保留了退路:你自己定义一个同名的子代理就能覆盖内置的那个,并且自己指定模型字段。所以想继续走便宜路线是可以的,只是这件事从默认变成了显式选择——它逼你为这个决定负责,这个变化本身比默认值是什么更重要。 ## 最便宜的那一档,装得下你要它读的东西吗? 这是我认为整个话题里最被忽略的一格,而且它是一道硬墙,不是一个权衡。 几乎所有讲子代理的材料都会举同一个例子:派一个便宜模型去扫几十万词元的日志,定位失败模式,返回一段堆栈。这个例子有个问题——按当前的模型阵容,最便宜那一档根本装不下几十万词元。 按官方模型总览页给出的规格 (https://platform.claude.com/docs/en/about-claude/models/overview),旗舰档和中档的上下文窗口都是一百万词元级别,而最便宜那一档是二十万。差五倍。 档位 | 上下文窗口 | 相对单价 | 适合的子代理形状 | 旗舰档 | 百万级 | 最高 | 需要判断力的生成、要做取舍的评审、要决定问题是什么的调度 | 中档 | 百万级 | 中 | 长文档结构化抽取、搜索并摘要、跨文件检索 | 最便宜档 | 二十万级 | 最低 | 批量分类过滤、确定性格式转换、短输入高吞吐 | 这张表右边那一列和左边那一列合在一起看,会看出一件相当反直觉的事:子代理最经典的用法是往里塞大输入,而最便宜的那一档恰好是窗口最小的那一档。这两件事在方向上是打架的。 所以“扫大日志派便宜模型”这条建议,在今天要么得改成中档,要么得先分片再派。分片这件事本身又有成本——它需要一个知道该按什么维度分的东西,而那又是判断力。 ## 被截断的失败长什么样 更麻烦的是超窗的失败方式。它通常不表现为报错,而表现为子代理只读到了前面一部分就开始回答,而且答得挺像样。它不知道自己没读完。 站内那篇讲词元估算工具那把尺子刻的是哪一代分词器的口径 (https://zhangwenbao.com/token-counter-tokenizer-generation-gap-window-cost-guide.html)的文章里有一条结论正好接在这儿:本地估出来的词元数和真实口径能差出五成,也就是说你以为塞了十五万,实际可能已经过线。派活之前先量一遍,别靠估。 ## 窗口这一格该放在哪一层去看 站内那篇讲智能体骨架的六层该按什么顺序建 (https://zhangwenbao.com/agent-harness-layers-build-order.html)的文章有一条结论可以直接借过来:真正撑住稳定性的是评估与容错这两层,而它们通常被排在最后。窗口这件事就是典型的容错层问题——它不是能力问题,是边界问题,而边界问题只有装了传感器才看得见。 具体到子代理,最省事的传感器是一行断言:派活之前把输入量一遍,超过目标模型窗口的八成就直接抛错,别让它跑。宁可失败得很响,也别成功得很安静。这一行代码的性价比,比这一整节讲的所有选型考虑加起来都高。 ## 冷启动税到底是多少,为什么它不是一个固定数字? 每派一次子代理都有固定开销:系统提示重新计算、项目规则文件重新加载、工具描述重新注入。社区常给的经验值是每次三五千词元,低于一万词元的有效工作量就不划算。 这个量级大体没问题,但“固定开销”这个说法不准确——它不固定,而且不均匀。 官方文档里有一条几乎没人引用的说明:内置的Explore和Plan这两个子代理会跳过项目规则文件和父会话的版本控制状态,理由是让研究保持快速和廉价;而其余所有内置子代理,以及你自己写的每一个自定义子代理,两样都会加载。 换句话说,免税待遇只发给两个官方子代理。你自己写的那七八个专家子代理,每一个每一次派活都要把整份项目规则文件重新读一遍。项目规则文件写到三千词元,七个子代理各派一次,光这一项就是两万一千词元,而这些内容主会话里本来就有一份。 站内那篇讲项目规则文件不是写得越详细越好、最优行数是多少 (https://zhangwenbao.com/claudemd-minimalist-guide.html)的文章原来的论据是注意力稀释,这里给了它第二条更算得清的理由:规则文件的长度会被子代理的数量乘一遍。 ## 缓存那一格才是真正的分水岭 但冷启动税还不是最贵的那部分。最贵的是缓存。 按官方提示缓存文档给出的价格倍率 (https://platform.claude.com/docs/en/build-with-claude/prompt-caching),缓存写入是基础输入价的1.25倍,缓存读取只有0.1倍。也就是说一段稳定前缀只要被复用一次以上,成本就降到了原来的十分之一附近。主会话之所以跑几十轮还不至于破产,很大程度上靠的是这一格。 问题是缓存是按模型分区的。你为了省钱把子代理换成另一档模型,等于换到了一个空的缓存分区——那段本来能按十分之一计价的前缀,在子代理这边要按1.25倍重新写一遍。 然后是这篇文章里我最想让人记住的那个数字。同一份文档里列了各模型的最小可缓存前缀,而这个数不是单调的: 档位 | 最小可缓存前缀 | 低于门槛时的表现 | 旗舰档 | 512词元 | 静默不缓存,不报错 | 中档 | 1024词元 | 静默不缓存,不报错 | 最便宜档 | 4096词元 | 静默不缓存,不报错 | 最便宜那一档的起缓存门槛,是最贵那一档的八倍。 这件事的后果很具体:一个子代理的固定前缀——它自己的系统提示加上工具描述——很容易落在一两千词元这个区间。这个长度在旗舰档和中档都能进缓存,挪到最便宜那一档就进不去了,而且没有任何提示。你以为省了钱,实际是把一段本来能按十分之一计价的内容,换成了每次全价重算。 怎么查?文档给的办法很直接:看返回里的缓存读取词元数。如果重复派活很多次它一直是零,那就是没进缓存,去比对长度和门槛。 顺带还有一条同源的坑:同一份文档的失效层级表里写着,工具定义只要变动,工具、系统、消息三层缓存全部作废。所以那种“按任务动态增删工具”的设计,看着灵活,代价是每改一次就把整条会话的缓存清零一次。 ## 把一次真实的派活算成数字 抽象的倍率不如一笔具体的账好使。假设一个搜索型子代理,固定前缀是系统提示八百词元加工具描述一千二百词元,共两千词元;项目规则文件三千词元;每次工作输入两万词元,输出五百词元。一天派四十次。 配置 | 每次固定前缀怎么计价 | 四十次的固定前缀总量 | 留在主会话(前缀已缓存) | 不重复,缓存读取 | 约2000词元按0.1倍读一次 | 子代理用同档模型 | 前缀5000词元,首次1.25倍写入,之后0.1倍读取 | 1次写入加39次读取 | 子代理降到最便宜档 | 前缀5000词元过了4096门槛,同上但单价更低 | 1次写入加39次读取 | 子代理降档且不加载规则文件 | 前缀2000词元,低于4096门槛,静默不缓存 | 40次全价重算 | 看最后一行。它是四种配置里看起来最省的那个——模型最便宜、前缀最短、规则文件也没加载——实际是唯一一个每次都要全价重算固定前缀的。为了省钱做的三件事,最后一件把前两件的收益抵消掉了,而且没有任何提示。 这个坑之所以隐蔽,是因为它的三个成因单独看每一个都是对的:换便宜模型对、精简前缀对、不加载不需要的规则文件也对。是它们凑在一起才越过了那条门槛线,而门槛线在文档的另一页上。 顺带说,这类“单独审查每一项都合规、凑一起才出事”的故障,在站内做过基础设施排查的那几篇里反复出现过。它的通用特征是:没有任何一个环节可以被指认为犯错的那一环,所以复盘会开完通常没有结论。 ## 那到底该按什么路由模型? 社区那套说法是“按决策复杂度路由,不按输入体量”。这句话本身没错,但只够一半——它假设了所有模型都装得下、缓存行为都一样,而上面两节说明这两个假设都不成立。 补全之后是三个维度,按顺序问: - 装得下吗?把实际输入量量一遍,超过最便宜那档的窗口,这一档直接出局,不用讨论价格。 - 输出需要判断力吗?需要取舍、需要从零碎证据里综合、需要决定问题是什么的,往上走一档。只需要准确不需要创造的,中档就够。确定性的分类和格式转换,最便宜那档最划算。 - 这段前缀会被复用多少次?只派一次的,缓存不用考虑;一天要派几十次的,先确认前缀长度过了那一档的门槛,过不了就把前缀补厚,或者干脆别降档。 第三条听起来很怪——为了让缓存生效而故意把提示词写长——但账是这么算的:把一段一千八百词元的前缀补到四千一百词元,多出来的部分第一次全价写入,之后每次按十分之一读取。派活超过三次就回本了。这不是优雅的做法,是门槛设成阶梯就一定会产生的套利空间。 ## 成本模型里最容易漏的两项 常见的单次派活成本公式是:冷启动开销乘输入单价,加上工作输入乘输入单价,再加输出乘输出单价。这个公式漏了两项,而漏掉的这两项恰恰在生产里占比最大: - 缓存分区切换的损失。本来能按0.1倍读取的部分,换模型后按1.25倍重写。前缀越长,这一项越大。 - 父会话重读的重复计费。子代理读过、父会话又读一遍的那部分,在两边都是正常读取,账单上没有任何标记。 观测上我建议记两个比值,按子代理分桶:开销词元除以工作词元,以及缓存读取词元除以总输入词元。第一个长期高于0.3,说明委派策略有问题;第二个长期接近零,说明你的子代理压根没吃到缓存。站内那篇拆订阅档、团队版与接口计费到底怎么算、省钱机制在哪 (https://zhangwenbao.com/claude-code-pricing-guide.html)的文章可以配着看,那篇讲的是账面价格,这里讲的是这些价格在多代理结构下怎么被放大或抵消。 ## 工具权限继承那一格,最容易漏的是什么? 子代理会继承一样很多人低估的东西:工具权限。官方文档对内置子代理的表述是,每一个都继承父会话的权限,再叠加额外的工具限制。 标准防御是最小权限白名单:搜索型子代理只给读文件和搜索,写注释型子代理只给读和改文件、不给命令执行。这条大家都知道。 但有一格几乎所有人都漏:技能工具。文档里写得很清楚——如果不把技能这个工具从子代理的工具清单里去掉(或者放进禁用列表),子代理在执行过程中仍然可以自己发现并调用项目级、用户级和插件提供的技能。 这一格为什么危险,稍微推一下就明白:你给一个子代理配了只读权限,觉得很安全;但它能调用的某个技能内部可能会执行命令、写文件、发网络请求。你限制的是它直接能做什么,没限制它能借谁的手。 这条在提示注入的场景下尤其要紧。如果一段注入指令从外部内容——比如抓回来的网页、用户提交的评论——钻进了子代理的输入,它就能借技能这条路触发父会话本来会拦下来的操作。站内那篇讲从安全评审到权限模型与提示注入防御 (https://zhangwenbao.com/claude-code-security.html)的文章给了完整的防御面,这里只补一句:白名单要连技能一起白名单,只列工具是漏的。 ## 一份能直接照着走的派活检查清单 把前面几节压成五个按顺序问的问题。任何一步答“否”就停在主会话里做。 - 有效输入是不是超过一万词元?低于这个量级,冷启动税吃掉全部收益。 - 输出能不能压到两千词元以内,且结构在派活前就写得出来?写不出来,说明还有决策没做。 - 父会话之后需不需要看原始证据?需要,就别拆——摘要漏掉的那个细节往往就是根因。 - 目标模型装得下这些输入吗?量一遍,别估。 - 这段前缀会被复用几次,过了那一档的缓存门槛没有?高频复用的,缓存这一格的权重高于单价。 还有一条不属于清单但值得单列的经验:同一形态的任务在主会话里处理过至少三次之后,才值得抽成一个固定的专家子代理。专家化过度的代价是七个子代理各自维护一份提示词,每个一个月被调用两次,质量在你不知道的情况下缓慢漂移。这跟微服务拆早了是完全一样的病。 ## 这套东西落到独立站运营的活上是什么样? 上面全是工程语言,落到实际业务上其实很好对号入座。 任务 | 该不该拆 | 理由 | 扫三百个产品页找出缺结构化数据的 | 拆 | 输入大输出小,判据确定,中档或最便宜档都行 | 读竞品站二十篇文章总结定位差异 | 拆 | 典型的读得多说得少,但输出需要判断,走中档 | 把一批产品描述改写成统一口吻 | 不拆 | 输入不大,且口吻一致性需要同一个上下文里连着做 | 排查某个页面为什么掉排名 | 不拆 | 迭代式假设验证,摘要会切断工作记忆 | 批量给旧文补内链 | 看情况 | 候选池检索可以拆,具体插哪句不能拆 | 每天扫一遍站点日志找异常 | 拆,但注意窗口 | 日志量常常超过最便宜档的窗口,要么分片要么升档 | 最后那一行是本文两条主线交汇的地方,也是我见过最多人踩的一格:它看起来是最标准的子代理场景,恰恰因为标准,大家会直接照抄“派便宜模型”这条建议,然后撞上窗口。 ## 一个美妆站的真实返工 去年年底帮一个做护肤的出海站搭产品页批改流水线,第一版设计得挺漂亮:五个专家子代理,分别管标题、描述、成分表、结构化数据、内链,全部派最便宜那档,主会话负责调度和合并。 跑了两周,两个毛病同时冒出来。 第一个是内容打架。成分表那个子代理按法规口径把某个成分写成了标准名,描述那个子代理按营销口径写成了俗名,同一个页面上两个名字。这就是那条“互相冲突的决策带来糟糕结果”的原话在电商页面上的样子——没有任何一个子代理做错了,是“该用哪个口径”这个决策从来没有人做过。 第二个是账。五个子代理各自的固定前缀都在两千词元上下,全都卡在最便宜那档的门槛下面,四十个页面跑一轮就是两百次全价重算。当时没意识到,只觉得比预期贵。 返工的做法很朴素:五个砍成两个。第一个负责“读”——把页面现状、法规口径、竞品同类表述一次性读完,返回一份统一的事实清单;第二个负责“写”——拿着这份清单一次性把五处全改了,中间不再拆。口径冲突消失了,因为它现在只在一个上下文里被决定一次。 成本也降了,但降的原因跟我们最初以为的完全不一样:不是因为用了便宜模型,是因为派活次数从五次降到两次,而且合并后的前缀过了缓存门槛。 这件事之后我给自己定了条规矩:拆子代理之前先问一遍,被拆开的这几件事之间有没有共享的判断。有的话,那个判断必须在拆之前做完,或者干脆别拆。 还有一件事值得连起来看。本批另一篇讲内容自动化的触发器该挂在业务事实上、产出要有回执 (https://zhangwenbao.com/content-automation-trigger-and-receipt.html)的文章,讲的是流水线层面的可发现性;这篇讲的是流水线内部单个环节的派活决策。两者是同一件事在两个尺度上的表现——没有回执你不知道整条线好不好,没有那两个比值你不知道单次派活值不值。两个尺度都装了仪表,才谈得上调优。 ## 保哥的一句话总结 子代理是个动力工具,大多数任务不需要动力工具。默认留在主会话,能说出“我要隔离掉哪一段污染”或者“我要并行探索哪几条互不相干的路”才派活。说不出来的时候派出去的那些,通常不是在解决问题,是在把问题换个地方发生。 ## 常见问题解答 ## 子代理和技能到底怎么选? 判据只有一条:父会话需不需要对中间推理过程保持无感知。需要隔离的,用子代理;不需要隔离、只是想复用一段指令的,用技能。技能跑在父会话的上下文里,它是提示词扩展,不产生隔离;子代理是独立的一次调用,有自己的上下文窗口和系统提示。官方文档在“该用子代理还是主会话”那节之后专门补了一句,想要可复用的提示词或工作流就考虑技能,说的是同一件事。 ## 把调度器换成便宜模型,一定能省钱吗? 不一定,取决于这个调度器要不要决定问题是什么。如果它只是把已经定义好的几件事分发下去、等结果拼起来,那是路由,换便宜模型通常有效;如果它要把一个模糊的问题拆成可并行的子问题,还要判断回来的结果哪些可信、缺了什么再派一轮,那这一步是全场认知负荷最高的,省在这里省错了地方。做这套系统的厂商在自家研究型产品里用的正是旗舰档做主导者。 ## 为什么我给子代理换了便宜模型,账单反而涨了? 最常见的两个原因都跟缓存有关。一是缓存按模型分区,换模型等于换到空分区,本来能按十分之一读取的前缀要按1.25倍重新写入;二是最便宜那一档的最小可缓存前缀是四千多词元,是旗舰档的八倍,很多子代理的固定前缀落在中间,在主会话能缓存、挪过去就静默失效。查法是看返回里的缓存读取词元数,长期为零就是没进缓存。 ## 项目规则文件要不要给子代理加载? 官方的做法是分开对待:内置的探索型和计划型子代理会跳过规则文件和父会话的版本控制状态,其余内置子代理和所有自定义子代理都会加载。这意味着规则文件的长度会被子代理的数量乘一遍,写到三千词元、七个子代理各派一次,光这一项就两万多词元。所以子代理用得多的项目,规则文件更该精简,这跟注意力稀释是两条独立成立的理由。 ## 子代理的工具白名单,除了工具还要限制什么? 技能。这是最容易漏的一格:如果不把技能这个工具从子代理的工具清单里去掉或者加进禁用列表,子代理在执行过程中仍然可以自己发现并调用项目级、用户级和插件提供的技能。后果是你限制了它直接能做什么,但没限制它借别人的手做什么——某个技能内部可能会执行命令或者发网络请求。有外部内容进入子代理输入的场景下,这条尤其要紧。 ## 怎么知道自己的委派策略是不是坏的? 按子代理分桶记两个比值。第一个是开销词元除以工作词元,长期高于0.3说明拆得太碎,冷启动税占了主导;第二个是缓存读取词元除以总输入词元,长期接近零说明子代理压根没吃到缓存。这两个数都能从接口返回的用量字段里直接算出来,不需要额外埋点,但默认没人看,得自己接一个看板。 ## 权威参考资料 ## Token估算工具那把尺子刻得很准,只是刻的是上一代分词器的口径 - URL:https://zhangwenbao.com/token-counter-tokenizer-generation-gap-window-cost-guide.html - 分类:AI编程与工具链 - 发布:2026-07-27 | 更新:2026-07-27 - 摘要:同一份中文内容用两代分词器各数一遍:这款工具对上一代词表中位只差6.2%,对新一代却系统性多报51.2%。文中给出成因、可直接套用的换算倍数,以及官方精确计数端点怎么用。 - 关键词:API成本,Token优化,上下文窗口 > **TLDR**:摘要:这款工具的估算不是不准,是准得偏心。拿站内120篇长文做对照,它给的中间档相对GPT-4那代词表的中位偏差只有6.2%,97.5%的文章落在它给的上下界之间——承诺的一成五误差兑现得干干净净。问题出在换代之后。同样这120篇,换成GPT-4o那代词表再数一遍,它系统性多报51.2%,而且没有一篇的真实值落进它给的区间。它把新旧两档口径都画在了同一边,新的那一端从来没够着过。 > 摘要:这款工具的估算不是不准,是准得偏心。拿站内120篇长文做对照,它给的中间档相对GPT-4那代词表的中位偏差只有6.2%,97.5%的文章落在它给的上下界之间——承诺的一成五误差兑现得干干净净。 问题出在换代之后。同样这120篇,换成GPT-4o那代词表再数一遍,它系统性多报51.2%,而且没有一篇的真实值落进它给的区间。它把新旧两档口径都画在了同一边,新的那一端从来没够着过。 先说这款工具的定位,免得后面的话听着像挑刺。它是一个纯前端的启发式估算器:把文本按汉字、英文字母、数字、空白、其余符号分成五类,各自乘一个折算系数加起来,给出低中高三个数,再顺手算一下占各种上下文窗口的比例和调用成本。全程不上传,商业提示词也能放心往里粘。 这个设计取向是对的。浏览器里塞不下真正的词表文件——那些东西动辄几兆,为了估个数把它们全下载下来不划算。工具的使用说明里也把这一层交代得很坦白,甚至主动写了一节叫“这款工具做不到什么”,把不精确、不区分模型、不算图片音频四条限制都列了。 能主动写限制的工具不多。所以我这次没打算去证明它不准,而是想验证一件更具体的事:它承诺的那个误差范围,到底兑不兑现。 ## 这把尺子到底是怎么刻的? 要验证承诺,先得知道承诺是怎么算出来的。我把页面里那段脚本抽了出来,逐行读完,再用另一种语言原样复刻了一遍。 ## 五类字符,一把算盘 它的分类逻辑很干脆:汉字与中日韩字符走一个正则,英文字母走一个,数字走一个,空白走一个,剩下的全部归进“符号”这一类。五个计数乘各自的系数,相加取整,一个数就出来了。 这里有个细节值得先记下:字符总数用的是JavaScript字符串的长度属性。这个属性数的是UTF-16码元,不是我们直觉里的“字”。后面会看到,这一条埋了几个坑。 ## 三档系数摊开看 三个档位的差别,全在五个系数上: 字符类别 | 下界 | 中间档 | 上界 | 汉字与中日韩 | 每字1.00 | 每字1.25 | 每字1.60 | 英文字母 | 每4.4个1个 | 每4.0个1个 | 每3.6个1个 | 数字 | 每3.0位1个 | 每2.5位1个 | 每2.0位1个 | 符号与标点 | 每个0.55 | 每个0.70 | 每个0.95 | 空白 | 每个0.28 | 每个0.28 | 每个0.28 | 空白那一行三档全一样,说明作者认为空格的折算不随词表变化。这个判断后面会被数据部分证实。 页面上对三档的解释是:下界代表“对中文更友好的新词表”,上界代表“早期词表或代码密集”,中间那档最接近实际。这句话是整篇文章的引信——它把新旧两代词表分别指派给了区间的两端。 ## 那个悄悄乘1.18的开关 五类字符算完之后还有一步:如果文本命中了一组代码特征的正则,三个档位分别再乘1.12、1.18、1.25。这个开关是全局的,不按比例——一篇中文文章末尾贴了两行示例代码,整篇的估算都会被抬起来。 触发条件是六个模式取或:行尾是花括号或分号、出现function加空格、出现箭头函数符号、出现const加空格、出现import加空格、出现形如尖括号包字母的标签,以及模板字符串的插值起始符。这一组模式选得很有倾向性,第七节会专门算这笔账。 ## 先把复刻校准了再往下走 猜算法容易翻车,所以我做了交叉验证:在浏览器里点“加载示例”按钮,让工具用它自带的那段提示词跑一次,再把同一段文本喂给我的复刻版。 两边的输出逐字段对上了:字符数491,下界274,中间档348,上界458,代码特征命中。五个数字一个不差。往后所有的批量结果,都建立在这次校准之上。 ## 它承诺的误差一成五,实测兑现了吗? 先给结论:兑现了,而且兑现得比我预想的漂亮。 ## 对照组用真正的词表 启发式估算的对照组只能是真分词器。我用了两个:一个是cl100k_base,另一个是o200k_base。这两个名字不是我编的口径,OpenAI官方的计数教程里有一张明确的对照表——cl100k_base对应gpt-4-turbo、gpt-4、gpt-3.5-turbo,o200k_base对应gpt-4o、gpt-4o-mini。前者是2022年底那一代,后者是2024年那一代。 语料我没有构造,直接从站里拉了120篇真实长文,去掉标签只留正文,每篇3000字以上。这些都是中文为主、夹杂英文术语和少量代码块的内容,跟大多数人往这个工具里粘的东西形态接近。 ## 对上一代词表,它准得让人意外 120篇跑完,中间档相对cl100k_base的中位偏差是 +6.2%,均值 +7.3%。最小的一篇只差 -1.1%,最大的一篇 +32.7%。 更关键的是分布:114篇落在正负15%以内,占95.0%;117篇的真实值落在它给的上下界之间,占97.5%。工具的FAQ里那句“与真实分词器的差距通常在一成到一成五之间”,在这一档上是句实话。 一个不加载任何词表、纯靠五个系数硬算的估算器能做到这个水平,说明那几个系数不是拍脑袋填的,是照着真实数据调过的。这一点值得先讲清楚,因为接下来的内容会显得没那么友好。 ## 唯一那三篇例外,坏在同一件事上 没落进区间的三篇,偏差最大的是站内那篇拆JS在线运行工具异步输出去哪了 (https://zhangwenbao.com/js-runner-async-console-linenum-blocking-guide.html)的教程,中间档13392,真实10089,多报32.7%。原因不难猜:那篇正文里贴了大量JavaScript代码,代码特征开关被打开,整篇乘了1.18。 这三篇的共同点是代码块占比高。也就是说,那个乘1.18的开关,在它最该发挥作用的场景里反而把误差推大了。这个线索先记着。 ## 换一代分词器,同一份内容为什么差出五成? 把对照组换成o200k_base,同样这120篇,同样的工具输出,数字整个变了脸。 ## 五成一,不是五个百分点 中位偏差从 +6.2% 跳到 +51.2%,均值 +51.9%。最保守的一篇也多报了35.9%,最离谱的一篇多报80.5%。 但真正让我停下来的不是51这个数,是另一个数:120篇里,落在正负15%以内的有0篇,真实值落进上下界之间的也是0篇。不是大部分没落进,是一篇都没有。 一个区间如果只是偏了,会有零星几个样本擦边命中。整整120篇全部出界,说明这不是精度问题,是这把尺子的量程整个平移了。 ## 它的区间画在了同一边 把每汉字的实际消耗单独拎出来看,事情就清楚了。汉字超过500个的那120篇里,cl100k_base的实测中位是每字1.269个token,区间1.166到1.444;o200k_base的实测中位是每字0.897,区间0.825到1.086。 再对照工具的三档:下界1.00、中间1.25、上界1.60。中间档1.25几乎正压在cl100k的1.269上,这就是它对上一代如此精准的原因。而o200k的0.897,比它的下界还低一截——工具标着“对中文更友好的新词表”的那一端,恰恰够不到真正对中文更友好的那一代。 打个不太严谨的比方:这就像一份按2015年汇率表做的报关单模板,公式列得一点没错,只是表老了。你照着填,每一步都合规,最后那个数就是不对。 ## 更麻烦的是,换代不只有一个方向 工具的说明里有一句判断:“新一代分词器对中文更友好,同样一段中文,用较新的词表切出来的token数比早期词表少三成左右。”从cl100k到o200k,1.269降到0.897,正好降了29.3%——这句话准得可以当结论引用。 问题是它被当成了一条规律。而Anthropic的官方文档里写着完全相反的一段:Claude 4.7及之后的模型换了新的分词器,同样的输入文本产生的token数比早先的模型大约多三成,文档还专门提醒不要拿旧模型上量到的数字去估成本和窗口占用,要按你打算用的那个模型重新数一遍。 同一年里,一家的新词表让中文便宜了三成,另一家的新词表让同样的文本贵了三成。“新的一定更省”从来不是一条定律,它只是过去某一次换代的方向。工具把这个方向刻进了系数,于是它的下界永远只往一边留余量。 ## 那个标着对中文更友好的下界,一次都没够着 找到病灶之后,我第一反应是这东西应该很好修:把下界的汉字系数往下挪一点就行。结果被实测打了脸,这一节讲的就是打脸的过程。 ## 说明书写的是少三成,代码写的是少两成 先看一个对不上的地方。中间档是每字1.25,说明里承诺新词表“少三成左右”,那下界按理应该落在1.25乘0.7,也就是0.875。而代码里写的是1.00——相对中间档只降了20%。 而o200k的实测中位是0.897,离0.875只差0.022,离1.00差0.103。也就是说,这款工具的文字描述比它自己的代码更接近事实。作者对现实的判断是对的,落到系数上的时候少走了一步。 ## 我以为改一个数就修好了,实测说不行 顺着这个思路,我做了个反事实测试:只把下界的汉字系数从1.00改成0.875,其余四个系数原样不动,再跑一遍那120篇。 结果是2篇。落进区间的从0篇变成2篇,覆盖率从0%变成1.7%。这个数字远低于我的预期,说明汉字系数只是问题的一部分,不是全部。这条论点我原本已经写进提纲了,实测之后只能改写。 ## 把误差拆开,看每类字符各背多少锅 与其猜,不如把账拆了。我按五类字符做了一次误差归因:工具的中间档比o200k多出来的那65万个token,分别是哪一类贡献的。 字符类别 | 对超出量的贡献 | 占比 | 汉字与中日韩 | +696808 | +107.2% | 符号与标点 | -62785 | -9.7% | 空白 | +15142 | +2.3% | 英文字母 | +3227 | +0.5% | 数字 | -873 | -0.1% | 汉字那一项占了107.2%,超过百分之百,因为标点那一项是负的——工具把标点算便宜了,反过来抵掉一部分。其余三类加起来影响不到3%。 所以病灶确实在汉字系数上,只是它错的幅度比“少走一步”大得多。1.25要降到0.76上下才对得上o200k,而不是0.875。我先前那个反事实之所以只修好2篇,就是因为改的幅度还不够一半。 ## 照实测反解一遍,五个系数应该是多少 既然要给数,就给到底。我拿那120篇做了一次最小二乘拟合,反解出每类字符在两种口径下的真实单价: 字符类别 | 工具中间档 | cl100k实测 | o200k实测 | 汉字与中日韩 | 1.250 | 1.090 | 0.761 | 英文字母 | 0.250 | 0.131 | 0.210 | 数字 | 0.400 | 0.238 | 0.462 | 符号与标点 | 0.700 | 1.756 | 1.131 | 空白 | 0.280 | -0.135 | 0.052 | 这组系数在同一批语料上的自检成绩:cl100k口径的绝对偏差中位1.6%,120篇里有114篇落在正负5%以内;o200k口径中位1.8%,117篇落在正负5%以内。 三个地方值得单独说。第一,符号与标点的真实单价是1.1到1.8,而工具按0.70算,等于把中文正文里最密集的那类非汉字字符打了对折。第二,空白的系数接近零甚至为负,说明空格基本被并进了相邻的token里,不额外收费——工具那个三档不变的0.28,方向上是多收了。第三,英文和数字这两栏在两种口径下方向相反,这也是为什么下一节要把它们分开讲。 ## 这组数字该怎么用,以及不该怎么用 提醒一句:这是在以中文为主的语料上拟合出来的整篇口径系数,不是逐字符的真值。汉字那一项因为占绝对多数,拟合得最稳;英文、数字、标点在这批语料里占比小,彼此还有共线性,单看某一栏的绝对值意义有限。 拿它来做什么合适?拿来解释误差的来源、以及给中文长文做整篇修正,是靠谱的。拿来给一份纯英文的产品文案做逐类换算,就别用了——那批语料里根本没有这种形态。 ## 英文被高估,数字被低估,各错各的方向 把语料换成非中文的形态,误差不是变大变小的问题,是换了方向。 ## 四个字母一个token,这条经验值老了 工具中间档按每4.0个字母1个token算,下界4.4、上界3.6。我拿四段不同风格的英文实测了一下: 英文类型 | 实际字母/token | 中间档偏差 | 通用散文 | 4.68 | +46.3% | 电商产品描述 | 3.67 | +31.0% | 术语与长词密集 | 8.10 | +123.8% | 含品牌名与网址 | 3.41 | +20.5% | 四段全部高估,最少两成,最多一倍还多。注意最后一列的偏差不只来自字母那一项——同一段文本里的空格和标点也在往上加——但方向是一致的:对英文内容,这个工具的整个区间都压在真实值上方。 我特意做了一段混合英文再验一次:454个字母,cl100k实际92个token,等于每4.93个字母1个token。工具给的下界128、中间140、上界155,真实值92连下界的边都摸不到。 ## 长词不等于生僻词,这一条恰好写反了 工具的说明里写着:“常见词往往整词一个token,生僻词和长词会被切成好几段。”前半句对,后半句里的“长词”得单拎出来。 那段术语密集的英文之所以能做到8.10个字母才1个token,正是因为里头全是Internationalization、characterization、normalization这类长词。它们长,但一点也不生僻——词根和后缀都是高频子词,分词器两三刀就切完了。子词切分这套做法本来就是为了这个设计的:Sennrich那篇2016年的论文标题直接写着用子词单元处理罕见词,把没见过的长词拆成见过的碎片,而不是每个字母单独算。 真正会被切碎的是随机串:订单号、哈希值、拼错的单词、生造的品牌名。它们长得像词但从没一起出现过,只能一小段一小段地拼。所以判断一段英文贵不贵,看的不是词长,是这些字符组合有没有一起出现过很多次。 ## 数字本身还行,坏在中间那些点和冒号 数字这一栏工具按每2.5位1个token算。单看纯数字串,这个折算相当接近:现代分词器把长数字按三位一组切,123是1个,1234是2个,1234567是3个。平均下来就在2.5到3位之间。 坏事的是分隔符。实测几个常见形态: - 19:31:22一个时间戳,5个token——两个冒号各占一个 - 103.39.225.35一个IP地址,7个token——三个点各占一个 - 3.14159 4个token,小数点单独一个 - ¥12,800.50 6个token,货币符号、千分位逗号、小数点各一个 工具把这些点、冒号、逗号统统归进符号那一类,按0.70折算,而它们每一个都是实打实的1个token。日志、报表、订单数据这类内容里分隔符密度很高,估算就会往低了走。我那段混着订单号、IP和耗时的样本,工具给36,真实53,少报了32.1%。 ## 顺手一条反直觉的:加空格反而更便宜 很多人压提示词的时候会顺手把空格删掉,觉得字符少了就是省了。实测正好相反: - token counting带空格,2个token - tokencounting去掉空格,4个token - token_counting用下划线,3个token - token-counting用连字符,3个token 因为空格是被并进后一个词里的, counting连着前面那个空格正好是词表里的一个完整条目;一旦粘在一起,分词器不认识这个组合,只能硬拆成四段。省下1个字符,多付2个token,这笔账划不来。 ## 哪几类字符是它算不准的重灾区? 五类字符里,最容易被忽略的是那个叫“符号”的兜底类。它不是垃圾桶,里面装的恰恰是中文写作最常用的那批字符。 ## 全角标点:中文正文里最密集的非汉字 工具的汉字正则覆盖四个区段:常用汉字、扩展A、日文假名、谚文音节。全角标点一个都不在里面——逗号在U+FF0C,句号在U+3002,顿号、分号、冒号、问号、感叹号、书名号、全角括号全部落到符号那一类,按0.70折算。 而实测下来,这些标点在两种词表里每一个都是整整1个token,一个不多一个不少。我把12个常用中文标点连着写,工具算9,cl100k实际12。 这里有个小小的讽刺:工具自带示例的提示词里,第五条要求写的是“中文与英文数字之间不加空格,标点使用全角”。它教用户多用全角标点,而它自己把全角标点按七折收。 ## emoji:一个字符被数成两个符号 前面提过字符总数用的是UTF-16码元。MDN那份文档说得很直白:JavaScript用UTF-16编码,每个Unicode字符可能占一个或两个码元,所以长度属性返回的值不一定等于实际的字符数;文档还专门点名了三类需要留神的内容——emoji、数学符号,以及冷僻的汉字。 落到这个工具上就是:一个火箭emoji占2个码元,两个都不匹配汉字正则,于是变成2个符号,中间档算出1.4个token,取整1。真实是多少?cl100k要3个,o200k要2个。 组合emoji更夸张。那个由三个人加两个零宽连接符拼起来的一家三口,UTF-16长度是8,工具算6个token,cl100k实际要13个。少报了一半还多。 ## 冷僻字与扩展区:正则内外都不准 MDN点名的第三类更有意思,因为它在这个工具里有两种不同的坏法。 字符 | 在汉字正则内 | 工具算 | cl100k实际 | 龘 | 是 | 1 | 2 | 䶮(扩展A) | 是 | 1 | 3 | 𠮷(扩展B) | 否 | 1 | 4 | 前两个在正则里,按每字1.25算,取整还是1,实际要2到3个。第三个在正则外——扩展B区的字是代理对,两个码元,正则的四个区段都是基本多文种平面内的范围,够不着——于是它被当成2个符号,算出1.4取整1,实际要4个。 常用汉字之所以只要1个token,是因为词表里给它们留了位置;冷僻字没这个待遇,只能按UTF-8的字节一个个拼,三字节的字就是3个token起。做古籍、姓名库、生僻商品名这类内容的,这一栏的误差会明显放大。 ## 这些加起来影响有多大 说完误差方向,得给个量级,不然容易被当成鸡蛋里挑骨头。在那120篇中文长文里,符号这一项整体是把估算往低了拉的,贡献是负9.7%——它部分抵消了汉字那一项的高估。 换句话说,在常规中文内容上,这几个坑互相打了个折。真正会露出来的是特殊形态:emoji密集的社媒文案、生僻字多的名录、点和冒号密集的日志。这些内容用它估,得心里有数。 ## 检测到代码特征这个开关按什么判? 第一节留了个线索:那个乘1.18的开关。现在把它拆开。 ## 它认的是一个语言家族,不是代码 那组正则里的关键词是function、箭头符号、const、import、行尾分号或花括号、尖括号标签。这几样凑在一起,画像非常清楚:它认的是JavaScript这一系。 我拿十二种常见片段各跑了一遍: 语言 | 是否触发 | 中间档相对cl100k | JavaScript | 触发 | +21% | CSS | 触发 | +14% | Go | 触发 | 0% | Rust | 触发 | -17% | JSON | 触发 | +64% | Python(含import) | 触发 | +8% | Python(不含import) | 不触发 | -12% | SQL | 不触发 | +26% | Shell | 不触发 | -31% | YAML | 不触发 | -19% | Markdown表格 | 不触发 | -4% | 同一段Python代码,加一行import就触发,去掉那行就不触发。SQL、Shell、YAML这三种在运维和数据场景里最常见的形态,全部漏网。 ## 更要紧的是,触发跟准不准没什么关系 看上表第三列:Go触发了,偏差正好是0;Rust触发了,反而还低估17%;JSON触发了,偏差冲到 +64%。而Shell没触发,低估了31%——它才是最需要上调的那一个。 JSON那一格最能说明问题。上调之前中间档是15,真实11,已经高估39%;上调之后变成18,高估变成64%。这个开关在实测的十二种形态里,没有一次把误差改小到值得。原因也不难理解:符号密度高确实会让token变多,但那个影响已经体现在符号计数本身了,再整篇乘一次等于收了两遍。 ## 反过来,中文里提一句就中招 假阳性这一侧更好复现。以下每一句都是纯中文,每一句都会让整篇估算上调18%: - 这个function的作用是把中文切成词。 - 流程是:抓取 => 清洗 => 入库。 - 这里的const值写死在了页面里。 - 把词表import进来要几兆。 - 在
标签里写正文。
写技术类内容的人躲不开这几个词。我在站里那120篇中扫了一遍,有6篇命中,全是工具教程类的文章,正文里引了代码片段——这几篇属于该上调的。但只要在一篇纯策略文里提一句“流程是抓取到清洗到入库”,并写成箭头,整篇的账就被抬高了一档。
## 窗口占用条为什么和它自己的说明打架?
前面聊的都是估得准不准。这一节的问题不一样:它算得对不对。
## 说明书第二节写得很清楚
工具的使用说明第二节第一句是:“窗口大小是输入加输出的总额度,不是只算输入。”下面还建议留三成余量,理由是模型回复、多轮历史、系统提示词、工具定义都挤在同一个窗口里。
这段话没有任何问题。有问题的是它下面那五根进度条。
## 把输出改到7000,条子纹丝不动
我在页面里做了个直接的测试。先点“加载示例”跑一次,8K窗口那一格显示4.2%,绿色。这时候底下的“预计输出token”填的是默认值800。
然后我把那个数字改成7000,触发它的重算事件。成本面板立刻跟着变了,而8K窗口那一格还是4.2%,一动没动。
按它自己说明书里的口径算一下:输入348加输出7000,一共7348,占8192的89.7%——早该进橙色警告区了。但页面上是绿的。
那个输出数字就在同一屏往下滚三厘米的地方,它已经拿去算钱了,只是没拿去算窗口。像是同一个人管着两个抽屉,抽屉之间不通气。
## 成本面板也少了半张脸
顺着成本这一块再看,还有三处。
第一,估算给了三档区间,还专门写了一句“把这个区间当作规划的余量比盯着某个具体数字更稳妥”,可成本面板只用中间那一档。拿一份5670字的中文测算:按下界算1000次是28.28,按中间档32.37,按上界38.16——区间两端差了9.88,占中间值的31%,而面板上只有32.37这一个数。
第二,四个输入框都写了最小值0,但那是HTML属性,不走表单提交就不生效。我把“预计输出token”填成负5000,面板老老实实算出单次输出成本负0.075、一千次合计负73.96。负数成本这东西,报给老板大概能提前下班。
第三,“调用次数”填0,面板显示的是“1次合计”。代码里那个取整之后接了个默认值1,0被当成空值换掉了,页面没有任何提示。
## 照着它的红灯去拆内容,会不会白拆?
前面两节各自成立,合起来会产生一个更实际的后果:窗口那五根条子给出的绿黄红判定,可能和真实情况对不上。
## 十一档里有四档判反了
我用同一段中文按不同长度重复,从1890字到11340字排了十一档,每一档比两个判定:工具怎么说,按o200k加上800输出实际是多少。
中文字数 | 工具算8K占用 | 工具判定 | 实际判定 |
4725 | 69.1% | 绿 | 绿 |
5670 | 82.9% | 橙色警告 | 绿 |
6615 | 96.7% | 橙色警告 | 橙色警告 |
7560 | 110.5% | 红色超出 | 橙色警告 |
8505 | 124.3% | 红色超出 | 橙色警告 |
9450 | 138.2% | 红色超出 | 橙色警告 |
10395 | 152.0% | 红色超出 | 红色超出 |
十一档里四档不一致,而且全部是同一个方向:工具比实际紧张。
## 两种翻转,代价不一样
5670字那一档是虚惊:工具报橙色,你以为快撑爆了,实际才用掉六成三。代价是你会去做一次没必要的精简。
7560到9450那三档更贵。工具报“超出”,你的第一反应是把内容切开分两次调用,或者换一个窗口更大的模型。而实际上o200k口径下这些内容加上输出还有一到两成的余量,一次就能跑完。多切一刀就是多一次调用、多一份系统提示词,还多一道把结果拼回去的活儿。
要是这个判断被写进了自动化流程里——比如按窗口占用自动决定走不走分块检索——那就不是多花点钱的事了,是整条链路的行为被一个偏了五成的估算带着走。做检索增强的时候这一层尤其要注意,切不切、切多大,取决于的是真实token数,不是估算值;关于切块本身有多少种切法、每种切出来差多少,RAG分块预览器那篇 (https://zhangwenbao.com/rag-chunk-preview-strategy-overlap-selfcontained-scoring-guide.html)拆得更细。
## 放到真实规模上是多少钱
抽象的百分比不好感受,换个具体场景:把站里这120篇长文当成一批要改写的输入,一次跑完。
工具面板给的输入token合计是1941630。cl100k实际1815944,o200k实际1278968。按每百万3块的输入单价折:面板5.82,cl100k口径5.45,o200k口径3.84。
只看这个数字不算多,但注意比例:按o200k结算,面板把输入预算多报了34%。120篇是小批量,把它乘到几万篇的量级,或者用在一个需要向上申请预算的项目里,三分之一的偏差就不是小数了——尤其是这个偏差还是单向的,永远往贵了报。
好消息是它偏得很稳定,这就意味着可以修。
## 这工具到底该怎么用才不亏?
写到这儿该给操作了。前面挑出来的问题没有一条否定它的价值——它解决的是“我完全没有量的概念”这个真问题,而这个问题绝大多数团队还真没解决。只是用法得调一调。
## 先量级,后精确,中间隔一道修正
把它当成三步流程里的第一步,而不是唯一一步:
- 拿它过一遍,只看数量级。是几千还是几万,会不会撑爆窗口,这一层它给得又快又稳。
- 按你实际要用的模型乘一个系数,把口径拉回来。系数下面就给。
- 真要签预算或者写进自动化,去调官方的计数接口。这一步只在决策要花钱的时候做。
这个顺序的好处是,前两步花不了一分钟,第三步只在必要时才做。反过来把第三步提前,等于每改一版提示词就要跑一次接口,得不偿失。
如果你的用量集中在订阅制的编程助手上,这三步之外还要看清楚订阅档位与接口计费的分界在哪儿——Claude Code到底要花多少钱 (https://zhangwenbao.com/claude-code-pricing-guide.html)那篇把Pro、Max、Team和接口四种口径拆开算过一遍,跟本文的估算这一层刚好互补。日常想随时盯住上下文用掉多少,也可以在终端里挂一个实时显示上下文与Token占用的状态栏 (https://zhangwenbao.com/claude-hud-guide.html),比每次手动粘进估算器省事。
## 两个修正系数,直接拿去用
拿那120篇算的比值,中位数是这样的:
- 工具的中间档 乘0.94,约等于cl100k口径(GPT-4、GPT-3.5那一代)
- 工具的中间档 乘0.66,约等于o200k口径(GPT-4o那一代)
两个数字都有离散:前者在0.75到1.01之间,后者在0.55到0.74之间。所以别把它当精确换算,当成一次量纲对齐就行——把一个稳定偏高五成的数拉回真实附近,比继续按原样报预算强得多。
这两个系数是在中文为主的长文上算的。纯英文内容要往下调得更多,因为前面看到英文那一栏工具高估得更狠;代码密集的内容如果触发了那个1.18的开关,也要额外往下再折一点。
## 要精确,就去问模型本人
Anthropic的接口里有一个专门的计数端点,路径是messages下的count_tokens,接受和发消息一模一样的结构——系统提示词、工具定义、图片、PDF都能算进去。返回的就是这次请求的输入token数。
两个细节值得知道。一是这个端点免费,只按用量层级限每分钟请求数,起步档就有2000次每分钟,跟发消息的限额是分开算的。二是官方把它的结果称为估算,说实际创建消息时用的token数可能有小幅出入,因为里面可能包含系统自动加的token——但那部分不计费。
另外补一句前面提过的:如果你用的是Claude 4.7之后的模型,官方明确提醒不要拿更早模型上量到的数字来估成本和窗口,因为那一代换了分词器,同样的文本大约多三成。要比就用这个端点把同一份请求按两个模型各数一次,直接对比两个返回值。
## 顺带一个能省钱的写法:写得越常规越便宜
这一条是我在拆分词边界的时候顺手测出来的,跟工具本身没关系,但对天天写提示词的人更有用。
同样19个汉字,我写了两个意思几乎一样的版本,用o200k数:
- “搜索引擎优化的核心是内容质量和用户体验”——13个token,每字0.684
- “搜寻引擎优选之要旨系文稿品第暨用者感受”——20个token,每字1.053
字数一样,语言一样,词表一样,价格差54%。因为第一句里的“搜索”“优化”“核心”“内容”“质量”“用户”“体验”在词表里都是现成的整块,第二句里那些生造的书面语只能一个字一个字地拼。
推论很直接:提示词写大白话比写文绉绉的公文体便宜,而且大白话模型还理解得更好,这是少见的两头都占的事。想省钱先别急着删字,先把生僻表达换成常用说法。日常用编程助手时还有一批更琐碎的省法,十个常见坑里的省Token部分 (https://zhangwenbao.com/claude-code-mistakes.html)整理过一份。
## 真正的省钱杠杆,多半不在输入这一侧
最后说个容易搞错优先级的地方。用工具的默认配置跑它自带的示例:输入348个token、输出800个,输入单价3、输出单价15。单次输入成本0.00104,单次输出成本0.01200——输出那一头是输入的11.5倍。
换句话说,在这个配置下就算你把提示词砍掉一半,省下的也不到总成本的4%。工具说明里“约束输出长度通常比压缩输入更有效”这句话是对的,而且比它写的还要更对。
比这更狠的是另外两条。重复调用同一段长系统提示词的,走提示词缓存;不要求实时返回的批量任务,走批量接口——Anthropic官方文档写的是成本降低50%,大多数批次不到一小时就跑完。这两条的效果,往往比在提示词里抠几百个token大得多。想把这类账系统性算清楚的,可以顺着AI团队Token失控那笔账 (https://zhangwenbao.com/ai-team-token-rate-limit-cost-control-aggregation-review.html)再往下看一层,那篇讲的是聚合服务和自建之间怎么权衡。
## 什么时候它依然是最好的选择
说了这么多,得把它的长处也落到实处。
一是快。我喂了一份7.56万字符的中文进去,15毫秒出结果;再喂56.7万字符,91毫秒。这个量级的文本,任何需要网络往返的方案都比不了。
二是不上传。竞品分析的资料、还没发布的产品文案、客户给的原始需求,这些东西粘进一个会往服务器发请求的页面,本身就是个风险。纯前端计算这一点在商业场景里的价值,比多准五个百分点重要。
三是它把窗口占用和成本测算摆在了同一屏。虽然那两块各有前面说的毛病,但“一份内容同时看量、看窗口、看钱”这个信息组织方式是对的,比开三个页面分别算强。想顺手看看还有哪些同类工具,全部免费工具那一页 (https://zhangwenbao.com/tools/)都在。
⚡ 动手试试:Token估算与成本测算
粘一段内容就出三档token估算、五种上下文窗口的占用比例,以及按你自己填的单价算出来的调用成本。单价不内置,永远不会过时。全部在浏览器里算,内容不上传。
保哥自研免费在线工具,浏览器打开就能用。
→ 打开Token估算与成本测算 (https://zhangwenbao.com/tools/token-counter.php)
## 常见问题解答
## 这个工具估出来的数,我到底该不该信?
看你用的是哪一代模型。拿站内120篇中文长文实测,它的中间档相对cl100k_base(GPT-4、GPT-3.5那一代)的中位偏差只有6.2%,95%的文章落在正负15%以内,承诺完全兑现。但换成o200k_base(GPT-4o那一代),中位偏差变成 +51.2%,120篇里没有一篇落进它给的上下界。实用做法是:先用它看数量级,再按模型乘一个系数——cl100k口径乘0.94,o200k口径乘0.66。
## 它的下界写着对中文更友好的新词表,为什么反而够不着新词表?
因为下界的汉字系数定在了每字1.00,而o200k实测中位是0.897,整个区间的下沿比目标高了一档。有意思的是它的文字描述是对的——说明里写“新词表比早期词表少三成左右”,中间档1.25少三成正好是0.875,很接近实测值。误差归因下来,工具比o200k多报的部分有107.2%来自汉字这一项,其余四类基本互相抵消。
## 新一代分词器是不是一定更省token?
不是,这正是工具那个区间失效的根本原因。从cl100k到o200k,中文确实降了29.3%,跟工具说明里写的“少三成”对得上。但Anthropic的官方文档写着,Claude 4.7及之后的模型换了新分词器,同样的输入文本产生的token数比早先的模型大约多三成,还专门提醒不要拿旧模型量到的数字估成本和窗口。同一年里两个方向都发生过,所以“新的更省”只能当成某一次换代的事实,不能当规律。
## 窗口占用那几根条子为什么不算输出token?
代码里那几根条子只用了输入的估算值,页面下方“预计输出token”那个输入框没有参与计算。实测把它从800改到7000,成本面板立刻变了,8K窗口那一格还是4.2%纹丝不动——按输入加输出算应该是89.7%,早该进警告区。而工具自己的使用说明第二节第一句就写着窗口是输入加输出的总额度。用的时候把输出数自己加上去再判断。
## 它说我的内容超出窗口了,要不要马上拆开?
先别急。我按不同长度排了十一档做对照,有四档的判定和实际对不上,而且全是同一个方向——工具比实际紧张。7560到9450字那三档,工具报红色超出,按o200k口径加上输出实际还有一到两成余量,一次就能跑完。多切一刀意味着多一次调用、多一份系统提示词,还多一道拼接。建议把工具的估算乘0.66,再加上你预计的输出token,然后自己跟窗口大小比一次。
## 检测到代码特征这个提示,是按什么判的?
它匹配的是一组JavaScript家族的特征:function、箭头符号、const、import、行尾花括号或分号、尖括号标签。实测十二种片段,SQL、Shell、YAML、Markdown表格以及不含import的Python全部漏网;而纯中文句子里只要出现这几个词,比如写一句“这里的const值写死在了页面里”,整篇也会被上调18%。更关键的是,触发与否跟准不准没什么关系——JSON触发之后偏差从 +39% 被推到 +64%。
## 为什么中文标点和emoji的估算偏差特别大?
因为它们都落进了那个叫“符号”的兜底类,按每个0.70折算。而实测中文全角标点每一个都是整整1个token,逗号、句号、顿号、书名号无一例外。emoji更绕:字符总数用的是UTF-16码元,一个火箭占2个码元,被当成2个符号算出1个token,实际cl100k要3个;那个一家三口的组合emoji工具算6个,实际13个。扩展B区的冷僻汉字同理,𠮷被算成1个,实际要4个。
## 有没有办法让同样的内容少花点钱?
有三条,效果依次递增。第一条是改写法:同样19个汉字,用常用词组写是13个token,换成生造的书面语变成20个,差54%——写大白话比写公文体便宜,而且模型还理解得更好。第二条是约束输出长度:按工具默认配置,输出那一头的成本是输入的11.5倍,砍一半提示词省下的不到总额的4%。第三条是走缓存和批量接口,Anthropic官方文档写的批量处理是成本降低50%,多数批次一小时内完成。
## 权威参考资料
## MCP还有必要装吗?CLI加Skill已经接管了Agent工具链的主干
- URL:https://zhangwenbao.com/cli-skill-vs-mcp-agent-toolchain.html
- 分类:AI编程与工具链
- 发布:2026-07-23 | 更新:2026-07-30
- 摘要:MCP还有必要装吗?核对官方原文拆穿被引错的词元数字,讲清三笔架构开销、Skill为什么才是真正的替代层、微软让MCP分发技能的反转,以及五条迁移判据与测量方法。
- 关键词:MCP,上下文工程,Agent开发,Skills,扩展机制
> **TLDR**:摘要:说MCP被抛弃的那批文章,引的是同一个数字,而那个数字被读错了。GitHub官方原话是合并Projects工具集省下约两万三千词元、降幅五成,不是整个服务从五万降到两万三;由此推算出来的两百五十倍差距,是二次加工的产物。真实情况更有意思:Anthropic自己给的解法不是弃用协议,而是让模型写代码去调它,一个案例把十五万词元压到两千;微软则把Skill放上层、MCP压下层,还让MCP服务反过来对外公布Skill。这篇把三笔账、四种误读和一套可执行的迁移判据摆清楚。
> 摘要:说MCP被抛弃的那批文章,引的是同一个数字,而那个数字被读错了。GitHub官方原话是合并Projects工具集省下约两万三千词元、降幅五成,不是整个服务从五万降到两万三;由此推算出来的两百五十倍差距,是二次加工的产物。真实情况更有意思:Anthropic自己给的解法不是弃用协议,而是让模型写代码去调它,一个案例把十五万词元压到两千;微软则把Skill放上层、MCP压下层,还让MCP服务反过来对外公布Skill。这篇把三笔账、四种误读和一套可执行的迁移判据摆清楚。
先说一件容易被跳过的小事。GitHub在2026年1月28日的更新日志里写了一句话 (https://github.blog/changelog/2026-01-28-github-mcp-server-new-projects-tools-oauth-scope-filtering-and-new-features/):他们把Projects这一组工具合并成三个函数,因此减少了约两万三千词元的用量,降幅五成。
这句话被引用了成百上千次,引着引着就变了形——变成了“GitHub官方MCP服务光是描述自己的工具就吃掉五万词元,后来砍到两万三”。再往下一步,有人拿这个五万去除以一份技能文件的两百词元,得出两百五十倍的差距,这个倍数至今还在中文技术圈里流传。
问题是,那个五成的基数是Projects这一个工具组,不是整台服务器。官方那句话从头到尾没有给出全量工具定义的总词元数。整条推论链的第一块砖,是读者自己垫上去的。
纠这个错不是为了替MCP辩护。恰恰相反:真实的证据比编出来的更有说服力,而且指向的结论也更精确——MCP没有死,它被从“默认集成方式”这个位置上挪走了,挪它的不是CLI,是Skill那一层。下面把账重新算一遍。
## 一个被引错的数字,是怎么滚成共识的?
值得花一节讲这个,因为同样的滚雪球每个月都在发生,而且下一个雪球你多半也拦不住——除非手上有一套拆的办法。
这颗雪球的成长路径大概是四步。第一步,官方发一句带百分比的话,句子里有个隐含的基数。第二步,二手报道把百分比留下、把基数丢掉,写成“整台服务从五万降到两万三”。第三步,有人拿这个凭空出现的五万,去除以另一个来源、另一种口径的两百,得出两百五十倍。第四步,这个倍数因为好记、好转发,反过来成了论证的前提。
四步走完,原始那句话里唯一可核实的东西——降幅五成——反而没人提了。
## 三个问题就能把这类数字拆开
下次再看到某个惊人的倍数,按顺序问三句话,基本能筛掉九成的水分。
第一句,分子和分母是同一次测量吗?这里显然不是:五万来自一台服务的工具定义,两百来自一份技能文件的元数据,两者既不同来源也不同口径。
第二句,百分比的基数写清楚了没有?官方原文里那个五成,基数是Projects这一组工具,不是全部工具。基数一换,结论就换。
第三句,这个数字在你自己的环境里可测吗?这条最狠。工具定义占多少词元,你自己翻一次会话日志就知道,根本不需要引用任何人。凡是能在自己机器上十分钟测出来的东西,就别引二手数字,尤其别引带倍数的二手数字。
这套拆法不只对协议之争有用。AI这个领域每周都在生产“提升X倍”“节省Y成”的句子,能自己动手测的人和只会转发的人,判断力的差距会越拉越大。
## MCP到底贵在哪,贵的是哪一部分?
2025年大半年,MCP被包装成Agent时代的通用接口:一个协议连接所有工具和所有模型。这个故事能卖出去,因为它解决的是2024年的真问题——那时候模型不太会用工具,标准化的结构描述确实帮了大忙。
到2026年,问题反转了。模型已经很会用工具,付不起的是描述工具的方式。这笔成本不是一笔,是三笔,而且互相叠加。
## 第一笔:词元房租,每个会话预收一次
MCP的设计是把工具目录预先灌进模型上下文。动态发现要求模型先知道有什么可用,这不是缺陷,是设计本身;但它同时就是税。
扎心的不是绝对值,是收费方式:进门先交,交完这次会话可能一条相关工具都不会调。一份按需加载的技能文件则是触发才读,不触发就一个词元都不花。
有一组被反复引用的社区实测:同时挂三台服务器,工具定义在二十万词元的窗口里占掉了十四万三,也就是七成多。这个数字来自个人配置而非官方基准,具体多少取决于你挂了什么,但量级上没人反驳过。GitHub自己也在文档里提供了按工具组开关的参数,理由写得很直白——只启用你需要的工具组,可以帮助模型做工具选择,同时减小上下文体积 (https://github.com/github/github-mcp-server/blob/main/docs/server-configuration.md)。厂商愿意在文档里教你怎么少装,本身就说明这笔开销是真的。
更要命的是这笔房租的计价方式跟你的实际用量脱钩。一台服务挂上去,它的定义在每一轮对话里都要重新过一遍模型;你这次会话是在改一段CSS还是在查订单,它一视同仁地收。用得越少的服务,单位价值越差,而人最容易忘掉的恰恰是那些用得少的服务。
## 第二笔:模型实打实变笨
上下文成本有一层比账单更疼的二阶伤害。每一千词元的工具描述,就是模型少一千词元的注意力放在你真正的问题上;工具列表越长,选错工具的概率越高。
这不是玄学,是可测量的。同一个任务,把无关工具组关掉再跑一遍,你会看到调用路径变短、绕路变少。注意力是Agent系统里最稀缺的资源,而工具目录把它花在了管道上。
这里有个容易被忽略的机制:工具选错之后的代价不是一次性的。选错工具会返回一个不对路的结果,这个结果又留在上下文里,成为下一轮推理的依据。一次糟糕的工具选择会污染后面所有轮次,而不是被简单地重试掉。这就是为什么把工具目录砍窄,往往比调提示词见效更快。
验证方法很简单,不用信任何人:把同一个任务在两种配置下各跑三遍,一次挂满,一次只留必需的那一组,对比总词元数、工具调用次数和最终是否一次做对。三组数据出来,该关哪些就一目了然了。
## 第三笔:逼模型说外语
这一笔最有意思,因为它不是工程问题,是语言学问题。
大模型的训练语料里装着几十亿行shell命令和它们的输出:问答站、代码仓库的问题区、持续集成日志、配置文件、教程。Agent敲一条命令行的时候,它在做一件见过几百万次的事,连报错长什么样、人类怎么排错都见过。
调一个MCP工具时,它在照着三十秒前才第一次出现在自己上下文里的结构描述干活。一边是母语,一边是趴在工作台上现翻说明书。让模型用命令行,不是在教它新技能,是在给它已有的技能让路。
母语还自带一套工具箱。输出可以用管道预过滤,只有相关的那几行进上下文;报错是它见过一百万次的纯文本;调试就是把命令原样粘进自己的终端,亲眼看它怎么挂。MCP出错时你在翻别人服务的日志,命令行出错时命令本身就是复现步骤。
管道这一条尤其被低估。一次接口调用可能返回几千行结构化数据,全量进上下文既贵又稀释注意力;同样的活儿在命令行里是一次调用接两三个过滤器,回来五行。过滤发生在模型外面,而不是让模型读完再自己挑,这是两种成本结构。
这也解释了一个现象:很多人第一次把某台服务换成命令行时,体感提升远大于省下来的词元数。因为省词元只是账面收益,真正改变体感的是模型不再需要在一大坨返回值里翻找,一次就答对了。
## 为什么Anthropic自己给的解法不是弃用协议?
如果说协议有原罪,最有资格宣判的应该是它的作者。而作者给的方案,恰恰不是让你卸载。
Anthropic在工程博客里承认了两件事:工具定义会撑爆上下文窗口,中间结果也要一路穿过模型再传给下一步。他们给的做法是把MCP服务当成代码接口而不是直接调用的工具 (https://www.anthropic.com/engineering/code-execution-with-mcp)——让Agent写一小段代码去调,用文件系统去发现有哪些工具、只加载真正要用的那几个定义,再在执行环境里把大结果过滤完才回传。
官方给的对照案例很硬:一条把云端表格数据同步进客户系统的流程,原来要十五万词元,改成代码执行之后是两千,节省98.7%。
这个方案该怎么读,决定了你会不会做错决策。它不是“协议不行”,而是协议不该直接贴着模型的上下文窗口用,中间需要垫一层代码。而一旦你接受要垫一层代码,那么这一层是用宿主语言写的脚本,还是用现成的命令行工具,就只剩下工程口味的差别了。这也是命令行路线能站住的真正原因——它就是那层代码最便宜的现成实现。
## 站内运营的活儿卡在协议层,是什么手感?
大人物的观点不值钱,讲三个具体的卡点更实在。这三件事全是独立站运营里最平常的活,失败模式各不相同,但结局一样。
## 第一种:它把你和你本来就有的东西隔开了
要抓自家站点的搜索表现数据。浏览器里天天登着后台,看起来最顺手的方案是让Agent直接开浏览器点进去。
结果服务起的是一个全新配置的浏览器实例:没有cookie,没有登录态。想着那就登录一次,自动化检测把登录流程拦了。改成接管你真实的浏览器,标签页定位又飘,点击落在了错误的页面上。
跟这层抽象搏斗四十分钟之后,换成几十行脚本直连已登录浏览器的调试端口,一次跑通。问题不在于那台服务做得差,而在于它在你和一个你本来就拥有的资源之间,砌了一堵隔离墙。
## 第二种:它是别人家的商业模式
批量出图这条线原来走的是一个托管聚合服务,替你代理上游的生图接口。某天它停服了。不是变慢,不是降级,是没了,所有经过它的流程当场全灭。
修复方案是一百行出头的脚本直连上游接口,先按高分辨率出图再降采样成网页用的尺寸。比原来更快,还支持了代理层从没暴露过的参数,依赖只剩下环境里的一个密钥。
这段脚本现在已经活得比它替代的那层“基础设施”久了。原因很朴素:脚本的依赖清单是运行时加一个接口,托管服务的依赖清单里包含别人家公司的商业模式。
## 第三种:往下挖一层,浏览器根本不该出场
第一种卡点之后退一步问自己:为什么要驱动浏览器?搜索表现和流量数据都有官方接口,都支持服务账号认证。
最终方案是一个用服务账号认证的无界面脚本,定时跑,数据落成本地文件让Agent直接读。没有浏览器,没有会过期的登录态,也没有中间层。这个教训可以推广:相当一部分服务包装的东西,往下挖一层本来就有可脚本化的接口。
三次失败,一个诊断:中间那一层要么是故障点,要么是会消失的依赖,而它下面那层——命令行、脚本、官方接口——永远可用。有个说法把这个性质讲得很准:服务断开时你从自动降级为手动,但流程知识还在。前提是流程知识写在你自己的文件里,而不是编码在别人的工具描述里。
## 离场的那批人,究竟说了什么?
2026年一季度这波退潮和普通的社交媒体唱衰不一样,关键看是谁在退。但也正因为这些话被反复转述,误差累积得特别快。逐条对一遍原文,结论会温和不少,也准确不少。
流传的版本 | 原文实际是什么 |
YC总裁公开宣布MCP已死 | 他说的是吃上下文、要手动开关、认证难用,然后半夜写了个命令行包装器;抱怨的是体验,不是判死刑 |
Perplexity全面弃用MCP | 是内部去优先,且主要针对本地进程那种接法,回到接口与命令行;不等于对外主张全行业照办 |
Sentry创始人说MCP服务没必要存在 | 原话是“许多MCP服务不需要存在”,他同时自己还常驻着两台服务、配十来个技能文件 |
Anthropic承认协议失败 | 承认的是全量工具定义撑不住规模,给的解法是垫一层代码,不是弃用 |
最有代表性的是那条被引用最多的原帖 (https://x.com/garrytan/status/2031910564344262988):抱怨吃上下文、抱怨要来回开关、抱怨认证,然后花三十分钟撸了一个浏览器自动化的命令行包装器,结果团队告诉他别家早就做过一个了。这条帖子真正传达的信息是“现有集成方式的体验烂到值得我自己动手”,而不是“协议本身是错的”。
那位Sentry创始人的完整立场更值得抄:技能教你怎么做菜,协议提供让你做菜的器具。一个自己还在跑两台服务的人说“许多服务不需要存在”,这句话的重点在“许多”,不在“存在”。
为什么这类话特别容易被放大?因为“谁在退”这个框架本身就带传播增益。当初下注最重的人出来抱怨,比一百个旁观者点评更有戏剧性,于是转述者会本能地把语气往极端调——抱怨变成宣判,去优先变成弃用,许多变成全部。
读这类消息有个笨办法很管用:只看当事人自己现在还在用什么,不看他说了什么。说话是立场,配置是事实。上面这四条里,凡是能查到当事人现状的,现状都比言论温和得多。
## 真正替代MCP的不是命令行,是Skill这一层
多数对比文章漏掉一个关键:光有命令行并没有掀翻什么。掀翻它的是命令行加一层知识文件。
技能文件写的是流程知识:跑哪些命令、什么顺序、边界情况怎么办、什么时候该停下来问人。它是写给模型看的作业指导书。技能文件该怎么组织、frontmatter有哪些字段可用 (https://zhangwenbao.com/claude-code-skill-patterns.html)是另一个话题,这里只谈它在架构里占的位置。
位置很清楚:Skill接管了协议的编排价值,命令行接管了它的执行价值,两头一夹,常规场景下协议就没剩下多少事了。
## 工具描述和作业指导书,差的不是格式是体裁
为什么同样是给模型看的文字,一个要几万词元还讲不清,另一个几百词元就够?因为它们承载的东西根本不是一类。
工具描述回答的是“这个函数接受什么参数、返回什么结构”。它擅长表达接口,不擅长表达顺序、条件和禁忌。你没法在一个参数说明里写清楚“先查库存再改价格,改完必须回读确认,如果库存为零就停下来问人”。
作业指导书回答的是“遇到这类活该怎么办”。顺序、判断、边界、什么时候该停,全都是它的母语。2025年那批几万词元的工具定义,本质上是被压缩得很烂的作业指导书——用错了体裁,再多字数也说不明白。
换了体裁之后还白捡三个好处:改行为等于改一份文本再提交一次版本管理,反馈回路以分钟计;团队里不写代码的人也能读、能审、能提意见;出问题时你看到的是一份人话流程,不是一堆参数签名。
## 国内的动向和硅谷同频,而且跑得更实
飞书在2026年3月底开源了官方命令行工具——注意,是命令行,不是又一台MCP服务。它用Go写成,MIT许可,覆盖日历、消息、文档、表格、多维表格、任务、邮件、会议等18个业务域,两百多条精选命令,把两千五百多个开放接口收在下面。
更说明问题的是配套形态:它内置了26个可直接安装的Agent技能,一条命令装进主流编程Agent。当一家头部协作平台选择用命令行加技能的形态对接Agent生态,而不是发一台服务器,这就不再是社区偏好,是厂商拿研发预算投的票。
顺手校准一个数字:早期报道普遍写的是11个业务域、19个技能,那是它刚开源时的规模;到2026年年中已经扩到18个域、26个技能,星标一万六千以上。引用开源项目的规格时,别把发布当天的快照当常量用。
## 技能文件的代价也要摆出来
文字作业指导书不是代码,做不到百分之百确定性执行。模型会读漏一步、跳过一条护栏、在你要求照章办事的地方自作主张。
可行的硬规矩是:凡是必须精确的步骤,写成脚本让技能去调用;技能文件的文字只负责需要判断力的部分。判断归技能,精确归脚本。如果一个流程零容忍偏差、又完全不需要判断,那它根本不该是技能,该是一个定时任务。
## 微软把这套东西落成了什么形状?
终局长什么样,目前最可信的预览来自微软,而且它给出的答案比“Skill在上、MCP在下”这个流行说法更精细。
他们的技能执行器由四个部件拼成 (https://devblogs.microsoft.com/foundry/dotnet-ai-skills-executor-azure-openai-mcp/):技能加载器从目录里发现并解析技能文件,把前置元数据和正文分开;模型服务负责对话与函数调用;协议客户端连接一台或多台MCP服务,发现它们的工具并路由执行请求;执行器本身负责跑那个Agent主循环。
技能文件在这里被解析成一个对象,带名称、描述、标签,正文整段作为指令。前置元数据里有两个字段特别值得抄:一个声明这条技能在什么文件模式下被激活,一个声明它期望用到哪些工具。
## 真正的反转在这里
如果故事只到“Skill在上、MCP在下”,那还只是分层。微软后来又让MCP服务反过来对外公布技能 (https://devblogs.microsoft.com/agent-framework/discover-agent-skills-from-mcp-servers-in-net/):技能不再只能放在本地磁盘,也可以住在一台MCP服务上,服务通过一份索引文档把自己有哪些技能广播出来,框架再经由认证过的连接把技能正文取回来。
这一步把叙事整个掰了个方向。协议从“工具的传输层”变成了“知识的分发通道”——它不再只是Skill脚下的水管,也可以是Skill的货架。那些断言协议会被技能取代的文章,恰恰没料到两者能这么长。
对做独立站和外贸的团队,这一层的现实意义是:你未来要接的第三方能力,很可能不再以“装一台服务、灌几十个工具定义”的形式交付,而是以“订阅一份技能索引”的形式交付。选型时该问的不是对方有没有MCP服务,而是对方的能力以什么粒度、什么时机进你的上下文。
## 为什么这个反转能成立,而不是又一次概念套壳
因为它把两件本来被混在一起的事分开了:能力的传输,和能力的说明书。
过去这两件事绑死在一起——你连上一台服务,它把工具描述一股脑塞给你,说明书就是传输的一部分,想要前者必须先吃下后者。分开之后,服务只在真正要执行的那一刻被调用,说明书按需取回,什么时候进上下文由你这边决定。
这一步对企业采购的意义比对个人开发者大。供应商可以继续维护它的服务和授权体系,而客户拿到的上下文开销从“每次会话固定支出”变成“按需支出”,两边的诉求第一次不冲突了。之前那种非此即彼的争论,很大程度上是因为没人把这两件事拆开谈。
顺带说一句选型上的提醒:看到某个平台同时提供服务与技能两种接法时,别默认技能一定更省。要看它的技能文件是不是真的按需加载、正文有多长、有没有把一整本手册塞进一个文件里。体裁对了不等于分量对了。
## 什么情况下MCP仍然是更优解?
宣告某个技术已死的文章大多败在从不给对方摆事实。这里反过来说,而且理由是结构性的,不是怀旧。
- 没有shell,命令行论就不成立。网页版助手、移动端Agent、锁死的企业沙箱,很多根本摸不到命令行。对它们来说“直接跑一条命令就行”是一句没有意义的话,而基于HTTP的协议传输恰恰能进这些环境。这不是小众市场,大部分面向消费者的AI产品都在这个范畴里。
- 工具池真的高频变化时,动态发现是真价值。一个开放生态里的Agent,用户在运行时接入自己的第三方服务,这时带结构描述的协议就是比一个文件夹的文档强。2025年的错误不是造了这个协议,而是把动态发现当成了静态工具集的默认方案。
- 托管授权和审计边界。脚本连上你已登录的浏览器时,继承的是你的完整会话——方便,但也正是让安全团队睡不着的那种全量授权。远程服务配托管授权,给企业的是细粒度令牌、可撤销、每次调用留痕。
还要对命令行路线的另一面诚实:给Agent一个shell,等于给它任意命令执行的能力。威胁模型里一旦有提示词注入,受限的协议面反而变成了优点。这条张力怎么处理,和选服务时怎么辨认真实包名与授权范围 (https://zhangwenbao.com/best-mcp-servers-claude-code.html)是同一类工程判断。
还有一条跨平台的现实:技能文件里的命令通常默默假设了某一种操作系统,搬到另一套环境上要返工,而协议描述不挑系统。团队里有人用Mac有人用Windows的时候,这条比想象中更烦人。
注意这些赢面的共性:全都是环境约束——没shell、工具不稳定、凭证不能落地、跨系统。没有一条是“在命令行存在且能用的前提下,协议集成得更好”。这就是降级而非死亡的准确含义。
## 混合式才是大多数团队最后落到的形状
把上面两组理由摞在一起,得到的不是二选一,而是分层:作业指导书在上,命令行和脚本是默认执行层,协议是前两层够不到时的兜底传输。
这个形状有个很实际的好处——它让替换成本降到了单层。上游服务停服,你换一条执行路径,作业指导书基本不动;模型换代,你换模型,作业指导书还是不动。把知识和传输解耦之后,传输就变成了大宗商品,而大宗商品是按成本竞争的。
## 这周就能跑一遍的迁移判据
理论说完,给可以直接抄的作业。逐条核对你在跑的每一台服务:
- 官方命令行或可脚本化接口已经存在。存在,就说明这台服务只是在你的Agent和它本可直达的东西之间做翻译。
- 你的Agent摸得到shell。摸得到,命令行论全额适用。
- 流程是可重复的。你翻来覆去调的就是那三五个工具、相似的顺序,却在为静态例行公事支付动态发现的价格。
- 词元开销远超使用率。服务加载了成千上万词元的定义,你只用其中五分之一的工具。翻一下会话日志,这条可测量。
- 服务需要人伺候。认证反复重配、常驻进程要管、动不动关了再开试试。
命中三条以上,就写一份技能文件指向命令行,断开服务,然后对比迁移前后每任务的词元数。技能文件通常只需要四段:用哪个工具、带真实输出的标准命令示例、失败模式和兜底、模型不许越过的硬边界。
## 四段各该写什么,写多长
把这四段写成什么样,直接决定这份文件是资产还是负担。给一份可以照着填的骨架。
第一段:用哪个工具、怎么确认它装好了。写清楚工具名、版本要求,以及一条用来自检的命令。这一段的作用是让模型在开工前就知道环境对不对,而不是在第三步才因为找不到命令而乱猜。
第二段:带真实输出的标准命令示例。这是四段里最值钱的一段。别只写命令,要把它跑出来的真实输出粘一小段进去。模型见过输出长什么样,解析和判断的准确率会明显不一样;只给命令不给输出,等于让人闭着眼睛接球。
第三段:失败模式和兜底。列出你已经踩过的坑:认证过期长什么样、限流报什么错、哪个参数在某些情况下会静默失效。每条配一句该怎么办。这一段会随时间越写越长,也正是这份文件唯一会增值的部分。
第四段:硬边界。明确写出模型不许做的事——不许改这几个目录、不许在没确认前执行删除、不许把密钥打进日志。注意这一段是提示而不是强制,真正不能出错的边界还得靠权限配置兜底,文字只负责让它不去试。
总长度控制在一百行以内是个不错的目标。超过这个数,通常意味着你把三件事塞进了一份文件,该拆了。
## 按迁移收益排个先后
一次全迁是最容易翻车的做法。按下面这张表挑,先动收益大风险小的那几台。
这类集成 | 先动还是后动 | 理由 |
代码托管、云平台、容器编排 | 最先动 | 官方命令行成熟到过分,模型对它们的命令熟到不用教 |
自家数据库与内部接口 | 早动 | 本来就是你自己的接口,中间那层纯粹是翻译 |
协作平台与办公套件 | 看有没有官方命令行 | 有就动,没有则等,别自己撸一个包装器长期维护 |
浏览器自动化 | 看用途 | 要登录态和真实会话就走脚本,要跨环境一致性就留着协议 |
需要托管授权的第三方服务 | 最后动或不动 | 凭证不落本地这件事,脚本路线暂时给不了同等保证 |
还有一类不该动:你一个月只用一两次、而且每次用法都不一样的服务。它的词元开销本来就摊得很薄,写一份技能文件的维护成本反而更高。迁移的收益跟使用频次成正比,跟用法的固定程度成正比,跟你能不能自己修它成正比。
## 每任务词元到底怎么量才算数
迁移前后各测一遍,听起来简单,实际很容易测出一个自己骗自己的数字。三个常见陷阱。
第一,只测一次。同一个任务跑三遍,词元数波动两三成是常事,单次对比毫无意义。至少各跑三遍取中位数,任务本身也要固定,别一次查订单一次改标题。
第二,只测总量不看构成。总量降了,可能只是这次它少绕了一次弯,跟你的改动无关。要分开看两块:固定开销,也就是任务开始前上下文里已经躺着多少;变动开销,也就是执行过程中新增了多少。迁移主要削的是前者,如果前者没动,说明服务其实没断干净。
第三,忘了算技能文件本身。技能文件被触发之后也要进上下文,它不是免费的。真正的对比是“协议的固定开销”对“技能文件的触发开销加脚本调用的输出量”,而不是拿几万词元去比一份文件的元数据。把这一项算进去,倍数会缩水,但结论通常还是成立——只是从两百倍变成十几倍,而十几倍已经足够改变决策了。
## 别省掉测量这一步,也别只测词元
词元下降是最好写的那个数字,但它未必是最重要的。保哥自己迁移时真正改变判断的,是故障恢复时间:脚本坏了,把命令一粘就看到报错;服务那条路坏的时候,人在翻别人家的日志。可调试性才是复利,而它从来不体现在账单上。
还有一个反直觉的观察值得记下来:把工具目录砍窄之后,模型的表现提升往往比省下来的钱更值钱。这一点在算token账时容易被漏掉——省下的两万词元是一次性的加法,而选对工具带来的路径缩短是每一轮都在生效的乘法。同样的账在浏览器这个具体场景里也成立,四种让模型看页面的方式各自要花多少词元 (https://zhangwenbao.com/claude-code-screenshot-mcp-frontend-debug.html)那篇里量过一遍,量级差异同样在两个数量级上。
## 如果只能记一句
把立场写成一句可以被证伪的话:到2026年底,“怎么把Agent接到某个系统”的默认答案会变成“它有命令行吗”,只有这个问题答“没有”时,协议才出场。
今天新起一个Agent项目,从技能加命令行开始;撞上前面那三种环境约束的那天,再加服务,别提前。至于三种扩展机制彼此的边界怎么划,MCP、Skills与Hooks各管哪一段 (https://zhangwenbao.com/mcp-vs-skills-claude-code.html)那篇写得更细,可以当配套读。
## 常见问题解答
## MCP是不是已经死了,还值得学吗?
值得,但学的重点要换。它没死,是从默认集成方式降级成了几种可选传输之一。真正过时的是“遇到集成需求先想有没有现成服务”这个反射。现在该先问有没有命令行或可脚本化接口,没有再考虑协议。协议本身的概念——工具发现、结构化描述、托管授权——在没有shell的环境里依然是唯一解。
## 那个流传很广的250倍差距到底靠不靠谱?
不靠谱,至少它的推导过程站不住。它把GitHub官方“合并Projects工具组省下约两万三千词元、降幅五成”读成了“整台服务从五万降到两万三”,再拿这个五万去除以技能文件的两百词元。官方从没公布过全量工具定义的总词元数。方向没错——按需加载确实比预先灌入省得多,但具体倍数请以你自己会话日志里的实测为准。
## 技能文件不能保证百分之百执行,那关键流程怎么办?
把需要判断的部分留给技能文件,把不能出错的部分写成脚本让它调用。判断归技能,精确归脚本。如果一个流程既零容忍偏差又不需要任何判断,那它根本不该交给Agent,该做成定时任务。这个分工也是技能文件不至于越写越长的关键。
## 给Agent开shell安全吗,会不会被提示词注入利用?
风险真实存在,给shell等于给任意命令执行能力。可行的收敛有三层:用允许与拒绝名单把可执行命令和可读写路径框死,把密钥放进环境变量而不是让它读凭证文件,在工具调用前挂一道钩子做硬拦截。反过来说,这也正是受限协议面在高危环境里的价值所在——不是所有场景都该用同一套接法。
## 已经装了七八台服务,要不要一次全迁走?
不要。按迁移判据逐台评估,命中三条以上的先动,一次动一台,每台迁完记录每任务词元数和一次故障恢复的耗时。全量替换的风险在于你会同时失去多个可回退的参照,一旦出问题分不清是哪一处改动引起的。
## 公司里有人坚持“协议是标准,不能不用”,怎么谈?
把话题从立场换成成本。请对方一起看两个可测量的东西:一是每个会话里工具定义占了多少词元、其中多少工具实际被调用过;二是最近三次这条集成出故障时,定位问题花了多久。这两个数字摆出来之后,讨论通常会自动从要不要标准,变成这条集成到底值不值那个价。
## 权威参考资料
## AI Agent卡在六成成功率不动,问题不在你正在调的那一层
- URL:https://zhangwenbao.com/agent-harness-layers-build-order.html
- 分类:AI编程与工具链
- 发布:2026-07-23 | 更新:2026-07-30
- 摘要:六层Agent骨架是对的分类,却是错的施工顺序。评估与容错这两层撑起约八成稳定性,本文给出倒序施工法、三套拆法的正面对照、传感器该装哪几个,以及判断建不建的两根决策轴。
- 关键词:AI Agent,AI编程,上下文工程,Agent开发,工程方法论
> **TLDR**:摘要:把AI Agent架起来跑的那套外围系统,业界现在管它叫harness,中文可以叫骨架。流行的讲法是六层:上下文、工具、执行、记忆、评估、容错,然后按这个顺序建。这个顺序是反的。真实的贡献分布严重不平等——评估和容错这两层加起来撑住了大约八成的稳定性,而它们通常被排在最后,甚至被当成可有可无的打磨。更麻烦的是,业界至少有三套互不兼容的拆法,其中只有一套能回答“下一步该改哪儿”。这篇把三套摆在一起对照,给出倒着建的顺序、每一层的真实投入产出、传感器具体装哪些、以及三种情况下干脆别建。最后用两篇2026年6月的论文说明一件事:骨架不是永久护城河,它是一扇会关的窗。
> 摘要:把AI Agent架起来跑的那套外围系统,业界现在管它叫harness,中文可以叫骨架。流行的讲法是六层:上下文、工具、执行、记忆、评估、容错,然后按这个顺序建。这个顺序是反的。真实的贡献分布严重不平等——评估和容错这两层加起来撑住了大约八成的稳定性,而它们通常被排在最后,甚至被当成可有可无的打磨。更麻烦的是,业界至少有三套互不兼容的拆法,其中只有一套能回答“下一步该改哪儿”。这篇把三套摆在一起对照,给出倒着建的顺序、每一层的真实投入产出、传感器具体装哪些、以及三种情况下干脆别建。最后用两篇2026年6月的论文说明一件事:骨架不是永久护城河,它是一扇会关的窗。
先说一个让人不太舒服的观察。
过去大半年里,我见过的AI Agent项目卡住的位置高度一致:成功率停在六成到七成之间,怎么调都不动。团队的反应也高度一致——回头去改提示词,去精简那份规则文件,去换一个更贵的模型。三件事轮着做,一个月过去,成功率纹丝不动。
问题不在他们改的那些地方。问题是他们没有任何一个仪表能告诉他们,到底哪一层坏了。
## 六层框架是对的分类,却是错的施工顺序
现在讲AI Agent工程,几乎所有的图都长一个样:上下文(模型看到什么)、工具(模型能做什么)、执行(步骤怎么串)、记忆与状态(跨轮次记什么)、评估与观测(到底做对没有)、约束与容错(出错了怎么办)。六个盒子从上往下排成一列,箭头依次往下指。
作为分类,这套框架没问题。它把散落在各处的实践收进了一个能讲清楚的范畴里,这本身就有价值——就像“测试夹具”这个词在上世纪九十年代末稳定下来之前,每家公司对测试运行器、Mock、断言库、集成框架都有自己的叫法,等这个伞形概念被接受之后,那些散落的实践才第一次作为一个整体被设计。
问题出在,几乎所有人都把这张图当成了施工顺序图。从上往下读,读出来的意思是:先做上下文,再做工具,再做执行,再做记忆,最后加评估和容错。
这正是大多数团队的实际做法,也正是他们卡在六七成好几个月的原因。
## 这六层的权重为什么严重不平等?
## 前四层全是盲操作
把六层拆开看一件事:哪几层能产生反馈,哪几层不能。
第一层你调上下文,Agent的行为变了,然后呢?你没有任何依据判断它是变好了还是只是变了。第二层你加一个工具,你在假设它会被正确调用。第三层你画一套执行流程,你在假设每一步真的能跑通。第四层你上记忆,你在假设记住的那些东西确实有用。
这里顺带说一句工具那一层的常见误解:很多人以为工具越全越好,实际恰恰相反,工具目录的质量在于精选而不在于覆盖。站内那篇拆协议服务、技能与钩子三种扩展机制该怎么选 (https://zhangwenbao.com/mcp-vs-skills-claude-code.html)的文章讲的就是这个取舍,它和这里的第二层是同一件事的两种说法。
四层全是在假设。没有评估和容错,你是关着仪表盘在飞——你对前四层做的每一个改动都是赌博,赢了不知道为什么赢,输了不知道输在哪。
第五层和第六层不是叠在前四层之上的优化项,它们是让你能判断前四层有没有效的那副眼镜。没有这副眼镜,前四层的每一次调优都只是在换一种方式瞎。
## 一张按周记录下来的贡献表
下面这组数据来自一条在生产环境连续跑了六十天的AI编程流水线,每周只加一层,逐周记录同一批真实任务上的成功率变化。
层 | 这一周具体做了什么 | 成功率提升 | 投入工时 |
一·上下文 | 精简规则文件,收紧文件选择器 | +12% | 2周 |
二·工具 | 从22个工具里砍掉14个,只留8个 | +8% | 1周 |
三·执行 | 计划、执行、复查三段式模板 | +6% | 1周 |
四·记忆 | 跨会话偏好、草稿区 | +3% | 2周 |
五·评估 | 单测风格的适应度函数、指标看板 | +22% | 1周 |
六·容错 | 验证关卡、带上下文重试、回滚 | +18% | 2周 |
这张表值得读两遍。第五层给出的提升接近第一层的两倍,工时只用了一半。第六层给出的提升是第四层的六倍,工时完全一样。
五和六加起来是40个百分点,其余四层加起来是29个百分点。这就是“八成稳定性来自后两层”这个说法的来源——不是修辞,是记账。
## 一个被指标救回来的项目
保哥这两年帮客户看过不少这类项目,其中有一个印象特别深。
那是一家做户外装备的独立站,想用Agent自动给站内几百个产品页补结构化数据和内链。做了六周,通过率卡在62%。上下文调过两次,模型换过三次,工具加了两个新的,纹丝不动。团队已经在开会讨论要不要砍掉这个项目了。
后来花了一个下午加了第五层,就是一组极其朴素的检查:改完之后页面还能不能正常渲染、结构化数据能不能通过校验、站内链接有没有指向404、改动行数是不是异常的大、改动内容和需求描述的语义相似度够不够。加起来两百来行脚本,谈不上任何技术含量。
一天之内,看板告诉了他们一件此前完全看不见的事:四成的失败,是有效的改动打坏了一条不相关的内链。Agent确实在做正确的内容改动,但每跑三次就会把某篇相关文章的交叉引用弄挂。之前所有的上下文调优都没碰到这块,因为他们根本不知道有这个问题存在。
花两天修链接处理逻辑,通过率从62%跳到84%。上下文、工具、模型,一个都没动。
这里的教训不是“凡事都要测量”这种正确的废话。教训是:瓶颈几乎从来不在你以为的地方,而没有仪表你永远找不到它。六周的前三层调优没找到这个bug,两天的第五层找到了。
## 倒着建:从容错和评估往回走
所以正确的顺序是反的。推荐的施工序列是六到一:
- 先做容错。失败是默认状态,不是异常状态。如果Agent不能从一次错误的工具调用里恢复,上下文调得再漂亮也白搭。先把验证关卡和回滚路径接上去。
- 再做评估。不可衡量的东西不可改进。先建看板,再谈优化。
- 第三是工具。有了评估之后,工具是性价比最高的行为改造手段。工具选错是会复利的,但没有评估就改工具,改的是运气。
- 第四是上下文。上下文调优边际递减而且极易过度工程。有评估你才知道什么时候该停手。
- 第五是执行编排。显式的流程编排只在底层组件稳定之后才有回报。
- 记忆放最后,而且经常根本不做。这是过度建设最严重的一层,半小时以内的任务里它几乎从来不是瓶颈。
## 今天下午就能试的三十分钟启动法
如果你手上正好有个卡住的Agent,下面这五步是一次性动作,不需要重构任何东西:
- 挑出过去一周观察到的三个失败模式。就三个,不要贪多。
- 每个写一个二十行的校验器。不用聪明,硬编码判断完全可以:构建过了没?接口调用返回200没?输出符合结构没?
- 接进Agent的循环。失败时把校验器的输出当成重试提示喂回去:“这次输出不合格,原因是X,按这个约束重来”。
- 跑二十次有代表性的任务,看哪个校验器触发得最频繁。
- 触发最频繁的那个,就是你的下一个bug。它在哪一层修就在哪一层修——但你不打开校验器,永远不知道它在哪一层。
整套倒序哲学就是这一个循环:容错、评估、诊断、修真正的瓶颈,然后重复。
如果你打算把这套循环真的写成代码而不是停在纸面上,站内那篇用官方软件开发工具包几行代码搭一个Agent的实战 (https://zhangwenbao.com/claude-agent-sdk-guide.html)可以当起点,校验器和重试提示都是接在那个循环的同一个位置上。
## 三套互不兼容的拆法,只有一套能回答下一步改哪儿
这里要说一件很少被摆到台面上的事:所谓的“骨架”,业界至少有三套完全不同的拆法,而且它们互相对不上。
## 第一套:按部件列清单
2026年3月10日,LangChain的Vivek Trivedy发了一篇拆解Agent骨架解剖结构的文章 (https://www.langchain.com/blog/the-anatomy-of-an-agent-harness),正式给出了那个后来传得最广的公式:Agent等于模型加骨架。文章列了十三个组件:系统提示、工具与技能与协议服务及其描述、随包提供的基础设施、编排逻辑、钩子与中间件、文件系统、命令行与代码执行、沙箱、记忆与检索工具、压缩、工具调用卸载、技能的渐进披露、规划与自校验。
这篇文章里最扎人的一句话不是公式,是它给出的一条观察:在Terminal-Bench 2.0的榜单上,同一个模型跑在不同骨架里,分数差得很远,而且官方自家工具里的成绩明显低于其他骨架。文中还提到,只改骨架、一行模型都不换,就能把排名从三十名开外推进前五。
## 第二套:按层级排栈
就是本文开头那六层。它的优点是好教好记,缺点是前面已经说透了:它长得像施工顺序,但不是。
## 第三套:按作用时机和确定性排2×2
2026年4月2日,Thoughtworks的Birgitta Böckeler在Martin Fowler的网站上发了一篇面向编码Agent使用者的骨架工程指南 (https://martinfowler.com/articles/harness-engineering.html),给了一套和前两套都不同的切法。
她先做了一个划分:内骨架是模型厂商随产品发给你的那一层(Agent软件开发工具包、编码工具本身),外骨架是你自己在上面搭的那一层(规则文件、协议服务、自定义技能)。这个划分立刻回答了一个预算问题——内骨架是白送的,你花的每一分钱都只该花在外骨架上。
然后是真正好用的那个2×2。横轴是作用时机:
- 引导是前馈控制,预判Agent的行为,在它动手之前把它引到正确方向上。原文的说法是,引导“提高Agent第一次就做对的概率”。
- 传感器是反馈控制,在Agent动完手之后观察结果、让它自我修正。原文特别加了一句:传感器“在产生专门为大模型消费而优化的信号时,威力尤其大”。
纵轴是确定性:
- 计算型——确定性、快,跑在CPU上。测试、静态检查、类型检查、结构分析,毫秒到秒级出结果,结果可靠。
- 推断型——语义分析、AI代码评审、大模型当裁判,跑在GPU上,更慢更贵,结果更不确定。
四个格子填满是这样:编码约定属于推断型前馈(规则文件、技能),代码批量改写属于计算型前馈(重构配方),结构测试属于计算型反馈(架构约束测试),评审指令属于推断型反馈(技能)。
## 为什么第三套赢了
三套摆在一起,差别就出来了:前两套是按部件分类的,部件清单回答不了“下一步该改哪儿”;第三套是按作用机制分类的,所以它能。
拿一个具体故障走一遍。假设你的Agent总是漏掉某个必填字段。用十三个组件的清单,你会陷进“该改系统提示还是该加个工具还是该写个钩子”的三选一里,三个都说得通。用六层,你会在“这算上下文问题还是执行问题”里打转。用2×2,你只问两个问题:这是应该在它动手前拦住的,还是应该在它动完手后抓住的?这件事有没有确定性的判据?两个问题各一个答案,格子就定了,改哪儿也就定了。
## 把2×2变成一套四步定位动作
光有分类还是抽象的,下面这四步是我把它用起来之后固化下来的动作,遇到任何一个反复出现的故障都可以照着走一遍。
- 先写下那句“它又干了什么”。要具体到能复述:不是“它写得不好”,而是“它把描述写到了一百八十个字”“它把内链指到了一个已删的分类页”。写不具体,说明你还没观察够,后面三步都没法做。
- 问第一个问题:这件事有没有确定性判据?字数、返回码、结构是否合法、必填字段在不在——有,就走计算型;只能靠“读起来像不像话”判断的,才走推断型。这一步最容易犯的错是把明明能数出来的东西交给裁判去感觉。
- 问第二个问题:拦在前面更划算,还是抓在后面更划算?判断依据是重做一次的代价。改一行描述,重做很便宜,那就抓在后面;跑一整套多语言生成再发现语种搞混了,重做很贵,那就拦在前面。
- 落格子,然后只改那一个格子。两个答案交出来就是一个格子,改动限定在那个格子里,改完把这个故障加进回归集。关键在于最后半句——不进回归集的修复,下个月一定会以另一种形式回来。
这套动作有个附带的好处:它逼你承认有些故障你其实无从判断。当第二步答不上来的时候,真正的问题不是选计算型还是推断型,而是你对“做对了”的定义还没写下来。这种情况比想象中常见,而且从来不会自己好转。
顺带说一句,Böckeler那篇还给了第三个维度:骨架按管的东西分三类——可维护性骨架(内部代码质量,目前最成熟)、架构适应度骨架(性能要求、可观测性标准)、行为骨架(功能正确性)。她对最后一类的原话是“我们还有很多事要做”。前面那个户外站的案例正好落在这一类:内链被打坏,不是代码质量问题,是行为正确性问题,而这恰好是三类里最不成熟的那一类。
## 传感器具体该装哪几个?
Böckeler在2026年5月27日又发了一篇专讲可维护性传感器的实操文章 (https://martinfowler.com/articles/sensors-for-coding-agents.html),把“该装什么”落到了具体工具上。这一节的信息密度很高,值得逐条抄下来。
## 会话进行中就该跑的(全是计算型)
类型检查器、代码静态检查(配自定义输出格式,好让Agent自己纠)、静态安全扫描、依赖关系检查器(管目录结构和依赖方向)、带覆盖率的测试套件、增量变异测试、提交前的密钥泄露检查。
## 接进流水线之后重跑的
同一批计算型传感器,在干净的基础设施上再跑一遍。这一步不是冗余,是因为本地环境的脏状态会让不少问题在会话里被掩盖过去。
## 按更慢的周期跑的(推断型为主)
安全审阅、数据处理方式审阅、依赖新鲜度报告、模块化与耦合度审阅。前两个纯粹靠提示词跑,后两个是计算加推断的混合。
## 三种接进循环的方式,两种不好使
这是全文最实用的一段。Böckeler试了三种接法:
- 写进规则文件里让Agent自己去跑。她的原话是“相当不可靠”,还补了一句非常真实的抱怨——她得反反复复问Agent,为什么一次都没跑过那些检查。
- 挂钩子。文件修改时触发,或者接在提交前。可用,但她提醒要盯着别太吵。
- 写成自定义扩展。她的评价是“看起来挺有前途”,但用量还不够下结论。
第一条值得放大讲。把校验写进指令,和把校验写进机制,是两件事。写进指令的东西,模型会看心情执行;写进机制的东西,模型没得选。这条经验和站内那篇讲给循环工程装刹车的实战 (https://zhangwenbao.com/agent-loop-engineering-guardrails.html)是完全一致的结论——那篇里的掉沟检测之所以有效,正是因为它们是硬编码的计数器,不是写在提示词里的君子协定。
## 阈值别设成二选一
还有一个特别聪明的设计细节:她配置静态检查的时候,没有把阈值做成“要么改要么加豁免注释”的二选一,而是允许Agent在它认为这次重构确实没必要的时候,把阈值稍微往上调一点。
这个设计的道理是:卡死的阈值只会训练出满屏的豁免注释,那时候你的传感器就等于关了。给一点可协商的空间,反而能让规则活着。
最后她自己留了一句警告,我觉得比前面所有工具清单都值钱:“我忍不住会想,这是不是也会带来一种虚假的安全感,一种质量的错觉。”传感器装满了,不等于质量真的上去了——它只等于你现在能看见一部分问题。
## 没有验证面的话,从零怎么建一个?
前面反复说“先建验证面”,但很多人卡在这句话上:我做的就是内容,哪来的测试和类型检查?
这是个真问题,也是个被高估的问题。验证面不等于单元测试,它的定义宽得多——任何一个能在不看人脸色的前提下、对一次输出给出“合格/不合格”的判断,都是验证面。按这个定义,内容类的工作里能拿来当验证面的东西其实相当多,只是没人把它们收拢过。
## 先捡那些能数出来的
成本最低、见效最快的一批,全都是纯计算:描述字数在不在区间内、标题里的核心词有没有被改写掉、标点是不是混进了半角、结构化数据能不能通过校验器、新加的内链是不是全部返回200、图片有没有alt、同一批稿子里有没有出现重复标题。每一条都是几行代码,加起来一个下午写得完。
别小看这一批。前面那个户外站的故事里,把项目从判死刑救回来的正是这一类里最不起眼的一条——内链是否404。
## 再补那些能对照的
第二批稍微费一点事,但价值更高:这次输出和需求描述的语义相似度、这次输出和站内已有文章的重复度、这次改动的规模是不是异常(一个只该改标题的任务却动了三百行,那多半出事了)。这批是计算加推断的混合,也是最容易发现“做了但做错了”的一批。
## 最后才是需要人的那一档
确实有一部分东西没法自动判断:这段话是不是像人写的,这个论断成不成立,这个例子有没有说服力。这一档的正确做法不是放弃,而是把它压缩成抽检——不是每篇都看,而是固定比例随机抽,抽到不合格就回头查前两批传感器为什么没拦住。抽检的价值不在抽检本身,在于它持续告诉你自动化那部分漏了什么。
保哥的经验是,这三档建完,大部分内容流水线的成功率就已经能从“大概能用”推到“可以放着跑”了,而这中间一行提示词都没改过。
## 记忆层是最容易过度建设的一层
这一节单独拎出来,因为它是我见过最贵的一个坑。
记忆工程看起来很高级:向量库、语义索引、回合摘要、偏好学习,每一个词都很有面子。但这也是大多数团队砸进四到六周、最后只换回三个百分点的地方。
三条可以直接抄的规矩:
- 任务每次半小时以内,跳过记忆。把偏好写死在一次性的系统提示里,更快、更便宜、还不会腐烂。
- 真需要跨会话状态,先用平文件或者最简单的键值存储。向量库和向量化在九成场景里都属于过早优化。
- 长任务里,干净交接比持久记忆强。与其让一个Agent在塞满噪音的上下文里挣扎,不如带着显式的状态摘要交给一个全新的Agent接力。持久上下文会累积噪音,而恢复本质上是一个“需要干净上下文”的问题——当前这个Agent已经背了太多包袱,它看不见自己的bug。
还有一个反直觉的地方:那份写给Agent看的规则文件,也属于容易过度建设的范畴。站内那篇讲规则文件不是写得越详细越好、以及最优行数在哪 (https://zhangwenbao.com/claudemd-minimalist-guide.html)的实证复盘,结论和这里完全同构——加得越多,能被真正执行的比例越低。
唯一的例外是真的需要在几周里学习特定用户模式的场景,比如一个要学会公司内部黑话的客服Agent。除此之外,记忆都该往后放。
关于上下文该怎么减不该怎么加,站内那篇讲上下文工程真正杠杆在删不在加的复盘 (https://zhangwenbao.com/context-engineering-subtraction-practice.html)写得更细,那组“五千词元打赢十万词元”的对照实验,本质上讲的也是同一件事。
## 哪三种情况下干脆别建?
写到这里得踩一脚刹车。这篇不是在推销骨架工程,所以有必要把“不该建”的情形单独说清楚。
## 情况一:你的任务是探索性的,不是生产性的
如果你在用Agent做头脑风暴、起草、摸可能性,那么骨架机制伤大于帮。裸跑保留了模型的发散空间。等你确实从“探索”跨过“可重复生产”那道门槛之后再建也不迟。
## 情况二:你根本没有验证面
补一句和安全有关的:验证面缺失还有一个更贵的版本,就是把权限也一起省掉了。站内那篇从安全评审到权限边界与提示注入防御的实战 (https://zhangwenbao.com/claude-code-security.html)讲的那几道边界,本质上就是第六层里“不许它做什么”的那半边——这半边不属于优化项,属于底线。
第五层是承重层。如果你的任务没有测试、没有类型、没有静态检查、没有可观察的副作用、没有可对比的基线、没有人工抽检闭环——那你建不出有意义的骨架,就算你想建也建不出来,因为没有任何东西可以拿来验证。先建验证面,再建骨架。
这一条对内容和SEO类的Agent尤其致命。很多人上来就让Agent批量改标题、批量写描述,然后问为什么效果不稳定——因为整条链路上没有一个地方能判断“这次改得对不对”。站内那篇讲AI内容流水线为什么会被降权、三处人工节点该卡在哪里 (https://zhangwenbao.com/ai-content-pipeline-deindex-anti-spam-3-human-checkpoints.html)的复盘,讲的就是验证面缺失的代价。
## 情况三:你坐在投资象限的橙色区
这个要展开说。
## 建还是不建,该看哪两根轴?
把整件事压成一个决策面,两根轴就够:任务重复度有多高,以及距离下一代模型发布有多近。
| 当前模型代(近期无大版本) | 即将换代(30天内) |
高重复度 | 绿区·满投
六层全建,回报会复利。这是黄金窗口。 | 黄区·选择性缓投
只建第五、六层。跳过那些下一代模型会顺手吸收掉的补丁。 |
低重复度 | 红区·不投
裸跑。一次性脚本摊不平骨架成本。 | 橙区·设计期
不建实现。读发布说明、研究模式、磨判断力,等一个周期。 |
压成一条可以口算的启发式:未来六个月内同一条流水线会跑超过五十次,并且这个窗口里没有已知的模型换代——建。任一条件不成立,往下降一格。两条都不成立,直接放弃实现,把预算转到阅读上。
国内团队最常见的误判是坐在橙区却在按绿区做事:为一个两个月后就会过期的内部一次性工具,精雕细琢一套多层骨架。橙区的正确动作听起来有点残忍——别建,去读。把预算花在能深读发布说明、看懂能力差量、能复述骨架迁移模式的工程师身上。这种阅读能力是跨代复利的,那套精雕细琢的实现不是。
## 它是一扇会关的窗,不是一条护城河
最后这一节要说的,是这个话题里最容易被两边同时说错的地方。
## 每吃掉一层,就解锁更高一层
怀疑派最强的那把刀是:模型变强会把骨架吃掉。这把刀有真凭实据。厂商自己的复盘几乎就在承认这件事——上一代模型有“上下文快满时急着收尾”的失败模式,于是有了专门的上下文重置补丁;下一代模型这个毛病基本消失,补丁就没用了。同样,早期需要用硬约束逼模型“每轮只做一件事”,规划能力上来之后,这条约束反而帮倒忙,直接被删掉了。
但把这个模式外推成“骨架终将归零”是错的。错在把骨架当成一块面积固定、随时间缩小的东西。
数据指向相反方向:每一层被吸收掉的骨架,都解锁了此前根本够不着的任务复杂度。上下文焦虑一被治好,团队立刻就去挑战更难的全栈拆解了。骨架不是在缩小,是在随模型能力上移——它迁移到海拔更高的问题上去了。
时代 | 骨架当时在处理什么 | 已经被模型吃掉的 |
早期 | 单轮正确性、基础工具调用 | 上下文窗口基本款、简单工具结构 |
中期 | 上下文焦虑、强制分步、独立评估Agent | 长上下文连贯性、基础任务拆解 |
当下 | 跨任务编排、持久记忆、跨系统交接、自评估护栏 | 单任务规划、单功能点执行约束 |
下一代 | 多日工作流、组织级集成、Agent之间的协商 | 今天大部分评估与恢复模式 |
## 更尖锐的版本:骨架是因模型而异的
2026年6月8日的一篇论文把这件事推到了更不舒服的位置。Self-Harness这篇提出了让Agent改造自己骨架的范式 (https://arxiv.org/abs/2606.09498),作者的出发点是:不同模型行为不同,所以有效的骨架设计本质上是因模型而异的;而骨架目前基本还靠人类专家手工做,这个范式在模型越来越多样、迭代越来越快的时候扩展性很差。
他们做的事情是一个三段循环:弱点挖掘(从执行轨迹里找出这个模型特有的失败模式)、骨架提议(针对这些失败生成多样但最小的骨架改动)、提议验证(只有通过回归测试的改动才被接受)。在Terminal-Bench 2.0上拿三个不同家族的基座模型试,保留集通过率分别从40.5%涨到61.9%、23.8%涨到38.1%、42.9%涨到57.1%。
这组数字里最值得看的其实不是涨幅,是起点:同一套初始骨架,三个模型的成绩分别是40.5%、23.8%、42.9%,最高和最低差了将近19个百分点。这就是“骨架是因模型而异的”最直白的证据。它同时意味着一件让人扫兴的事——你在网上看到的任何一份“通用骨架最佳实践”,都有一个由它作者当时用的那个模型决定的天花板。
论文还有一句补充值得引:定性分析显示,这套方法产出的不是泛泛的通用指令,而是把模型特有的弱点变成了具体可执行的骨架改动。换句话说,能自动化的部分是“针对性”,不是“通用性”。
## 把状态挪出模型,学术上也成立
另一条2026年6月的证据来自检索方向。Harness-1这篇论文把搜索Agent的状态外置到了环境侧 (https://arxiv.org/abs/2606.02373),作者的论证是:把常规的状态管理塞进策略里是错的,因为强化学习被迫同时优化两件事——语义搜索决策,以及那些环境本来能更可靠维护的记账工作。
他们的做法是让骨架去维护环境侧的工作记忆:候选池、带重要性标记的精选集、紧凑的证据链接、验证记录、压缩去重后的观察、以及按预算渲染的上下文;策略只保留语义决策——搜什么、留哪些、验什么、什么时候停。在覆盖网页、金融、专利和多跳问答的八个检索基准上,平均精选召回率0.730,比次强的开源检索子代理高11.4个百分点,而它只是个两百亿参数的模型。论文特别提到,收益在留出的迁移基准上尤其明显。
提炼成一句能带走的话:凡是环境能可靠维护的记账,就不该让模型去记。让模型记账不只是多花点词元,是往它的优化目标里混进了一件本不该由它承担的事。
顺带说一句,这个词现在已经进了维基百科关于Agent骨架的词条 (https://en.wikipedia.org/wiki/Agent_harness),而且词条里明确写着这个说法的归属是有争议的——一派记在那位在博客里随口起了个名的独立开发者头上,另一派记在LangChain那篇解剖文章头上。词条还顺手做了一件好事:它把这套东西的前身指了出来,推理与行动交替的循环范式来自一篇经过同行评审的框架论文,模型调用外部工具的能力则更早就有工作演示过。一个七周传遍全行业的新词,底下压着的是好几年的旧地基。
## 常见问题解答
## 骨架工程和上下文工程、提示词工程是什么关系?
层级关系。提示词工程优化的是单次交互,上下文工程管的是某一时刻模型看到什么,骨架设计的是整个运行环境,前两者都是它的组成部分。有一个区别值得单独记:被包裹的那个组件是非确定性的,所以骨架从一开始就要按“模型会编造一个动作、或者会谎报任务已完成”来设计恢复路径,这跟包裹一个确定性组件完全是两回事。
## 小团队没资源,六层里最先建哪一个?
第六层的最小可用版本:挑三个最常见的失败模式,每个写二十行硬编码校验,失败时把校验结果当重试提示喂回去。这一步通常一个下午能做完,而它会立刻告诉你第五层该测什么。反过来先建第五层也行,但先有恢复路径,你在调试期间会少丢很多次工作成果。
## 怎么判断我该继续加骨架还是该停手?
看指标是不是还在动。上下文调优有明显的边际递减,指标连着两三轮改动都在噪声范围内浮动,就是该停的信号。这也是为什么评估必须先建——没有指标,你分不清“已经到顶了”和“方向错了”。
## 用不同模型要不要重做骨架?
大部分不用重做,但要重测。前面那组数据说明同一套骨架在不同模型上的成绩能差近19个百分点,所以换模型之后至少要把评估集重跑一遍,看哪几个校验器的触发频率发生了变化——变化最大的那几个,就是这个模型和上一个模型的行为差异所在。
## 推断型传感器(大模型当裁判)可靠吗?
在文件和函数级别,计算型传感器更有效;跨文件的问题上,原始数据本身很嘈杂,没有语义解释反而不太可用,这时候推断型才有它的位置。实践上的做法是分工而不是二选一:能用确定性判据的地方绝不用裁判,剩下确实需要语义判断的部分再交给裁判,并且给它可对照的基线。
## 这套东西对做SEO和独立站运营的人有什么用?
用处比想象中直接。任何一条“让AI批量处理内容”的流水线,都是一个Agent系统:批量写描述、批量补内链、批量生成产品文案、批量做多语言。它们卡住的原因跟编程Agent一模一样——没有验证面,所以没有仪表,所以每次改动都是赌博。先建校验(描述长度、关键词是否原样保留、内链是否404、结构化数据是否通过),再谈提示词怎么写,顺序反了就会一直在原地打转。
## 权威参考资料
## 斯坦福CS146S换了新大纲,被删掉的那几讲比新加的更有信息量
- URL:https://zhangwenbao.com/stanford-cs146s-self-study-2026.html
- 分类:AI编程与工具链
- 发布:2026-07-23 | 更新:2026-07-30
- 摘要:CS146S官网已挂出新版课程描述,删掉的两讲全是绑产品的内容。本文给出逐讲判断、作业仓库停更八个月的真实状态、两周与六周两条路线,并纠正Semgrep那组被抬高七倍的数字。
- 关键词:Claude Code,AI编程,Vibe Coding,上下文工程
> **TLDR**:摘要:斯坦福CS146S(The Modern Software Developer)已经在官网挂出新一期的课程描述,核心主题换成了MCP、agent skills、规格驱动开发、循环工程和软件工厂。而2025年秋那版大纲里的“现代终端”“一句话建应用”不见了。被删掉的那几讲,比新加的更有信息量——删的全是产品名,留的全是工程判断。另一个自学者必须知道的事实:作业仓库有3819颗星,但最后一次代码推送停在2025年11月10日,也就是说大纲已经换代、作业还是上一版的。下面给出逐讲取舍、两条自学路线、Final Project的替代方案,以及一处被广泛传错的安全实测数据。
> 摘要:斯坦福CS146S(The Modern Software Developer)已经在官网挂出新一期的课程描述,核心主题换成了MCP、agent skills、规格驱动开发、循环工程和软件工厂。而2025年秋那版大纲里的“现代终端”“一句话建应用”不见了。被删掉的那几讲,比新加的更有信息量——删的全是产品名,留的全是工程判断。另一个自学者必须知道的事实:作业仓库有3819颗星,但最后一次代码推送停在2025年11月10日,也就是说大纲已经换代、作业还是上一版的。下面给出逐讲取舍、两条自学路线、Final Project的替代方案,以及一处被广泛传错的安全实测数据。
先把最常被搜索的三件事在开头答完。
第一,这门课是真的。斯坦福CS146S,课程名The Modern Software Developer,讲师Mihail Eric,3学分,2025年秋首开,斯坦福课程公告里有独立条目 (https://bulletin.stanford.edu/courses/2274401)。
第二,材料基本免费。官网、幻灯片、阅读清单、8周作业代码全部公开,唯一拿不到的是嘉宾演讲的完整录像。
第三,别按顺序啃。这是本文最想说的一句——大学课表是为有学分、有截止日期、有成绩单的在校生设计的,不是为下班后挤时间的工程师设计的。任何超过六周的自学计划,都会悄悄变成一个已放弃的计划。
搜索答案给完了。接下来是摘要给不了的东西:这门课在2026年自己改了什么,改动背后的行业信号,以及一份逐讲的取舍判断。
## CS146S现在到底是什么状态?
这一节的信息在网上流传的版本大多已经过期,所以我直接去了一手源。
课程官网 (https://themodernsoftware.dev/)目前挂着的是新一期的课程描述,不再是2025年秋那版。页面上的确定信息:
- 学分:3学分
- 先修:CS111/CS161等价的编程经验,推荐修过CS221或CS229
- 形式:每周讲座 + 动手编码课 + 业界嘉宾演讲 + 期末项目
- 教室:420-041,讲师答疑时间周五12:00到12:30
- 助教:两个位置目前都还是待定
助教还没定这条挺有意思——它说明筹备还在进行中,嘉宾阵容和具体周次安排大概率会再变。所以如果你打算跟新一期,别现在就把整个学期的计划排死。
那份公开的先修要求也值得认真对待。这门课默认你有CS111级别的编程底子加基本工具经验。如果你从来没有用编码Agent真正交付过一个东西,冷启动硬啃这门课是收藏夹吃灰的标准路径。先补一周上手型入门,再进场。
## 新旧两版大纲之间,被删掉的是什么?
这是我认为整件事里最值钱的一段观察。
2025年秋那版的十讲结构,大致是这么排的:大语言模型与提示词 → Agent解剖与MCP → 上下文工程 → Agent协作模式 → 现代终端 → 测试与安全 → 代码审查 → 一句话建应用 → 部署后运维 → 软件工程的未来。
而官网现在的课程描述,点名的核心主题是这五个:MCP、agent skills、规格驱动开发、循环工程、软件工厂。学习目标写的是:设计Agent驱动的工作流、把工具和技能组合成可靠的开发系统、用软件工厂的原则更快更大规模地构建和演进软件。
两版并排看,加进来的东西很显眼。但更有信息量的是被拿掉的:
2025秋版的主题 | 在新描述里的处境 | 我的读法 |
现代终端(Warp等) | 消失 | 产品评测型内容,保质期以月计 |
一句话建应用(v0、Lovable等) | 消失 | 同上,且这类产品一年换三次定价 |
提示词工程 | 不再单列 | 被吸收进上下文与规格这两个更大的框架 |
Agent解剖与MCP | 保留并前置 | 协议层的东西被证明是耐久的 |
上下文工程 | 保留 | 课程里最不容易过时的一讲 |
测试、安全、代码审查 | 并入“可靠的开发系统” | 从独立议题变成系统属性 |
— | 新增:规格驱动开发 | 把需求翻译成可执行规格,成了独立能力 |
— | 新增:循环工程 | 人机分工从“怎么下指令”移到“怎么设计迭代循环” |
— | 新增:软件工厂 | 从单人产出转向流水线产出 |
把这张表读透,能得到一条比任何课程笔记都有用的原语:一门课两版大纲之间被删掉的东西,比被加进来的东西更有信息量。
加进来的东西可能只是追热点,删掉的东西一定是有人认真判断过“这个不值得占用十分之一个学期”。而这次删掉的两讲,恰好都是绑在具体产品上的内容。
## “软件工厂”这个词该怎么理解
三个新主题里,软件工厂最容易被当成噱头,但它其实是整套变化的落点。
前面两个——规格驱动、循环工程——解决的都是“怎么让一次交付更可靠”。软件工厂问的是下一个问题:当一次交付已经可靠了,怎么让第二次、第十次交付不用重新组织一遍?
换成做独立站的语言就很好懂。你用Agent做出了第一个落地页,这是手工业;你把选题、生成、审查、上线这几步固定成一条能重复跑的线,每次只换输入,这才是工厂。差别不在单次产出的质量,在于第二次要不要重新想一遍流程。
保哥这两年做内容管线的体会是,绝大多数人卡在从手工业到工厂那一步,而不是卡在第一次做不出来。第一次做出来靠的是热情,做成流水线靠的是把每一步的输入输出定义清楚——那是纯粹的工程活,一点都不性感,但省下来的时间是成倍的。课程把它列成核心主题,说明这个判断已经不只是从业者的经验之谈了。
## 这个信号对自学者意味着什么
它直接决定了你该把时间花在哪儿。工具名的保质期以月计,工程判断的保质期以年计。2025年秋那版材料里,会过时的部分恰好就是新版删掉的那部分;两个核心模块讲的上下文失效模式、自主度检查点、安全审查闸门,从那时到现在一个都没变。
所以“2025年秋的材料是不是已经过时了”这个高频疑虑,答案是:过时的部分正好是你本来就该跳过的部分。
## 三条新主题在中文世界的对应资源
新增的三个主题里,有两个我已经单独拆过,可以直接当作课程之外的补充读物。
规格驱动开发那条腿,最成熟的落地形态是OpenSpec这类工具。我在Claude Code、OpenSpec、Superpowers三件套是刚需还是过度工程 (https://zhangwenbao.com/claude-code-openspec-superpowers.html)里做过一次比较刻薄的评估——结论是这套方法在多人协作和长周期项目上确实值,但单人小项目用它是纯负担。课程把它列成核心主题,说明学界的判断偏向前者。
循环工程那条腿更新,讲的是把人机分工从“怎么把这一轮指令写好”上移到“怎么设计一个能自己跑、又能被人叫停的循环”。给Agent装上刹车之后那张跑了一整夜的账单才真正消失 (https://zhangwenbao.com/agent-loop-engineering-guardrails.html)那篇里讲了护栏的具体形态——迭代上限、上下文轮换阈值、掉沟检测的三个触发器。这些东西以前属于“老手的经验”,现在被写进了大学课表。
至于MCP和agent skills这对,课程把它们并列在第一句,本身就是个态度。这两者的关系在2026年上半年被吵得很凶,我在MCP、Skills、Hooks三大扩展机制怎么选 (https://zhangwenbao.com/mcp-vs-skills-claude-code.html)里逐条对过官方文档——简单说,它们解决的不是同一层问题,把它们当竞品对比是提错了问题。
## 作业仓库为什么八个多月没动了?
这一条是我在准备这篇时顺手查出来的,但它的实用价值可能是全文最高的一条。
作业代码仓库 (https://github.com/mihail911/modern-software-dev-assignments)的公开数据是这样的:
- 3819颗星、925个fork,热度确实很高
- 创建于2025年8月7日,最后一次代码推送是2025年11月10日
- Python项目,用Conda加Poetry管理,官方说明写的是Python 3.12
- 开着31个未关闭的issue
- 没有LICENSE文件
- 仓库描述里明确写着这是2025年秋那一期的作业
三个结论:
一,大纲和作业已经对不上了。课程描述换成了MCP、skills、规格驱动、循环工程、软件工厂,而作业还停在上一版的八周结构。你照着仓库跑,跑的是旧课。这不影响作业本身的价值(下面会说哪几个作业依然值得做),但你得知道自己在做的是什么。
二,没有LICENSE不等于随便用。公开可读和可再分发是两回事。缺少许可证的默认状态是“保留所有权利”,个人学习没问题,把它当成公司内训材料分发、或者把代码抄进商业项目,就得先问一句。这一点在源自大学的开源材料里非常常见,也非常容易被忽略。
三,31个未关闭的issue加上八个多月零推送,说明维护是停滞的。遇到环境问题别指望有人回你,Python 3.12加Poetry这套依赖,隔了大半年很可能已经装不动了。做心理准备:把环境跑起来这件事本身,可能就要吃掉你第一个晚上。
## 顺手给一套判断课程材料新鲜度的动作
这套动作对任何一份挂在GitHub上的教学材料都适用,花不到三分钟:
- 看最后一次推送时间,不是看星数。星数只反映它曾经火过,推送时间反映它现在还活着没有。一份三年前的高星仓库和一份上个月更新的低星仓库,后者对你更有用。
- 看未关闭issue里最新几条在问什么。如果全是“装不上依赖”,说明环境已经烂了;如果是内容层面的讨论,说明还有人在认真用。
- 看有没有LICENSE。决定你能用到什么程度。
- 把仓库描述和课程官网当前的描述对一遍。这一步最容易被跳过,也最容易发现问题——本文最重要的那个发现就是这么来的。
第四步值得单独强调。课程官网、作业仓库、社交媒体的宣传,这三处经常处在不同的时间线上,而大多数人只看其中一处就下结论。把它们对一遍,通常能省掉后面一整周的白工。
## 哪几讲值得花时间,哪几讲可以快进?
下面这张表是我最希望有人在开始之前递给我的。星级是我的判断,不是斯坦福的,理由在后面展开。
讲次 | 主题 | 判断 | 性价比最高的练习 | 2026年用什么工具做 |
1 | 大模型与提示词 | ★★☆ 必要地基,别恋战 | 同一提示词跑10次,量化输出方差 | 任意前沿模型API |
2 | Agent解剖与MCP | ★★★ 全课最该动手的作业 | 徒手写一个MCP服务端,不用框架不用脚手架 | MCP官方SDK |
3 | 上下文工程 | ★★★ ROI最高的一讲 | 写一页设计文档喂给Agent,和裸提示词跑同一任务做对照 | 项目规则文件 |
4 | Agent协作模式 | ★★★ 从写代码到管Agent的分水岭 | 用带检查点的方式指挥Agent交付一个真实功能 | 计划模式 |
5 | 现代终端 | ★☆☆ 终端老手直接跳(新版已删) | 不必做 | — |
6 | 测试与安全 | ★★★ 玩具和产品之间的闸门 | 对自己的仓库跑安全扫描,人工数真假阳性 | 静态扫描器加Agent复审 |
7 | 代码审查 | ★★☆ 和第6讲捆着学 | 对抗式审查一个AI写的PR,找出它自己没发现的3个问题 | 第二个Agent当评审 |
8 | 一句话建应用 | ★★☆ 好玩,但课在“差距”上(新版已删) | 生成一个应用,然后列出所有不能上生产的理由 | 任意应用生成器 |
9 | 部署后运维 | ★★☆ 读就行,除非运维是本职 | 用“Agent值班”的视角读SRE导论 | 纯阅读周 |
10 | 软件工程的未来 | ★☆☆ 播客级内容,通勤听 | 不必做 | — |
先看星级的分布形状。价值集中在第2到第4讲和第6到第7讲,也就是课程的中段;两头——开头的入门铺垫、结尾的趋势畅想——恰恰是自学者热情耗尽的地方,也恰恰是最可压缩的部分。
这个形状和新版大纲的改动方向是一致的:中段被保留和扩写,两头被删或者被压。两个独立来源指向同一个判断,这比任何单方面的推荐都可信。
## 第2讲那个作业为什么值得单独喊一声
徒手写一个MCP服务端——不套模板,也不让Agent帮你搭脚手架——是给Agent祛魅最快的路径。
亲手写完工具列表握手、亲眼看着模型(有时是错误地)决定调用你的哪个工具之后,整个Agent生态就不神秘了。协议本身的官方入门文档 (https://modelcontextprotocol.io/docs/getting-started/intro)并不长,一个晚上足够走完。
这个作业最大的副产品是它会永久改变你写工具描述的方式。在服务端那一侧亲眼确认过之后,你会开始把每一条description都当提示词来写——因为它就是提示词。这件事读一百篇文章都不如自己写一遍。
## 上下文工程那一讲为什么ROI最高?
只精读一讲的话,选这讲。它是“从编码Agent拿到稳定输出的人”和“每次都在抽奖的人”之间的分界线。
这一讲的阅读清单至今仍是这个主题下最好的一份选材,尤其是Drew Breunig那篇长上下文失效模式 (https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html)——它给你经历过却叫不出名字的故障逐个命了名。四种,各有各的相貌:
- 污染:一个幻觉或错误进了上下文,之后被反复引用。症状是你纠正过的东西卷土重来。
- 分心:上下文长到模型过度关注历史,反而忽略了训练里学到的东西。症状是它开始机械重复前面的模式。
- 混淆:上下文里多余的信息被模型拿去生成了低质量回答。症状是输出里混进了另一个模块的约定。
- 冲突:新累积进来的信息或工具,和已有内容互相矛盾。症状是在两个方案之间反复横跳。
能把这四种分开,你就有了一套诊断语言。没有诊断语言的时候,所有故障看起来都是“它今天有点笨”,而你唯一的动作就是重开一轮。
## 那个对照实验,一个下午就能跑完
配套练习强烈建议照做:从积压需求里挑一个真实功能,写一页设计文档(约束、非目标、相关文件、业务规则),让同一个Agent把任务跑两遍——一遍带文档,一遍裸提示词,然后diff两次输出。
这个实验的典型结果是:裸提示词那版会凭空发明一个数据模型,和两层目录之外的既有模型直接冲突;带文档那版不会。一个下午,这门课的中心论点就摆在你自己的终端里,不需要相信任何人。
如果你做完之后想往下挖,上下文工程的减法实战 (https://zhangwenbao.com/context-engineering-subtraction-practice.html)那篇是这一讲的延伸——里面有可复现的基准数字、四种失效模式的现场排查顺序,以及一套先卸载再摘要的阈值打法。课程讲的是这门学科存在,那篇讲的是它在2026年长成了什么样。
## 第4讲那条自主度光谱,比任何工具都活得久
第4讲的耐久内容只有一样:自主度光谱。它回答的是全行业都在绕圈的问题——给Agent多大自主权、检查点设在哪。
光谱给的答案不复杂:简单任务放手跑,中等任务能省八成时间但要人工收尾,复杂任务必须分段审查。真正难的不是记住这三档,而是判断手上这个任务属于哪一档。
我用下来最好使的判据是问一句:如果它做错了,我要花多久才能发现?五分钟内能发现的(跑不起来、测试红了),放手;要到下个迭代才发现的(数据写歪了、边界条件漏了),分段审查。这个判据比“任务复不复杂”准得多,因为复杂度是关于任务的,而可发现性是关于你的系统的——后者才是决定风险的那个变量。
这一讲的作业是全程指挥Agent、而不是亲手敲代码地交付一个完整项目,正好接在第3讲写的设计文档后面。两个作业是连着的,别拆开做。
## 安全那两讲里,有一组数字被传错了
第6和第7讲当一个整体学,它们合起来是全课最清醒的部分。而它们的核心阅读材料里,有一组数字在中文和英文世界都被反复传错,错得还挺严重。
流传的版本是:“Semgrep用编码Agent扫11个大型开源项目,Claude Code找出了46个真实漏洞,但误报率86%。”
翻Semgrep那篇原始实测 (https://semgrep.dev/blog/2025/finding-vulnerabilities-in-modern-web-apps-using-claude-code-and-openai-codex/)会发现,46这个数字的含义完全不是这样:
> Claude Code报告了46个漏洞,真阳性率14%、误报率86%。作为对照,Codex报告了21个,真阳性率18%、误报率82%。
也就是说,46是它报出来的条数,不是真实漏洞数。按14%的真阳性率算,真正成立的大约只有6条。原始说法把结论抬高了七倍多。
## 原文里还有几组更值得看的数字
被传丢的部分反而更有用:
- 两个Agent合计产出400多条安全发现,由Semgrep的安全研究团队逐条人工复核,其中约20个是高危漏洞。
- Claude Code最擅长的是越权访问(IDOR)类问题,真阳性率22%。
- 它最不擅长的是跨文件跨函数的污点追踪:SQL注入真阳性率只有5%,XSS只有16%。
- 实测用的是Claude Code v1.0.32配Sonnet 4、Codex v0.2.0配o4-mini——都是2025年的版本。
最后那条尤其重要。拿一年前的版本得出的结论,今天照抄是危险的;但反过来,说“现在的模型肯定好多了”同样没有证据。正确的姿势是把这组数字当成量级参考,然后在你自己的仓库上跑一遍拿到当下的数。
## 它到底告诉了我们什么
剥掉被夸大的部分,这组数据的真实含义反而更清晰,而且更有指导性:AI安全审查真实到值得用,又不可靠到绝不能当唯一闸门。
那个5%和16%的分布尤其值得琢磨。模型擅长的是单点能看出来的问题(越权访问基本上看一个接口就够了),不擅长的是要串起好几个文件才能确认的问题(污点从入口流到危险函数)。而后者恰恰是电商站最高发的那一类——用户提交的评论、问答、富文本,每一个都是跨越了好几层才落到渲染或者查询上。
把这一讲落到实处,我在Claude Code安全实战 (https://zhangwenbao.com/claude-code-security.html)里写过一整套可执行的配置:权限白名单、密钥外置、用生命周期钩子做硬闸。课程讲的是为什么,那篇讲的是怎么配。
## 怎么在自己仓库上测出当下的数
转述的百分比不值得信,你自己跑出来的值得。整个流程半天能走完:
- 挑一个你写过、但已经放了几周的仓库。放几周很关键——刚写完的代码你还记得所有假设,会不自觉地帮它辩护。
- 先跑一遍传统静态扫描器,把结果存下来当基线。不要先跑Agent,否则你的判断会被它的叙述带走。
- 再让Agent做一遍审查,要求它每条给出文件、行号和触发路径。没有触发路径的发现一律先标灰——这是筛掉大部分误报最省力的一道闸。
- 人工逐条判真假,记下总数和真阳性数。这一步不能外包,也不能跳。
- 按类型分组统计。你会发现自己的分布和公开实测未必一致,因为它取决于你的代码风格和技术栈。
第五步往往是最有价值的。公开实测告诉你这个工具的平均能力,只有你自己的数据能告诉你它在你的代码上是什么能力——而后者才是你要用来做决策的那个数。跑一次,你对“AI安全审查靠不靠谱”这个问题的答案就从别人的转述变成了自己的结论。
## 自学该走两周速通还是六周完整?
在校生用十周,是因为学期就是十周。你没有学期约束,也没有让慢节奏对学生生效的那两样东西——外部截止日期和成绩单。
所以路线只给两条,用一个问题分流:你用编码Agent交付过真实的东西吗?
— | 两周速通 | 六周完整 |
适合谁 | 已经每周指挥Agent干活 | 还没用Agent交付过真实的东西 |
前置 | 无 | 先花约1周跟上手型入门 |
第1到2讲 | 只扫阅读材料,半天 | 阅读加MCP服务端作业,3到4天 |
核心闭环 | 第3讲到第4讲到第6/7讲,三个连续练习块 | 同样三块,摊开到几周 |
项目 | 一个真实仓库,两个专注的周末 | 相同 |
后三讲 | 按兴趣选,可不做 | 选修一讲 |
核心闭环那一行是不许跳的:第3讲写设计文档做对照实验(一个晚上)→ 第4讲带检查点交付一个真实功能(两到三个晚上)→ 第6和7讲对自己的仓库做扫描加对抗式审查(一个晚上)。其余全部可选。
如果分流问题的答案是“还没有”,那就先别碰CS146S。先补那一周入门,再走六周路线进场。想找一条已经本土化过的上手路径,用Vibe Coding做SEO工具的8步实战 (https://zhangwenbao.com/vibe-coding-seo-tool-tutorial.html)是我为完全没交付过东西的人写的,做完一个能跑的小工具再回来,体感完全不同。
## 三种最常见的放弃姿势
路线本身不难,难的是走完。见过的放弃姿势基本是这三种,每一种都有对应的拆解办法:
第一种:从第1讲开始按顺序读,读到第3讲热情耗尽。这是最普遍的一种,因为前两讲的内容对有经验的人来说是复习,而复习是最消耗意志力的活动——你既学不到东西,又觉得跳过不踏实。办法很简单:直接从第3讲开始,把第1到2讲当成需要时再回头查的参考。
第二种:卡在环境上。作业仓库停更了大半年,依赖装不上是大概率事件。这时候人会误以为是自己的问题,然后花一个晚上和Poetry搏斗,第二天就不想打开电脑了。办法是:如果30分钟装不上,直接放弃跑官方作业,用你自己的项目做同样的练习。练习的价值在动作本身,不在那份代码。
第三种:只做输入不做输出。读完所有材料、收藏所有链接,然后什么都没变。这一种最隐蔽,因为过程中的感受一直很好。判据是:如果你这周没有产出一段自己跑过的diff,那这周你没在学这门课。
三种放弃姿势有个共同点——它们都发生在“动手”之前。课程设计者把八成分数压在期末项目上,本身就是对这件事的预判。
## 自学者反而占的一个便宜
在校生必须按当期指定的工具选型走,因为作业要对着规格评分。你可以自由替换——第4讲用你真实在用的Agent跑,第6讲的扫描直接指向你自己的代码库。
只要替换是有意识的,自学版CS146S比学分版更贴近你的工作。这也是为什么前面那条“作业仓库停更了”其实没那么致命:你本来就不该照着评分标准做作业,你该照着自己的项目做。
## Final Project占总评八成,自学者拿什么替代
一门课把分数排成期末项目八成、周作业一成半、课堂参与半成,等于明说它不相信“读”能产生这项能力。
这个设计我完全同意,所以话也说直白:十讲全读完但什么都没做,你没上过这门课,你只是读了一篇关于它的长文。
替代方案要和真项目同构——用一个仓库把整条管线走通。规格是这样的:
- 挑一个你真心希望它存在的东西。自学里稀缺的是动力,不是信息。这一条比后面四条加起来都重要。
- 生成任何代码之前先写设计文档:约束、非目标、相关文件、业务规则。对应第3讲。
- 用带显式检查点的方式指挥Agent构建,而不是一口气收下一个巨型diff。对应第4讲。
- 宣布完成之前先过闸门:安全扫描加对抗式Agent审查,修掉真问题。对应第6到7讲。
- 部署到带最低限度日志的环境。对应第8到9讲,降低深度即可。
整套流程两个专注的周末装得下。它把这门课从词汇表变成肌肉记忆,还会留给你任何阅读都给不了的东西:一份“我的Agent工作流在哪一步断掉”的具体记忆——你真正的学习发生在那里。
保哥自己做这个替代项目的时候选的是一个拖了很久没做的内部看板。第四步那道闸门当场就打了脸:对抗式审查扫出11条,3条是真的,其中一处未校验的重定向就在我记得当时“审过”的代码里。任何阅读材料的教育效果,都比不上发现自己亲手批准过的漏洞。
## 2026年该用什么工具做这些练习?
课程材料里的工具选型有一部分是2025年秋的快照,直接照抄会踩到已经变了的东西。给一份替换建议:
练习 | 课程原设定 | 2026年的做法 | 注意什么 |
提示词方差实验 | 任意前沿模型API | 不变 | 跑10次是下限,schema漂移经常要更多样本才看得出 |
徒手写MCP服务端 | MCP官方SDK | 不变,但用最新版SDK | 包名和传输方式在2026年上半年有过调整,别抄老教程 |
上下文对照实验 | 项目规则文件 | 不变 | 规则文件要短,长了会稀释你想验证的那条 |
带检查点交付功能 | 计划模式 | 加上循环护栏 | 迭代上限和掉沟检测,新版大纲把这块单列成了循环工程 |
安全扫描 | 静态扫描器加Agent复审 | 不变,但自己数真假阳性 | 别信任何转述的误报率,用你自己仓库的数 |
对抗式代码审查 | 第二个Agent当评审 | 换独立上下文的子代理 | 同一个窗口里自审等于自己给自己打分 |
最后一行值得多说一句。让同一个Agent在同一个会话里审查自己刚写的代码,它会带着写代码时的全部假设去审——那些假设恰恰是漏洞的来源。换一个独立上下文的子代理,是最低成本的“换个人看”。
想把整条工具链摸清楚再动手的,Claude Code从安装到工作流的完整指南 (https://zhangwenbao.com/claude-code-complete-guide.html)是一条更省事的路径,它讲的是主线骨架;CS146S讲的是骨架背后的判断依据。两个一起看,比只看其中一个划算得多。
## 这门课对不写代码的人有用吗?
这个问题问的人不少,值得单独答一段,因为答案是“有用,但要换一种读法”。
做SEO、做独立站运营、做内容的人,大多不会去徒手写MCP服务端,也不会关心Poetry怎么装。但这门课的中段——上下文工程、自主度光谱、审查闸门——讲的其实不是编程,是怎么和一个不太可靠但很能干的协作者一起干活。这件事和写不写代码没关系。
## 三条能直接搬走的原则
第一,先写规格再动手,这条在内容生产上比在编程上更成立。让Agent写一篇文章,直接给标题和裸提示词,它会给你一篇看起来很像那么回事、但每一段都是安全废话的东西。先写一页约束(读者是谁、不写什么、必须包含哪几个事实、语气边界),产出质量的差别是量级的。这就是第3讲那个对照实验,只是把代码换成了文章。
第二,检查点比自主度重要。自主度光谱那一讲的核心不是“该给多大权限”,而是“检查点设在哪”。批量改100篇文章的时候,正确的形状不是一口气跑完再看,而是跑3篇停下来验一次——因为前3篇里出现的系统性偏差,会在后97篇里原样复制。
第三,输出必须过闸门,而且闸门不能是它自己。第6到7讲讲的是安全扫描和对抗式审查,换到内容场景就是事实核查和第二双眼睛。让同一个Agent检查自己刚写的东西,它会带着写作时的全部假设去检查——那些假设恰恰是错误的来源。
这三条合起来,其实就是把软件工程里已经验证过几十年的东西,搬到一个新的协作对象身上。课程真正教的不是工具,是分工。而分工这件事,在哪个行业都通用。
## 这份手册的边界在哪儿?
三个诚实的限定,说清楚比藏着好。
第一,逐讲判断基于2025年秋的公开材料。新一期的具体周次安排、嘉宾阵容和作业还没公布。以往的模式看,工具选型那几讲大概率会换,两个核心模块大概率原样保留——但这是推测,不是事实。
第二,作业仓库的状态会变。我核对时它停在2025年11月10日、31个未关issue、无LICENSE。新学期开始前后很可能会有一次大更新,值得在开工前自己去看一眼最新推送时间。这类会过期的事实,最好养成核对而不是引用的习惯。
第三,这份手册刻意用深度换导航。每个核心讲值得的篇幅都远超“一句判断加一个练习”。用这一页决定把时间花在哪儿,用课程材料本身去把时间花掉。做AI相关的自养工具是同一个道理——我在Vibe Coding重塑SEO工作流 (https://zhangwenbao.com/vibe-coding-seo-competitive-advantage.html)那篇里反复强调过,工具清单救不了你,跑通一遍才行。
## 常见问题解答
## 斯坦福CS146S 2026年还开吗?
课程官网目前挂着新一期的课程描述,教室420-041、讲师答疑周五12:00到12:30这些信息都已经列出,两个助教位置还是待定状态。课程描述本身已经换代,核心主题变成了MCP、agent skills、规格驱动开发、循环工程和软件工厂。因为筹备还在进行中,具体的周次安排和嘉宾阵容大概率还会调整,别现在就把整个学期的计划排死。
## CS146S的课程材料是免费的吗,国内能访问吗?
官网、幻灯片、阅读清单和8周作业代码全部公开免费,官网和GitHub都能直接打开。拿不到的是嘉宾演讲的完整录像,散见于视频平台,需要自己解决网络条件。需要注意的是作业仓库没有LICENSE文件,缺少许可证的默认状态是保留所有权利——个人学习没问题,但当成公司内训材料分发或者把代码抄进商业项目之前,最好先确认一下。
## CS146S的作业仓库还能用吗?
能用,但要有心理准备。仓库有3819颗星、925个fork,热度很高;可是最后一次代码推送停在2025年11月10日,至今八个多月零提交,还开着31个未关闭的issue。它对应的是2025年秋那一版的八周结构,而课程描述已经换代,所以大纲和作业目前是对不上的。依赖用Conda加Poetry管理、Python 3.12,隔了大半年很可能已经装不动,把环境跑起来本身可能就要吃掉一个晚上。
## 只有一个周末,CS146S该学哪一讲?
第3讲上下文工程,并且必须做配套实验,不能只读。具体做法:从积压需求里挑一个真实功能,写一页设计文档(约束、非目标、相关文件、业务规则),让同一个Agent把任务跑两遍,一遍带文档一遍裸提示词,然后diff两次输出。典型结果是裸提示词那版会凭空发明一个和既有代码冲突的数据模型。一个下午,这门课的中心论点就摆在你自己的终端里。
## Semgrep用编码Agent找漏洞那组数据到底是多少?
流传最广的说法“Claude Code找出46个真实漏洞、误报率86%”是把结论抬高了七倍多。原文说的是Claude Code报告了46个漏洞,真阳性率14%、误报率86%,也就是真正成立的大约6条;Codex报告21个,真阳性率18%。两者合计400多条发现,人工复核后约20个是高危。分类型看,Claude Code在越权访问上真阳性率22%,但在需要跨文件跨函数污点追踪的类型上很弱——SQL注入只有5%、XSS只有16%。测试用的是2025年的版本。
## 没用过编码Agent,能直接学这门课吗?
不建议。官网写明的先修是CS111或CS161等价的编程经验,推荐修过CS221或CS229,课程默认你已经有基本的工具经验。如果你从来没有用编码Agent真正交付过一个东西,冷启动硬啃是收藏夹吃灰的标准路径。正确顺序是先花大约一周跟一个上手型入门,做出一个能跑的小东西,再走六周完整路线进场。
## 自学怎么替代占八成分数的期末项目?
用一个真实仓库把整条管线走通,五步:挑一个你真心希望它存在的东西;生成任何代码之前先写设计文档,包含约束、非目标、相关文件和业务规则;用带显式检查点的方式指挥Agent构建,而不是一口气收下巨型diff;宣布完成之前先过闸门,做安全扫描加对抗式Agent审查并修掉真问题;最后部署到一个带最低限度日志的环境。两个专注的周末装得下,它会留给你一份“我的工作流在哪一步断掉”的具体记忆。
## 权威参考资料
## Claude Code截图MCP怎么配?四种读页面方式的token账与调试循环
- URL:https://zhangwenbao.com/claude-code-screenshot-mcp-frontend-debug.html
- 分类:AI编程与工具链
- 发布:2026-07-23 | 更新:2026-07-30
- 摘要:让Claude Code看页面有四种办法,成本差两个数量级。本文算清每种办法各自能回答什么、要花多少,讲透长页面截图为什么是陷阱,并给出可直接照抄的截图封顶配置与安全参数。
- 关键词:MCP,Claude Code,Token优化,浏览器自动化,前端调试
> **TLDR**:摘要:让模型看页面有四条路——无障碍快照、视口截图、整页截图、定向脚本,成本能差出两个数量级。快照适合驱动页面,调CSS和布局却几乎答不上来;整页截图看着最便宜,是因为它已经被压成一条纸带。2026年还多了一层变化:Claude 4.7及之后的模型走高分辨率档,同一张图的视觉token最多翻三倍,截图省钱这个前提被削掉了一半。这篇把四条路的账重新算一遍,给出可以自己套的视觉token公式、两个浏览器MCP的官方装法与裁剪开关,以及一套先问数字、最后才看像素的调试循环。
> 摘要:让模型看页面有四条路——无障碍快照、视口截图、整页截图、定向脚本,成本能差出两个数量级。快照适合驱动页面,调CSS和布局却几乎答不上来;整页截图看着最便宜,是因为它已经被压成一条纸带。2026年还多了一层变化:Claude 4.7及之后的模型走高分辨率档,同一张图的视觉token最多翻三倍,截图省钱这个前提被削掉了一半。这篇把四条路的账重新算一遍,给出可以自己套的视觉token公式、两个浏览器MCP的官方装法与裁剪开关,以及一套先问数字、最后才看像素的调试循环。
移动端流量占比长期趴在8%上下,这个数字在一个技术向站点里不算离谱,于是它在数据面板里躺了大半年没人动。真去查的那天,事情反而简单得让人生气:一段十几行的脚本,回来一个79 token的结果,直接点名了肇事者——390px的视口里塞着一个427px宽的表格,外加三十多个小于44px的点击目标。
但这不是过程的开头。开头是老老实实照着工具说明先跑了一次无障碍快照,烧掉一万多token,关于这个bug一个字也没学到。原因说破了很朴素:无障碍树里根本没有“宽度”这个概念,它描述的是结构与可操作性,不是像素。
这篇就是那趟弯路的复盘。它要回答的问题很窄:当你让Claude Code去看一个页面,你到底在为什么付钱,以及怎么才能少付一点。
先立个版本锚点,免得数字被当成常量:chrome-devtools-mcp当前是1.6.0,2026年7月14日发布;Playwright MCP当前是0.0.78。前者从5月底的1.1.1到7月中的1.6.0,六周走了六个版本;后者做了一年多还停在0.0.x。工具面在动,所以下面所有数字看的是量级关系。
## 让模型“看”一个页面,到底有几种办法?
拿同一个URL在同一个视口下把四种方式各跑一遍,把结果落到磁盘再量,能得到一张分化极大的表。注意最后一列——它比token数更重要。
方式 | 量级 | 它真正能回答什么 |
无障碍快照 | 一万token级 | 页面结构、有哪些元素可点可填。样式一概不知 |
视口截图 | 两千token级 | 长什么样、有没有明显错位。读不出精确值 |
整页截图 | 几百token级 | 长页面上基本什么也答不了,下文单开一节 |
定向脚本 | 几十token级 | 你问的那几个数,一个不多 |
这四条路不是替代关系,是分工。真正的浪费不在于用了贵的那条,而在于用贵的那条去回答它答不了的问题——花一万多token买回一句“页面结构看起来正常”,钱花了,问题还在原地。所以下面每一节都先讲这条路能回答什么,再讲它花多少。
## 无障碍快照贵在哪
快照的成本跟页面复杂度正相关。它要把可访问性树摊平成文本,每个可交互元素带上角色、名称和一个唯一标识。一篇长文章、一个商品列表页、一个后台表格,节点数轻轻松松上千,摊开就是上万token。
贵得有道理。快照给每个元素分配的那个uid,是后续点击和填写能够寻址的唯一凭据。没有它,模型面对的就是一堆无法指认的像素。Playwright MCP自己的截图工具里甚至写着一句警告:你不能基于截图执行操作,要操作请回去拿快照。
## 截图能回答什么,不能回答什么
截图擅长的是“看起来对不对”这一类判断:字体渲染有没有崩、两块内容有没有压在一起、层级扫一眼清不清楚。这些问题没有任何脚本能替代,因为它们的判据本身就在视觉里。
截图不擅长的是给数字。你能看出“有东西太宽了”,但你没法从一张图片里读出427px。想让模型基于截图去推断具体尺寸,等于让它拿肉眼估长度,然后你再拿这个估值去改CSS——错误会从第一步就开始累积。
## 定向脚本为什么最便宜
因为它把“提问”和“取值”合并成了一件事。你不是先把整个页面搬进上下文再让模型从里面找答案,而是直接在页面里跑一段只返回答案的代码。
() => {
const de = document.documentElement;
const wide = [];
document.querySelectorAll('pre,table,img,iframe').forEach(el => {
const r = el.getBoundingClientRect();
if (r.width > de.clientWidth + 1) wide.push({ tag: el.tagName, w: Math.round(r.width) });
});
return { viewport: de.clientWidth, overflow: de.scrollWidth > de.clientWidth, wide };
}
回来的是一个几十字符的对象,把视口宽度、有没有横向溢出、以及具体哪个标签宽多少一次性说清。谷歌给这个服务写的设计原则里有一句更抽象的表述:返回语义摘要,一句“LCP是3.2秒”好过五万行JSON。定向脚本就是把这条原则用到了布局上。
这里面藏着一个更值得记住的判断:成本不取决于页面有多大,取决于你把多少东西搬进了上下文。同一个商品详情页,快照要一万多,脚本要几十,页面本身没有任何变化。差的是你有没有先把问题想清楚。这也解释了为什么“先问一个具体问题”这件事在人机协作里的收益,比在纯人工排查里高得多——人翻页面是免费的,模型不是。
代价当然也有。定向脚本要求你会写一点DOM查询,也要求你对页面结构有基本假设。好在这两样都不需要多深,上面那段代码几乎是通用模板,换个选择器就能问别的问题。真正的门槛不在语法,在于愿意先停下来把“我到底想知道什么”写成一句话。
## 官方都说优先用快照,为什么调前端时不该听?
两家官方在这件事上口径一致。Chrome DevTools MCP把它写进工具说明,Playwright MCP把它当设计目标写进README,说的都是优先用结构化快照,绕开对截图和视觉模型的依赖。
他们没说错。他们回答的是另一个问题。
“优先用快照”这条规则服务的是驱动页面:填表单、走结账流程、点开某个折叠面板、跑一遍注册链路。这类任务的核心诉求是可寻址性,快照是唯一能提供它的东西,多花的token换来的是动作能落地。
前端调试不是驱动页面。当你问“这个表格在手机上为什么撑破了”,你要的是一组数:元素宽度、容器宽度、计算出来的max-width、父级有没有overflow。快照一个都没有,截图也没有。两个默认选项都在做同一件事——把整页倾倒进上下文——而对这类任务,倾倒本身就是错的。
把这条分界线记成一句话可能更好用:要动它,用快照;要量它,用脚本;要看它,才用截图。这三件事在工具面上长得很像,在成本上差两个数量级。
## 整页截图便宜得可疑,这笔账到底该怎么算?
回头看上面那张表,整页截图是最便宜的图片。这个便宜是假的,而且它的失败方式非常安静,值得单独拆开。
## 视觉token到底怎么算出来的
Claude看图不是按像素,是按块。官方视觉文档给出的公式 (https://platform.claude.com/docs/en/docs/build-with-claude/vision)是:图片被切成28×28像素的方块,每一块算一个视觉token,所以一张图的成本是宽除以28向上取整,乘以高除以28向上取整。
这个公式很值钱,因为它让截图成本从玄学变成了算术。你可以在按下截图之前就知道这一下要花多少,而不是事后看账单猜。
## 高分辨率档把这笔账改了多少
这里是2026年最容易踩空的一处。很多讲截图省token的资料还停在“长边超过1568像素会被等比缩小”这一条上,那是标准档的规则。官方文档现在写的是两档:
分辨率档 | 适用模型 | 最长边 | 视觉token上限 |
高分辨率档 | Claude 4.7及之后的模型 | 2576 px | 4784 |
标准档 | 其余模型 | 1568 px | 1568 |
高分辨率是这些模型上的自动行为,不需要beta头,也没有客户端开关可关。官方原话是,高分辨率图片消耗的视觉token可能达到同一张图在标准档下的大约三倍。同一份文档给的对照表,把这个差距摊得很清楚:
原始尺寸 | 标准档缩到 | 标准档token | 高分辨率档缩到 | 高分辨率档token |
1000×1000 | 不缩 | 1296 | 不缩 | 1296 |
1920×1080 | 1456×819 | 1560 | 不缩 | 2691 |
2000×1500 | 1269×952 | 1564 | 不缩 | 3888 |
3840×2160 | 1456×819 | 1560 | 2576×1449 | 4784 |
规律一眼就出来了:图越大,高分辨率档的惩罚越重。1920×1080差1.7倍,4K直接差3.1倍。标准档因为封顶在1568 token,图再大成本也不涨;高分辨率档把天花板抬到4784,于是大图真的会把这个额度吃满。
顺着这条规律推一步,结论有点反直觉:过去那条“截图比快照便宜”的经验,正在被模型自己的升级慢慢磨掉。快照的成本跟着页面复杂度走,没变;截图的成本跟着分辨率走,涨了。两条曲线在靠近。而定向脚本那几十个token,跟这两件事都无关——它是唯一不受这次变化影响的选项。
## 长页面的正确截法
现在回到整页截图。一篇长文章截下来是2544×27358这个量级。套公式:标准档按最长边压到1568,宽度只剩146像素;高分辨率档压到2576,宽度是240像素。
两个数都是一条纸带。它便宜是因为它已经被毁掉了——模型收到一个看不清的东西,不会报错,然后自信地告诉你页面看着挺正常。更荒谬的是在高分辨率档下,你还要为这条更宽一点的纸带多付两倍半的钱。
长页面的正确做法有三条,按优先级排:能用脚本回答的先用脚本;需要看的地方滚到那个位置截一张视口图;只关心某个组件就传它的uid只截那一块。别在文章级长页面上用整页截图,然后以为自己看过了。
## 两个浏览器MCP怎么装,各自什么时候上?
两个都值得装。与其说它们是竞品,不如说是两种不同的仪器——一台示波器和一台游标卡尺,你不会问哪个更好。
## Chrome DevTools MCP
谷歌出品,当前1.6.0,仓库 (https://github.com/ChromeDevTools/chrome-devtools-mcp)拿到4.78万星、3200多个fork。工具面按官方README的分类是9组共52个:输入自动化10个、导航6个、模拟2个、性能3个、网络2个、调试8个、内存12个、扩展5个、第三方2个,另加2个WebMCP工具。
claude mcp add chrome-devtools --scope user npx chrome-devtools-mcp@latest
需要Lighthouse跑分、带LCP与INP洞察的性能追踪、堆快照排内存泄漏、调浏览器扩展的时候用它。内存那一组独占12个工具,这个配比本身就说明了它的定位。
## Playwright MCP
微软出品 (https://github.com/microsoft/playwright-mcp),当前0.0.78,需要Node 18及以上。
claude mcp add playwright npx @playwright/mcp@latest
需要Firefox或WebKit这类非Chrome内核、要填复杂表单、要控制Cookie和存储、要写测试断言的时候用它。如果报浏览器缺失,补一条npx playwright install chromium。装完两个都用/mcp验一眼。
两条命令里的--scope user值得多看一眼。官方MCP文档 (https://code.claude.com/docs/en/mcp)把作用域分成三档:不写就是当前项目私有,写user是跨所有项目生效,还有一档是写进项目配置文件跟着仓库走给团队共用。浏览器这类工具属于个人调试习惯,装user档最省事,否则每换一个仓库就要重装一遍。
## 三个会白白花掉你时间的坑
写文件的路径不是随便给的。很多人第一次传一个临时目录的绝对路径进去,直接被拒。真实机制比“只能写工作区”更精确:当MCP客户端没有协商roots能力时,写文件的工具默认被限制在操作系统临时目录;客户端协商了roots,就以那些根目录为准。官方留了一个--allowUnrestrictedPaths开关来关掉这层限制,但它明确标注只在连接可信本地客户端时用。
缩窗口不等于模拟手机。把窗口拉到390×844,然后让页面自报宽度,回来的很可能是一千多——有头Chrome的窗口有最小尺寸,而缩窗口缩的是窗口,不是视口。要真机尺寸得走设备模拟:
emulate(viewport: "390x844x3,mobile,touch")
之后页面才会报390,溢出bug才会浮出来。移动端能不能查出东西,几乎全押在这一个区别上。
有头浏览器会抢焦点。在macOS上,每一条调试协议命令——哪怕是只读的列页面、截图——都会把浏览器拽到你编辑器前面。除非你确实要盯着屏幕看,否则加--headless跑。
无头模式下视口是有天花板的。官方给--viewport参数标了一句容易漏掉的说明:无头模式下最大尺寸是3840×2160。平时用不到,但当你想一次性截一张超宽的仪表盘、或者模拟某台大屏设备时,会撞上这条限制而且不一定有明确报错。真要那么宽,拆成几张视口图更稳。
## 一张截图凭什么能废掉整个会话?
这是最值得提前防的失败模式,因为它的后果不是“变慢”,是“直接终结”。
官方对图片有两道硬限制:单张图片任一边不得超过8000像素;而当一次请求里的图片超过20张时,会触发更严格的单图尺寸限制,官方给的稳妥做法是把每张图的每一边压到2000像素以内。踩过去会拿到一个400错误,明确告诉你某张图片的尺寸超了上限。
残忍的地方在于,那张超限图片已经进了对话历史。之后每一次请求都会带着它重发一遍,于是每一次都以同样的方式失败。这不是一个可以重试解决的错误,它是一次不可逆的污染。而且写文件也不一定能救——如果客户端后来试图把这个文件加载进上下文窗口,问题原样复现。
更麻烦的是,文本类MCP服务普遍有的那个逃生舱——限制单次结果字符数的注解——对返回图片的工具明确无效。官方文档把这句话写了两遍。换句话说,别指望有一个通用开关能替你兜底。
真正管用的是在源头把图压住。从1.3.0起,Chrome DevTools MCP提供了一组截图参数,长短横线两种写法都认:
{
"mcpServers": {
"chrome-devtools": {
"command": "npx",
"args": [
"-y", "chrome-devtools-mcp@latest",
"--screenshot-format=jpeg",
"--screenshot-quality=70",
"--screenshot-max-width=1456",
"--screenshot-max-height=819"
]
}
}
}
这里的两个尺寸不是随手填的。1456×819套一遍公式是52×30,正好1560个视觉token,而且因为它没超过任何一档的上限,标准档和高分辨率档拿到的是同一个数——你等于给截图成本上了一道确定性的封顶。格式换成JPEG或WebP还能再省,官方说这两种格式比PNG小三到五倍,质量参数是可选的第二把刀。
要提醒一句:这个上限是每次调用级别的。它能防住下一次事故,防不了已经躺在历史里的那张超限图。撞上之后就重开会话,目前没有更漂亮的解法。
## 常驻一个浏览器MCP,你在为它付什么?
有一个反对意见必须诚实摆出来:一个常驻的MCP服务,不管你用不用,每次请求都在吃工具schema的token。52个工具的描述加参数定义不是小数目,而其中至少12个内存调试工具,你可能一年也用不上一次。
很多讨论到这一步就停在“所以别常驻,改用命令行形态的技能”。这个结论方向没错,但它跳过了一层:官方其实已经把裁剪开关做好了,只是没人读到那一节。
- --slim:只暴露3个工具,覆盖导航、执行脚本和截图。名字听着朴素,但它恰好就是本文这套调试循环需要的全部。
- --category-performance=false、--category-network=false、--category-emulation=false:按类关掉整组工具,精确到你今天到底要干什么。
- --memory-debugging与--category-extensions默认就是关的,内存那12个工具其实不在默认工具面里——这也说明维护者自己清楚schema预算是有代价的。
所以更准确的说法不是“MCP太贵所以别用”,而是你为多少工具付费,是一个可以调的参数,而绝大多数人从来没调过。保哥自己的用法是调试期开完整工具面,跑批量任务时切--slim,两套配置各存一份。至于什么时候该把整件事交给命令行技能而不是MCP,那是另一层取舍,之前在MCP、Skills、Hooks三大扩展机制怎么选 (https://zhangwenbao.com/mcp-vs-skills-claude-code.html)里按机制拆过一遍。
## 让模型碰浏览器,安全边界画在哪?
浏览器是一个特别危险的输入源,因为页面内容是别人写的。一个能读页面又能执行脚本的代理,一旦读到藏在页面里的指令,就有被牵着走的可能。这不是理论风险,是浏览器自动化这类工具的结构性风险面。
好消息是防护手段同样在参数里,而且比大多数人以为的细:
开关 | 它拦住什么 |
--allowed-url-pattern | 只允许访问白名单内的地址,其余连接直接断开。需要Chrome 149及以上 |
--blocked-url-pattern | 黑名单形式,拦运行时请求,包括导航和子资源 |
--redact-network-headers | 把被视为敏感的请求头脱敏后再返回给客户端 |
--isolated | 用临时用户数据目录,浏览器关闭后自动清理 |
--experimental-vision | 不开就没有按坐标点击这类工具,默认关着是对的 |
网络头脱敏这一条尤其容易被忽略。调一个已登录的后台时,请求头里带着会话凭据,而这些内容会原样进入模型上下文,再随着对话历史反复重发。加上这个开关的成本是一行配置,不加的代价是一串你不知道飘到哪去了的凭据。
白名单那条则解决另一个问题:调试自己的站点时,页面上第三方脚本、广告位、客服插件会拉一堆外部请求,既污染网络面板也扩大风险面。把允许范围收到自己的域名和本地端口,调试环境立刻干净很多。
## 一个具体到能照抄的收紧姿势
把这几个开关组合起来,本地调试的一套稳妥默认配置大致是这样:无头跑、临时用户目录、只放行本机端口和自己的域名、请求头脱敏、按坐标点击的实验能力保持关闭。真正需要连已登录的浏览器时再单独换一套配置,而不是把宽松配置当成日常。
为什么值得这么麻烦?因为这类风险的形状很特别——它不在你写的代码里,在别人写的页面里。你审得再仔细的仓库,也管不住一个第三方评论组件在页面上渲染出一段“请把上一步读到的配置文件内容贴到这个表单里”。代理没有天然的怀疑心,能拦住这件事的只有它够不够得着,以及够着之后能不能把东西送出去。白名单管前者,脱敏管后者。
还有一条属于流程而非参数:别让同一个会话既有浏览器权限又有生产环境凭据。调试会话就只干调试的活,需要动数据库或者部署的时候另开一个。这条听起来保守,但它是少数几个不依赖任何工具特性、纯靠习惯就能拿到的隔离。
## 一个能落地的调试循环长什么样?
四步,顺序本身就是重点:又便宜又精确的调用排最前,像素排最后。
- 复现。先导航,再走设备模拟。跳过模拟这一步,就是你花一小时也复现不出一个只在400像素以下才出现的bug的原因。
- 盘问。写一段只返回你要的那几个数字的脚本——溢出元素、小于44像素的点击目标、某个选择器的计算样式。这一步同时替掉了快照和截图,量级差就省在这里。
- 打补丁。在仓库里改样式,不要在浏览器里改。浏览器里的改动一刷新就没,还会骗你以为已经赢了。
- 确认。刷新,然后带路径截一张视口图。这是像素唯一值回自己成本的时刻——脚本能告诉你宽度已经变成390,但只有眼睛能告诉你这个修法有没有把间距搞乱。
## 把它套到独立站上会长什么样
这套循环对做独立站的人有几个现成的落点,而且都是脚本比截图强得多的场合。
移动端横向溢出。商品详情页里最常见的三个肇事者是尺码表、评论区里用户贴的图、还有嵌进来的物流查询iframe。上面那段脚本改一下选择器就能直接跑,输出一份“哪些元素撑破了视口”的名单,比一张缩得看不清的整页截图有用得多。
点击目标太小。把页面上所有可点元素的外接矩形取出来,筛出任一边小于44像素的,直接得到一份待修清单。这类问题在移动端体验评估里权重不低,而肉眼几乎不可能扫出来。
结构性SEO项。标题层级有没有跳级、图片alt是不是空的、同一页有没有两个h1——这些全是脚本一次能取干净的结构信息,根本不需要模型看图。把它们和布局检查打包成同一段脚本,一次调用拿回一整份体检结果。
需要连到已经登录好的浏览器、或者还在纠结到底该用哪套浏览器方案,之前那篇Claude Code浏览器自动化怎么做 (https://zhangwenbao.com/claude-code-browser-automation.html)把选型和登录态这两件事讲透了,这里就不重复。
## 性能数据该怎么取才不烧钱
性能是个有意思的反例:这一类问题恰恰不该用脚本硬凑,因为专门的工具已经把语义摘要做好了。Chrome DevTools MCP的性能追踪会直接吐出带洞察的结论,而不是把几万行原始追踪数据丢给你。这就是前面那条设计原则的另一面——能拿到结论就别拿原始数据。
但有两类数值仍然值得用脚本自己取。一类是你关心的自定义时间点,比如商品主图开始渲染到骨架屏消失之间的间隔,这种业务语义没有任何通用工具知道。另一类是要跨多个页面横向比较的同一个指标,脚本能保证每次取的是同一个口径,而报告工具版本一升级就可能悄悄换了算法。
还有一个成本细节容易被忽略:性能追踪本身也要花token,而且返回的内容比一次视口截图多得多。所以合理的顺序是先用脚本确认问题确实存在、并缩小到某个页面的某个阶段,再对那一个页面开一次完整追踪。上来就对着十个页面各跑一遍完整跑分,是这套工具链里最容易烧钱的用法之一。
## 这套方法的边界在哪
定向脚本有个隐含前提:你已经知道该问什么。面对一个从没见过的页面,你既没有选择器也没有假设,先花一次快照或截图建立心智模型是完全值得的。规矩是建立坐标系之后停止倾倒整页,不是一开始就停。
还有一类问题天生是视觉的。字体渲染对不对、有没有互相压盖、深色模式下对比度够不够——没有脚本能回答。判据很简单:如果你的问题里带着“看起来”三个字,就去截图。
最后一条边界跟额度有关。这套循环省下来的是单次调用的token,但一个长调试会话的总消耗仍然可观,尤其在高分辨率档下每一张确认截图都比过去贵。要是你经常在窗口末尾被限流打断,那问题多半不在截图上,额度是怎么算的、撞墙当下该怎么办 (https://zhangwenbao.com/claude-rate-limits.html)是另一套需要单独理清的账。
## 说到底,这件事的重点不是省钱
把整篇压成一句话:别再让浏览器描述整个页面。快照和截图之争掩盖了一个共同点——两者都是整页倾倒,而对CSS和布局这类活,两者都是错的默认选项。问一个具体问题,拿回具体数字,只在最后用一张截图让眼睛确认一遍。
省下来的token只是顺带的收益。真正变化的是排查的质量:一万多token换回“页面结构看起来正常”,和几十个token换回“这个表格427像素宽”,前者你还得再猜一轮,后者可以直接动手改。保哥在自己站上跑这套流程最深的体会是,工具选型的分歧往往掩盖了一个更朴素的问题——很多人根本没先想清楚要问什么,于是只好把整页搬过去让模型替自己想。
如果你是刚把Claude Code接进日常工作流,浏览器这一块建议放到后面再碰,先把项目记忆、权限和验证循环这条主线走通,从安装到工作流的整条主线 (https://zhangwenbao.com/claude-code-complete-guide.html)那篇按顺序串过一遍,浏览器只是其中一个可选分支,不是起点。
## 常见问题解答
问:Chrome DevTools MCP和Playwright MCP只装一个行不行?
行,但要按主要场景选。跑性能、查内存、要Lighthouse报告就留Chrome DevTools MCP;要跨浏览器内核、写测试断言、控Cookie和存储就留Playwright MCP。两个都装的额外成本主要是工具schema,用上面的裁剪开关能压掉大半。
问:视觉token到底怎么手算?
宽度除以28向上取整,乘以高度除以28向上取整。比如1456×819就是52×30等于1560。图片若超过所在分辨率档的最长边或token上限会先被等比缩小,再按缩小后的尺寸算。
问:我用的模型走的是哪一档分辨率?
Claude 4.7及之后的模型自动走高分辨率档,最长边2576像素、视觉token上限4784;更早的模型走标准档,对应1568和1568。这是自动行为,没有开关可以手动切换,只能靠在客户端把图先压小来控制成本。
问:为什么整页截图返回的token数反而最小?
因为它被压扁了。一张两万多像素高的图按最长边缩到2576之后,宽度只剩两百多像素,块数自然少。省下来的不是成本,是信息——模型拿到的是一条读不出任何东西的纸带。
问:会话被超限图片污染之后还能救吗?
目前没有干净的解法,只能重开会话。因为那张图已经在对话历史里,之后每次请求都会重发并再次触发同样的错误。事前用截图尺寸参数封顶是唯一有效的预防手段。
问:为什么把窗口缩到手机尺寸查不出移动端的问题?
因为缩窗口缩的是窗口,不是视口,有头浏览器还有最小窗口尺寸兜着。必须走设备模拟,把视口宽度、缩放倍率、是否移动端、是否支持触摸一起设进去,页面才会按真机条件重新布局。这一步跳过去,后面所有测量都是在测一个不存在的场景。
问:这套做法能不能固化下来重复用?
可以,而且值得。把常用的几段查询——横向溢出、点击目标尺寸、标题层级、图片alt缺失——写成固定模板存起来,每次只改选择器和网址。真正需要模型现场发挥的部分其实很少,大多数排查用的是同一批问题的不同组合。
问:把浏览器MCP一直挂着有什么代价?
每次请求都要带上全部工具的schema。用--slim收到3个工具,或者用分类开关关掉性能、网络、模拟这些今天用不到的组,都能显著压低这笔常驻开销。
## 权威参考资料
## 循环工程给AI Agent装上刹车之后,那张跑了一整夜的账单才真正消失
- URL:https://zhangwenbao.com/agent-loop-engineering-guardrails.html
- 分类:AI编程与工具链
- 发布:2026-07-20 | 更新:2026-07-30
- 摘要:循环工程怎么落地?这篇拆解自主AI Agent的四类护栏与真实阈值常量:上下文保洁、四道刹车、独立评审与幂等写操作,并讲清内循环交给Agent、外循环由人拿着的问责边界。
- 关键词:AI Agent,上下文工程,Agent开发
> **TLDR**:摘要:自主Agent烧钱不是因为模型不够聪明,而是因为循环里那一步“观察”在说假话。护栏有四类——上下文保洁、四道刹车、独立评审、幂等写操作——它们不是并列的四件事,而是同时在保同一件事:让Agent看到的反馈可信。这篇把每一类拆到可以照抄的判据上,给出社区实现里真实生效的阈值常量、Codex把预算耗尽做成软停的设计,以及2026年7月中旬刚刚补上的那一环——内循环可以交给Agent,外循环必须留在人手里。
> 摘要:自主Agent烧钱不是因为模型不够聪明,而是因为循环里那一步“观察”在说假话。护栏有四类——上下文保洁、四道刹车、独立评审、幂等写操作——它们不是并列的四件事,而是同时在保同一件事:让Agent看到的反馈可信。这篇把每一类拆到可以照抄的判据上,给出社区实现里真实生效的阈值常量、Codex把预算耗尽做成软停的设计,以及2026年7月中旬刚刚补上的那一环——内循环可以交给Agent,外循环必须留在人手里。
有一条止损线被写死在一个494星的开源脚本里:同一条命令连续失败三次,或者同一个文件在十分钟之内被改写五次,就判定这个Agent已经掉进沟里,当场停机,等人来看。
这不是谁在会议室里推演出来的规则。它是被烧过之后刻回代码里的疤。写下这两个数字的人,一定亲眼看过一个循环在无人值守的夜里,一遍又一遍地把同一个文件改成两种互相矛盾的样子。
2026年上半年,这类疤痕开始有了统一的名字:循环工程。它管的不是模型答得好不好,而是那个驱动模型反复动手的外层循环——什么时候该给记忆瘦身,什么时候该急刹,谁有权说这活没干完,哪些操作被重跑第二遍也不会出事。
这篇文章的核心判断,和市面上大部分“Agent护栏清单”不太一样:四类护栏不是并列的四件事,它们全都在服务同一个目标——让循环里“观察”这一步说的是真话。上下文保洁保证观察没被陈年噪音污染,独立评审保证观察不是自己给自己打分,幂等保证重试不会偷偷改掉被观察的对象,刹车保证观察一旦失效循环会停。想清楚这条主线,装护栏就不再是照单抓药。
## 循环工程到底在给什么东西上锁?
先把这个词的来历说清楚,因为它年轻到还带着水汽。2026年6月,Google的Addy Osmani写了一篇文章,给这门一直在做却没名字的手艺定了名;同月16日,LangChain把它形式化成了几层互相嵌套的循环。前沿实践者和框架厂商在同一个月里各自命名同一样东西,玄学变成学科通常就长这样。
它在技术栈里的位置很好摆。提示词工程管你发出去的那几句话,上下文工程管模型在某一次调用里看见的每一个词元,harness工程管环境——它能碰哪些工具、哪些文件、哪些连接器。循环工程管的是把这一切驱动向目标的那个迭代过程,一层包住一层,谁也不取代谁。
## 为什么最外面这一层反而最难被抄走
把四层排成一列会看出一个规律:越靠里的层,越依赖某一个具体模型;越靠外的层,越跟模型无关。一句调教了半年的提示词,换一代模型可能就得重写;而一套压缩策略、四道刹车、生产者与检查者的分离,明天把底层模型整个换掉,每一条照样成立。
这就是循环工程被当成护城河的原因。模型质量在收敛,也可以租;任何人今晚就能调你在调的那个接口。但外层这些工程积累是造出来的,不是租来的,竞争对手升级模型也搬不走。开头那个84%的收益也是同一课——它来自循环层的一次改动,模型一个权重都没动。
反过来说,这也意味着你在循环层踩过的坑,别人不会替你踩。厂商发布会不会讲你的写操作重试了几次,也不会告诉你上下文该在几成的位置压缩。这些数字只能自己量。
## 把外壳剥掉,所有自主Agent都是同一个形状
接一个目标,推理下一步,执行动作,观察真实结果,判断差距,决定继续还是停。经典形式化叫ReAct,想一步、做一步、看一步,反思型变体在末尾再加一次自我批评。
这段描述里真正承重的词是“观察”。Agent之所以能比单次生成强,不是因为它想得更久,而是因为每一步都在回应上一步动作的真实反馈。跑一次测试、读一段报错、看一眼返回码,这些外部事实把它从自由联想里拽回来。
纠错机制会复利。一个能跑测试、读失败、再试一次的循环,五十步能啃下单次生成永远解不开的问题。但这条复利有个前提,而整篇文章都在撬这条缝:纠错只在观察可信时成立。绿色的测试是可信信号,“代码现在看起来好多了”不是。
## Ralph循环为什么故意每轮把上下文扔掉?
要理解护栏,先看一种把循环推到极端的玩法。Geoffrey Huntley在2025年中提出了Ralph循环,名字取自《辛普森一家》里那个憨厚执着的小孩,自嘲意味拉满。
做法反直觉到让人皱眉:不维护长对话。编码Agent跑在一个纯粹的bash循环里,每一轮读同一份提示词文件,挑一个任务做完,然后把这个Agent杀掉,开一个全新实例,清空上下文,再喂一遍一模一样的提示词。
让人本能抗拒的那一步,恰恰是它跑得通的原因。进度不存在模型的上下文窗口里,而存在文件和git历史里。第七轮把窗口填满了?第八轮是一个全新的脑子,读一遍仓库当前状态、读一遍规格文件、读一遍进度日志,接着干。上下文腐烂没机会累积,因为没有任何一段对话被允许变长。
Huntley用这套办法造出过一门完整的编程语言,带编译器、标准库和两种执行模式,API账单大约297美元,时薪十美元量级 (https://www.theregister.com/2026/01/27/ralph_wiggum_claude_loops/)。这个数字在从业者圈子里被反复引用,因为它相对一门语言本该消耗的工程师工时,低得不像话。
但请把注意力放在那个案例里最容易被忽略的部件上:编译器。它对着测试程序,要么产出正确结果,要么不产出。完成信号机器可验证,而且每一轮验证都免费。这不是幸运的细节,这是整套把戏的前提。把同一台机器指向一件没有可验证终点线的活,你搭出来的只是一台按小时计费的花钱机器。
## 这套玩法把你的岗位职责挪了个位置
Ralph模式下,你基本不写代码,甚至不太写提示词。你写的是规格、任务拆分和检查。原本泡在交互式会话里的每一个小时,都改花在把规格磨锋利、把验证做到骗不过去上。
原因很朴素:一个每轮清空上下文的Agent不记得你的任何意图,它只认写下来的东西。规格含糊进去,四十轮自信的废话出来。这也是为什么参考实现都强调任务粒度——每一条要小到一个上下文窗口能做完,比如加一个数据库字段、接一个组件,而不是“把整个后台做出来”。
这个位移对独立站团队反而是好事。你本来就不该指望一个Agent替你想清楚“这个页面到底要解决用户的什么问题”,但你完全可以指望它在一份写清楚的规格下,把三十个页面按同一套规则改完。规格写得清不清楚,现在直接等于产出质量,中间没有缓冲层。
## 它已经从民间偏方升级成产品原语
2026年4月30日,Codex CLI在0.128.0版本里加了/goal (https://simonwillison.net/2026/Apr/30/codex-goals/):设一个可验证的目标,它自己规划步骤、执行、检查产出、纠偏,一直跑到目标达成或者预算见底。前沿厂商把社区shell脚本变成内置命令,这件事本身就是一次背书。
更值得抄走的是它处理“钱花完了”的方式。预算耗尽不是硬中断,而是被标记成受预算限制的软停:系统会在最后一轮注入一份收尾提示,让Agent把手上的活收干净、把状态写清楚,而不是在半空中被砍断。暂停、恢复、清空、改预算这几件事只有人能做,Agent无权自己给自己加额度——这道边界比任何一条提示词都实在。
## 上下文怎么保洁才不会馊?
长循环最大的敌人不是笨模型,是一份被污染的上下文。每一坨没用的工具输出、每一条过期报错、每一个被放弃却还赖在窗口里的旧计划,都让下一次推理差一点,而且这种劣化跨轮次复利。
业界表述得很直接。HumanLayer那份十二条Agent准则 (https://github.com/humanlayer/12-factor-agents)里,第3条就叫“拥有你的上下文窗口”,第9条叫“把报错压缩进上下文窗口”。之所以要单独立两条,是因为默认行为——让历史一直堆着,好让Agent什么都记得——恰恰在跟模型的真实脾性对着干。
减脏的动作正好三个,工程到位的循环三个全用。压缩去减:对话逼近窗口上限时先总结,从总结重开一个窗口。转存去挪:四万词元的文件导出或命令输出扔到磁盘,上下文里只留真正要用的那五行加一个路径。隔离去挡:脏活交给一个自带干净窗口的子Agent,只让压缩后的结论回来。
这三个动作的收益有官方数据兜底。Anthropic在一个一百轮的网页搜索评测里做过对照:单靠上下文编辑就把词元消耗砍掉84% (https://claude.com/blog/context-management),而且救活了本来会因上下文耗尽而失败的任务;表现层面,上下文编辑单项带来29%的提升,配上记忆工具到39%。2026年没有哪一次模型升级,能用这么低的成本换这么大的提升。
请注意这三个动作发生在哪一层:它们全都是控制代码的活,不是模型的活。你不能靠在提示词里写一句“请注意节约上下文”来实现压缩,就像你不能靠嘱咐司机开慢点来代替刹车片。
## 刹车为什么比油门重要?
两种失效的代价完全不对称。油门坏了很便宜——模型笨一点、提示词差一点,你在产出质量里当场看得见。刹车坏了很贵——Agent干个没完,你在账单落地那一刻才看见,而那通常是第二天早上。
所以正经的循环装四道互相独立的刹车,各堵一个别人看不见的窟窿。
刹车 | 堵什么 | 起步取值 |
硬性迭代上限 | 循环永远不停 | 从10起,不是从100起 |
预算与时限 | 词元消耗就是全部成本 | 金额上限加墙钟上限,两个都要 |
无进展检测 | 在阴沟里空转 | 同参数同调用重复两次即停 |
机器可验证的完成检查 | Agent自称干完了 | 测试全绿、规格条目全过、编译器接受 |
阈值到底该定多少,与其猜,不如看别人生产里真实在用的常量。有一个把Ralph循环移植到Cursor命令行的开源实现 (https://github.com/agrimsingh/ralph-wiggum-cursor),把三个数字写死在了代码里:最大迭代数20,警告线七万词元,强制轮换上下文八万词元;界面上还有一层健康度提示,低于六成绿灯,六到八成黄灯,超过八成红灯。
顺手纠一个到处流传的说法:这套东西不是Cursor官方产品,是社区实现,写它的是一位独立开发者,仓库当前494星。把它当成“大厂内置能力”去引用,会让你的团队高估它的稳定性承诺。
八万这个数字值得单独品一下。按二十万词元的窗口算,它选择在四成的位置就强制轮换,而不是撑到九成再压缩。这个保守到有点浪费的取值,反映的是实践者的真实经验:等窗口快满了再动手,模型的判断质量早就悄悄退了两个台阶。
## 无进展检测其实很好写,难的是定义“同一步”
四道刹车里,前两道是常数比大小,第四道靠外部检查,只有第三道需要自己设计,也最容易被跳过。
可落地的做法是给每一次动作算一个签名,签名相同就算原地踏步。签名怎么取决定了它灵不灵:只取工具名太粗,改一个参数就算新动作;把整段参数原样哈希又太细,多一个空格就骗过去了。实践里比较稳的取法是工具名加上归一化后的关键参数,比如文件路径、命令主体、目标URL,把时间戳和随机串剔掉。
三个计数器基本够用:同签名连续重复两次、同一条命令累计失败三次、同一个文件在十分钟窗口内被写超过五次。命中就停,把命中的签名和最近三条动作写进错误日志。
为什么要写日志而不是直接重试?因为空转从来不会自我纠正,它只会花钱。一个卡住的循环和一个正在慢慢解决问题的循环,从账单上看一模一样,只有签名重复率能把它们分开。
## 谁来对Agent说那个“不”?
让Agent给自己的产出打分,等于让学生批自己的卷子。值得咂摸的是,这不是靠提示词能改掉的性格问题,而是结构问题:生成答案的那套权重被拿来评判答案好不好,它有一切动机附和自己。
你可以叮嘱它对自己的工作保持批判,它会产出一段措辞漂亮的自我批评,然后照样给自己放行。
解法整个行业收敛到了同一处:把生产者和检查者分开。一个负责创造,另一个独立评审——不同指令、不同模型,最好干脆不用模型——负责证明它错了,并且有权把作业打回循环。
## 评审的信任层级,从高到低
- 确定性关卡:测试、类型检查、linter、真实的编译报错。它们没有自尊心,也没有讨好谁的欲望,是最强的一档。
- 带评分细则的独立模型评审:适合写不出测试的东西,比如文案质量、设计取舍。把一个独立评估器调得刻薄是可行的工程活。
- 生成者自评:只配用来做初筛,永远不能当作停机依据。
这层级里最容易被忽略的是第一档的性价比。很多团队一上来就琢磨怎么让第二个模型评得更严,却没先把已有的测试、类型检查和构建报错接进循环——那些关卡不要钱、不会说谎、也不需要调提示词。
## 评分细则写成什么样才不算走过场
需要模型来评的那些东西——文案好不好、结构合不合理——最容易退化成一句“请严格评审”,然后拿回一段温柔的表扬。
让它变硬只有一条路:把评审问题写成能答“否”的形式。“这段文案质量如何”永远得不到否定;“这段文案里有没有出现无法核实的具体数字”“标题有没有超过预设字符数”“页面有没有两个以上H1”,这些每一条都能干净利落地判失败。
再加一条更狠的:要求评审输出证据位置,而不是结论。让它回“第3段第2句,数字310%没有出处”,比让它回“建议加强数据支撑”有用一百倍,因为前者可以被你抽查真伪,后者不能。评审一旦知道自己的输出会被核对,敷衍的成本就上去了。
最后是把一切串起来的那条铁律:检查者必须待在生产者改不到的地方。给Agent一个“让测试通过”的目标,同时给它测试文件的写权限,有相当比例的时候,它会通过改测试来让测试通过。
这不是坏心眼,也不是模型的缺陷。循环在精确优化你给它的信号——你说要绿,删掉红色的那条断言确实能变绿。奖励作弊是笼子的设计问题,不是野兽的性格问题。这条约束在权限层怎么落地,可以顺着Claude Code的权限白名单与提示注入防御 (https://zhangwenbao.com/claude-code-security.html)那一套配置往下配,把检查脚本和CI配置放进拒绝写入的名单里。
## 写操作不幂等,重试就是事故
工具这一层有一半是老生常谈:工具要少、要锋利、不要互相重叠。给实习生一百把枪,关键时刻他一定拔错;search_docs旁边摆着find_documentation和lookup,等于逼模型做一个本不该存在的选择。这半边大家都懂。
另一半没人在意,直到被咬:每一个写操作都必须幂等。
循环会重试,这是常态不是边界情况。超时、校验打嗝、模型犹豫,都会让同一个工具调用被发第二遍。行业里流传的一个统计是这个比例落在15%到30%之间,出处是一份第三方可靠性报告而非厂商数据,具体数值打折听,但方向没有争议。
如果一个非幂等的写操作恰好在超时前已经成功了,重试就会把它再执行一遍。落到独立站的语境里,这几件事分别长这样:
- 批量补商品结构化数据的脚本,把同一条产品评分标记写进了页面两次,富媒体结果反而被判为无效。
- 自动发券的Agent超时重试,同一个客户收到两张满减券,客服第二天才发现。
- 迁移站点时批量写301规则,同一条规则进了两遍,nginx直接起不来。
## 哪些操作必须挂键,哪些可以放过
不用给所有东西都加幂等。判据是这个操作重跑一遍之后,世界是不是回到了同一个状态。
- 读操作天然幂等,查商品、拉排名、抓页面,跑十遍也没事,不用管。
- 覆盖式写入接近幂等,比如把某个字段设成一个确定值、把某个文件整体重写,重跑一遍结果一样,风险低但仍要注意并发。
- 追加式和计数式写入是重灾区,插一行、发一次通知、扣一次额度、加一次库存流水,每重跑一次世界就多变一点,必须挂键。
还有一类容易漏掉的,是看起来像读、实际会改状态的操作。触发一次重新抓取、发起一次索引提交、调用一次会计费的第三方接口,它们在代码里长得像查询,账单上却是写操作。判断一个操作要不要挂键,别看函数名,看它有没有让别人那边多出一条记录。
解法要做成框架级保证而不是可选项:每个写操作带一个由入参确定性推导出来的幂等键,下游在一个时间窗内(二十四小时是常见默认值)对同一个键返回第一次的缓存结果,而不是再执行一遍。一句话判据——如果它不能被安全地调两次,那循环就不该调它一次。
## 掉进沟里长什么样,怎么自动认出来?
前面那个494星的实现,把“卡住”这件事做成了可判定的三个触发器,值得原样抄:同一条命令连续失败三次;同一个文件在十分钟内被写五次;或者Agent自己在输出里吐出一个约定好的求救标记。命中任意一条,把模式写进错误日志,停机,等人。
它落盘的六个文件也值得抄一遍结构:进度、护栏、活动日志(带每次工具调用的词元数)、错误日志、任务缓存、当前轮次编号。停机条件同样是三条——任务清单全部打勾、Agent吐出完成标记、或者撞到迭代上限。
这里有个反直觉的设计选择值得说一句:命中之后它选择停机等人,而不是自动换个策略再试。因为掉进沟里这件事,本质上是循环拿到的信息不足以自救,再多给它几轮,只是把同一个洞挖深。自动恢复听起来更智能,实际是把一次可以及时止损的失败,摊薄成一晚上看不出异常的持续消耗。
## 护栏文件是整套东西里唯一会变强的部分
最有意思的机制叫“路标”。每次失败,Agent要往护栏文件里追加一条记录,包含三个字段:触发条件是什么、下次该怎么避开、这条是第几轮之后加的。后面每一轮开工先读护栏文件。
这就是循环工程里少见的正反馈:模型的权重不会因为你跑了两百轮而变好,但护栏文件会一轮比一轮厚,而它是你的资产,不是模型厂商的。把它提交进git,团队里下一个人接手时,拿到的不是一句“这玩意有时候会抽风”,而是一份带触发条件的排错手册。
## 内循环交给Agent,外循环凭什么必须人拿着?
写到这儿都还是2026年上半年的共识。真正把这套讨论往前推了一步的,是7月中旬的一篇文章:Osmani在7月15日提出,Agent已经能跑内循环,人必须拥有外循环 (https://addyosmani.com/blog/own-the-outer-loop/)。
内循环是调查、实现、验证、重复——这几步交出去没问题。外循环是问责边界,由三根柱子撑着:
- 质量,指的是在放它出笼之前你装好的全部检查。
- 裁决,指的是上线与否由人来定。原话是模型可以写下那一行,但裁决是我的。
- 可交代,指的是别人问起来的时候,你能说清楚当初为什么这么判。
这三条为什么必须由人拿着,那篇文章给的证据比口号硬。一项2026年的代码质量调查显示,有42%的提交代码由AI生成或经过AI大幅辅助;Anthropic的一项研究发现,用AI完成任务的工程师在事后理解度测验上比对照组低了17个百分点,五成对六成七;沃顿的一项研究则更扎心——当AI给出的答案是错的,接近四分之三的人照样接受了它。
把这三个数字连起来读,结论很不客气:随着Agent接手的比例上升,人对自己名下代码的理解度是在下降的,而且人对错误答案的抵抗力本来就不高。护栏装得再好,最后那一下“我认”,没有任何机制能替你按。
## 抽检定成多少才不流于形式
外循环最常见的塌法不是不抽检,而是抽检变成走过场——每次都点开第一条、扫两眼、点通过。
让抽检重新长牙有三个动作。第一,抽样必须随机且可复现,用批次编号加序号算个哈希取模,别让人自己挑,人一挑就挑最容易看懂的那条。第二,抽检记录要落盘,写清楚看了哪几条、看的是什么、判断依据是什么;这份记录就是可交代那根柱子的实体。第三,抽检不通过要有后果——不是让Agent重跑一遍,而是把这一类失败写进护栏文件,让它下一批就不再犯。
比例怎么定,可以跟着风险走:改的是展示文案,抽一成;改的是会影响收录的标题和结构化数据,抽三成;改的是跳转规则、价格、库存这类一错就出事的,一条不漏地全过一遍机器校验,再抽人工。抽检比例不该按你有多少时间来定,该按错一条要赔多少钱来定。
## 独立站和SEO团队该先装哪一根?
不是所有活都值得造笼子。给一只金丝雀焊铁笼是过度工程:Agent只调一次工具就返回,或者三步的确定性流程,你不需要压缩策略,也不需要独立评审。
但有两根,只要牵涉真金白银或线上数据,短循环也不许省——刹车(让一个bug没法永远循环)和幂等(让一次重试没法污染数据)。只读的五步循环可以跳过上下文保洁和评审;任何会写东西的循环,这两根永远不能跳。
值得上全套的,是那些长周期、可重复、且完成信号机器可验证的活。落到这个站的读者身上,保哥自己在用的判断方式是先问一句:这件事干完之后,有没有一个不需要我看一眼就能变绿的检查?
常见的活 | 机器可验证的终点 | 适合自主循环吗 |
批量补全商品页结构化数据 | 富媒体测试无错误、字段覆盖率达标 | 适合,但写操作必须幂等 |
站点迁移生成301映射表 | 旧URL全部返回301且目标返回200 | 适合,验证脚本要独立于生成脚本 |
批量压图与格式转换 | 体积下降且视觉差异分数低于阈值 | 适合,属于典型的低难度流水线 |
把落地页文案改得更有说服力 | 没有 | 不适合,留在交互式会话里 |
重写整站标题标签 | 长度、重复率、关键词覆盖可测,说服力不可测 | 半适合,机器管硬指标人管取舍 |
去年帮一个3C配件出海团队做批量改标题的时候,翻车就翻在这张表的最后一行:脚本把长度和重复率全跑绿了,人一看,八成的标题读起来像同一句话套了不同型号。机器能验的那一半通过了,不能验的那一半塌了——这恰恰说明检查项定义在哪儿,Agent就把力气花在哪儿。
## 接线顺序按爆炸半径来
先上幂等和刹车,它们防的是事故;再上独立评审,它防的是自信地错;最后上上下文保洁,它防的是慢性质量腐烂。想同时上四根的团队,通常四根都装得不结实。
如果要给一个具体的起步节奏,可以这样排:第一天只做一件事,把这批活的完成检查写出来并且跑通,跑不出来就说明这活还不该上循环;第二天把迭代上限、金额上限和墙钟上限三个常数写进脚本,数值往小了设;第三天补幂等键和无进展检测,然后让它跑第一批,人在旁边盯着,每一次失败都当场追到根并写进护栏文件;第四天开始才谈无人值守,而且第一次无人值守跑的批量,规模应该小到就算全错也能手工回滚。
顺序反过来的团队很常见,通常是先花两周搭一套漂亮的多Agent编排,再回过头发现连一个能变绿的检查都没有。能不能写出那个检查,才是这活该不该自动化的分水岭,剩下的都是实现细节。
真正跑起来之后,编排是下一个问题而不是这个问题。多个循环怎么分工、什么时候值得并行、主循环怎么收编子Agent的结论,可以顺着Agent Teams的多Agent协作配置 (https://zhangwenbao.com/claude-code-agent-teams.html)往下走;想弄明白这个循环在代码层面到底长什么样,用两百多行Python手搓一个智能体循环 (https://zhangwenbao.com/build-magic-code.html)是最快的路径;而迭代上限、预算上限这些刹车在官方SDK里对应哪些参数,Claude Agent SDK的实战配置 (https://zhangwenbao.com/claude-agent-sdk-guide.html)里有现成写法。
最后留一份起飞前检查,任何循环无人值守跑之前过一遍:它会遗忘吗?它会停吗?有东西能对它说不吗?它的写操作被调两次也没事吗?四个问题里任何一个答“否”,你就有一个缺口,而循环一定会找到它。
## 常见问题解答
## 循环工程和上下文工程、提示词工程是什么关系?
是一层套一层的关系,不是替代关系。提示词工程管你发出去的那句话,上下文工程管模型在单次调用里看到的全部词元,harness工程管它能碰到的工具和环境,循环工程管把这些反复驱动向目标的迭代过程。越往外层,越不依赖具体是哪个模型,也越难被竞争对手抄走。
## 迭代上限设成10是不是太小了,很多任务根本做不完?
做不完正是这个取值想告诉你的信息。有上限的循环提前停下,代价是一次便宜的重跑;没上限的循环整夜空转,代价是第二天的账单。十轮足够你判断规格文件到底能不能支撑循环跑,而一百轮足够你在凌晨三点才发现它不能。先用小上限验证规格质量,信任建立起来了再往上调。
## 用同一个模型开两个会话,一个当生产者一个当评审,算独立评审吗?
算,但只是最弱的那一档。它解决了上下文互相污染的问题,没解决同一套权重倾向于认同同类输出的问题。可行的加固有三条:给评审换一个模型、给它一份明确的评分细则、并且优先把能写成测试或类型检查的部分交给确定性关卡。真正的分水岭不在于用几个模型,而在于检查者是否处在生产者改不到的位置。
## 幂等键应该怎么生成,用随机UUID可以吗?
不可以。随机值每次重试都不一样,等于没有键。幂等键必须由入参确定性推导,比如把用户标识、目标资源、任务编号这几项拼起来做哈希,保证同一次逻辑操作无论被重试多少遍都算出同一个键。下游据此在时间窗内返回第一次的结果,二十四小时是常见默认值。
## Ralph这种每轮清空上下文的做法,会不会把之前学到的东西全丢了?
会丢掉对话,但不丢进度和教训,前提是你把这两样外置。进度写在文件和git历史里,教训写在护栏文件里,每一轮开工先读这两样。这套做法反而比长对话更稳,因为git历史可审查、不会悄悄退化,而一段二十万词元的对话既看不清也回不去。
## 没有测试的老项目,是不是就完全没法跑自主循环?
可以先造一个便宜的验证器,再跑循环。构建能不能过、类型检查干不干净、关键页面的HTTP状态码对不对、结构化数据校验有没有报错,这些都算机器可验证的完成信号,成本远低于补一整套测试。把第一轮循环的目标定成“为模块X补上可运行的冒烟测试”,本身就是一个有诚实终点的任务。
## 权威参考资料
## 22万星和3.8万星,哪个更值得你把工作流搬上去
- URL:https://zhangwenbao.com/github-repo-health-signals-oss-selection.html
- 分类:AI编程与工具链
- 发布:2026-07-20 | 更新:2026-07-30
- 摘要:星标只涨不跌,是那个页面上最不反映项目现状的一栏。本文用三个仓库同一天的真实数据,讲清最后推送、未关问题比值、许可证误报与版本号方案怎么读,附一份十分钟体检清单。
- 关键词:AI Agent,效率工具,技术选型,工程方法论
> **TLDR**:摘要:选开源项目的时候,几乎所有人第一眼看星标,几乎所有推荐文第一句报星标。但星标是那个页面上唯一一个只增不减的数字——项目烂掉了它也不会掉一颗。真正携带信息的是另外几栏:最后推送时间、未关问题除以星标的比值、许可证那一栏,以及版本号方案本身。这篇同一天拉了三个AI Agent仓库的接口数据做对照:22.3万星的那个有2.6万个未关问题,38.5万星的那个只有5798个,3.8万星的那个只有10个。还发现了一件几乎没人知道的事——GitHub上那个许可证标签是自动检测出来的,在标准MIT正文后面加一句无害的说明,就足以让它显示成“其他”,而合规扫描工具往往直接读那一栏。最后给一份十分钟能跑完的体检清单,判据同样适用于选插件、选主题、选采集工具。
> 摘要:选开源项目的时候,几乎所有人第一眼看星标,几乎所有推荐文第一句报星标。但星标是那个页面上唯一一个只增不减的数字——项目烂掉了它也不会掉一颗。真正携带信息的是另外几栏:最后推送时间、未关问题除以星标的比值、许可证那一栏,以及版本号方案本身。这篇同一天拉了三个AI Agent仓库的接口数据做对照:22.3万星的那个有2.6万个未关问题,38.5万星的那个只有5798个,3.8万星的那个只有10个。还发现了一件几乎没人知道的事——GitHub上那个许可证标签是自动检测出来的,在标准MIT正文后面加一句无害的说明,就足以让它显示成“其他”,而合规扫描工具往往直接读那一栏。最后给一份十分钟能跑完的体检清单,判据同样适用于选插件、选主题、选采集工具。
先讲一件让我改掉习惯的小事。
年初有人推给保哥一个开源Agent框架,说“七周涨到11.3万星,2026年最快的开源项目”。这个说法是真的。三个多月后我又去看了一眼同一个仓库:22.3万星。翻了一倍。
但同一天我顺手把另外两栏也拉了下来,看到的东西和星标讲的完全不是一个故事。
## 星标是那一栏里唯一只会涨的数字
把GitHub仓库页面上能读到的字段排一排,你会发现它们分成两类:会随项目健康度上下浮动的,和只会单调上涨的。
最后推送时间会往回退(准确说是会停住不动),未关问题数会涨会落,发布节奏会变密变疏,许可证会改,分叉数虽然也基本只涨但涨速会明显掉档。只有星标不会——一个项目彻底死掉、作者跑路、代码三年没人碰,它的星标该是多少还是多少,甚至因为持续被老文章引用还会慢慢往上爬。
这一点在评测类内容里被放大得尤其厉害。站内那篇拆三款AI应用生成器计费机制与退出成本的横评 (https://zhangwenbao.com/lovable-vs-v0-vs-bolt-ai-app-builder.html)写的时候我也踩过:三家的公开数字里,最好拿也最没用的就是融资额和用户数,真正决定你走不走得掉的全在文档细节里。
这就是问题所在:所有推荐文最爱报的那个数字,恰好是唯一一个不反映项目当前状态的数字。它测的是历史累计关注度,不是现在的健康度。而选型这件事,你需要的恰恰是后者。
而这套东西对本站读者的价值,恰恰不在于选Agent框架。站内那篇把SEO团队要用的AI工具分成五类做真实投产比对照的路线图 (https://zhangwenbao.com/seo-team-ai-selection-5-categories-real-roi-roadmap.html)里,最难的一步从来不是列候选,是判断某个候选半年后还在不在——而那个判断,用的就是下面这几栏。
顺带说一句,这跟做SEO时“别拿域名权重当唯一判据”是同一类错误:一个只累积不衰减的指标,用久了会让你系统性地高估老资产、低估新资产。
## 同一天拉三个仓库,体检报告长什么样?
下面这组数据来自2026年7月30日的接口调用,三个都是当下AI Agent方向上被提得最多的仓库。为了避免这篇变成软文,我不评价谁好谁坏,只看数字之间的关系。
字段 | 仓库甲 | 仓库乙 | 仓库丙 |
星标 | 384,581 | 222,728 | 38,376 |
分叉 | 80,818 | 42,762 | 4,105 |
未关问题 | 5,798 | 25,950 | 10 |
未关问题 ÷ 星标 | 1.51% | 11.65% | 0.026% |
分叉 ÷ 星标 | 21.0% | 19.2% | 10.7% |
最后推送 | 当天 | 当天 | 8天前 |
创建时间 | 2025-11-24 | 2025-07-22 | 2025-07-24 |
许可证(接口返回) | NOASSERTION | MIT | MIT |
主语言 | TypeScript | Python | Markdown为主 |
这张表里有三个地方值得停下来。
第一,甲的星标是乙的1.7倍,但乙的未关问题是甲的4.5倍。比值差了将近八倍。
第二,丙的星标只有甲的十分之一,未关问题却只有10个。这个数字小到反常。
第三,甲的许可证在接口里返回的是NOASSERTION,也就是“未认定”。这一栏后面藏着这篇里最实用的一个发现,放到专门一节讲。
## 为什么这里全看比值,不看绝对值
有人会问:为什么不直接比“谁的未关问题多”?因为绝对值受项目规模影响太大,比出来的是体量不是健康度。
举个反直觉的例子。一个只有五百星的小工具,如果攒了三百个未关问题,那基本可以判死;而一个几十万星的项目攒了五千个,可能反而说明它运转正常——因为提问的人基数根本不在一个量级上。用绝对值排序,你会系统性地冤枉大项目、放过小项目,而后者恰恰是风险更高的那一类。
比值也不是万能的,它有一个已知的失真源:会被机器人和模板刷歪。有些项目开了自动化,依赖有更新就自动开一个问题,这类问题积压起来会把比值顶得很高,但它跟维护质量没关系。判别方法很简单——扫一眼问题列表里的作者,如果一屏里有一半是同一个机器人账号,那这个比值就得打折。
## 还有一栏叫“已关闭”,很多人从来没点开过
页面上问题列表默认只显示未关闭的,但那个筛选器旁边有个已关闭的入口。已关闭列表其实比未关闭列表更能说明问题:未关闭列表告诉你还欠着多少,已关闭列表告诉你这个项目还债的速度和方式。
点进去按最近关闭排序,看两件事:最近关闭的那几条是怎么关的(有真的修复提交,还是被机器人以“长期无活动”自动关掉的),以及从提出到关闭中间隔了多久。大批被自动关掉的陈旧问题,是一个比高积压更坏的信号——高积压至少说明还有人在提,自动清扫说明连提的人都不指望了。
## 未关问题除以星标,这个比值在说什么?
先别急着下“乙的项目质量差”这个结论。这个比值同时被三件事推动,得分开看。
## 它可能在说“用的人多且在真用”
问题是用户提的。一个没人真正跑起来的项目,是提不出问题的。11.65%这个比值在一定程度上是活跃度的证据,不全是负面信号——尤其当这个项目的定位是“装在你自己服务器上二十四小时跑”的时候,环境组合爆炸,问题量天然就高。
## 它也可能在说“进来的比处理掉的快”
这是负面的那一半。2.6万个未关问题意味着维护带宽已经明显跟不上流入速度。对你的实际影响很具体:你踩到的坑,大概率已经有人提过,但也大概率不会有人回。这不是道德问题,是算术问题。
## 丙的0.026%又是另一回事
10个未关问题配3.8万星,这个数字不能读成“质量高到没人提问题”。更可能的解释是项目形态不同——丙这个插件市场仓库 (https://github.com/wshobson/agents)的内容主体是一堆Markdown文件(Agent定义、技能包、命令模板),不是一个要在各种环境里跑起来的运行时。没有运行时就没有环境问题,没有环境问题就没有那类占绝大多数的issue。
## 三十秒读懂一个问题列表
比值只是个入口,真正有信息量的是列表本身。按最新排序之后,把前十条快速扫一遍,只做三件事:
- 数一下有几条是“装不上”。安装类问题占比高,说明这个项目的门槛已经在往上飘,而作者没顾上。这一条对你影响最直接——你也要装。
- 看有没有官方账号出现在回复里。不是看回复数量,是看回复里有没有维护者。二十条讨论全是用户互相猜,和三条回复里有一条来自维护者,是完全不同的两个项目状态。
- 看最新一条和最老一条的间隔。如果前十条跨了两天,说明流入很猛;如果跨了三个月,说明这个项目已经安静下来了——安静未必是坏事,但你得知道自己在选一个什么节奏的东西。
这三件事加起来不到一分钟,得到的信息量比盯着比值算半天大得多。数字告诉你规模,内容告诉你性质,而选型需要的几乎全是性质。
所以这个比值的正确用法不是横向排名,是纵向自比:同一个仓库,半年前的比值和现在的比值哪个高?以及,看最近关闭的那几个问题,间隔是多久。后者比比值本身更硬——比值告诉你积压有多深,关闭间隔告诉你水管还通不通。
## 如果一定要看星标,看增速别看存量
存量是历史累计,增速是当下判断。同样是十万星,过去三个月涨了两万和过去三个月涨了两百,是两个完全不同的项目,而页面上显示的数字一模一样。
增速也没那么难拿——把同一个仓库的星标数隔一两周记两次,差值就是最粗糙但也最诚实的增速。真要做得细一点,接口里能按时间取到加星记录,画出曲线之后有三种形状值得认识:台阶形(某天突然一竖,多半是被大号推荐或者上了热榜,之后回落到平线)、斜坡形(持续缓慢上升,这是真实采用的样子)、平台形(涨到某个数就横住了,说明它的目标人群已经吃完了)。
台阶形最需要警惕,因为它对应的往往正是那些“七周涨到多少万星”的标题。一次热榜带来的星标,和一年里持续有人用出来的星标,在数字上没有任何区别,但在预测力上差着一个量级。
## 最后推送时间为什么比星标可靠?
因为它是唯一一个会往坏了走的公开字段。星标只涨,分叉基本只涨,问题数可以靠批量关闭做漂亮,只有“最后一次推送是什么时候”这一栏没法粉饰——要么有人在写代码,要么没有。
实际用起来有两个注意点。
这一栏还能顺手救你一次:很多推荐文里的包名、命令、配置项其实已经改过了,而文章不会自己更新。站内那篇整理最值得装的服务怎么选、真实包名与避坑清单 (https://zhangwenbao.com/best-mcp-servers-claude-code.html)的时候,被淘汰掉的候选里有一半就是因为包名早就换了而各处教程还在抄旧的。
第一,别把最后推送和最后提交搞混。推送时间会被一些无关操作刷新(比如只改了README、或者机器人提了个依赖升级)。所以看到“今天推送”之后还要往下走一步,翻一眼最近几次提交都在动什么文件。全是文档和依赖锁文件的,等于没动。
第二,八个月是个很有用的门槛。这不是拍脑袋——生态里的主要依赖大致每季度动一次,语言运行时每年动一到两次,八个月足够攒下一堆装不上的坑。之前研究一门课程的配套作业仓库时就撞过这个:星标接近四千,看着挺可靠,一查最后推送停在八个多月前,而课程大纲本身已经换了新版——课程官网、作业仓库、社交宣传,三处经常处在不同的时间线上。这三条时间线各走各的,谁也不等谁。
## 许可证那一栏,为什么显示的可能不是真的?
这一节是我这次最意外的收获。
前面表里的甲,接口返回的许可证是NOASSERTION,网页上显示成“Other”。按常识,这意味着它用了某种非标准的自定义许可证,企业采用前要走法务。
我把这个仓库的LICENSE文件 (https://github.com/openclaw/openclaw)拉下来看了一眼——是一字不差的标准MIT许可证。版权行、授权段、免责段,全都是模板原文。唯一的差别是文件末尾多了两行:
> Third-party notices for incorporated or adapted code are recorded in THIRD_PARTY_NOTICES.md.
翻译过来就是“第三方代码的声明记在另一个文件里”。一句完全无害、甚至相当负责任的补充说明。
## 机制是这样的
GitHub那一栏不是人填的,是自动检测出来的。官方关于给仓库加许可证的文档 (https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/licensing-a-repository)写得很清楚:它用一个叫Licensee的开源Ruby包,把仓库的LICENSE文件跟一份已知许可证的短名单做比对。名单之外,或者比对不上,就归到“其他”。
文档里还有一句非常明确的官方建议:“要让你的许可证被检测到,请简化你的LICENSE文件,把复杂的部分记到别处,比如仓库的README里。”原文归因的失败原因是“多个许可证或其他复杂情况”。甲这个仓库恰好就撞在了“其他复杂情况”上——它把第三方声明的指引写进了LICENSE,而不是README。
GitHub自己在同一页上加了免责声明,说这些信息是“按现状提供”的,不做任何保证,并建议有疑问去咨询专业人士。换句话说,官方从来没说过那一栏是权威的,是我们自己默认它权威。
## 为什么这件事有实际后果
因为读那一栏的往往不是人,是流水线。企业里的依赖合规扫描、开源治理平台、采购审批表,很多都直接消费接口返回的许可证标识符。一个返回NOASSERTION的依赖,在这些流程里会被自动标红,然后走人工评审,然后卡两周——而它实际上就是MIT。
反过来的风险同样存在:检测通过不等于真的能用。Licensee比对的是LICENSE这一个文件,仓库里某个子目录带着完全不同的许可证、或者引入了传染性协议的代码,它都看不见。所以这一栏的正确读法是——它显示“其他”,多半是文件写法问题,不是许可证问题;它显示MIT,也只说明根目录那个文件是MIT。两个方向上都不该当结论。
最后一个可以当段子记的细节:决定这一栏怎么显示的那个Licensee项目本身 (https://github.com/licensee/licensee),只有903颗星。几十万星的项目在页面上顶着什么许可证标签,是由一个九百星的小工具说了算的。
## 版本号方案一换,半年前的建议连语法都不成立了
这条是从一次打脸里学来的。
四月份有篇写得相当认真的评测,结尾给了条建议:“如果你想等更稳定的版本,建议等v0.12,预计五月中下旬。”这句话在当时完全合理,那个项目正在v0.10。
问题是,这个项目现在的发布列表 (https://github.com/NousResearch/hermes-agent)里最新的标签叫v2026.7.20。往前翻是v2026.7.7.2、v2026.7.7、v2026.7.1、v2026.6.19、v2026.6.5。它已经从语义化版本整个切到了日期版本。不存在v0.12,也永远不会存在——那条建议现在连语法都不成立了。
## 版本号方案本身就是一个信号
这件事比“某条建议过期了”更有意思的地方在于:版本号方案的选择,本身就在告诉你这个项目怎么看待自己。
- 语义化版本(主.次.修)在承诺兼容性契约:主版本不变,你的集成就不该坏。用它的项目通常有明确的公开接口和相对稳定的用户群。
- 日期版本(年.月.日)不承诺任何兼容性,只承诺新鲜度。用它的项目通常迭代极快、接口还在动、并且默认你会一直跟着升。
- 从前者切到后者,是一个明确的表态:我们不打算再维持版本承诺了,请跟着走。
所以看到日期版本的时候,你要问的不是“哪个版本稳”,而是“我能不能接受两周一次的跟进节奏”。这两个问题的答案完全不同。
## 顺带看一眼发布节奏
同一份发布列表还告诉了我另外两件事:大版本大约两周一发,中间夹着修补版本(7月7日发了一个,第二天马上跟了一个7.7.2);而几个大版本的说明文字长度分别是五万二、四万、四万五千个字符。
两周一发、每次四五万字的变更说明,这个组合读出来是:功能推进极快,但你不跟就会掉队;而且每次跟进要读的东西不少。如果你的团队没有专人盯这个,那么“它很活跃”对你来说其实是成本不是收益。
## 创建时间那一栏,能戳破哪些叙事?
这一栏几乎从来没人看,但它是唯一一个能对上官方叙事的字段。
回到开头那个“七周从零涨到11.3万星”的说法。这个说法把起点定在2026年2月底。而接口返回的仓库创建时间是2025年7月22日——比叙事起点早了七个月。
这中间的七个月去哪了?可能性无非几种,每一种都有对应的排查动作:
- 先私有开发,后转公开。最常见。仓库创建于私有阶段,公开那天才开始涨星。判据:翻最早的几次提交,看时间是否连续;如果最早的提交和创建时间同期、且一路密集到公开日,那就是这种情况。这不是问题,只是说明“七周从零”这个说法省略了准备期。
- 改过名或转移过。GitHub保留原仓库的创建时间,但会把旧地址重定向到新地址。判据:看主题标签里有没有别的项目名残留——这个仓库的标签里就同时挂着好几个明显是旧名字的词。这种情况要额外注意:你在网上搜到的旧名字资料,可能对应的是完全不同的一个版本。
- 从别的项目分叉出来后断开了关系。判据:接口里的分叉标记是否为假、上游字段是否为空。都为空但代码风格明显承袭另一个项目的,值得多看两眼。
不管是哪一种,结论都一样:创建时间和官方叙事起点差得越多,就说明有一段历史没被讲出来,而那段历史里往往藏着你最该知道的东西——比如它原来叫什么、原来的用户为什么走了、旧文档还有多少在网上飘着。
反过来的情况同样值得警惕:如果创建时间晚于你在网上看到的最早讨论,那多半是仓库被重建过。重建意味着历史问题、历史讨论、历史提交全都不在这儿了,你搜到的那些“已解决”的帖子可能指向一个已经不存在的地址。
## 分叉数和订阅数各自在测什么?
这两栏很少有人认真读,但它们测的东西不一样,而且都比星标具体。
分叉除以星标大致反映“看客里有多少人真的动了手”。前面那张表里,甲21.0%、乙19.2%、丙10.7%。丙明显低,这跟它的形态吻合——它的用法是装插件,不是改代码,所以不需要分叉。而甲和乙都在两成左右,说明这两个项目的用户里有相当比例是要自己改的。这个比值高,意味着你也大概率得改。预算要按这个来估,不是按“装上就能用”估。
订阅数(也就是关注仓库动态的人数)测的是另一件事:有多少人愿意持续接收这个项目的通知。乙的订阅数是838。相对22.3万星来说,这个数字非常小。它说明绝大多数人是点了个星就走了,并没有真的跟进。星标里有多少是“先收藏着”而不是“我在用”,这一栏给了个粗略的答案。
## 把这套判据搬到你真正要选的东西上
写到这里得说,我知道大部分读这篇的人不会去选AI Agent框架。但这套判据是通用的,只要目标托管在GitHub上就能用,而做独立站的人几乎天天在选这类东西。
## 选WordPress插件的时候
插件目录页会显示“最后更新”和“兼容到某某版本”,但那两栏是作者手填的,改一下日期就能刷新。去仓库看最后推送时间,两者对不上的时候,以仓库为准。另外一定要翻最近几条未关问题——如果最新的几条都在问“新版本装不上”而且没人回,那这个插件的实际状态跟目录页显示的不是一回事。站内那篇讲备份方案五个维度对照与真实选型 (https://zhangwenbao.com/wordpress-backup-5-dimension-updraftplus-duplicator-snapshot-disaster-recovery.html)的复盘里,被淘汰掉的几个候选就是栽在这一步。
## 选主题或建站框架的时候
重点看分叉除以星标。这个比值高,说明大家都在改它——那你也得改,别指望开箱即用。还要看许可证那一栏,主题类项目的许可证情况比插件复杂得多,因为它们经常打包了字体、图标、演示图片,而这些资产的授权跟代码本身的授权常常不是一回事。这时候接口返回“其他”反而是个有用的提醒:值得点进LICENSE文件亲眼看一遍。关于建站底座该怎么选,站内那篇从SEO角度横评几种内容管理系统的分析 (https://zhangwenbao.com/cms-platform-choice-seo-real-impact-wordpress-typecho-hugo-sanity.html)可以配着看。
## 选采集或数据类工具的时候
这一类最该看问题的关闭间隔而不是问题总数。采集工具的生命线是跟着目标站点的改版走的,目标站一改结构它就废。所以你要确认的是“坏了之后多久有人修”,而这个答案只能从最近几个已关闭问题的时间戳里读出来。星标在这里几乎没有参考价值——被采的站不会因为工具星标高就不改版。
## 如果它根本没有公开仓库怎么办
越来越多的AI工具是纯服务形态,没有开源仓库可查。这时候整套判据要换一批观察点,但问的还是同样三个问题。
“最后一次有人动它”的替代观察点是变更日志和文档更新时间。变更日志停更三个月以上的服务,多半已经进维护模式了。有个更隐蔽的判据:看它的文档里还在不在提已经过时的模型名或版本号——文档里挂着半年前的型号,说明没人在维护那套文档,而没人维护文档的服务,接口大概率也没人维护。
“遇到问题之后发生了什么”的替代观察点是社区渠道。看它的社群或论坛里,官方账号最近一次回复用户是什么时候,以及回复的是不是实质问题。这一步比看“有没有工单系统”有用得多。
“授权条款有没有亲眼看过”在服务形态下更重要,因为条款可以单方面改。要额外关注两件事:数据用不用于训练,以及停服之后你的数据怎么导出。这两条通常写在服务条款的中后段,而不是价格页上。
## 这套清单最容易被误用的地方
最后提个醒,免得走到另一个极端。这五步是排除法,不是打分法。它擅长的是快速淘汰掉那些明显不该选的,不擅长在两个都健康的候选里分出高下。
两个候选都通过体检之后,决定选哪个的因素完全在另一个维度上:它解决的是不是你真正的问题、迁走的成本有多高、你的团队会不会用。把体检指标拿来当排序依据,是这套方法最常见的误用——就像不能靠体检报告选朋友一样,体检只能告诉你谁明显不行。
## 一份十分钟能跑完的体检清单
把上面所有东西压成动作,一次接口调用加三次点击就够:
- 拉一次接口。一条命令就能拿到星标、分叉、未关问题、最后推送、许可证、创建时间、订阅数、主语言全部字段,仓库接口的官方文档 (https://docs.github.com/en/rest/repos/repos)里写得很清楚,不需要认证也能读公开仓库。这一步比在网页上翻半天快得多,而且拿到的是结构化的。
- 算两个比值。未关问题÷星标、分叉÷星标。前者看积压深度,后者看你要不要准备改代码。
- 点进问题列表,按最新排序,看前五条在问什么。这一步无可替代。比值告诉你有多少积压,这五条告诉你积压的是什么性质——是功能请求还是“装不上”。
- 点进发布列表,看版本号方案和最近三次的间隔。方案告诉你它承不承诺兼容,间隔告诉你你要付出多少跟进成本。
- 点开LICENSE文件本身看一眼,不看那个自动检测出来的标签。三十秒的事,能省掉后面两周的合规扯皮。
还有一件值得顺手做的事:如果你选的是Agent相关的东西,先确认它的资产格式绑不绑死在某一个工具上。站内那篇写同一套Agent资产能不能跨工具搬家的实测 (https://zhangwenbao.com/agent-skills-cross-harness-portability.html)把五家的能力差异逐行对过一遍,结论是能不能搬跟项目活不活跃是两个独立的风险,得分开评。至于托管型和自建型该怎么选,站内那篇拆官方托管智能体真实用法与避坑的文章 (https://zhangwenbao.com/claude-managed-agents.html)可以配着读。
五步走完,你对这个项目的判断会比“它有多少星”准确一个数量级。而且这五步跟项目属于哪个领域完全无关——选Agent框架、选插件、选主题、选一个命令行小工具,动作一模一样。
保哥自己现在的习惯是:看到推荐文里第一句报星标的,就默认作者没做过这五步。这个启发式的准确率高得有点让人失望。
## 常见问题解答
## 星标是不是完全没用?
不是完全没用,是被严重误用了。它有一个正当用途:判断这个项目有没有过临界规模——几百星和几万星之间确实有质变,涉及到有没有中文资料、有没有人在论坛回答问题、出了事能不能搜到别人的解法。但一旦过了这个门槛,星标继续涨对你的决策就不再增加任何信息了。三万星和三十万星之间的差别,对你能不能用好它几乎没有影响。
## 未关问题很多的项目就不能用吗?
能用,但要调整预期。正确的心态是把它当成“社区版软件”而不是“产品”:你踩到的坑要自己解决,不要指望提问会有回音。如果你的团队有能力读源码、能自己打补丁,高积压其实不是障碍;如果你指望官方支持,那这个比值就是个很硬的否决项。
## 接口返回NOASSERTION,到底能不能用?
先点进LICENSE文件看一眼,多数情况下答案会在三十秒内出现。如果正文就是标准协议、只是多了几句附加说明,那基本可以按那个标准协议理解,但企业场景下建议把这个情况写进你的合规记录里,免得下次扫描又被卡。如果正文确实是自定义条款,那就得逐条读,尤其注意有没有“不得用于商业用途”“不得提供竞品服务”这类限制——这类条款在最近两年的项目里出现得越来越多。
## 怎么快速判断一个项目是不是快死了?
三个信号同时出现基本可以定性:最后推送超过半年、最近几条未关问题都是“装不上”且无人回复、发布列表最后一条也停在半年前。单独一个信号都可能有别的解释(比如项目已经成熟到不需要频繁改动),三个一起出现就没什么别的解释了。
## 一个项目星标停涨了,是不是就该换掉?
不是。星标停涨最常见的原因是这个项目的目标人群已经吃透了——需要它的人都已经知道它了,没有新增关注很正常。真正该触发换掉决定的是另外三个:最后推送停住、你提的问题没人回、以及它挡住了你要做的下一件事。前两个是它的问题,第三个是你的问题,而第三个通常才是真正的换掉理由。
## 为什么不看贡献者人数?
因为这一栏的噪声比信号大。贡献者列表里会混进大量只提过一次拼写修正的人,而这些人和真正在维护的人在列表里长得一模一样。想看这个维度,更可靠的读法是看最近三个月的提交里,作者一共有几个不同的人——如果九成提交出自一个人,那这个项目的实际状态是单人项目,跟贡献者列表上挂着两百人没有关系。单人项目不是不能用,但你要按单人项目的风险来准备。
## 这套判据对不在GitHub上的项目怎么办?
思路可以整个搬过去,只是取数的地方变了。核心永远是那三件事:最后一次有人动它是什么时候、用户遇到问题之后发生了什么、以及授权条款你有没有亲眼看过。码云、自建的代码托管、甚至一个只提供下载的官网,这三件事都能找到对应的观察点,只是要多花点时间。
## 做SEO和独立站,最该把这套判据用在哪儿?
用在所有会长期跑在你站上的东西上:插件、主题、缓存方案、采集工具、结构化数据生成器。判断依据的排序是——最后推送时间第一,最近问题的性质第二,许可证第三,星标最后。特别提醒一点:跟搜索引擎打交道的那类插件(站点地图、结构化数据、重定向管理)对新鲜度的要求比其他插件高一档,因为搜索引擎那边的规则一直在动,而一个半年没更新的结构化数据插件,输出的很可能已经是过时的格式了。
## 权威参考资料
## 换掉Claude Code那天,你攒的那套Agent资产还剩多少
- URL:https://zhangwenbao.com/agent-skills-cross-harness-portability.html
- 分类:AI编程与工具链
- 发布:2026-07-14 | 更新:2026-07-30
- 摘要:一份源同时供五个Agent工具消费,能力对照逐行摊开:技能几乎全兼容,工具白名单与生命周期钩子搬不走且静默失效。附8KB截断上限、模型映射陷阱与迁移前四件事。
- 关键词:AI Agent,Claude Code,Claude Skills,开发技巧,技术选型
> **TLDR**:摘要:如果你已经给团队攒了一批Agent资产——写描述的技能、查死链的子代理、批量改标题的斜杠命令——那么有个问题迟早要回答:换掉现在这个工具的那天,这批东西还剩多少能用?业界最大的那个Agent插件市场给了一份可以逐行核对的答案:一份源文件,同时供五个不同的运行工具消费,而且明确拒绝走最小公约数路线。逐行读它的能力对照表能看到,技能本身几乎全兼容,真正搬不动的是三类东西——逐个代理的工具白名单、生命周期钩子、以及待办追踪。更麻烦的是,工具白名单被丢弃的时候是静默的:你以为限制住了,实际上没有。这篇把五家的差异、两个会直接截断的硬上限、两档完全不同的安装路径全部摊开,最后给一份迁移前该做的四件事。顺带说一个让人不太舒服的发现:那份分层模型策略把SEO归进了最便宜的一档。
> 摘要:如果你已经给团队攒了一批Agent资产——写描述的技能、查死链的子代理、批量改标题的斜杠命令——那么有个问题迟早要回答:换掉现在这个工具的那天,这批东西还剩多少能用?业界最大的那个Agent插件市场给了一份可以逐行核对的答案:一份源文件,同时供五个不同的运行工具消费,而且明确拒绝走最小公约数路线。逐行读它的能力对照表能看到,技能本身几乎全兼容,真正搬不动的是三类东西——逐个代理的工具白名单、生命周期钩子、以及待办追踪。更麻烦的是,工具白名单被丢弃的时候是静默的:你以为限制住了,实际上没有。这篇把五家的差异、两个会直接截断的硬上限、两档完全不同的安装路径全部摊开,最后给一份迁移前该做的四件事。顺带说一个让人不太舒服的发现:那份分层模型策略把SEO归进了最便宜的一档。
先说清楚这篇要解决的焦虑是什么。
你花了三个月,把日常那些重复动作固化成了Agent资产:一个专门写商品描述的技能、一个专门查内链是否失效的子代理、一套跑多语言页面的斜杠命令。它们现在跑得挺好。
然后你开始隐隐不安:这批东西是不是绑死在这一个工具上了?如果半年后团队要换,或者公司统一采购了别家,这三个月是不是白干?
这个问题以前没有可核对的答案,现在有了。
## 一份源,五个目标,这件事是怎么做到的?
目前生态里规模最大的那个Agent插件市场仓库 (https://github.com/wshobson/agents),最近把自己重新定义成了“多运行环境插件市场”。数字上是94个插件、203个代理、175个技能、109个命令,外加16个多代理编排工作流。
但真正值得关注的不是这些数字,是它的组织方式:只有一份源,放在Claude Code的Markdown格式里;其余五个运行环境的产物,全部由适配器生成。
它在文档里给了一句立场非常明确的话:每个运行环境拿到的都是符合它自己习惯的原生产物,而不是最小公约数式的翻译。
这句话是整件事的关键。做跨平台兼容有两条路:一条是砍到所有平台都支持的那个交集,出来的东西哪儿都能跑但哪儿都不好用;另一条是给每个目标单独生成它的原生形态,代价是维护成本和一堆不对称的边界情况。这个仓库选了后者,而恰恰因为选了后者,它被迫把五家的能力差异一条条写下来——那份对照表,就成了现在能拿到的最完整的一份跨工具可移植性清单。
## 这件事两年前做不到,现在为什么能了
值得停一下想想:为什么现在能有一份源供五家消费,而两年前不行。
答案不在技术上,在格式上。这五家在两件事上意外地收敛了:一是都接受用带前置元数据的Markdown来定义代理和技能,二是都接受把项目级指令放在一个约定俗成的文件里。只要这两件事一致,剩下的差异就都只是字段名和目录结构的问题——那是适配器能解决的,而语义层面的分歧不是。
这个收敛本身也说明了一件事:这些工具的差异化竞争,已经从“怎么描述任务”转移到了“怎么执行任务”。描述层大家趋同,执行层各显神通。对使用者来说这是好消息,因为你花时间最多的正是描述层。
另一个附带结论是,越靠近描述层的资产越保值,越靠近执行层的资产越容易作废。这条判据可以直接拿来指导你把时间花在哪儿。想把描述层的东西写扎实,站内那篇讲技能怎么写才好用、一套经得起用的设计模式 (https://zhangwenbao.com/claude-code-skill-patterns.html)整理的那些写法基本是通用的,不绑定具体工具。
## 五家的能力矩阵,差异都在哪几行?
下面这张表按它的跨运行环境能力矩阵文档 (https://github.com/wshobson/agents/blob/main/docs/harnesses.md)整理,只保留会影响你迁移决策的行。
能力 | Claude Code | Codex | Cursor | OpenCode | Gemini |
技能(原生格式) | 支持 | 支持 | 支持 | 支持 | 支持(自动发现) |
子代理(Markdown原生) | 支持 | 要转成TOML | 支持 | 支持(前置元数据不同) | 支持 |
斜杠命令 | 支持 | 被转成技能 | 支持 | 支持 | 转成TOML |
插件市场 | 支持 | 没有 | 支持 | 没有 | 没有 |
并行子代理 | 支持 | 支持 | 支持 | 支持 | 支持 |
逐代理工具白名单 | 支持 | 只有沙箱模式 | 只有只读开关 | 支持(权限块) | 支持 |
待办追踪工具 | 支持 | 没有 | 没有 | 支持 | 没有 |
派生子代理的工具 | 支持 | 只能在正文里点名 | 支持 | 支持 | 用@语法 |
协议服务 | 支持 | 支持 | 支持 | 支持 | 支持 |
生命周期钩子 | 支持 | 没有 | 没有 | 支持(脚本插件) | 没有 |
技能正文硬上限 | 无 | 8 KB | 无 | 无 | 无 |
把这张表读透,会得到一个和直觉相反的结论。
技能这一行,五家全绿。也就是说,你写的那些“知识包”——什么时候该怎么做、模板长什么样、有哪些坑——迁移风险基本为零。这是好消息,因为技能通常也是你花时间最多的那部分。
真正搬不动的是三行:逐代理工具白名单、待办追踪、生命周期钩子。这三样有个共同点,它们都不是“知识”,而是“约束”。你写下来的经验能跟着走,你设下的边界不能。
这个规律值得单独拎出来记:可移植的是你告诉它怎么做的部分,不可移植的是你限制它不许做什么的部分。而后者往往才是让流水线敢无人值守跑的那半边。站内那篇讲技能和子代理到底有什么区别、一个共享上下文一个独立窗口 (https://zhangwenbao.com/claude-skill-vs-subagent.html)的拆解可以配着看——技能之所以最容易搬,恰恰因为它本质上只是一份被按需加载的文档。
## 降级是静默的,这才是真正的风险
上面那张表还只是静态能力对比。真正危险的是降级发生的时候你收不到任何通知。
那份文档给了一张“优雅降级”表,把源里的每种写法在四个目标环境下会变成什么逐条列了出来。挑最要命的几条:
- 你在代理里写了工具白名单——在Codex里被丢弃,换成一个“只读沙箱”的启发式猜测;在Cursor里直接丢弃,因为Cursor不认这个字段;在OpenCode里被翻译成权限拒绝块;只有Gemini原样透传。
- 你给代理起名叫某个常见的通用词——在Codex里会被自动加上插件名前缀做命名空间隔离,其他三家原样保留。这意味着同一份配置在Codex和别处,代理的实际名字是不一样的,你正文里如果按名字引用过它,那段引用在一半环境里会失效。
- 你在正文里用了待办追踪——Codex、Cursor、Gemini都没有对应物,文档给的处理是“原样留着”。也就是说,那段指令会被当成普通文字读进去,模型可能会假装自己在维护一个待办列表,而实际上什么都没记。
- 你写了个颜色标记——五家全丢。这条无害,但它说明适配器确实在逐字段做决策。
第一条和第三条的组合,构成了这篇里我最想强调的风险:
> 你以为你给这个代理上了工具白名单,所以敢让它无人值守跑。搬到另一个环境之后白名单没了,而它照跑不误,也没有任何报错。
保哥去年帮一个客户做站内批量改造的时候就吃过类似的亏:换了一套跑批工具之后,原本限制“只改草稿不动已发布”的那道配置没跟着过来,一次批量跑下去动了三十几篇线上文章。所幸有备份,但那一天的心情不太好形容。
这不是那个仓库的设计缺陷,恰恰相反,它把这件事白纸黑字写出来了,已经比绝大多数迁移方案负责得多。问题在于会去读这份表的人太少,大部分人会在装完发现“能跑”之后就不再深究了。
## 怎么主动把静默降级逼出来
静默降级最难受的地方在于,正常使用的时候一切看起来都好。要发现它,只能主动去撞。
做法是准备一组本该失败的用例——注意是本该失败,不是本该成功。这跟平时写测试的直觉相反,但在这里是唯一有效的方式:
- 让一个只该读文件的代理去尝试写一个文件。预期是被拒绝,如果它写成功了,说明白名单没生效。
- 让一个不该出网的代理去请求一个外部地址。预期是被拦,成功了就是漏了。
- 跑一个会触发钩子阈值的批量操作。预期是中断等确认,一路跑完就是钩子没接上。
- 在正文里按名字引用一个代理,看它在各个环境里是不是都能被正确解析——前面提过,有的环境会给代理名加前缀,加了前缀之后按原名引用就找不到了。
这四条跑一遍不到二十分钟,但它们是唯一能把“配置写了但没生效”这类问题抓出来的手段。而这类问题的特点是:不主动去撞,它可以安安静静地存在好几个月,直到某一天以一种非常昂贵的方式暴露出来。
顺带说一句,这套“用本该失败的用例去验边界”的思路不限于Agent迁移。换缓存插件之后验一遍该缓存的有没有被缓存、该绕过的有没有绕过;换重定向管理之后验一遍旧链接还跳不跳——判据完全一样。
关于权限边界为什么不能当成优化项,站内那篇从安全评审到权限与提示注入防御的实战 (https://zhangwenbao.com/claude-code-security.html)讲得更细。这里只补一句:迁移之后,安全相关的配置必须重新验证一遍,不能假设它跟着搬过去了。
## 两个会直接截断的硬上限
整份文档里最具体、也最容易在实操中撞上的是两个数字。
## 技能正文8 KB
Codex对单个技能正文有8 KB的硬上限。超了会在加载时被截断——不是报错,是截断。适配器的处理方式是把超限的内容拆到一个引用文件里去,但如果你是手工搬运而不是走适配器,那么超出的那部分就是直接消失,而你不会收到任何提示。
8 KB大概是多少?中文按UTF-8编码一个汉字三字节,8 KB差不多是两千七百字。一份写得比较细的技能文档,加上几段示例,很容易就过线了。
这条还有个连带影响:它意味着技能要按“能被截断”来组织——最重要的判据写在最前面,示例和边缘情况放后面。这个写法在没有上限的环境里也不吃亏,因为渐进披露的机制本来就鼓励这么写。
## 一份超长的技能该怎么拆
撞上限之后最省事的做法是砍内容,但那通常会把有用的东西砍掉。更好的做法是按“被读到的概率”重新排版。
一份技能里的内容大致分三类,按优先级排:
- 触发判据和硬约束——什么情况下用它、绝对不能做什么。这部分必须在最前面,因为它是被截断之后唯一还留着的部分。
- 标准流程——正常路径怎么走。放中间。
- 示例、边缘情况、背景解释——放最后,或者干脆拆到引用文件里去。这部分体积最大而被读到的概率最低。
拆的时候有个容易犯的错:把示例整段挪走,却忘了正文里还写着“参见下面的例子”。挪走之后那句话就指向了空气,而模型看到这种悬空引用的反应通常是自己编一个。检查方法很土但有效——拆完之后把正文通读一遍,凡是出现“下面”“如下”“参见”的地方,确认它指的东西还在不在。
## 上下文文件32 KiB
同样是Codex,对那份上下文文件有32 KiB的上限。这个数字看起来宽松,但考虑到很多团队的规则文件是一路加出来的,撞线的概率并不低。
## 上下文文件那一栏,五家给出了同一个数
这是整份文档里最让我意外的一行。
五个运行环境的上下文文件叫法各不相同——Claude Code叫一个名字,Codex、Cursor、OpenCode都用AGENTS.md这个开放格式 (https://agents.md/),Gemini又叫另一个名字。文件名不统一,这在意料之中。
但推荐上限这一栏,五家写的是同一个数:150行、500词元。
五个由完全不同团队做的产品,在“这份文件该写多长”这件事上给出了完全一致的建议,这个巧合的信息量不小。它至少说明这个数不是某一家的产品偏好,而是大模型读长指令时那个共同的注意力衰减规律决定的。
站内那篇讲规则文件不是写得越详细越好、最优行数在哪 (https://zhangwenbao.com/claudemd-minimalist-guide.html)的实证复盘得出的结论和这个数字高度吻合。两条独立来源指向同一个数,那基本就可以当成硬约束用了。
换算成中文:500词元大概是三百到四百个汉字。这意味着你那份规则文件的正文,应该短到能一屏看完。剩下的东西全部下沉到技能里去,靠按需加载而不是常驻。至于规则文件和给人看的说明文档该怎么分工,站内那篇讲两者区别、一个给AI一个给人的对照 (https://zhangwenbao.com/claudemd-vs-readme.html)把边界划得比较清楚。
## 装法分两档:能一步装的和必须先编译的
这一节是纯操作层面的,但它直接决定了你的迁移成本。
那个仓库做了一个我觉得挺聪明的取舍:只把小体积的注册表文件提交进仓库,转换出来的那些庞大的技能和代理目录树全部忽略掉,让用户本地重新生成。文档里管这叫“精简权衡”。
后果是安装路径分成两档:
- 能一步装的:Codex和Cursor。因为提交进仓库的那些注册表直接指向源目录,这两家能顺着指针把源文件读进去,一条命令搞定。Codex这个终端编码代理 (https://github.com/openai/codex)甚至能在仓库就是当前目录的时候自动发现它。
- 必须先编译的:Gemini和OpenCode。没有从地址一步安装这条路,必须先把仓库克隆下来,跑一次生成命令,再从本地路径装。Gemini这个命令行代理 (https://github.com/google-gemini/gemini-cli)的扩展安装走的就是本地路径这一条。
这个差别对评估迁移成本很关键:能一步装意味着可以让每个同事自己装;必须先编译意味着你得准备一套内部分发流程。后者的实际工作量,通常比“换一个工具”这句话听起来大一个量级。
还有个细节值得学:那个仓库在持续集成里加了一道检查,提交的注册表和源文件对不上就直接失败。这是个很实在的设计——一份源多份产物这种结构,最常见的事故就是改了源忘了重新生成,让机器去盯比让人去记靠谱得多。
## 模型别名怎么映射?
这一栏藏着一个容易忽略的成本问题。
你在代理里写的模型别名,会被适配器映射成各家自己的型号。同一个别名在五家的落点是这样的:
源里写的 | Codex | Cursor | OpenCode | Gemini |
顶配档 | 映射到该家旗舰型号 | 改写成“继承” | 改写成完整型号标识 | 映射到该家专业型号 |
最长时程档 | 同样映射到旗舰型号 | 改写成“继承” | 改写成对应完整标识 | 同样映射到专业型号 |
注意Cursor那一列:它把所有模型指定全部改写成“继承”,也就是跟着用户在界面里选的模型走。这意味着你精心设计的分档策略——重要的用贵模型、琐碎的用便宜模型——在Cursor里整个失效了,全都跑在用户当前选的那个上。
如果用户选的是最贵那档,你的成本会静默上涨;如果选的是最便宜那档,你那些依赖强推理的代理会静默变笨。两个方向的失效都不报错。
还有一个更细的坑:Codex那一列把“顶配”和“最长时程”两个不同的档位映射到了同一个型号。源里的两档区分在那边被压平了,你以为还在分档,实际上没有。
## 它把SEO放进了最便宜的那一档
这一节跟迁移没关系,但我看到的时候确实愣了一下。
那个仓库公布了一份分层模型策略,从0到4五档。第0档给最长时程的自主工作,比如大规模迁移、跑好几小时的任务;第1档给架构、安全、代码评审这类生产关键任务;第2档交给用户自己选;第3档给文档、测试、调试;第4档,也就是最便宜最快的那一档,写的是“快速运维任务、SEO、部署、内容”。
SEO和部署、内容一起,被归进了“快速操作”。
我不打算把这解读成什么行业歧视——从它的代理清单看,那些标着SEO的代理确实多数是执行型的:生成描述、批量补标签、检查基础项。用便宜快的模型跑这些,是完全正确的工程决策。
但这个归类暴露了一个更普遍的认知:SEO在工具生态里被默认成了一件“照着规则填空”的事。
而实际做过的人都知道,SEO里真正难的那部分长什么样:这两个页面该不该合并、这个词值不值得做、这次流量掉了是算法更新还是自己改坏了、这批AI生成的内容会不会被判成垃圾。这些判断的共同点是——你得把好几个互相独立的信息源串起来,才能得出结论。
而“需要跨多个来源串起来才能确认”这个特征,恰好也是安全审计那一类任务的特征,也就是被放进第1档的那些。同一种认知难度,因为顶着不同的名字,被分进了最贵和最便宜两档。
实操上的启示很直接:如果你要用这类插件市场里的SEO组件,先看它给这个代理指定了哪一档模型,再决定要不要覆盖。纯执行型的保持便宜档没问题,凡是涉及判断的那些,该往上调就往上调——省下的那点钱,赔不起一次判断失误。站内那篇讲AI都用来写稿、真正拉开差距的其实是判断层 (https://zhangwenbao.com/ai-judgment-layer-vs-execution-layer-seo.html)的分析,讲的正是这条分界线。
## 拿一条真实的流水线走一遍会怎样?
前面全是逐行对照,容易看着看着就抽象了。这一节把它落到一个具体场景上。
假设你在做一个跨境独立站,有一千两百个商品页要补多语言描述。保哥手上这类项目做过不少,典型的资产构成是这样的六件:
- 一份写描述的技能,里面写了品类词该怎么处理、哪些表述在目标市场是雷区、句长控制在什么范围。
- 一份本地化技能,写清楚每种语言的度量单位、日期格式、货币符号位置。
- 一个校验子代理,专门检查生成结果:字数在不在区间、核心词有没有被改写掉、有没有把品牌名翻译掉。
- 一条斜杠命令,把上面三个串起来跑一批。
- 一个工具白名单,限定这批代理只能读文件和调翻译接口,不许写数据库、不许发网络请求到别的地方。
- 一个提交前钩子,任何一次写入超过五十条就中断,等人确认。
## 搬完之后剩下什么
按前面那张表逐条对:
- 前两件(技能)——全须全尾搬过去。这也是你花时间最多的两件,好消息。唯一要做的是量一下体积,本地化那份如果把五六种语言的规则都写在一起,很可能超过8 KB。
- 第三件(子代理)——能搬,但格式要转。在Codex里要变成另一种配置格式,在OpenCode里前置元数据的写法不一样。走适配器就是自动的,手工搬就要注意。
- 第四件(斜杠命令)——在Codex里会变成技能。这是这条流水线里第一个实质性的行为变化:原本你敲一下它必然执行,现在变成模型看情况触发。对一条要跑一千两百次的批量任务来说,这个变化不可接受。
- 第五件(工具白名单)——在两家直接消失。而它恰恰是你敢让这批代理连着跑几个小时的原因。
- 第六件(钩子)——在三家直接消失。那道“超过五十条就停下来等人”的保险,没了。
六件资产,两件完好、一件要转格式、三件受损。而受损的那三件,全都集中在“保证这件事按预期发生”这个维度上。
## 受损的那三件,各自该怎么补
好消息是三件都有替代方案,只是要把它们从工具内部挪到工具外部。
命令变技能的那一条,补法是把入口挪到工具外面:写一个脚本,由脚本按批次去调用,而不是靠模型自觉触发。这样触发的确定性重新回到你手里,代价是要多维护一个脚本。
工具白名单没了的那一条,补法是在环境层面上收权限:跑这批任务的时候用一个受限的凭据,数据库连接给只读、翻译接口之外的出网直接在网络层拦掉。把约束从“应用配置”下沉到“运行环境”,是所有跨工具迁移里最保险的一招——环境不认得你在用哪个工具,所以它的限制不会因为换工具而失效。
钩子没了的那一条,补法是把闸门挪到写入端:不让代理直接写库,改成先写一个待应用的变更文件,再由另一个进程读这个文件去应用,条数校验放在那个进程里。多一个中转步骤,换回一道不会跟着工具走的保险。
三条补法有个共同的形状:把约束从工具里挪到工具外。这样做的额外好处是,下次再换工具的时候,这三件事一件都不用重做。站内那篇讲AI内容流水线为什么会被降权、三处人工节点卡在哪 (https://zhangwenbao.com/ai-content-pipeline-deindex-anti-spam-3-human-checkpoints.html)的复盘讲的就是这几道外部闸门具体该设在什么位置。
## 一个反直觉的结论
走完这一遍,会发现迁移成本的分布跟大部分人预期的正好相反。
大家担心的通常是“我写的那些提示词和经验是不是白写了”,而这部分恰恰是最安全的。真正要重做的是那些当初写起来最快、最不起眼的几行配置——一行工具白名单、一个钩子、一条命令定义。写得越快的东西,越可能是绑得最死的东西,因为它之所以能写得那么快,正是因为那家工具替你把复杂性都吸收掉了。
## 怎么给自己的任务分档
与其接受别人给的分档,不如自己重分一遍。判据其实只有一个问题:做这个判断,需不需要把两个以上互相独立的信息源拼起来?
按这个问题过一遍常见的SEO任务,分档结果和那份现成的表出入不小:
- 只看一处就能决定的——描述超没超字数、标题里有没有核心词、图片缺不缺替代文字、结构化数据格式合不合法。这些确实该用最便宜最快的档,而且用贵的也不会更准。
- 要看两处的——这个页面和那个页面是不是在抢同一个词、这批新内容和站内已有内容重不重。要同时持有两份材料并做比较,便宜档已经开始吃力。
- 要看三处以上的——流量掉了是算法更新、自己改坏了、还是季节性;这个词值不值得做要同时看搜索量、竞争度、你自己的内容储备和转化路径。这一档跟安全审计是同一个认知难度,就该用同一档模型。
这个分法的好处是它跟任务名字无关,只跟结构有关。一个叫“SEO检查”的任务可能落在第一档,另一个也叫“SEO检查”的任务可能落在第三档——用名字分档必然分错,用结构分档才分得对。
顺带说一个反向的省钱技巧:第三档任务里有相当一部分工作量其实是第一档的(收集材料、整理格式),可以拆成两步,用便宜模型把材料备齐,只把最后那个判断交给贵模型。实测下来这种拆法通常能省掉六成以上的开销,而结论质量没有可察觉的下降。
## 迁移之前该做的四件事
把上面所有东西压成动作。假设你现在真的要把一批Agent资产从一个工具搬到另一个:
## 一、先把资产按“知识”和“约束”分成两堆
知识那堆——技能、模板、经验文档——基本能整批搬走,先不用管。约束那堆——工具白名单、权限设置、钩子、待办追踪——假设它们全部搬不过去,逐条列出来,然后在目标环境里找对应物。找不到对应物的,要么换一种实现方式,要么把对应的自动化降级成有人值守。
## 二、量一遍长度
把每份技能的正文体积过一遍,超过8 KB的先拆。把规则文件的行数数一遍,超过150行的先精简。这两件事在迁移前做是十分钟的活,迁移后发现内容被截断了再回头查,是一整天的活。
## 三、把模型指定全部显式化
别依赖别名映射。搬过去之后,逐个代理确认它实际跑在哪个型号上——尤其是那些你特意指定了贵模型的。前面说过,有的环境会把你的指定整个改写成“跟着用户选”,这种失效不会报错。
## 四、准备一组能验证“搬对了”的用例
这一步最容易被跳过,也最不该跳过。挑五到十个有代表性的任务,在旧环境里跑一遍记下输出,搬完之后在新环境里跑同一批,逐个对照。
重点不是看结果对不对,是看那些本该被拦住的操作有没有被拦住——故意让它去碰一个白名单外的工具,看它是被拒绝了还是顺利执行了。这一条测的正是前面那个静默降级的风险,而它是唯一能测出来的方式。
## 常见问题解答
## 技能真的能一份写完到处用吗?
正文内容基本可以,边界条件不行。除了8 KB上限,还有一个细节:工具名的大小写各家不一样——有的用大驼峰,有的严格要求全小写,有的干脆建议正文里不要出现任何工具词汇、改用动作动词描述。所以最稳的写法是在技能正文里尽量别提具体工具名,改成描述你要它做什么,把工具的事交给环境去解决。这个写法迁移成本最低,而且在单一环境里也不吃亏。
## 为什么不干脆用最小公约数,写所有平台都支持的东西?
因为最小公约数很小。看那张表就知道,五家全绿的只有技能、并行子代理和协议服务这三行,其余全是不对称的。真按交集写,你会失去工具白名单、钩子、待办追踪、插件市场——也就是把整个约束层丢掉。这个代价比多维护几份适配器大得多。
## 哪一类资产最值得优先固化?
技能。理由有三条:它五家全兼容、它承载的是你真正积累下来的经验、而且它有一个开放标准在推进。Agent Skills这个开放标准 (https://agentskills.io/home)已经有多个框架声明兼容,往这个方向投入的资产,未来的迁移面会越来越宽。相反,最不值得深度投入的是那些绑死在某一家专有机制上的东西。
## 斜杠命令被转成技能,会有什么实际影响?
触发方式变了。斜杠命令是你显式敲出来的,模型必须执行;技能是靠描述匹配触发的,模型可能不触发。一个原本百分之百会跑的东西,变成了一个大概率会跑的东西。如果这个命令承担的是流程里的关键一步(比如发布前必跑的检查),转换之后就需要在别处补一道硬保障,不能指望它自觉。
## 一次装多少个插件合适?
越少越好,按任务装、用完卸。这个仓库自己的架构说明也是这个态度:每个插件是独立可组合的,装一个插件只加载它自己的组件,不加载整个市场。但即便如此,装得越多路由越模糊——当四个插件都声称自己管“建一个后端服务”的时候,模型选哪个基本靠运气。正确的心智模型是把它当目录查,不是当框架装。
## 多个插件同时装,路由会乱到什么程度?
会比想象中乱。问题不在插件本身冲突,在于描述重叠:当四个插件的描述里都写着自己擅长“搭建后端服务”,模型选哪个基本没有稳定规律,同一句话问两遍可能走两条路。
更麻烦的是这种不稳定不会报错,只会表现为“今天效果好、明天效果差”,而你会误以为是模型的问题。实用的判别方法是:同一个任务连着问三遍,看它是不是每次都走同一条路。不是的话,先去卸插件,别去改提示词。
## 该不该为了可移植性,主动放弃某些好用的功能?
大部分情况下不该。可移植性是保险,不是目标——为了保险而放弃日常效率,账通常算不过来。保哥的做法是分两档:日常提效的东西该用什么用什么,不考虑迁移;但凡是流程里的关键闸门,一律做成不依赖具体工具的形式。前者坏了你损失的是效率,后者坏了你损失的是数据。两者的容错空间完全不同,所以标准也该不同。
## 怎么判断一个新工具值不值得迁过去?
先别看功能表,先看它认不认那两份开放格式——上下文文件的格式和技能的格式。认,说明你已有的资产至少有一部分能直接落地,迁移是增量的;不认,意味着你要从零重建,那这个决定就不是“换个工具”而是“重做一遍”,评估标准得整个换掉。这一条比任何功能对比都更能决定迁移的实际代价。
## 对做独立站的人,这套东西最实际的用法是什么?
两条。第一,把你已有的重复动作先写成技能,不要写成命令或者钩子——技能是可移植性最好的那一档,等于给自己留了后路。第二,凡是涉及“不许它做什么”的部分,别只写在配置里,同时在流程外面加一道:发布前的人工确认、写库前的字段校验、批量操作的条数上限。这些外部保障不依赖任何一家工具,也就不会在换工具的时候跟着丢。
## 权威参考资料
## Codex App怎么用?并进ChatGPT桌面端后的工作流、计费与避坑
- URL:https://zhangwenbao.com/openai-codex-app-guide.html
- 分类:AI编程与工具链
- 发布:2026-07-14 | 更新:2026-07-30
- 摘要:Codex并进ChatGPT桌面端之后怎么用?讲清平台门槛与六层配置优先级、工作树三选一与交接机制的真实用法、代币与接口价的换算关系,以及四笔容易让额度提前见底的隐藏消耗。
- 关键词:Claude Code,AI编程,开发技巧,Codex,终端代理
> **TLDR**:摘要:Codex不再是一个单独下载的应用,它成了ChatGPT桌面端里与聊天、办公并列的一种模式,所有付费档位都含,免费档也能用。真正值得先搞清楚的有三件:并行开发用的工作树不是自动创建的,你得在开对话时手动选,还要挑起始分支;配置也不止用户目录那一个文件,一共六层优先级外加一道项目信任门;计费单位换算下来是一枚代币约合四美分的接口价值,而缓存过的输入只要十分之一。这篇按装、配、跑、算的顺序把这四件事讲透,附官方给的六条省额度办法和一份踩坑清单。
> 摘要:Codex不再是一个单独下载的应用,它成了ChatGPT桌面端里与聊天、办公并列的一种模式,所有付费档位都含,免费档也能用。真正值得先搞清楚的有三件:并行开发用的工作树不是自动创建的,你得在开对话时手动选,还要挑起始分支;配置也不止用户目录那一个文件,一共六层优先级外加一道项目信任门;计费单位换算下来是一枚代币约合四美分的接口价值,而缓存过的输入只要十分之一。这篇按装、配、跑、算的顺序把这四件事讲透,附官方给的六条省额度办法和一份踩坑清单。
一个产品在半年里换了三次形状,通常说明它的团队自己也在找位置。2026年7月9日,OpenAI把原本独立的Codex桌面应用并进了重写的ChatGPT桌面端,Codex成了与Chat、Work并列的一种模式;老的那个ChatGPT桌面应用改名叫Classic。
合并这件事本身,有一个比任何公告都硬的旁证:开发者文档站上那条Codex定价页的地址,现在会308永久重定向到ChatGPT的学习文档域名下。产品并了,文档也跟着搬了家——这种改动不会为了做样子而做。
下面这篇不打算复述发布会讲了什么。它想回答的是几个更实际的问题:这东西装在什么机器上、配置到底读哪些文件、那个被吹得最响的并行能力究竟怎么用、以及每个月的钱花在了哪里。
## 合并之后,Codex到底还算不算一个独立产品?
算,也不算。准确的说法是:Codex是一个智能体内核,穿了四套衣服。
入口 | 形态 | 擅长 |
ChatGPT桌面端的Codex模式 | 图形界面 | 并行开对话、看差异、审查合并请求 |
Codex命令行 | 终端,开源 | 脚本化、接持续集成、定时任务 |
Codex云端 | 浏览器 | 派活出去,回头再收 |
编辑器插件 | 嵌在IDE里 | 写代码时随手唤起 |
四个入口读同一份仓库约定文件、共享用户级配置、消耗同一份订阅额度。所以在桌面端学会的东西,换到命令行一点不浪费,反过来也一样。这个判断很重要,因为它直接决定了后面所有取舍的形状——你不是在选产品,你是在选一个界面。
OpenAI愿意做这次合并,背后是一组挺反常的用户构成:官方公开过的数字里,Codex的周活从2026年初的六十万一路涨到年中的五百万级别,而其中约两成用户根本不是开发者,非开发者这一群的增速还是开发者的三倍。市场、财务、法务的人自发在用一个为工程师做的工具,这就是它最终被塞进消费级旗舰应用的原因。
## 这次合并对你意味着什么
抛开商业叙事,合并留下三个实际后果,每一个都会影响你怎么用它。
第一,它的路线图现在向一个消费级产品汇报。这不是坏话,是需要计入预算的变量:接下来几个季度的功能取舍,会更多考虑那两成非开发者,而不是你。把它当成一个会持续变形的东西来用,别把关键流程焊死在某个界面细节上。
第二,早期的合并构建确实丢了一批东西。临时聊天、语音模式、深度研究、自定义助手在合并初期缺席,聊天历史被塞进一个只显示三四条的小弹窗。如果这些对你重要,把改名为Classic的旧应用留着并行用一段——虽然把一个还在用的产品命名成经典版,读起来确实很像一张弃用通告。
第三,也是最容易被忽略的:macOS上应用标识变了。从原本的ChatGPT标识换成了Codex标识,钉在旧标识上的设备管理策略、白名单、自动化脚本会悄无声息地失效。管设备的人请先更新策略,再让同事更新应用,顺序反了会有一段时间的合规空窗。
## 还有一个混乱是产品自己造出来的
合并之后最高频的吐槽不是缺功能,是分不清Work模式和Codex模式。在两者之间来回切,很多任务下界面几乎没有变化,官方也没把差异讲透。
在这块体验被修好之前,一条能用的土规则是:跟仓库相关的活走Codex模式,因为只有它有工作树和差异审查;文档、表格、调研这类走Work模式。别指望那个切换按钮会给模型换个脑子,它换的主要是这一套围绕代码的工作台。
## 装之前要先确认哪几件事?
硬件门槛会直接排除一批人,所以放在最前面。桌面端只支持Apple Silicon的macOS和Windows;官方下载页给macOS标的就是Apple Silicon,Intel机器出局。没有Linux版本,也没有任何时间表。Linux用户到这里就可以打住,直接去用命令行版本——同一个智能体、同样的额度,只是没有图形界面。
安装本身没什么可讲的:下载、用ChatGPT账号登录、指向一个项目文件夹。值得单说的是登录这一步——它不要接口密钥。计费直接挂在你已有的订阅上,这是它和绝大多数智能体工具最大的上手差异,也是它敢说边际成本为零的底气。
还有一件该在跑第一个正经任务之前做的事:检查仓库里的约定文件。如果之前给命令行版写过,桌面端读的就是同一份;没有的话,先把构建命令、测试命令、目录约定写进去。这一步跳过去,后面每一次对话都要重新解释一遍项目长什么样,而这些解释是要花钱的。
## 第一天就该顺一遍的四件事
装完到跑第一个真任务之间,有四件事值得花十分钟顺一遍,它们决定了后面几个月的体验。
一是选好权限姿势。和命令行一样,桌面端的智能体跑在文件与网络访问受限的沙箱里,要提权会先问你。第一次上手别急着把审批调到从不询问,先用默认跑几个任务,看清楚它在什么时候会伸手要权限,再决定放宽哪一格。
二是把项目按信任分级。自己的仓库标受信任,克隆来试的陌生仓库保持默认。这一步的收益在下一节会讲清楚,但现在先形成习惯成本最低。
三是想清楚本地还是云端。桌面端区分本地环境和云端环境:本地是智能体在你机器上干活,云端是任务跑在服务商的基础设施上。云端能让你在手机上派活、回来再审,但它和本地消息吃同一份额度窗口,这一点后面单独展开。
四是先跑一个你已经知道答案的任务。这条听起来多余,实际上是最省时间的:拿一个你自己十分钟能做完、且知道正确结果长什么样的活让它做一遍。你要看的不是它做没做对,是它的提权时机、差异呈现方式、以及审查界面用起来顺不顺手。这些没法从任何评测里读到。
## 配置真的只有一个文件吗?
流传最广的说法是用户级设置放在主目录下的~/.codex/config.toml,三个入口共享。这话没错,但它只说了六分之一。
官方配置文档 (https://developers.openai.com/codex/config-file/config-basic)给出的解析顺序是六层,从高到低:
- 命令行参数与临时覆盖
- 项目配置文件.codex/config.toml,从仓库根目录往当前工作目录逐级读,最近的那一层赢
- 用参数选中的档案文件
- 用户配置~/.codex/config.toml
- 系统配置,类Unix上是/etc/codex/config.toml
- 内建默认值
## 那道最容易被忽略的信任门
第二层有个前置条件:项目级配置只在你把这个项目标记为受信任时才加载。标记为不受信任,Codex会跳过整个项目级目录,包括项目本地配置、钩子和规则;用户级和系统级的仍然照常加载。
这个设计的意义比它看起来大。克隆一个陌生仓库跑一下,这是每个人每周都在做的事,而仓库里可以躺着一份把审批策略调松、把沙箱模式调到完全放开的配置。信任门就是拦这个的。反过来说,如果你发现自己精心写的项目配置似乎没生效,第一个该查的不是语法,是这个项目有没有被标成受信任。
## 受管机器上还有一层
企业环境里还有一份要求文件,组织可以用它强制约束,比如禁止把审批策略设成从不询问、禁止把沙箱模式开到完全放开。这一层是员工改不掉的。管设备队伍的人如果只知道那个用户目录里的文件,会误以为个人配置能覆盖一切——实际上顺序正好反过来,组织约束在最外面。
## 一线程一工作树这个说法,到底哪里不对?
这是本文最想纠正的一处。二手介绍里流传最广的版本大致是:你在项目里新开一个对话,Codex就悄悄为它建一个Git工作树,你什么都不用管,对话关掉自动清理。
听起来很美,也确实是很多人决定装它的理由。但官方文档 (https://developers.openai.com/codex/environments/git-worktrees)写的不是这样。
## 它实际上是三选一
开新对话的时候,你要在输入框下方选这个对话跑在哪:
位置 | 含义 |
本地 | 直接在你当前的项目目录里干活 |
工作树 | 把改动隔离在一个Git工作树里 |
云端 | 跑在配置好的云环境里 |
选了工作树,还要再选一件事:基于哪个分支创建。可以是主干、某个特性分支,也可以是带着未暂存改动的当前分支。提交之后Codex才会建出工作树,而且默认让你工作在分离头指针状态。
另外两条限制也得说清楚:工作树只在桌面端的Codex模式里有,命令行和插件都没有;而且它要求项目本身在一个Git仓库里,因为它底层就是Git工作树。
## 真正的新东西叫交接
比自动创建更值得关注的,是官方给的那个交接流程——在本地检出和工作树之间搬运一整个对话,Git层面的操作由Codex代劳。
为什么需要它?因为Git有一条硬约束:同一个分支同一时间只能在一个地方检出。你在工作树上检出了某个分支,本地检出就不能再检它,反过来也一样。手工来回倒腾这件事,是并行开发里最容易把自己绕晕的一步。交接把这段体力活自动化了。
顺着这个机制,官方给的心智模型也很清爽:本地是前台,工作树是后台。需要你盯着调、要跑依赖、要人工验证的活留在前台;能排队后台跑的丢进工作树,回头再交接回来审。真要说这个应用有什么设计得漂亮的地方,是这一条,不是那个并不存在的自动创建。
## 定时任务会自己去后台
还有一处二手资料普遍没提:Git仓库里的定时任务可以跑在专用的后台工作树上,避免和你手头正在做的事冲突;而在非版本控制的项目里,定时任务就直接在项目目录里跑。这个差别对排定时活的人是实打实的——前者可以放心让它半夜跑,后者你得先确认自己不在同一个目录里改东西。
顺带一提,如果你更熟悉终端那一侧的并行方案,把两边的模型对照着看会更快理解,之前那篇一个仓库并行跑多个AI任务 (https://zhangwenbao.com/claude-code-worktree.html)讲的是同一件事的另一种实现路径。
## 什么时候该开工作树,什么时候纯属添乱
知道了它是手动的,下一个问题就变成了什么时候值得手动那一下。
适合开工作树的活有三个共同特征:耗时长、不需要你中途介入、改动面可能很大。大范围重构、批量补测试、把某个依赖升个大版本,这些丢进工作树最合适——它们跑起来要几十分钟,期间你完全可以在本地干别的,而且万一跑歪了,丢掉整个工作树比在主目录里回滚干净得多。
不适合的也很清楚:改一行配置、调一个样式、修一个明确的小报错。这类活开工作树是纯粹的仪式开销,你得选分支、等它建、跑完还要交接回来,总时间比直接在本地改长得多。
中间还有一类容易判断错的:需要跑起来才能验证的活。比如改完要启动开发服务器看效果、要连本地数据库跑一遍。工作树是一份独立检出,依赖和环境变量不会自动跟过去,得先给它配好本地环境的初始化脚本。愿意配就留在工作树,不愿意配就老老实实在本地做——半配不配是最难受的状态。
## 并行到底能开几路
技术上没有硬性上限,但有两条现实约束。一条是你自己的注意力:轮流审三份差异,比实时盯着一个智能体思考要高效得多,可这个优势在第四第五份之后会迅速衰减,因为你开始记不清哪个改动属于哪条线。
另一条是磁盘。每个工作树都是一份完整的文件检出,只共享Git元数据。一个几百兆的前端仓库开五路,就是几个G。有人报告过应用会在文档目录里自建文件夹,叠加上没清理的工作树,磁盘杂物能积累得超出想象。干完的对话及时关掉让清理跑起来,别留十几个活工作树过夜。
## 那些看着像内建的能力,其实是什么?
桌面端最吸引眼球的两个能力,是能自己开网页的浏览器和能操作图形界面的电脑使用。很多介绍把它们讲得像开箱即用,实际上两个都是要单独安装的插件。
## 内置浏览器
它给你和模型一个共享的网页视图,可以预览页面、留视觉批注,也可以让模型代你在站点上操作。快捷键是macOS上的Cmd+Shift+B、Windows上的Ctrl+Shift+B。
两个容易踩空的地方:第一,它用的是一份独立的浏览器档案,不会自动共享你现有的标签页和登录状态,需要账号就得在里面重新登一次;想用你日常那个Chrome的档案,得改装Chrome扩展那条路。第二,浏览器在命令行和编辑器插件里都不可用,只有桌面端和网页版有。
官方在这一节写了一句很克制但很重要的提醒:把页面内容当作不可信的上下文来对待。这不是免责声明,这是提示注入的正式说法——页面上任何一段文字都可能是写给模型看的指令。
## 电脑使用
官方文档 (https://developers.openai.com/codex/computer-use)说得很直白:它能看见并操作macOS或Windows上的图形界面,用在命令行工具和结构化集成都够不着的地方——查一个桌面应用的状态、改某个应用的设置、复现一个只在图形界面里出现的问题。
装它要给权限。macOS上要授予屏幕录制和辅助功能两项,前者让它看见,后者让它操作;Windows上则要保证目标应用在活动桌面上可见。设置里有一个应用授权面板,批准过的应用会进入一个始终允许列表。
这份权限清单本身就是风险提示。一个能看你屏幕、能点任何东西的智能体,一旦任务里混进恶意内容,横向移动的空间非常大。按任务授权具体应用、永远不给全局授权,是唯一说得过去的用法;密码管理器和网银标签页离它越远越好。
## 一枚代币到底值多少钱?
这是最值得算清楚的一节,因为算完之后很多选择会自己浮出来。
## 先看官方费率表
官方计费文档 (https://learn.chatgpt.com/docs/pricing)给的是每百万词元消耗多少代币,注意中间那一列——缓存过的输入只要正常输入的十分之一。
模型 | 输入 | 缓存输入 | 输出 |
GPT-5.6 Sol | 125 | 12.5 | 750 |
GPT-5.6 Terra | 62.5 | 6.25 | 375 |
GPT-5.6 Luna | 25 | 2.5 | 150 |
GPT-5.4 mini | 18.75 | 1.875 | 113 |
GPT-Image-2生图 | 200 | 50 | 750 |
## 拿接口价一除,汇率就出来了
把这张表和接口定价页 (https://developers.openai.com/api/docs/pricing)并排看:Sol每百万输入词元5美元、缓存输入0.5美元、输出30美元;Terra是2.5、0.25、15;Luna是1、0.1、6。
逐格一除,全部落在同一个数上:1枚代币等于4美分的接口价值。125对5美元、12.5对0.5美元、750对30美元,Terra和Luna同样闭合,连GPT-5.4 mini那个看起来不整的113也是112.5四舍五入的结果。这不是巧合,是刻意设计的整齐——你的订阅本质上是一笔按高倍率预付的接口余额。
官方还给了另一个能直接用的数:GPT-5.6平均每条消息消耗5到40枚代币。换算过来就是每条消息0.2到1.6美元的接口等值。拿这个去比每月20美元的订阅,杠杆倍率高得有点离谱——这也解释了为什么按接口密钥自己跑同样的量,账单会比订阅难看很多。
要提醒的是,官方明确说这些额度和代币数都是平均速率,不是保证值。同一份文档还写了一句很实在的话:看起来相似的任务消耗可能差很多,模型选择、上下文、推理、工具调用、检索、缓存都会影响用量,光看提示词长度估不准。
## 三个模型该怎么分工
官方给的定位是:Sol用在质量和推理深度最要紧的时候,比如复杂分析和高阶工作流;Terra是日常默认,能力和性价比平衡得最好;Luna为速度和低成本优化,适合轻量或者高吞吐的活。
把费率叠上去,这个建议会变得更锋利:Luna每词元的开销只有Sol的五分之一。而修测试、小重构、批量改脚本这类日常活,质量差距很少配得上五倍的烧钱速度。一个能直接照抄的默认是:Terra当主力,杂活批量跑Luna,Sol留给那些你本来会交给资深工程师的任务。
## 额度是按模型分行的,不是按档位一个数
流传的说法里,Plus档常被简化成一句“每五小时大约二十到一百一十条”。这个数字本身没错,但它只是Terra那一行。官方的额度表是一个矩阵:
模型 | Plus与Business | Pro 5倍 | Pro 20倍 |
GPT-5.6 Sol | 15–90 | 75–450 | 300–1800 |
GPT-5.6 Terra | 20–110 | 100–550 | 400–2200 |
GPT-5.6 Luna | 50–280 | 250–1400 | 1000–5600 |
GPT-5.4 mini | 60–350 | 300–1750 | 1200–7000 |
换个模型,可用条数能差五倍以上。所以“额度不够用”这句抱怨,很多时候真正的意思是“一直在用Sol干Luna就能干的活”。
还有两列在表里全是不可用,容易让人误会:云端对话和代码审查那两列目前没有公布具体数字。但脚注写得很清楚,本地消息和云端对话共享同一个五小时窗口,另有周级别的限额叠在上面。至于代码审查,只有通过代码托管平台跑的那种才单独计入——你在本地让它审一遍差异,走的还是通用额度。
## 三类用户的账单大概长什么样
把上面的数字组合一下,能拼出三张有代表性的账单。这些是量级估算,不是承诺。
一个人做独立站,每天两三个小时。典型用法是改模板、调样式、写点脚本、批量处理商品数据。这类活八成可以跑Luna,Plus档每五小时50到280条,基本用不完。每月20美元封顶,这是性价比最高的一档,没有升级的必要。
小团队做产品,每人每天高强度用。主力跑Terra,复杂设计和疑难排查偶尔上Sol。这时候Plus的20到110条会开始紧张,尤其是下午连着开三条并行线的时候。判断要不要升Pro的标准不是感觉,是看用量面板:如果每周有三次以上撞到窗口上限并且被迫等待,升档换来的时间比省下的钱值钱。
要接自动化和定时任务。这一类不该走订阅,该走接口密钥。原因不是价格,是权限姿势——命令行的执行命令默认只读、需要显式提权,这才是自动化该有的样子,而图形界面既做不到也没法被程序驱动。混合用是完全正常的:人工交互走订阅,机器跑的活走密钥,两边的账分开看反而更清楚。
如果你还在同时评估另一家的订阅,两边的限额机制其实差别不小,五小时窗口与周限额到底怎么算 (https://zhangwenbao.com/claude-rate-limits.html)那篇把另一侧的双层窗口拆得比较细,对照着看能少踩不少想当然的坑。
## 档位价目与两个容易看漏的条款
订阅档从免费到定制一共六档:免费0美元、Go每月8美元、Plus每月20美元、Pro从每月100美元起(5倍或20倍,20倍是200美元)、Business每用户每月20美元、企业与教育版联系销售。
Business那一档有两个附加条件常被漏掉:20美元是两人起、按年付的价格,按月付是每用户25美元。团队做预算时按25算,签合同时再谈年付,比反过来安全。
另外Pro档还独占一个研究预览阶段的快速模型GPT-5.3-Codex-Spark,跑在专用低延迟硬件上,用量走一条单独的限额,接口暂时不提供。想清楚这一点再决定要不要升Pro——它不只是额度乘个系数。
## 官方自己给的省额度办法有哪几条?
与其自己琢磨,不如直接看官方在计费文档里列的那几条。它们排得很实在,而且有两条明显是站在自家产品对立面说话的。
- 控制提示词体积。指令要精确,但把不必要的上下文删掉。
- 限制素材范围。只给相关文件,能缩小来源或时间范围就缩小。
- 让产出匹配需求。先定受众、格式和长度,把必须做的和锦上添花的分开。
- 缩小仓库约定文件。大项目可以把约定文件按目录嵌套,控制每次注入多少上下文。
- 少挂几个工具服务。官方原话是每一个都会给消息追加上下文、吃掉更多额度,不用的时候就禁用掉。
- 日常任务换小模型。换到更小的档能明显拉长本地消息的可用条数。
倒数第二条尤其值得停一下。一个服务商在自己的计费文档里主动劝你少挂它自家生态的扩展,这种自曝短处的坦白不常见,也基本可以当作定论——常驻扩展的上下文开销是真实的、可观的、而且你付了钱。这一点在别的智能体工具上同样成立,只是很少有人把它写进官方文档。
## 把这六条翻译成能执行的动作
官方的表述偏原则,落到具体操作大概是这样几件事。
约定文件那条最容易见效。很多人的仓库约定文件写了几百行,把编码规范、目录说明、历史决策全塞了进去,而这些内容每一次对话都要重新交一遍钱。按目录嵌套之后,前端目录下的对话只加载前端那一份,后端同理,单次注入量能砍掉一大半。判断该不该留的土办法:这一行如果模型不知道,它会做错吗?不会就删。
素材范围那条对做内容和数据的人尤其重要。让它读整个导出的商品表,和让它读筛选后的三百行,产出质量差别不大,费用差好几倍。养成先筛后问的习惯,比任何模型选择的技巧都省钱。
产出匹配需求那条最反直觉:输出比输入贵得多。看那张费率表,输出的单价是输入的六倍。所以“顺便再帮我写份文档”这种随口追加,成本远高于它听起来的样子。先说清楚要多长、给谁看、什么格式,能挡掉大量没人会读的字。
## 缓存那一列才是最大的杠杆
六条建议里官方没有明说、但从费率表能直接读出来的一条是:让上下文稳定下来,比让上下文变小更划算。缓存过的输入只按十分之一计费,这意味着同一份约定文件、同一批参考代码在连续几轮里反复出现时,第二轮之后基本是白送的。
反过来说,每次都换一批文件、每次都重开一个新对话,等于主动放弃这个折扣。一个很小的习惯改变能吃到它:同一个主题的活尽量在一个对话里连着做完,而不是做一件开一个新窗口。这条对长任务的省钱效果,往往比换小模型还明显。
还有三条属于用量监控而非节流。撞到额度上限时不必升档,可以单独买代币继续;也可以拿接口密钥跑额外的本地对话,按接口价计费。命令行里敲/status能看当前会话的剩余额度,网页后台有完整的用量面板。
## 四笔容易莫名其妙见底的账
第一笔是云端与本地共享同一个五小时窗口。把活派到云端买不来额外容量,只买来额外的并行度。此外还有周级别的限额叠在上面。
第二笔是生图。官方文档原话是生图消耗额度的速度平均快3到5倍,取决于质量和尺寸;对照上面那张费率表也能看出来,生图模型的输入费率是Sol的1.6倍。一场设计密集的会话吃掉一整个窗口,一点都不夸张。语音也一样:桌面语音有单独的时长额度,Plus大约15到30分钟,而在按代币计费的工作区里大约每分钟6枚代币,通过语音起的任务照样吃你的Codex额度。语音这块的实现也挺有意思:对话本身由一个实时模型托着,真正在应用里起任务和协调的是Terra,所以你用嘴派的活,账还是记在同一本上。
第三笔是速度配置。官方写得很明确:提速档会让所有适用模型的代币消耗率上升,快速模式对支持的模型按更高费率计。这一条很容易在赶工期时被无意识地打开,然后到月底才发现额度提前一周就没了。
第四笔最隐蔽:额度是和其他智能体功能共享的。官方文档里点名了一个当前正在共享的例子——Plus和Pro上的ChatGPT表格功能。也就是说,同事拿它处理一份大表,吃掉的是同一份预算。团队按人头分配额度时,别只按写代码的人数算。
还有一条不算消耗但值得知道:代码审查的额度是单独计的,而且只在通过代码托管平台跑的时候才计入——比如在合并请求里提及机器人、或者给仓库开了自动审查。你在本地让它审一遍差异,走的还是通用额度。
如果你同时也在另一家的订阅上花钱,两边的计费哲学值得对照着看一遍,之前那篇订阅、接口与省钱机制全拆解 (https://zhangwenbao.com/claude-code-pricing-guide.html)把另一侧的账算过一遍,两边合起来看更容易判断自己该把预算放哪。
## 桌面端、命令行和另一家的终端智能体该怎么分?
先说桌面端和命令行的关系。它们是同一个智能体,所以这不是选型,是分工:
维度 | 桌面端Codex模式 | Codex命令行 |
平台 | macOS(Apple Silicon)、Windows | macOS、Linux、Windows |
工作树 | 开对话时可选,带交接流程 | 要自己手动管 |
审查 | 差异内联编辑、合并请求面板 | 终端里看差异 |
脚本化与持续集成 | 做不到 | 可以,最小权限沙箱 |
浏览器与电脑使用 | 装插件后可用 | 没有 |
结论其实很短:桌面端是驾驶舱,命令行才是能被脚本驱动的引擎。两边共享配置和额度,所以“都用”是最正经的答案——命令行当骨干接自动化,桌面端当指挥室做审查。
至于要不要从另一家的终端智能体迁过来,保哥的判断是:如果你的工作流已经建在扩展机制、钩子和软件开发工具包上,这次合并没有造出值得搬家的能力差距。真正的不对称是分工上的——一边把免终端的图形体验做得更好,另一边把终端原生的可编程性做得更深。按你平时住在哪一边选,别按发布会的热闹选。想看两个内核在架构层面的完整对照,两个终端编程代理的架构与工作流对比 (https://zhangwenbao.com/claude-code-vs-codex.html)那篇拆得更细。
## 做出海和独立站的人,这东西能落到哪
那两成非开发者用户不是统计噪声,它指向一批很具体的用法。运营侧最现成的三个:把重复的数据清洗写成定时任务丢进后台工作树,每天早上回来收结果;让它在内置浏览器里跑一遍下单流程,检查改版后结账链路有没有断;用小模型批量处理商品文案的格式化与字段补齐,这种活跑Luna完全够用,跑Sol就是纯浪费。
要注意的边界也很清楚:涉及客户数据、支付凭据、后台管理系统的操作,别交给能看屏幕点鼠标的那个能力。它强大的地方和它危险的地方是同一处。
还有一个用法把那两成非开发者的价值讲得最清楚:让不写代码的同事自己改掉那些本来要排队等开发的小东西——落地页上的错别字、指错的链接、没更新的促销日期。这类活占了不少团队开发排期的比例,技术难度却接近于零。做法是给运营同事开一个权限收紧的项目,改动全部走差异审查再合并。
这里的关键不是模型多聪明,是那道审查关口。有差异面板,改动就是可见、可否决、可回溯的;没有它,同样的能力就是在生产环境裸奔。所以在团队里推这个东西,先把审查流程立起来再放权限,顺序反了迟早出事。
## 一个更朴素的判断标准
要不要装它,其实不用等评测。三个问题自问一遍就有答案:你已经在给ChatGPT付费了吗?你需要同时推进几条互不干扰的改动吗?你更愿意在图形界面里审查差异,还是在终端里?
三个都是肯定,装它的边际成本接近于零,值得试;只要有一个是否定,先别急。尤其是第一个——如果你还没有订阅,为了这个应用去开一档,性价比远不如把同样的钱花在你已经熟悉的那套工具上。工具的价值高度依赖于你已经建好的习惯,而不是它的功能清单有多长。
还有一层容易被忽略的判断:这个产品六个月变了三次形态,第三次还是被并进了一个消费级应用。把非关键的活交给它、把关键流程留在更稳定的地方,是这个阶段最省心的姿势。等它的形状稳下来,再考虑要不要往深里绑。
## 常见问题解答
问:Codex桌面端支持Linux吗?
不支持,官方也没有公布过任何计划。只有Apple Silicon的macOS和Windows两个平台。Linux用户请用命令行版本,同一个智能体、同一份配置、同一份订阅额度,区别只是没有图形界面。
问:每个对话真的会自动创建工作树吗?
不会。开对话时要在本地、工作树、云端三者里手动选一个,选了工作树还要指定基于哪个分支创建,默认工作在分离头指针状态。工作树只在桌面端的Codex模式里可用,而且项目必须在Git仓库中。
问:一枚代币值多少钱?
约合4美分的接口价值。用官方费率表除以对应的接口定价,几个模型的输入、缓存输入、输出三档全部落在这个数上。缓存过的输入只按正常输入的十分之一计费,这是最容易被忽略的省钱杠杆。
问:额度用完了必须升档吗?
不必须。个人档位撞到上限后可以单独购买代币继续用;也可以用接口密钥跑额外的本地对话,按接口价计费。工作区类的账户则可以购买工作区代币。换用更小的模型同样能立刻拉长可用条数。
问:把任务派到云端能省本地额度吗?
不能。云端对话和本地消息共享同一个五小时窗口,另外还有周级别的限额。派到云端买到的是并行度和不占用本机资源,不是额外容量。
问:项目里的配置文件为什么没生效?
大概率是这个项目没有被标记为受信任。不受信任的项目会跳过整个项目级目录,包括本地配置、钩子和规则,只保留用户级和系统级配置。此外受管设备上还有一层组织强制的要求文件,个人配置改不掉它。
问:内置浏览器能用我已经登录的Chrome吗?
默认不能。它用的是一份独立的浏览器档案,不共享你现有的标签页和会话,需要账号得在里面重新登录。要用日常Chrome的档案,走Chrome扩展那条路。
问:升级到Pro只是额度乘个系数吗?
不只是。除了5倍或20倍的额度,Pro还独占一个研究预览阶段的快速模型,跑在专用低延迟硬件上并走单独的限额,接口侧暂不提供。如果你在意的是响应速度而不只是条数,这一条比倍率更值得算。
## 权威参考资料
## Lovable、v0、Bolt怎么选?三款AI应用生成器的计费机制与退出成本
- URL:https://zhangwenbao.com/lovable-vs-v0-vs-bolt-ai-app-builder.html
- 分类:AI编程与工具链
- 发布:2026-07-08 | 更新:2026-07-30
- 摘要:这三个不是同一产品的三个牌子,是三个物种。本文按官方定价页核对全部价格与额度,拆开三种计费模式各自的翻车姿势、导出代码后仍然拿不到的四层绑定,以及最新一版代码安全报告揭示的漏洞分布。
- 关键词:Vibe Coding,独立站,代码安全,选型
> **TLDR**:摘要:不会写代码、这周就要把能用的东西摆到用户面前,选Lovable;团队在Vercel上跑Next.js且在乎代码评审,选v0,但要注意它的付费起步档已经从20美元涨到30美元;要浏览器里的完整开发环境或者要做移动端,选Bolt。会用终端的工程师三个都别买。真正决定这笔钱花得值不值的不是功能清单,是三件事:计费单位挂在什么东西上、你的应用长大之后成本曲线往哪走、以及离开的时候要付多少。文中所有价格与额度都按官方定价页逐条核对过。
> 摘要:不会写代码、这周就要把能用的东西摆到用户面前,选Lovable;团队在Vercel上跑Next.js且在乎代码评审,选v0,但要注意它的付费起步档已经从20美元涨到30美元;要浏览器里的完整开发环境或者要做移动端,选Bolt。会用终端的工程师三个都别买。真正决定这笔钱花得值不值的不是功能清单,是三件事:计费单位挂在什么东西上、你的应用长大之后成本曲线往哪走、以及离开的时候要付多少。文中所有价格与额度都按官方定价页逐条核对过。
这个赛道现在的声量已经大到失真。一家成立不到三年的公司,年化收入冲到5亿美元规模,估值传闻在半年里翻了一倍,连搜索框里拼错名字的人都在暴涨。热闹归热闹,掏钱之前得先把一件事想明白:你买的到底是什么。
把这三家的营销页并排看,你会觉得它们在卖同一样东西——用自然语言生成一个能跑的应用。但把账单摊开看,它们卖的是三样不同的东西,而且三条成本曲线的形状完全不同。这篇按速查手册写,不按测评写:先说物种差异,再逐个拆计费,最后讲交接和退出。
## 这三个真的是竞品吗?
先给结论:不是。它们是三个不同的物种,而网上对这三家的差评,追根溯源大多是选错了物种,不是产品本身烂。
三家20到30美元的趋同定价强化了“它们是竞品”这个错觉。拆开看,它们回答的是三个不同的问题:
| 它回答的问题 | 工作单位 |
Lovable | 我有产品想法但不会写代码,帮我做出能用的应用 | 一个产品决策 |
v0 | 我要在Vercel生态里做生产级前端 | 一个合并请求 |
Bolt | 我要一个跑在浏览器标签页里的完整开发环境 | 一个代码库 |
有一样东西三家已经不比了:代码质量。底层都是前沿模型,输出质量在2025年就趋同了。还在分化的只剩两样——包在模型外面的工作流,以及项目变大之后各家怎么收你的钱。这篇的主菜全在这两样上。
## 先用免费档摸清楚各家的脾气
在掏钱之前,三家的免费档其实足够让你判断物种合不合适。把官方给的限额并排放,差异一目了然:
| 免费档给什么 | 它先卡住你的地方 |
Lovable | 每天5枚credit,每月上限约30枚 | credit,一个带图落地页就要1.7枚 |
v0 | 每月5美元额度 | 每天7条消息的硬上限 |
Bolt | 每天30万词元、每月100万词元 | 页面强制带品牌标识、上传限10MB |
三家卡你的地方不一样,这本身就是信息。v0卡的是对话次数,说明它假设你每次提问都经过思考;Bolt卡的是词元总量,说明它默认你会频繁迭代;Lovable卡的是任务份额,说明它把一次完整的产品动作当成计价单元。免费档的形状,就是付费档逻辑的缩影。
用免费档做判断的正确姿势不是比谁生成得好看,而是拿同一个具体需求各跑一遍——比如“一个带邮箱订阅的产品预告页”——然后看三件事:它把代码藏起来还是摊开、改一处细节要来回几轮、以及你能不能看懂它选了哪些第三方服务。这三件事决定了后面几个月你过得舒不舒服,生成质量反而不决定。
如果你的问题其实更上游,也就是还没定“到底用什么建站”,那么这三个都只是众多选项里的一类,之前那篇SaaS托管、自建、AI建站还是纯代码 (https://zhangwenbao.com/independent-site-builder-platform-choice-saas-wordpress-ai-code-seo.html)把四条路的取舍拆得更完整,先看那篇再回来选牌子会更省时间。
## Lovable为什么是最好的孵化器,却不该住在里面?
Lovable在这篇里占的篇幅最大,因为它的营销和现实之间的落差最大——而且是两个方向上的落差。
先说好的那一面。据行业报道,它在2026年中的年化收入约5亿美元,员工只有一百多人。这种收入结构说明了一切:钱不是开发者掏的,是全球那批有想法但不会执行的人掏的。按“非技术创始人的孵化器”这个标准评价,它是品类里最好的产品,每一分钱都挣得名副其实。
顺带把一个容易被传歪的数字校准一下:2025年12月完成的那轮3.3亿美元B轮,对应估值约66亿美元,这是有官方博客背书的。至于132亿这个数,来自2026年7月初的报道,说的是正在谈的一轮,截至本文更新时仍未见官宣关闭。引用它的时候记得带上“在谈”两个字。
## credit到底是怎么扣的
官方定价页 (https://lovable.dev/pricing)把消耗示例写得很实在,这几个数比任何评测都有用:
你说的话 | 它做的事 | 扣多少 |
把按钮改成灰色 | 更新按钮样式 | 0.50 |
去掉页脚 | 移除页脚组件 | 0.90 |
加上注册和登录 | 加鉴权页面与逻辑,更新路由 | 1.20 |
做个带图的落地页 | 生成落地页、3张图、主题与5个区块 | 1.70 |
Pro档每月25美元,给100枚credit外加每天赠送;免费档每天5枚、每月上限30枚左右;Business档每月50美元,加的是团队管控。未用完的月度credit在订阅有效期内可以顺延,每日赠送的那部分不顺延,每24小时清零。
## 那个几乎没人提的固定档模式
官方其实给了两种构建模式,而流传的介绍里基本只讲了第一种:
- 默认模式:credit消耗随任务复杂度浮动,就是上面那张表。
- 计划模式:每条消息固定1枚credit。
这个区别在项目变大之后会变成救命稻草。因为默认模式最被诟病的那条曲线——应用越复杂、每次修改要带的上下文越多、单次扣得越狠——在固定档下被拉平了。项目小的时候用默认模式更省,项目大到单次动辄扣两三枚的时候,切固定档反而划算。
这也是评估这类工具时一个通用的提醒:厂商往往已经给了缓解手段,只是没放在营销页的第一屏。在抱怨账单之前,先把定价页的常见问题一条条读完,比读十篇测评有用。
## 第二条成本曲线藏在托管里
还有一笔更隐蔽的账。Pro和Business订阅除了credit,还含一份用于构建与托管的赠额。而官方明确写着:当应用的访问量或体积达到一定规模,会在赠额之外产生费用,这笔费用从你的credit余额里扣。
把这句话翻译成人话:你的应用越成功,它吃你的credit越多——而且吃的还是你原本用来继续开发的那份。这不是黑幕,托管确实要成本,但它决定了一个正确的心智模型:这笔钱是为冲刺付的,不是为长跑付的。
团队用的话还有一个实用设置值得先打开:工作区的所有者和管理员可以设一个默认的月度credit上限,还能按成员单独覆盖。不设的话,一个人一晚上就能把整个团队的额度用光,这种事在共享额度的产品里屡见不鲜。
## 国内视角的三条硬约束
官网访问没问题,但付费需要国际信用卡;底层后端服务的国内访问延迟明显,面向国内用户的应用体验会打折;部署产物默认在海外节点,备案无从谈起。
所以它适合做面向海外用户的产品验证或者内部演示。要做国内C端产品,要么验证完导出代码部署到国内云,要么直接看后面讲的国产替代。最差的选择是用海外工具的默认部署链路去服务国内用户,等于把产品体验押在一条你完全不可控的网络路径上。
## Bolt的账单为什么会复利?
Bolt藏着整个品类里最少被讲透的一个事实。先说它是什么,再揭这个底。
## 浏览器里跑真实Node.js是怎么做到的
技术上Bolt是三者中最有意思的。它背后的容器技术是在浏览器里实现的一整套Node.js运行时——本质上是在浏览器沙箱里跑一台微型虚拟机,不用远程服务器,也不用等容器启动。文件树全部可见、任何文件可以手改、有终端。
三个工具里只有它用起来像IDE而不是聊天产品,这也精确圈定了它的物种:想要AI的速度、但不愿意放弃代码可见性的开发者。
## Expo那条移动端路径,走到哪一步会停
它还握着整个品类最清晰的差异化能力:移动端。通过与Expo的官方合作,它能脚手架出带路由和样式方案的React Native项目,几分钟内扫码就能在真机上跑起来。另外两家完全没有原生移动端路径。
但边界要说清楚,因为营销页不会说:浏览器里的运行时跑不了Xcode、Android Studio和云构建管线。它给你的是React Native代码,不是签名后的安装包。上架应用商店仍然要在自己机器上配构建服务。“不写代码从想法到应用商店”这句话只在前八成路程上成立,对最后两成保持沉默。
## 现在揭底:它按项目体积收钱,不按需求大小
Bolt的词元消耗跟项目大小挂钩,不跟你这次要改什么挂钩。它的大部分开销花在把项目文件同步进模型上下文——同样是改一行字,第六周的花费远高于第一周,纯粹因为代码库长大了。
官方定价 (https://bolt.new/pricing)是Pro档每月25美元、起步每月1000万词元,未用完的付费词元顺延一个月;Teams档每人每月30美元;年付最高能省28%。听着很多,但中等规模项目单条消息就能消耗六位数词元。它用词元顺延和差异同步来缓解,但曲线的本质不变:它在项目小的时候便宜,恰好在项目开始成功的时候变贵。
## 免费档和Pro档的真实边界不在词元上
定价页上还有一组常被跳过的数字,对独立站主反而更关键:免费档每天30万词元、每月100万词元、单文件上传10MB、托管站点最多约33.3万次网络请求,而且页面会带品牌标识。Pro档取消每日词元上限、上传放宽到100MB、请求配额提到100万次,并且解锁自定义域名、可选数据库供应商、扩展的数据库容量与AI图片编辑。
请求配额这一条值得单独盯:它是第三条“应用成功了才开始收你钱”的曲线。一个真有流量的落地页,几十万次请求消耗得比想象中快。把Bolt当草稿机用,这条完全够;把它当正式托管,迟早要面对这笔账。
国内访问方面,Bolt的架构反而是优势:计算跑在本地浏览器里,网络依赖比另外两家轻,主要瓶颈在模型请求和包管理源,而后者可以换国内镜像。
## 浏览器运行时能跑什么,跑不了什么
把Node.js塞进浏览器很酷,但这个架构有几条绕不过去的边界,值得在选它之前想清楚。
能跑的是纯JavaScript和TypeScript生态里的绝大多数东西:常见的前端框架、服务端渲染、接口路由、包管理、开发服务器、热更新。跑不了的是任何依赖原生二进制的东西——需要本机编译的模块、图像处理库的原生绑定、以及非JavaScript的后端语言。想用Python写个数据处理服务,这条路直接封死。
这条边界解释了它的用户画像为什么这么清晰。它服务的是全栈JavaScript这一支,而这一支恰好覆盖了独立站、落地页、轻量后台这些最常见的需求。超出这个范围,它的优势立刻变成限制。
## 它正在往企业采购那一侧挪
还有一个变化值得留意,因为它会改变这个工具未来的形状:从2026年年中起,Bolt开始把云厂商的应用市场作为采购渠道,并推进与主流办公套件的集成。团队档里那几条不太起眼的能力——私有包仓库支持、按包注入设计系统知识、集中计费与成员权限管控——都是同一个方向的信号。
对个人用户来说这没什么影响,对团队采购的人却是个提醒:当一个工具开始认真做企业采购,它的定价结构和功能优先级往往会跟着往上走。现在这个价位能拿到的东西,未必会一直留在这一档。
## v0改版之后,到底变成了什么?
v0的篇幅最短,不是因为它最弱——在自己的生态位里它可能是三者中最专业的——而是因为它的决策没有中间地带。你是Vercel和Next.js的团队,它就是最优解;不是,就别碰。
## 每个对话是一个分支,不是一段聊天
这个产品在2026年2月变了,而且变得很关键。它在更早的两年里一直被定型为“React组件生成器”,说实话当时这个定型是公允的。改版之后 (https://vercel.com/blog/introducing-the-new-v0)它是另一个物种:沙箱运行时对齐真实部署环境、原生代码托管集成、编辑器风格的界面、数据库连接,以及最有战略意味的一条——可以导入已有代码库,不再只能从零生成。
Git语义是它最硬的差异点。每个会话自动开一条新分支,命名带哈希后缀,它从不直接写主干,产出永远是一个可以走正常流程评审的合并请求;合并之后由平台自动重建和重新部署。
这一条恰好化解了AI生成工具最恶心的问题——产出物锁在一个团队没人能审的花园里。一个跑在Vercel上的团队,设计师或产品经理打开它描述一个新的设置页,工程师收到的是一个正常的合并请求,而不是一段“你去看看这个链接”。
## 它的定价已经不是流传的那个数了
这是本篇需要最先纠正的一处。网上大量对比文里写的还是“每月20美元的Premium档”,而官方定价页 (https://v0.app/pricing)现在的档位是:
档位 | 价格 | 含什么 |
Free | 0美元 | 每月5美元额度,每天7条消息上限 |
Plus | 每用户每月30美元 | 每用户每月30美元额度,每天登录再送2美元 |
Business | 每用户每月100美元 | 同样额度,加默认不用于训练 |
Enterprise | 定制 | 单点登录、角色权限、优先资源 |
Premium这个档名已经不存在了,付费起步价从20涨到了30美元。常见问题里甚至还留着一条“Ultra档去哪了”,说明档位结构近期动过不止一次。拿旧价格做预算的团队,签单时会发现对不上。
另一个几乎没人提的变化是它公布了自有模型的分档价目:从轻量档的每百万输入词元1美元、输出5美元,一路到最高速档的输入10美元、输出50美元,中间还有缓存写入和缓存读取两档单价。这意味着v0的额度不再是黑箱,你可以自己估算一次生成大概要花多少。这在三家里是独一份的透明度。
## 代价有两个,都真实
第一是生态引力。没有合同意义上的锁定,但一切默认假设都是Next.js加Vercel,想用它做部署到国内云或者其他云的项目,等于逆流游泳。
第二是国内的一个致命细节:生成的项目默认部署到平台自有域名,而这个域名在国内长期无法直接访问。很多人快速做了个落地页发到群里,才发现国内同事全部打不开。解法是绑自定义域名加配置解析,但这已经超出了非技术用户的舒适区。国内业务用它写组件、拿代码可以,别指望它的部署链路。
## 一条企业用户才会注意的分界
v0的档位表里有一行容易被跳过:付费的高一档明确写着默认不用于训练,最高档进一步承诺数据永不用于训练。这条在个人用户眼里可能无关痛痒,但对代做客户项目的人、或者手上有商业敏感逻辑的团队,它是能不能用的前提。
值得注意的是三家在这件事上的表述颗粒度差别很大,而颗粒度本身就说明了它们各自主要在服务谁。把这一行写进档位表的产品,是在对企业采购流程说话;只在服务条款里含糊带过的,说明它现在还不需要过那一关。做决策时可以把它当成一个成熟度指标来读。
## 三种计费模式,三种翻车姿势?
功能清单放一边,计费模式才是三个产品真正分道扬镳的地方。这张表不比功能,比翻车姿势:
| Lovable | v0 | Bolt |
付费起步 | 25美元/月 | 30美元/用户/月 | 25美元/月 |
计费单位 | 按任务扣credit | 词元折算额度 | 词元 |
成本驱动 | 任务复杂度 | 模型档位乘生成量 | 项目体积(文件同步) |
翻车姿势 | 应用变复杂后每次修改都贵 | 跑完才知道花了多少 | 同样的修改越到后期越贵 |
额度顺延 | 月度credit可顺延,每日赠送不顺延 | 按月度周期结算 | 付费词元顺延一个月 |
团队档 | 50美元/月 | 100美元/用户/月 | 30美元/人/月 |
第二条曲线 | 托管赠额超出后扣credit | 额度外按需购买 | 网络请求配额 |
三家共用一条规律:入门定价是围绕第一周的用量设计的,而单位进度成本都随应用成熟而上涨。这不算黑幕——上下文确实贵,他们只是把前沿模型的成本传导给你——但它决定了正确的用法:为冲刺付费,不为马拉松付费。
三个工具的最佳状态都在项目生命周期的前两到四周。开工前就规划好退出点,这个价格没毛病;拖到第四个月还在里面维护生产应用,你就在用聊天机器人的人体工学,付外包公司的价钱。
## 把这张表变成一条预算线
光看单价意义不大,把它折算成一次验证的总成本才有用。按三到四周的验证冲刺算,一个人的开销大致是这样:Lovable 25到50美元(Pro一档通常够,复杂一点可能要补买credit);v0 30到60美元(额度用完按需购买,复杂的多文件生成几个回合就能吃掉一大块);Bolt 25到50美元(前期便宜,后两周开始明显变贵)。
拿这个数去和外包对比,结论不用多算:一个MVP外包出去动辄三五万人民币起,而且交付周期以月计。所以这类工具真正的价值不在省钱,在把验证的最小成本从万元级压到百元级,从而让你敢多试几个想法。用这个视角看,纠结三家谁便宜十美元完全是找错了变量。
但同一个算法反过来也成立:一旦项目进入维护期,每月固定的几十美元加上不断上翘的单位成本,一年下来就是四位数人民币,换来的还是一套你不能完全掌控的架构。验证期它便宜得不讲道理,维护期它贵得同样不讲道理——这两句话不矛盾,它们说的是曲线的两端。
## 代码归你所有,为什么不等于架构自由?
三家都支持代码托管同步,营销页都写着“代码归你所有”。技术上没错,实践上误导,这是最值得拆掉的一个误区。
拿到仓库只是容易的那两成,你拿不到的是架构独立性。Lovable生成的不是“恰好用了某个后端服务的React应用”——它的登录流程、行级安全策略、存储规则、边缘函数全部编织在那个后端的特定模型里,换后端远不止导出几张表,是重新架构。v0的产出默认遵循Next.js约定,最顺滑的归宿是它自家平台。Bolt最可迁移,标准框架的普通代码,这也是它成为开发者之选的又一个理由——但即便是它,项目也继承了AI在第一分钟替你选的那些服务绑定。
一个能长期用的原则:评估这类工具,看离开的成本,别看加入的成本。加入花25美元,带着一个成功的产品离开要花一次真正的工程改造。这个不对称才是真实价签——说句公道话,这也正是那个百亿级估值背后的完整商业模式:离开成本就是护城河。
## 真要走的时候,具体卡在哪几步
把“迁移很难”说得具体一点,会更有用。按实际难度排,离开时要处理的东西大致是四层。
第一层是代码,最容易。三家都能同步到代码托管平台,克隆下来就是标准项目结构。这一步一两个小时能搞定,也是唯一一层符合“代码归你所有”这句宣传的。
第二层是数据,中等难度。导出数据表本身不难,麻烦的是表结构往往是AI在第一分钟替你定的,字段命名、关联关系、索引都未必符合你后面的需求。迁移的同时通常要顺手重构一遍模型,这才是真正花时间的地方。
第三层是鉴权与权限,很难。登录流程、会话管理、行级安全策略这些不是代码,是配置在后端服务里的规则集。换一个后端就得整套重写,而且这部分一旦写错就是安全事故,不能靠“先跑起来再说”。
第四层是那些你根本不知道存在的绑定。文件存储走了哪个服务、邮件从哪发、支付回调指向哪、定时任务挂在哪——这些都是AI在你没参与的情况下替你选的。找齐它们的唯一办法是逐个功能走一遍,看哪里会报错。
结论很直接:迁移的工作量跟你在生成器里待的时间成正比,跟你对它的了解成反比。所以最省钱的做法不是等到不得不走的时候再动,而是从第一天就保持一份“它替我选了什么”的清单,边做边记。这份清单十分钟能开始写,将来能省掉几周。
## AI写出来的代码到底有多不安全?
这一节很多对比文会含糊带过,但对要上线收钱的人来说,它比功能差异重要得多。
常被引用的那个数字是“约45%的AI生成代码存在漏洞”。这个数没错,但它来自2025年的报告;2026年3月发布的春季版 (https://www.veracode.com/blog/spring-2026-genai-code-security/)更新了口径,也给出了远比一个百分比有用的分布。
## 先看总量:两年过去,安全性纹丝不动
累计测过150多个大模型,整体安全通过率约55%,也就是说仍有约45%的样本带着漏洞。同期的语法正确率超过95%。报告里那句话说得很重:能跑的代码和能安全跑的代码之间的差距不只是在持续,而是在拉大。
## 再看分布:模型学会了防最出名的那一类
真正有价值的是按漏洞类别拆开之后的样子:
漏洞类别 | 安全通过率 |
SQL注入 | 82% |
不安全的加密算法 | 86% |
跨站脚本 | 15% |
日志注入 | 13% |
这张表的信息量比那个45%大得多。模型已经基本学会防SQL注入了,却几乎完全不防跨站脚本和日志注入。一个合理的解释是:SQL注入是过去二十年被写进每一本教材、每一篇博客的经典问题,训练语料里的正确示范铺天盖地;后两类的知名度低得多,语料里的坏示范反而更多。
为什么这对独立站主格外要命?因为跨站脚本的高发地恰好是电商站最离不开的那几块——用户评论、问答区、商品描述里嵌的富文本、第三方评价插件回填的内容。这些地方每一处都在把不受控的输入渲染进页面,而这正是模型最不擅长设防的那一类。
分语言看还有一处值得知道:Java的通过率只有29%,Python 62%、C# 58%、JavaScript 57%。
## 你正好落在中间那一档,这意味着什么
这三个生成器的产出基本都在JavaScript和TypeScript生态里,也就是57%那一档——不是最差的,但离能免检上线还差得远。四成多的样本带漏洞,换算过来就是你每做十个功能,大概有四个里藏着至少一处该修的东西。
Java那个29%反而值得多想一层。它未必是因为语言本身更不安全,更可能是因为Java的典型场景是企业级后端,代码里的鉴权、序列化、模板渲染更密集,能出错的地方本来就多。这提示了一个更通用的规律:通过率跟你让它写什么强相关,跟它用什么语言写反而是次要的。
套到实际使用上,结论是:让它生成展示型页面、静态内容、简单表单,风险相对可控;一旦你说的是“加个登录”“接个支付”“做个后台管理”,那就是踏进了通过率最低的那片区域。需求描述里出现权限、支付、上传、用户输入这四个词里的任何一个,都该自动触发一次人工复核。
还有一个反直觉的观察:这几年模型的语法正确率一路冲到95%以上,而安全通过率两年纹丝不动。这个剪刀差本身就是风险来源——代码看起来越专业,人越容易略过审查。过去初级开发者写的东西,缩进都不整齐,你自然会警惕;现在生成的代码格式漂亮、命名规范、注释齐全,反而更容易被一路点到底直接合并。
## 那该怎么办
结论不是“别用”,是把安全审查当成流程里的固定一环,而不是出事之后的补救。三件成本很低的事:涉及支付、用户数据、文件上传的代码,上线前必须人工过一遍;把富文本渲染的地方单独列出来逐个确认转义;用现成的静态扫描工具接进代码托管,让它在合并前跑。
更根本的一点是心态:这类工具的目标用户,恰恰是最没有能力发现这些问题的那批人。能力和风险的错配才是这个品类真正的结构性问题,而它不会因为模型再强一点就自动消失。
## 独立站上线前值得逐条走一遍的六项
把上面那张漏洞分布表翻译成检查动作,对做电商和内容站的人大致是这六条:
- 所有渲染用户输入的位置逐个确认转义,尤其是评论、问答、商品描述里的富文本,这是通过率只有15%的那一类。
- 日志里不要直接拼接用户输入,这是通过率13%的那一类,而且它的危害不在页面上,在你事后排查时被喂进假记录。
- 文件上传要限类型、限大小、限存储路径,生成器默认给的规则通常是最宽松的那种。
- 支付回调必须验签,别信任何“回调里带了订单号就当成功”的实现。
- 把接口密钥、数据库连接串从代码里挪到环境变量,检查有没有被顺手提交进仓库。
- 接一个静态扫描工具进代码托管,让它在合并前自动跑,这一步几乎零成本却能兜住大半。
前两条之所以排在最前面,是因为它们同时满足两个条件:模型最不擅长防,而电商站又最躲不开。剩下四条属于通用工程卫生,但生成器的用户群恰恰是最不熟悉这些的一批人,所以更值得白纸黑字列出来。
## 什么时候三个都不该用?
大多数对比文章不写这一节,因为写了就没法挂返佣链接。但对一大类读者,正确答案确实是“都不用”。
边界线可以这样画:应用生成器打包卖三样东西——AI编码模型、托管环境、以及把代码藏起来的聊天抽象层。模型已经不是差异点,所以你真正花钱买的是环境和抽象层。如果这两样你本来就有,那这个打包对你就是纯粹的开销。
具体来说,满足以下任何一条就跳过这三个生成器:
- 你已经每天在用编码智能体。终端原生的智能体配一个数据库服务的连接器,能复刻Lovable九成的后端接线,而且是在你自己的机器、自己的仓库、自己的评审流程里。
- 项目是存量改造,不是从零开始。三家里只有v0勉强支持导入已有代码库,而智能体生来就是干这个的。
- 这个应用是你的长期核心产品。架构决策、测试、持续集成、可观测性——聊天抽象层全都做不好。
- 有合规、备案或数据本地化要求。托管生成器的便利,恰恰是监管要求你必须自己掌握的那部分控制权。
反过来也要诚实:如果动手的人是设计师、产品经理、或者永远不会打开终端的创始人,终端智能体再强也与他无关。对这些人,抽象层不是开销,它就是产品本身。工具判断本质上是用户判断。三种编程范式在架构上的根本差异,终端代理、编辑器内嵌与多代理指挥中心的对比 (https://zhangwenbao.com/claude-code-vs-cursor-vs-windsurf.html)那篇拆得更细,那是这条边界线的另一侧。
## 国产替代:用户在国内就看这里
面向国内用户的产品,三个海外工具的短板会叠加放大:付费门槛、访问延迟、默认域名不可达、备案无从谈起。这时候国产方案值得认真看——有的支持自然语言直接生成小程序,这个国内高频需求三个海外工具完全覆盖不了;有的对标“想法到上线”的全链路,背靠国内云生态,备案链路顺;还有一类严格说是智能体搭建平台而非应用生成器,但很多“我要个AI应用”的需求本质上是智能体需求,在那类平台上成本更低。
判断标准很简单:用户在哪,工具就在哪。海外用户用海外工具加自定义域名;国内用户要么用国产平台,要么把海外工具只当代码草稿机——生成完导出,部署自己来。
挑国产方案时值得多问四个问题,它们比生成质量更能决定这个东西能不能真正上线:备案链路顺不顺(能不能在同一家云上一站办完)、支付能不能接进来(主流支付渠道的商户资质与回调)、小程序这条路给不给走(很多国内需求的入口根本不是网页)、数据落在哪(涉及个人信息就要面对本地化存储的合规要求)。这四条里任何一条卡住,生成得再漂亮也上不了线。
## 还有一条被忽略的中间路线
非此即彼之外其实有第三条路,而且成本很低:把生成器当设计稿工具,把落地交给终端智能体。
具体做法是用免费档或最低档快速生成几版界面和交互,把它当成会动的原型给团队和客户看、拿反馈、定方案;真正要写进自己代码库的时候,把界面截图和生成的组件代码作为参考素材,让终端智能体在你自己的技术栈里重新实现一遍。
这条路的好处是把两边的长处都占了:生成器最擅长的其实是把模糊想法变成可视化的东西,而这一步恰恰是终端智能体最弱的环节——它能写对代码,但很难在你说不清要什么的时候替你拿主意。反过来,工程规范、测试、部署这些又是智能体的主场。
代价是多一道翻译工序,所以它只在两种情况下划算:你的技术栈本来就不是它默认的那套,或者这个项目从一开始就确定要长期维护。如果两条都不占,直接用生成器一路做到验证结束更省事。
## 从原型到生产:那条必须提前排期的交接管线
所以真正该推荐的不是“选一个工具”,而是“设计一条带交接点的管线”:
- 验证阶段(第1到3周)。用生成器把想法变成能给真实用户点的东西,拿真反馈。这一段就该快,不必纠结代码好坏。
- 交接阶段(第3到4周)。导出或同步到代码托管,做一次安全与架构评审,人工或用智能体都行。上一节那张漏洞分布表就是这一步的检查清单。
- 建设阶段(第2个月起)。换终端智能体补测试、接持续集成、做重构,把基础设施迁到自己可控的地方。
整条管线杠杆最大的一步,是按时执行第二阶段的交接——赶在成本曲线上翘之前、赶在没人记录的架构决策固化之前。把生成器当一次性草稿用的团队,长期看总是赢过想把它用成永久平台的团队。
顺带说一句,如果你的目标就是一个内容站或者独立站而不是应用,这条管线里的第一阶段其实有更省事的替代路线,用AI终端一句话生成完整站点 (https://zhangwenbao.com/wordpress-studio-code-ai-terminal-natural-language-site-builder.html)那篇讲的就是成熟建站生态里的同类做法,底层跑的是同一批模型,但产出物天然就在你自己的技术栈里。
## 一个反直觉的观察
盯着这个赛道十八个月,最反直觉的结论是:它们不是在取代开发者,而是在制造有史以来通往软件工程的最宽漏斗。数以百万计被验证过的原型,最终全都需要工程师提供那些聊天抽象层给不了的东西——测试、架构、可观测性、合规。
保哥自己给客户的建议向来是同一句:按物种选工具,按用户选物种。别问哪个最好,先问你是谁、你的用户在哪、以及这个东西你打算养多久。想动手做点自己的小工具再决定,用对话式编程做一个SEO小工具 (https://zhangwenbao.com/vibe-coding-seo-tool-tutorial.html)那篇的八步流程可以当作一次低成本的实地体验。
## 常见问题解答
问:完全不会写代码,三个里该选哪个?
选Lovable。它是唯一把数据库、登录鉴权、文件存储和一键部署打包成一条龙的,工作单位是产品决策而不是代码。前提是接受一个结局:验证成功之后要把仓库交接给工程师,而不是永远住在里面。
问:v0现在到底多少钱?
付费起步档是每用户每月30美元,含同额度的月度用量,另有每天登录赠送的部分;再上一档是每用户每月100美元。流传甚广的每月20美元Premium档已经不存在了,用旧数字做预算会对不上。
问:Bolt的账单为什么越到后期越贵?
因为它的词元消耗跟项目体积挂钩,而不是跟你这次要改什么挂钩。大部分开销花在把项目文件同步进模型上下文,所以同样一处小改动,第六周比第一周贵得多。项目超出原型规模就该导出走人。
问:代码能导出,是不是就没有锁定风险?
不是。导出的只是文件,你拿不到的是架构独立性——鉴权流程、行级安全策略、存储规则、边缘函数往往深度编织在特定后端服务的模型里,换后端等于重新架构。评估这类工具要看离开的成本,不是加入的成本。
问:AI生成的代码能直接上线收钱吗?
不能免检上线。最新一版行业报告显示整体安全通过率约55%,而且分布极不均匀:SQL注入的通过率有82%,跨站脚本只有15%、日志注入只有13%。电商站的评论、问答、富文本描述恰好是跨站脚本高发区,上线前必须人工过一遍。
问:做面向国内用户的产品,这三个能用吗?
能用但别用它们的默认部署链路。付费要国际信用卡,托管节点在海外,备案无从谈起,其中一家的默认部署域名国内还长期不可达。可行的做法是只把它当代码草稿机,生成完导出到国内云自己部署,或者直接选国产平台。
问:什么时候该跳过生成器直接上编码智能体?
满足四条里的任何一条就该跳过:你已经每天在用编码智能体、项目是存量改造、这个应用是长期核心产品、有合规或数据本地化要求。生成器卖的是环境和抽象层,这两样你本来就有的话,它对你就是纯开销。
问:这三个工具的最佳使用周期是多久?
项目生命周期的前两到四周。三家的入门定价都是围绕第一周的用量设计的,而单位进度成本随应用成熟而上涨。开工前就把交接点定下来,比事后被账单教育要便宜得多。
## 权威参考资料
## 上下文工程真正的杠杆是删不是加,5000 token打赢了10万
- URL:https://zhangwenbao.com/context-engineering-subtraction-practice.html
- 分类:AI编程与工具链
- 发布:2026-06-22 | 更新:2026-07-30
- 摘要:调教编码Agent的最大杠杆是删token而非加token。Sourcegraph实测precision@5从0.140升到0.478,5000 token精准检索打败10万token摘要。附诊断表、卸载阈值与预算分配法。
- 关键词:Claude Code,AI编程,Token优化,上下文工程,上下文窗口
> **TLDR**:摘要:调教编码Agent最大的杠杆是删token,不是加token。Sourcegraph在370个真实企业代码库任务上测出来:拿5000 token精准检索的Agent,比拿10万token代码库摘要的表现更好;precision@5从0.140升到0.478。但这个实验有个被广泛忽略的细节——赢的那一侧不是本地grep,是把源码整个搬走、只留13个检索工具的MCP方案。下面把腐烂机制、四种失效模式的辨认方法、先卸载后摘要的阈值打法,以及三个看着像进步的伪技巧,一次讲透。
> 摘要:调教编码Agent最大的杠杆是删token,不是加token。Sourcegraph在370个真实企业代码库任务上测出来:拿5000 token精准检索的Agent,比拿10万token代码库摘要的表现更好;precision@5从0.140升到0.478。但这个实验有个被广泛忽略的细节——赢的那一侧不是本地grep,是把源码整个搬走、只留13个检索工具的MCP方案。下面把腐烂机制、四种失效模式的辨认方法、先卸载后摘要的阈值打法,以及三个看着像进步的伪技巧,一次讲透。
大多数人调Agent的功夫,都花在了加法上:把指令文件越写越长,把可能用得上的文件统统塞进窗口,给整个仓库挂上向量索引。背后是同一个直觉——喂得越饱,Agent越强。
2026年最硬的几组证据说的恰恰相反。而且不是模棱两可的相反,是同一个任务、同一个模型、上下文多了20倍,结果反而更差。
这篇不打算再讲一遍上下文工程的定义。它只论证一件事:上下文窗口是一份要花的预算,不是一个要装满的桶——而预算里杠杆最大的那个动作,几乎总是减法。顺带把几组被反复转述、但转述过程中已经变形的实验数据,还原成它们本来的样子。
## 为什么“喂得越饱越强”是反的?
先看那个最常被引用的结论。Sourcegraph的上下文工程指南 (https://sourcegraph.com/blog/context-engineering)里有一句原话:在同一个编码任务上,拿着10万token代码库摘要的Agent,表现比拿着5000 token精准检索的更差。
体积让了20倍的先手,还是输了。机制不复杂:10万token的摘要没有给模型更多可用信息,只给了更多可分心的东西;5000 token精准检索赢,是因为里面每一个token都在承重。
但真正决定要不要相信这个结论的,是它背后那组可复现的数字。Sourcegraph把实验做成了一个叫CodeScaleBench的基准,370个软件工程任务,全部取自真实的企业级代码库。同一个编码Agent跑两种配置,结果是这样的:
指标 | 基线(本地源码+grep/file/read) | 结构化代码检索 |
文件召回率 | 0.127 | 0.278 |
precision@5 | 0.140 | 0.478 |
F1@5 | 0.099 | 0.262 |
精度翻了三倍多,改的只是取什么,不是取多少。下游效果更夸张:一个Kubernetes单体仓库的任务,基线撞上了两小时超时,换成结构化检索之后89秒完成、得分0.90;一次跨文件重构,基线用了96次工具调用、84分钟,换过来是5次调用、4.4分钟。
把96对5这组数字再读一遍。这是减法论证里最深的一层:精度不只是改善答案,它直接压缩轮数;轮数少了,对话里堆积的垃圾就少,窗口给后面的轮次留得就干净。精度是会复利的。
膨胀也复利,只是方向相反。今天放进来的每个垃圾token,都会喂出一个更糊涂的轮次,明天生产更多垃圾。
## “及时检索”具体是个什么动作
结论好记,落地容易走样。所谓及时检索,不是换一个更聪明的搜索算法,而是把“决定读哪个文件”这个动作,从你手上交回给Agent。
预加载的心智模型是:我先判断哪些文件相关,打包递给它。及时检索的心智模型是:我只给它一份目录和一个读取工具,它自己判断该拆哪个包。
差别在哪儿?在于你的判断是提问之前做的,它的判断是看过前几步结果之后做的。一行文件引用加一个读取工具,在Agent真正判定这个文件相关之前,几乎零成本;而你预判错的每一个文件,都是全价买单还倒扣注意力。
有一个很实用的自查:如果你正在写“把下面这些文件的内容也一并附上”,先停三秒——你是真的知道它需要,还是只是不确定它不需要?后者就是分心的来源。不确定的东西应该做成它取得到的,而不是它必须看的。
另一件常被搞反的事:及时检索并不意味着次数越少越好。基线那96次工具调用之所以糟糕,不是因为次数多,而是因为每次都取回一堆无关的东西,于是不得不再取一次。轮数是精度的结果,不是可以直接优化的目标——盯着轮数硬压,只会逼出一个一次性抓一大把的策略,正好回到加法那条路上。
## 那组实验,究竟是谁赢了谁?
这一节是我在别处没见人写过的,也是这组数据被转述时最常丢掉的部分。
大多数二手引用把它概括成“结构化代码检索打败了grep”。这个说法不算错,但它把最有意思的那半掐掉了。翻CodeScaleBench的实验设置 (https://sourcegraph.com/blog/codescalebench-testing-coding-agents-on-large-codebases-and-multi-repo-software-engineering-tasks)会发现,赢的那一侧的完整配置是:Agent不在本地持有源码,改成调用13个检索工具,而这13个工具是通过MCP暴露的。
换句话说,2026年关于“上下文该做减法”的最硬一组实证,是靠MCP拿到的。
这个细节之所以重要,是因为同一年的舆论主线恰好是“MCP是不是该被CLI加Skill取代”。我在MCP、Skills、Hooks三大扩展机制怎么选 (https://zhangwenbao.com/mcp-vs-skills-claude-code.html)那篇里拆过这场争论的来龙去脉。而这里出现了一个反直觉的交叉:被诟病“常驻吃上下文”的协议,在这个实验里恰恰是省上下文的那一方。
怎么理解这个矛盾?关键在于账算到哪一层。MCP的成本是工具定义常驻窗口;MCP的收益是把整个代码库挪出窗口。当代码库有几百万行、而13个工具定义只有几千token的时候,这笔交易的方向非常清楚。当你挂的是十几台各自带着几十个工具的服务、而要处理的只是一个单文件改动时,方向就反过来了。
所以真正的原语不是“MCP好”或者“MCP差”,而是:判断一个机制该不该用,得看它换掉了什么,而不是它本身占多少。只算成本不算它替你搬走了什么,就会得出一堆看着严谨、方向却是错的结论。
## 怎么判断一笔上下文交易划不划算
把这条原语做成可算的式子并不难。任何一个占用常驻上下文的机制,划算与否取决于两个量的比:
- 它的常驻成本:工具定义、指令片段每一轮都要付的那部分。
- 它替你挪出窗口的量×这些内容原本被读到的频率。
13个工具定义大概几千token,换掉的是一个动辄百万行的代码库——这笔交易几乎不用算。而挂十几台服务、每台带几十个工具,常驻成本可能上万token,换回来的却只是“万一要用”的可能性,这就是纯亏。
注意第二项里那个频率因子,它是最容易被忽略的。一个替你搬走了大量内容、但那些内容一次都用不到的机制,收益是零而不是很大——你只是把从来不会被读的东西,从窗口里换成了从来不会被调的工具。这种“看起来做了优化,其实两边都是死重”的情况,在堆了一堆集成的项目里非常常见。
实操上的粗判据:一台服务如果在最近十次任务里被调用不到两次,就该从常驻改成按需加载。这个数字没什么理论依据,但它足以砍掉大部分明显不划算的常驻项,而且执行成本只是翻一下调用日志。
## 上下文腐烂到底是怎么坏的?
“上下文腐烂”这个词现在满天飞,但绝大多数复述都把它讲成了一条平滑的曲线:输入越长,效果越差,像电池慢慢没电。
Chroma那份原始研究 (https://www.trychroma.com/research/context-rot)说的不是这个。他们在18个前沿模型上做了受控实验,最重要的发现有两条,而且两条都比“越长越差”更有用。
## 第一条:退化是非均匀的,是撞悬崖不是滑坡
模型不会随输入变长而线性变差。它们是撞墙——有的模型在32K还好好的,到64K突然塌方;有的一路撑住,然后毫无预兆地垮掉。
这条对工程实践的意义很直接:你在8K上下文里跑通的验证,对64K完全没有预测力。那种“先小规模验证,成了再放大”的常规做法,在长上下文这件事上是失效的。要验就得在你真实的上下文长度上验。
## 第二条:伤害的大小取决于问题和目标的语义距离
当要找的信息和提问之间语义相似度高时,长上下文的伤害小;相似度一低,退化速度立刻加快。
这条解释了一个很常见的困惑:为什么同样是塞满窗口,有时候Agent表现正常,有时候直接失智。区别不在你塞了多少,而在你要它找的东西和它手上的提问长不长得像。
落到做法上:如果任务本身就是“从一堆不相关的东西里找出那个隐含相关的”,比如排查一个症状和成因完全不像的线上问题,那这类任务对上下文洁净度的要求要比普通任务高一个量级。别在这种任务上省事。
研究里还测了干扰项的影响——语义上相似但实际无关的内容,会明显把模型带偏。这也是为什么“多塞点保险”这个直觉完全反了:你买的不是保险,是打了折的注意力。
## 长上下文失效有几种,各自怎么认?
知道会坏还不够,得能在现场认出是哪种坏法。Drew Breunig那篇长上下文失效模式 (https://www.dbreunig.com/2025/06/22/how-contexts-fail-and-how-to-fix-them.html)给了一套至今没被超越的分类,四种,各有各的相貌:
失效模式 | 机制 | 现场症状 | 该拉哪根杠杆 |
污染 | 一个幻觉或错误进入了上下文,之后被反复引用 | Agent坚持一个不存在的函数名/接口,你纠正一次它下一轮又用回去 | 开新会话,或把那段消息从历史里摘掉重来 |
分心 | 上下文长到模型过度关注历史,反而忽略了训练里学到的东西 | 前十轮很聪明,第三十轮开始机械重复前面的模式,不再想新办法 | 压缩历史,保留意图和产物,丢掉过程 |
混淆 | 上下文里多余的信息被模型拿去生成了低质量回答 | 输出里混进了另一个模块的约定、另一个环境的配置 | 收紧检索范围,把不相关的文件逐出 |
冲突 | 新累积进来的信息或工具,和上下文里已有的内容互相矛盾 | Agent在两种做法之间反复横跳,或者在相似工具间犹豫不决 | 砍工具集,消除重复;统一指令文件里打架的规则 |
这张表最大的用处是逼你先诊断再动手。四种失效对应四根完全不同的杠杆,用错了不但不解决问题,还会把成本推上去。
最容易搞混的是分心和混淆。判据是这样的:分心的Agent在重复自己,混淆的Agent在引用别人。前者要压缩,后者要收紧检索——反过来做,两边都会更糟。
## 现场排查该按什么顺序走
四种失效在真实会话里经常同时出现,所以顺序比清单重要。我实际用的排查路径是这样的:
- 先问是不是污染。成本最低、危害最大。判据是“我纠正过的东西有没有卷土重来”。只要出现一次回滚,后面所有诊断都不用做了——先把那段历史清掉,因为污染会伪装成另外三种。
- 再问是不是冲突。看Agent在不在两个方案之间反复横跳,或者在功能相近的工具间犹豫。这一步查的是你的配置,不是它的状态,所以可以离线做。
- 然后区分分心和混淆。用上面那条“重复自己还是引用别人”的判据。
- 最后才考虑加东西。如果前三步都排除了,问题很可能真的是信息不够——但按我的经验,走到第四步的概率不到三成。
把顺序反过来做,是这个领域最常见的时间浪费:一上来就补资料,结果补进去的东西被已有的污染带偏,症状加重,然后你以为是补得还不够多。加法在诊断阶段是有害的,因为它同时改变了症状和病因,让你没法归因。
## 该删的时候,怎么删才不丢信息?
Agent跑得够长,再聪明的检索也挡不住对话被填满。减法从选修变成必修,问题只剩一个:怎么删而不毁掉信息。
2026年的生产框架已经收敛出一套带明确阈值的打法,LangChain在Deep Agents文档里给的方案 (https://docs.langchain.com/oss/python/deepagents/context-engineering)是目前最干净的样本。三条规则,顺序不能乱:
- 任何单条超过2万token的工具返回,卸载到文件系统,在上下文里替换成一个文件路径加前10行预览。
- 会话越过模型窗口的85%,就把较早的工具调用截断成指向磁盘内容的指针。
- 只有当卸载已经不够用时才摘要——生成一份包含会话意图、产物、下一步的结构化摘要,同时把原始消息写到磁盘作为权威记录。
这个顺序本身就是课程。卸载是无损减法——内容还在,只是改用路径引用;摘要是有损的,而且失败方式很阴:摘要悄悄丢掉了那条唯一重要的约束,三轮之后Agent跑偏了,没人知道为什么。
## 还有另一半卸载,几乎没人提
关于卸载,绝大多数转述只讲了工具返回那一半。文档里还有对称的另一半:工具调用的入参也要卸载。
典型场景是写文件和编辑文件。你让Agent写一个800行的文件,这次工具调用的入参里就带着这800行的完整内容,然后它会一直躺在对话历史里。而这份内容已经落到磁盘上了——历史里那一份是纯冗余,一个字的信息量都没多出来,却要在接下来每一轮都被重新读一遍。
这一半为什么容易被漏掉?因为它反直觉:大家的心智模型里,“上下文膨胀”是Agent读进来的东西造成的,很少有人意识到Agent写出去的东西同样会在历史里留下等重的副本。跑重构、跑批量改文件的任务,这一项经常是最大的单一开销。
## 压缩到什么程度算过头
给一个可操作的判据:如果要压缩,就得让“大海捞针式恢复”可测试。当Agent后来发现需要那条被摘要掉的细节时,它还取得回来吗?取不回来,就是压狠了。
实操上可以这么验:压缩之后,故意问Agent一个只有被压掉那段才答得出的问题。答得出,说明摘要保住了要害;答不出,把摘要模板里的字段补一条。这个动作花不了五分钟,但它是压缩策略里唯一有反馈信号的环节。
摘要模板本身也值得固定下来。让模型自由发挥写摘要,它会写成一篇读后感;给它字段,它才会写成一份交接单。我用下来最稳的四个字段是:
- 意图:这次会话到底要达成什么,用一句话。跑偏最先丢的就是这条。
- 已产出:改了哪些文件、建了哪些东西,只列路径不贴内容。
- 硬约束:过程中确认过的、不能违反的规则。这是最容易被摘掉又最致命的一类。
- 下一步:当前卡在哪儿、下一个动作是什么。
缺了“硬约束”那一条,就是前面说的阴险失败:Agent接着干,语气还很自信,只是它已经不知道那个字段不能为空了。
## 常驻开销才是账单上最贵的那一栏
前面讲的都是工作集——它会变、会被逐出。但有两个科目每一轮都坐在窗口里,这让它们成为收益最高的下刀处。
## 工具定义
你暴露的每一个工具定义,每一轮都占着上下文;每一对功能近似的工具,都逼模型烧一轮去纠结选哪个。这不是零头——带着相互冲突假设的臃肿工具集,是有据可查的浪费轮数、把Agent搞糊涂的根源,也正是前面那张表里“冲突”那一行的主要来源。
规则很简单:只暴露覆盖当前任务的、最小的一组无歧义工具,并按需动态加载工具组,而不是一次性挂上你拥有的每一台服务。Agent在写后端代码时,作用域里的设计稿工具纯粹是税。
## 指令文件
CLAUDE.md和AGENTS.md会被拼接进每一轮,是大多数团队预算里被纵容得最厉害的科目。400行的指令文件把整个架构重讲一遍,每一行都在每一轮被永久征税,不管当前任务碰不碰那个子系统。
精简原则只有一句:永远加载的文件里,只放稳定的、全项目通用的规则——约定、硬约束、那几条“到处都别这么干”。所有任务相关的东西,推到Agent按需加载的文件里去。
一个短短的根文件写着“鉴权逻辑在src/auth/,动它之前先读src/auth/README.md”,胜过200行重述那个二十次任务里只碰一次的鉴权流程。更细的分层组织方式,我在CLAUDE.md记忆术的四级作用域拆解 (https://zhangwenbao.com/claudemd-memory-guide.html)里写过一整套,同一套逻辑也支撑着持久记忆系统——常驻层保持极小,可检索层承载大头。
顺带说一句子代理。Skill和子代理的核心区别 (https://zhangwenbao.com/claude-skill-vs-subagent.html)正是上下文归属:Skill共享主窗口,子代理拿的是独立窗口。所以把一个会产生大量中间输出的探索型任务丢给子代理,本身就是一次卸载——脏活在别的窗口里干完,回来的只有结论。这是减法思路的一个结构性用法,比任何压缩技巧都干净。
## 上下文预算该怎么分配?
减法是战略,预算是记账。把窗口当成一份有明细科目的账,你的工作就是分配——每一个花在过期堆栈上的token,都是从Agent真正要改的那个文件那里挪走的。
科目一共三类:
- 固定开销:系统提示词、指令文件、工具定义。纯负担,压到最低。
- 工作集:及时检索到的代码、最近N轮对话、已卸载内容的路径指针。保持精准,过期即逐出。
- 预留余量:给下一个工具结果和推理留出的空间。
把它落成一张真实的账更有说服力。假设一个20万token的窗口,一个中等复杂度的重构任务,我会这么分:
科目 | 预算 | 里面装什么 | 失控的信号 |
固定开销 | 不超过1万 | 系统提示词、精简后的指令文件、当前任务需要的那几个工具定义 | 还没开始干活,窗口已经用掉8%以上 |
工作集 | 12万到14万 | 及时检索到的定义和调用点、最近若干轮对话、已卸载内容的路径指针 | 里面出现了三轮之前就不再提及的文件 |
预留余量 | 不低于3万 | 留给下一个工具返回和这一轮的推理 | 压缩总是在工具返回的瞬间被触发 |
右边那一栏比左边的数字更有用。预算是不是合理,不看你分了多少,看它以什么方式被突破。固定开销超标说明你在指令文件和工具集上偷懒;工作集里躺着老文件说明逐出策略没生效;压缩总在工具返回那一刻被触发,说明余量留少了。
余量为什么值得单列一栏?因为一个把窗口跑到99%满的Agent没有余地思考——下一个大的工具返回,会逼它在最糟糕的时刻仓皇压缩,而仓皇压缩恰恰是最容易丢掉关键约束的时候。
预留余量这件事没法靠感觉,得能看见。给Claude Code装一个实时状态栏 (https://zhangwenbao.com/claude-hud-guide.html)是成本最低的办法,上下文占比和token消耗直接摆在眼前;把黄色预警线提前到七成,而不是等它变红。看不见的预算是管不住的,这一条在任何领域都成立。
Anthropic在官方那篇为AI智能体做有效上下文工程 (https://www.anthropic.com/engineering/effective-context-engineering-for-ai-agents)里给的框架是同一套骨架,并且明确提出了结构化笔记模式:Agent把草稿写到上下文窗口之外的文件里,需要时再读回来,长期记忆在真正用到之前不占预算。这和前面那条“先卸载再摘要”是同一个原理的不同表达。
## 三种模型的窗口,账要分开算
上面那张表按20万窗口算。但2026年常用的几档窗口差得很远,同一套比例直接套过去会出问题。
窗口越大,固定开销的占比越不值得优化,工作集的纪律反而越重要。1万token的指令文件在20万窗口里是5%,在100万窗口里是0.5%——后者你完全没必要为它花时间。但工作集不是这样:窗口翻五倍,Chroma测出的那道悬崖并不会跟着往后挪五倍,因为退化跟的是绝对长度和干扰项密度,不是你用掉了窗口的百分之几。
所以有一条很反直觉的推论:换了更大窗口的模型之后,该收紧的是工作集,而不是放松。大窗口给你的是“不会硬性截断”的安全感,不是“可以多塞”的许可证。100万token的窗口是容量上限,不是使用目标——把它当目标的人,通常在第三十轮就会发现Agent开始胡说八道,然后归咎于模型不行。
还有一个容易被忽略的成本项:缓存。很多服务对命中缓存的输入按一折左右收费,而缓存命中的前提是前缀稳定。这意味着把变动频繁的内容放在上下文前部,会让后面所有稳定内容的缓存全部失效。顺序不只影响注意力,还直接影响账单——固定的放前面,易变的放后面,这个排序习惯几乎零成本,收益却是每一轮都在的。
## 哪些“最佳实践”其实在帮倒忙?
2026年一些说得最自信的建议,其实在悄悄拖后腿。它们有个共同点:全是加法,而且全都让人觉得很有生产力。
伪技巧一:为了保险把窗口塞满。这是白交上下文腐烂税——用每个主流模型家族上都测到过的注意力退化,换一份不存在的保险。而且按Chroma的发现,你还不知道自己离那道悬崖还有多远。
伪技巧二:把整个仓库嵌入向量库,然后称之为上下文工程。散文可以,代码不行。代码有结构——定义、引用、调用图,理解这种结构的检索会碾压把源文件当token袋子的检索,precision@5那组三倍多的差距就是证据。而且你还额外背上了一套要和不断变化的代码库保持同步的基础设施。
伪技巧三:不看状态、按固定节奏压缩。“每N轮压一次保持整洁”会扔掉Agent可能还需要的细节,还在窗口只用了30%的时候白白引入目标漂移风险。预算逼你压的时候再压,不要定时压。
顺便处理一个流传很广的数字:不少文章会引用“企业Agent失败中有65%源于上下文漂移”。这个数字我没能找到可核实的一手出处,多数引用都指向另一篇同样没给出处的二手文章。方向可能是对的,但把它当成论据写进技术方案,属于给自己埋雷。凡是找不到署名负责的一手来源的百分比,最好只当氛围不当依据。
## 这套东西用在独立站运营上,具体怎么落?
上面全是编码Agent的语境。但真正让保哥觉得这套方法值钱的,是它在内容和SEO这类活儿上同样成立,而且成立得更明显——因为这类任务的上下文天然更脏。
## 场景一:跑站点审计
让Agent审一个几百页的站,最常见的错误做法是把全站爬取结果一次性喂给它。这是典型的“10万token摘要”——信息全在,但每一条的权重都被稀释了,模型会挑最显眼的几条讲,剩下的当没看见。
正确的形状是及时检索:先给它页面清单和一个查询工具,让它按判断去取。判据是——如果你发现自己在准备一份“它可能用得上”的资料包,那你多半正在制造分心。
## 场景二:批量改内容
这是前面说的“入参卸载”最容易咬人的地方。一次性让Agent改30篇文章,每篇的原文和改写稿都会以工具入参的形式沉在历史里,跑到第十几篇的时候窗口就开始告急,而输出质量的下滑往往先于任何显式报错。
做法是把批量任务拆成独立会话,或者交给子代理,每篇改完只回传一个结果摘要。不要让第30篇的判断建立在前29篇的全文之上——那29篇对它没有任何帮助,只有干扰。
## 场景三:把项目约定沉淀成指令文件
做自养工具的人特别容易把指令文件写成项目说明书。我在用Vibe Coding重塑SEO工作流 (https://zhangwenbao.com/vibe-coding-seo-competitive-advantage.html)那篇里提过一个反复出现的现象:工具越用越顺手,指令文件也越写越长,然后某一天Agent开始忽略你写在第300行的那条规则。
保哥自己也栽过:给一个内容生产脚本写的指令文件从最初的40行长到280行,某天发现它开始忽略“标题不要用冒号拼接”这条——那条规则在第190行,前面堆着一大段和当次任务毫无关系的数据库字段说明。把无关部分挪进按需加载的文件之后,规则立刻又生效了,一个字都没改。
那不是它不听话,是那条规则已经被前面299行稀释掉了。指令文件的容量不是无限的,写第N条规则的时候,你其实在削弱前面N-1条的权重。这句话值得贴在每一个AGENTS.md的开头。
## 场景四:跨会话的项目记忆
做长期项目的人迟早会遇到这个需求:每开一个新会话都要把项目背景重讲一遍,很浪费。于是自然而然想到——把背景写进永远加载的那个文件里。
这正是把常驻层撑爆的最常见路径。正确的分层是常驻层只放索引,检索层承载内容:根文件里写“客户约定见docs/clients/,历史决策见docs/decisions/”,而不是把约定和决策本身抄进去。
判断标准很简单:问自己这条信息在十次任务里会被用到几次。十次里用到八九次的,进常驻层;只在特定任务里才碰的,进检索层。会犹豫的,一律进检索层——因为常驻层的每一行都是复利支出,而检索层的内容不用到就不花钱。
顺带一个反模式:把整个项目的历史决策记录塞进常驻层,理由是“怕它重复踩坑”。实际效果通常是它开始给出四个月前才成立的建议,因为那些记录里的时效性没人维护。过期的常驻上下文比没有上下文更危险,它会让Agent自信地做错事。
## 什么时候这一整套都不该上?
取舍要诚实说清楚:对短的一次性任务,这套机制全都不值。
任务是“给这个函数加个空值检查”“把这段文案的语气改得客气一点”,那么一个带着那一个文件的朴素提示词,胜过任何检索流水线、压缩方案或记忆系统。你花在搭上下文管线上的时间,够你手动做完二十次。
上下文工程是给长时程Agent的纪律;在两轮的任务上,它纯是负担。让仪式感匹配时程——这句话应该和前面那些技巧一起记住,因为过度工程化在这个领域造成的浪费,一点不比上下文膨胀少。
判断门槛可以粗暴一点:Agent要跑超过10轮、或者会读超过5个文件,才值得动用这一套。低于这个量级,好好写提示词、把对的文件递给它,到此为止。想系统补齐整条主线的,Claude Code从安装到工作流的完整指南 (https://zhangwenbao.com/claude-code-complete-guide.html)是更合适的入口,那篇讲的是骨架,这篇讲的是骨架上最容易断的那一节。
## 三句话收尾
第一,把上下文窗口当预算管,默认做减法:及时检索、代码优先用结构化检索、先卸载再摘要、工具集和指令文件都保持精简、永远预留余量。
第二,先诊断再施法。污染、分心、混淆、冲突四种失效对应四根不同的杠杆。一股脑同时上向量库、摘要流水线和300行指令文件然后祈祷,只会加成本、不解决问题。
第三,数据要读到实验设置那一层。“5K打赢100K”只是标题,底下那句“赢的一方把源码整个搬出了窗口”才是可迁移的原语。转述会磨掉细节,而工程判断恰恰活在细节里。
模型会一直变强,token预算永远有限。知道什么该留在预算之外,才是区分“能发布的Agent”和“只会空转的Agent”的那项技能。
## 常见问题解答
## 上下文工程和提示词工程到底有什么区别?
提示词工程优化的是一条消息的措辞,是施加在单轮上的手艺。上下文工程管的是整个循环里到底有哪些token进入了窗口——读一个文件进来800行,跑一次测试进来5000行堆栈,grep一把进来40个匹配,这些没有一个是谁写的提示词,它们是堆积出来的。提示词工程是上下文工程的子集。附赠一个免费诊断:Agent第一轮很稳、第三十轮崩掉,那不是提示词问题,是上下文管理问题。
## 5000 token打败10万token,这个结论可信吗?
可信,但要读到实验设置那一层。Sourcegraph的CodeScaleBench用了370个来自真实企业代码库的任务,基线是本地源码加grep、file、read这类标准工具,对照组是把源码搬出窗口、改用13个检索工具。结果是文件召回率0.127升到0.278,precision@5从0.140升到0.478,F1@5从0.099升到0.262。需要注意的是,赢的那一侧不是笼统的结构化检索,而是一套通过MCP暴露的检索工具——这个细节在多数转述里被抹掉了。
## 上下文腐烂是不是就是越长越差?
不完全是。Chroma在18个前沿模型上的受控实验给出了两条更精确的结论:一是退化非均匀,模型是撞悬崖不是滑坡,有的在32K还正常、64K突然塌方;二是伤害大小取决于要找的信息和提问之间的语义相似度,相似度越低退化越快。实践含义是,短上下文里跑通的验证对长上下文没有预测力,要验就得在真实长度上验。
## 卸载和摘要该按什么顺序做?
先卸载,再摘要,顺序不能反。参考LangChain在Deep Agents里给的阈值:单条工具返回超过2万token就写到文件系统,上下文里只留路径加前10行预览;会话越过模型窗口的85%时截断较早的工具调用;只有当卸载已经腾不出空间了才摘要。原因是卸载无损而摘要有损——摘要一旦丢掉了那条唯一重要的约束,三轮之后Agent跑偏,没人知道为什么。
## 工具调用的入参也需要卸载吗?
需要,而且这一项经常被完全忽略。写文件、编辑文件这类操作,会把整份文件内容作为入参留在对话历史里,而这份内容已经落到磁盘上了,历史里那一份是纯冗余。跑重构或者批量改文件的任务时,这往往是最大的单一开销。大家的心智模型里上下文膨胀是读进来的东西造成的,很少有人意识到写出去的东西会在历史里留下等重的副本。
## CLAUDE.md写多长算合适?
没有绝对行数,但有一条判据:只放稳定的、全项目通用的规则,任务相关的一律推到按需加载的文件里。因为这个文件会被拼接进每一轮,每一行都在被永久征税。一个短根文件写着“鉴权逻辑在src/auth/,动它之前先读src/auth/README.md”,胜过200行重述那个二十次任务只碰一次的流程。还有个反直觉的推论:写第N条规则的时候,你其实在削弱前面N-1条的权重。
## 什么情况下不该做上下文工程?
短的一次性任务全都不该。给一个函数加空值检查、改一段文案的语气,一个带着那一个文件的朴素提示词,胜过任何检索流水线、压缩方案或记忆系统。粗暴的门槛是:Agent要跑超过10轮、或者会读超过5个文件,才值得动用这一套。低于这个量级,过度工程化造成的浪费不比上下文膨胀少。
## 权威参考资料
## Claude Code怎么搭SEO自动化工作流?claude-seo技能实测与自建
- URL:https://zhangwenbao.com/claude-code-seo-automation-workflow.html
- 分类:AI编程与工具链
- 发布:2026-06-02 | 更新:2026-06-02
- 摘要:不堆Claude Code的功能清单,只讲一个老SEO怎么把它用成自动化产线:claude-seo能省下大量重复扫描却有水土不服,真正的杠杆是自建SKILL.md,再配上每周审计、内容刷新、排名周报四个实战场景,以及国内网络与订阅的真实门槛。
- 关键词:SEO自动化,Claude Code,SEO工作流
摘要:Claude Code真正改变SEO工作流的地方,不是“帮你写一段脚本”,而是它能照着你写好的技能文件,自己读站、跑代码、调API,把技术审计、内容诊断、周报这些每周固定要熬的活批量跑完。最快上手的路子是先装开源技能claude-seo跑一周建立手感,但它有几处国内会卡壳的坑;真正的长期杠杆,是你照着自己网站的脾气写一份SKILL.md,把这套判断力沉淀成可复用、可定时、可交接的产线。这篇按“装环境 → 实测claude-seo → 自建技能 → 串成流水线 → 划清边界”的顺序,把一个国内能落地的AI SEO工作流讲透。
做SEO这行,工具从来不缺。Screaming Frog爬一遍、Ahrefs导一堆词、GSC拉一摞数据,最后还得回到Excel里手动拼。强是真强,可问题也明摆着:每周固定要花的那几个小时,几乎都耗在“把数据从一个工具搬到另一个工具,再人肉对照判断”这种没什么创造性的环节上。
做SEO这行,最想砍掉的就是这段重复劳动。不是说判断不重要——恰恰相反,判断最重要,所以更不该把脑子浪费在搬运数据上。2026年这一年,让我觉得这件事终于能落地的,是Anthropic的Claude Code。它不是又一个聊天框,而是一个住在你终端里、能真正“动手”的智能体:读你本地的文件、跑Python、调外部接口、并行开好几个子任务,最后把结论拼给你。配上它的技能(Skills)系统,你等于可以给它装一颗“SEO大脑”,让它按你定的章法自己干活。
下面这套流程,不需要你是程序员——代码它来写、来跑、来debug,你负责说清楚要什么、看懂结果、做最后拍板。但你得懂基本的SEO逻辑,否则它跑得再快,方向错了也是白搭。
## SEO自动化到底卡在哪一步?
先把病灶说清楚,才知道Claude Code解的是哪一段。传统SEO自动化的痛点,其实就三条:
- 工具是散的。爬虫一个、外链工具一个、数据分析一个、报告又一个,每个之间靠人手搬运。一次完整的站点诊断,光在不同后台之间切换、导出、合并,就能磨掉大半天。
- 规则是死的。市面上的SaaS给你的是固定模板,可一个本土外贸站、一个SaaS落地页、一个内容博客,该看的指标、该排的优先级完全不一样。模板化的输出经常给你一堆“正确的废话”。
- 胶水代码是要命的。真想把几个工具串起来自动化,得自己写脚本、维护API、处理报错。写一次能用,三个月后接口一变就崩,维护成本压根算不过来。
这三条卡的其实是同一个地方:缺一个能听懂人话、又能动手干活、还能随网站情况随机应变的“中枢”。Claude Code补的正是这一段。你用中文跟它说“帮我看看这个站的Core Web Vitals和E-E-A-T有哪些硬伤,按影响排个序”,它会自己决定抓哪些页、跑什么检测、调哪个接口,最后给你一份带优先级的清单。把散件接起来的胶水,它自己写、自己改。
这跟“SEO自动化的边界在哪、哪些能交给工具哪些不能”是同一个命题的两面,这里只先记住一句:能自动化的是“执行”,不能自动化的是“判断和担责”。
## Claude Code凭什么值得SEO上车?
市面上能写代码的AI不少,为什么单挑Claude Code来做SEO自动化?核心就一句:它真有“用电脑”的能力,而不只是“说代码”的能力。
网页版的对话模型,你问它要个脚本,它吐给你一段文本,跑不跑得通、报不报错,得你自己复制粘贴去试。Claude Code不一样,它直接在你的项目目录里:
- 读、写、改你本地的文件和代码库,改完能立刻跑给你看;
- 执行Python、Node脚本,报错了它自己读traceback、自己修;
- 调用外部接口,比如Google Search Console、PageSpeed Insights,把真实数据拉进来分析;
- 并行开好几个子代理(agent),一个查技术、一个看内容、一个评GEO,最后汇总;
- 通过技能系统加载你写好的playbook,按固定章法办事。
对SEO来说,这几条凑在一起的意义是:你第一次有了一个“既懂数据分析、又会写代码、还不嫌活累”的执行层。它跟付费SaaS的关键区别在成本结构——SaaS是按月按席位收你钱,功能给到哪是别人说了算;Claude Code是你一个订阅打底,能力边界由你写的技能决定,想要什么自己加。
当然,工具再利,也得先会用基本功。Claude Code本身有一堆命令和上下文管理的门道,用顺了效率差好几倍。这部分单独写过用了一年最终留下的几个核心命令 (https://zhangwenbao.com/claude-code-six-core-commands-minimalist-workflow.html),这里不展开,免得跟本文的自动化主线打架——你可以把那篇当作上车前的“驾照”,本文当作“上路跑长途”。
## 国内怎么把Claude Code装上、跑起来?
这一步看着简单,国内用户其实最容易在这儿劝退。下面把真实门槛和命令都摆出来,别等装到一半才发现卡住。
## 官方安装命令(2026年现行版)
macOS / Linux / WSL,推荐用原生安装脚本,零依赖、后台自动更新:
curl -fsSL https://claude.ai/install.sh | bash
Windows用户,用PowerShell(建议管理员权限):
irm https://claude.ai/install.ps1 | iex
装完验证版本,再进你的项目目录启动:
claude --version
cd /path/to/your-seo-project
claude
如果你更习惯npm,也可以走 npm install -g @anthropic-ai/claude-code,但官方主推的是原生安装,自动更新这一条对长期用很省心。
## 国内落地的三个真实门槛
这才是重点,也是官方文档不会跟你讲的,下面这几个坑得提前知道:
- 账号与订阅。Claude Code要绑Claude的Pro、Max、Teams、Enterprise或者Anthropic Console账号,免费额度跑不动真正的自动化。重度使用建议直接上Max——并行跑审计很吃额度,Pro经常半路就提示限流。订阅支付对国内用户是第一道坎,得自己解决境外支付方式,这块各人情况不同,本文不展开。
- 网络。无论装Claude Code本身,还是后面要拉GitHub上的开源技能、调Google的接口,全程都要稳定的境外网络。不是“能打开网页”那种偶尔通,而是脚本连续跑十几分钟不断流。网络不稳,是后面claude-seo审计最常见的失败原因,没有之一。
- 本地环境。装Python 3.10及以上,Claude Code会自动调用。建议在项目根目录建一个 .claude/ 文件夹放你的自定义技能,后面会用到。
把这三关过了,你就有了一个能干活的底座。接下来分两条路:先用现成的开源技能快速见效,再自己造技能补短板。
## claude-seo这个开源技能,到底值不值得装?
社区里已经有人把常用的SEO能力打包成了开源技能——AgriciDaniel的claude-seo仓库 (https://github.com/AgriciDaniel/claude-seo)。保哥实测跑了不止一周,下面有褒有贬,按真实体验说。
## 它到底能干什么?
这不是个玩具。它一次能调起25个子技能、18个专业子代理并行干活,覆盖面相当全:
- 技术SEO:抓取、索引、Core Web Vitals信号、站点结构;
- 内容质量(E-E-A-T):经验、专业、权威、可信四个维度逐项打分;
- 结构化数据:检测、校验、生成Schema.org标记;
- GEO / AEO(AI搜索优化):评估段落的“可被引用性”——它会量化答案块的自包含程度(官方说最优是134到167个词的独立答案块)、问题式标题层级、归因密度,还会看你在维基百科、Reddit、YouTube、LinkedIn上的实体存在感;
- 本地SEO、国际化hreflang、电商SEO、图片优化、竞品分析等等。
它会自动识别你的网站类型(SaaS、本地商户、电商、内容站),然后输出一个0到100的健康分,外加一份分了Critical / High / Medium / Low优先级的行动计划。这份计划最值得认可的一点是:每条建议都带“可证伪”的验证方法——不是空喊“你要优化标题”,而是告诉你怎么检验这条做了到底有没有用。它是MIT许可、开源免费的,不跳过可选的Google API和扩展时,甚至能完全离线跑。
## 怎么装、怎么跑?
最快的是插件方式(需要Claude Code 1.0.33及以上版本):
/plugin marketplace add AgriciDaniel/claude-seo
/plugin install claude-seo@agricidaniel-claude-seo
如果你想看源码、改技能,走手动安装。Unix / macOS / Linux:
git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
bash claude-seo/install.sh
Windows PowerShell:
git clone --depth 1 https://github.com/AgriciDaniel/claude-seo.git
powershell -ExecutionPolicy Bypass -File claude-seo\install.ps1
装完启动Claude Code,跑一条全站审计:
claude
/seo audit https://your-site.com
常用命令列几个高频的,输入 /seo 能看到全部27个:
命令 | 用途 |
/seo audit