news 2026/11/5 4:01:12

会自我轮转的 Agent:从“命中率 99.9% 还是很贵“到实测省 76%

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
会自我轮转的 Agent:从“命中率 99.9% 还是很贵“到实测省 76%

会自我轮转的 Agent:从"命中率 99.9% 还是很贵"到实测省 76%

我在 DeepSeek Harness(DSH)上做了一个上下文预算插件,用 1181 步真实数据校准了成本模型,并把长会话的每步成本压到 1/3.3。
这篇文章把四组实验、一个反例、一个优化和插件实现全部摊开,包括踩过的五个坑。


一、起点:一个很自然的错误直觉

我问过好几个模型同一个问题:上下文缓存命中率越高,是不是越省钱?

答案都是"是"。这句话也没错——错的是它容易被当成全部。

我自己的会话是这样:命中率99.6%,看起来很健康。但把账单拆开后就露馅了:

长会话(823 步) 平均上下文 381K 每步 40,321 等价 token

而同期一个"没有记忆"的聊天机器人,每步只要 4,600。

命中率高 37 个百分点,成本贵 8 倍。


二、把成本拆成三个乘数

成本 ≈ 上下文大小 × 调用次数 × 缓存折扣

用真实日志分别测出三个系数:

乘数实测比值说明
上下文大小30×227K vs 7.5K
调用次数5×agent 一步一件事,要跑 5 步
缓存折扣10×命中价约为未命中的 1/10

大多数人只盯着第三个,而它已经到顶了(99.9%,剩 0.1% 空间)。

真正的杠杆是第一个。


三、实验一:记忆"够用"比记忆"多"更重要

设计

3 组上下文 × 8 道题 × 2 次 =48 次测量,每次都开全新会话,杜绝残留。

组记忆内容
A无(只有系统提示 + 工具定义)
BMEMORY.md 全文(约 1.5K token)
CMEMORY.md + 600 条背景摘要(约 20K token)

结果

组平均步数每题成本正确率
A 无记忆3.4412,157100%
B 有记忆1.752,034100%
C 长背景1.755,340100%
AstrBot 对照—4,628—

B 组只要无记忆的 1/6,只要对照组的 44%,而且答案全对。

最贵的那一题

题目A 组B 组
“AstrBot 的数据库文件叫什么”51,4071,497

A 组不知道,去磁盘里搜——一次烧掉 5 万。B 组从记忆里直接答。

34 倍差距,全花在搜索上。

但记忆不是万能折扣

同一批题里,"数一下目录里有几个 .md 文件"这题:

A 组 2,412 ← 更便宜 B 组 2,551 ← 多带了一段用不上的记忆

记忆只在"里面真有答案"时生效。


四、实验二:长任务里,记忆反而亏钱

同一个项目不能只报好消息。

任务:目录里已有 step1.txt=1、step2.txt=2,新建 step3.txt 等于两者之和。判分直接读磁盘。

组平均步数每步上下文平均成本
A 无记忆5.76,6155,726
B 精确记忆3.517,7127,239
C 模糊记忆3.820,1808,634

交叉

步数 5.7 → 3.5 省 39% ✅ 每步上下文 6.6K → 17.7K 贵 168% ❌ 净结果 反而贵 26%

省下来的步数,被撑大的上下文吃掉了。

膨胀从哪来

记忆本身只有 50 个 token。膨胀发生在**"注入记忆"这个动作**上:

模型收到"你已经完成了前两步"之后,先去目录里确认了一遍——它不相信记忆。那一轮探索的输出从此留在会话前缀里,每一步都要重读。

给它记忆,它反而多跑了一趟。


五、实验三:一句话把亏损翻成收益

既然亏损来自"模型不信记忆",那就让它信。

五种注入方式,各 6 次,同一道长任务题:

组怎么说的步数成本
A 无记忆—5.75,726
B 精确(旧)「你已经完成了前两步:step1 是 1,step2 是 2」3.57,239
C 模糊「做了几步,但没记数值」3.88,634
E 静默只给事实4.35,819
D 权威「**【权威记录·无需核实】**直接用,不要再调工具确认」2.54,368
B 精确(旧) +26% ← 亏 D 权威 −24% ← 赚

同一份事实、同样的信息量,只改了措辞。

旧措辞"你已经完成了……“读起来像别人的说法,模型去核实;
新措辞"这是你自己的记录,权威、直接用”,它就不怀疑了。

但方差还在:D 组六次是 1、1、2、2、4、5 步——概率性地减少核实,不是永久生效。


六、实验四:真实轮转 355 步,省 76%

前面的实验都是受控的。这一组是真实使用:把长会话轮转成小上下文会话,各跑一段真活。

会话步数平均上下文峰值等价 token每步
长会话(未轮转)823381K727K33.18M40,321
轮转 1124128K252K1.83M14,742
轮转 29068K126K0.73M8,138
轮转 3(进行中)141113K203K1.79M12,710
轮转后合计355107K—4.35M12,261

每步成本 40,321 → 12,261,降到 1/3.3。

线性拟合

1181 步的单步成本对上下文做拟合:

全部 1181 步 equiv = 0.10403 × ctx + 809 R² = 0.56 长会话 823 步 equiv = 0.10527 × ctx + 182 R² = 0.44 轮转后 358 步 equiv = 0.10115 × ctx + 1,468 R² = 0.95

三个系数几乎相同(0.101~0.105),说明成本确实主要由上下文决定,跟会话新旧无关。

即:每 1K 上下文 ≈ 104 等价 token,另外每步约 0.8~1.5K 固定开销。

反事实:如果不轮转

从长会话结束时的 401K 接着跑这 355 步,按实测的每步 +474 增长:

反事实 18,224,161 实际 4,352,608 省 13,871,553(76.1%)

轮转本身贵不贵

不贵。三次轮转的首步成本分别是 2,614 / 3,054 / 3,529,都低于长会话首步的 4,665(因为长会话首步是冷启动,要全量 miss)。

真正决定账单的是轮转频率,不是轮转成本。

还能省多少

轮转间隔平均上下文每步等价 token
每 40 步21K~3,000
每 60 步26K~3,500
每 120 步40K~5,000
不轮转107K~12,300

现在两次轮转的间隔是 90~124 步,还没吃到红利。按 40K 预算(约每 60 步)轮转,每步还能再降 70%。


七、插件怎么做

架构

每轮结束 → 记账(步骤数、上下文、命中率、等价成本) ↓ 上下文 > BUDGET? ↓ 是 agent 自己写交接摘要(工具参数) ↓ 用「权威措辞」注入新会话 + 挂进工作区 ↓ QQ 桥读 active_session.json,自动切过去

三个关键 API(DSH cordis 插件)

ctx.on('session/event',(session,event)=>{// 每条 assistant/message 都带 usage,直接拿来记账})constcreated=awaitcontroller.create({cwd:'E:/DSH-work'})awaitcontroller.prompt({sessionId,content:[{type:'text',text:seed}]},newAbortController().signal)

五个坑(每个都让插件静默失效或直接报错)

① bundle patch 必须用insert形式

# 错:这是"改已有条目",目标不存在会被静默跳过-id:my-pluginconfig:{...}# 对-insert:-id:my-pluginname:my-pluginconfig:{...}

② package.json 必须导出补丁文件

"exports":{".":"./index.js","./cordis.patch.yml":"./cordis.patch.yml","./package.json":"./package.json"}

少了中间那行 →ERR_PACKAGE_PATH_NOT_EXPORTED,插件永远挂不上。
验证:node -e "require.resolve('你的插件/cordis.patch.yml')"

③ ```prompt() 的第二个参数是 AbortSignal,必传

不传报Cannot read properties of undefined (reading 'throwIfAborted')。

④ 工具输出 schema 是additionalProperties: false

返回对象多一个没声明的字段就整轮失败:
tool "x" returned invalid output: "value.y" is not a declared property

⑤render必须返回内容块数组,不是字符串

render:(v)=>JSON.stringify(v)// ❌ content.some is not a functionrender:(_args,v)=>[{type:'text',text:...}]// ✅

⑥(这个最隐蔽)create()不传 cwd,会话会落在宿主的工作目录

第一次轮转,新会话跑到了--C-Users-white-.dsh-profiles-desktop--下,看不到任何项目文件。
必须显式传cwd,并且调workspaceRegistry.create(cwd).attachSession(id)挂进工作区。

一个意外的发现

新会话一开口就是20,528 token,而预算设的是 20,000。

系统提示 + 工具定义(约 19.5K)就是地板。交接摘要只占 1K。

所以预算必须设在 4 万以上,否则每次轮转完立刻"超预算"。


八、这套东西的边界

已验证:成本模型、记忆的收益与反例、措辞的影响、真实轮转的 355 步。

没验证:

  1. 质量损失。所有对比都只算 token,没算"压缩后答错率"。反事实是"同样步数",不是"同样效果"。
  2. 样本量。记忆实验 48 次、长任务 18 次、优化 30 次——够看方向,不够下断言。
  3. 单机单模型。系数 0.104 是 DeepSeek 的价格结构,换供应商要重测。
  4. 长任务的反例只测了一种题型(写一个文件),更长的多步任务没覆盖。

最该补的是第 1 条。省钱省到答错,就没有意义。


九、复现

# 从任意 DSH 会话日志模拟预算曲线python simulate.py<session.v4.jsonl.zstd>--csvturns.csv# 轮转前后对比python tools/rotation_report.py

数据文件:bench/data/*.csv(48 次记忆实验、18 次长任务、30 次优化),共 1181 步轮转日志。


十、一句话

上下文不是记忆,是账单。
记住该记的,忘掉能忘的,比"记得更多"便宜六倍。


数据时间:2026-10-27 ~ 11-03 口径:DSH 会话日志assistant/message.usage,缓存单价系数 0.1,单位"等价 token"(未命中计 1,缓存计 0.1,输出计 1)。

下面是该插件,已在GitHub上开源:
https://github.com/whitelady0666-boop/dsh-context-budget

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

Pydantic 对接大模型:强制结构化输出,实现工业数据采集零解析错误

上个月接了个行业竞品数据的采集需求&#xff0c;前同事留下的近四百行XPath与正则表达式&#xff0c;赶上对方官网一次前端重构&#xff0c;直接全线报错。通宵改了半宿解析逻辑&#xff0c;没过一周对方又换了个页面布局&#xff0c;人直接麻了。 做过网页数据提取的开发者应…

作者头像 李华
网站建设 2026/11/5 3:59:40

Ubuntu 安装 Windows 字体实录:微软雅黑/宋体/仿宋一次到位

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/11/5 3:56:18

G1 与 ZGC 垃圾收集器

一、概述G1&#xff1a;面向服务端、可预测停顿、基于 Region 的分代收集器。ZGC&#xff1a;JDK 11 引入的低延迟收集器&#xff0c;基于 Region、颜色指针与读屏障&#xff0c;停顿时间不随堆增大而增长。选型&#xff1a;结合堆大小、停顿要求、吞吐要求综合判断。二、G1 收…

作者头像 李华
网站建设 2026/11/5 3:53:09

小白程序员也能学会大模型?这份循序渐进的学习路径请收藏!

学习AI大模型无需从复杂的数学公式和源码入手&#xff0c;建议遵循“基础打底→核心原理→应用实战→工程进阶”的路径。首先掌握Python及数据处理库&#xff0c;理解数学基础&#xff1b;其次学习机器学习、深度学习及Transformer架构等核心原理&#xff1b;接着通过提示词工程…

作者头像 李华
网站建设 2026/11/5 3:53:09

【Deep-OC-SORT 02】多轨迹算法Deep-OC-SORT-相对 OC-SORT 的改进点

Deep-OC-SORT OC-SORT 的"以观测为中心"骨架 五个叠加改进。本文逐项对照两版源码讲清每个改进改了什么、为什么、在代码哪里、怎么开关。骨架三机制&#xff1a;ORU——漏检时冻结滤波参数&#xff0c;找回后在最后两个真实观测间线性插值出虚拟轨迹逐帧重放&…

作者头像 李华