dsh-slice-agent-loop
September 3, 2026 · View on GitHub
English | 中文
每一轮对话,把模型最需要的上下文交给它。不多给,也不少给。
这句话听起来像常识,但今天主流 coding agent 的做法是把整段对话史原样塞回模型:多给的部分从不裁剪,少给的时刻无法挽回。这个插件把围绕这句话设计的 slice loop 装进 DeepSeek Harness:同一个 harness、同一个模型、同一套工具与持久化,只把 agent loop 换掉——所以下面每一组对照实验,唯一的变量就是循环本身。
早期内测版;对应 DSH 0.1.2-alpha.4(snapshotEvents、typert /api/<ns>/<method> RPC + cookie 鉴权;自带 bench 驱动已说新协议)。
一句话,两个约束
| 约束 | transcript(全量对话史)现状 | |
|---|---|---|
| 不多给 | 上下文有上界 | 上下文一路涨到窗口上限,然后压缩;注意力稀释,账单随轮数快速增长 |
| 不少给 | 信息可回取 | 压缩之后,细节消失且无法找回 |
Transcript 架构的三个结构问题:A · Context rot——上下文越长,模型对每条信息的利用率越低;B · 压缩即断头——摘要必然有损且不可逆,原文不在任何地方;C · 成本随轮数平方增长——每次调用重发全史,缓存折扣延后爆发点,但救不了体量。
设计:磁带 + 召回
模型每轮看到的不是对话史,是为这一轮重建的工作切片:
| 区域 | 性质 |
|---|---|
| system prompt · 工具 schema | 冻结,整个会话逐字节不变(前缀缓存友好) |
| SESSION TAPE(会话磁带) | 只追加的封存轮账本:每轮问了什么、做了什么、文件基线与补丁、回复 |
| OPEN FILES | 当前打开文件,带 sha256 锚与 edited 标记 |
| 本轮请求 + 工具观察流 | 轮内追加——大工具结果在进入时折叠(见下)——轮末封存归档 |
磁带长得像 transcript——同样只追加、同样缓存友好——但每条账目带哈希和出处。超长内容在切口处以精确标记截断,全文始终留在持久会话日志里。
召回是"不少给"的兑现,三层:recall_search 找到某句话在哪一轮(评分检索,默认挡掉工具输出洪水),recall_turn 逐字取回那一轮,recall_step(turn, step) 在折叠视图不够用时逐字取回某一条工具结果。磁带的截断处和每个折叠视图上都留着路标,指回原文。
| Transcript 的问题 | 本插件的应对 |
|---|---|
| A · Context rot | 峰值有界:模型永远在小上下文里工作 |
| B · 压缩丢失 | 折叠但不丢失:会话日志全量持久,两层召回逐字回取 |
| C · 平方成本 | 每轮只携带这一轮需要的;磁带只追加,前缀缓存生效 |
两次折叠,两个时间尺度
slice 在两个时刻折叠历史:
| 折叠 | 何时 | 上下文里留下什么 | 什么可回取 |
|---|---|---|---|
| 跨轮(磁带) | 轮末 | 轮摘要、文件基线与补丁、回复头尾 | 全部,经 recall_turn / recall_search |
| 轮内(注入时折叠,2026-09 起默认) | 工具结果进入本轮的那一刻 | 数据/文档读取:头尾行 + 全部结构行,附录块只留前几个键;构建/测试/日志输出:每条错误、失败、警告及其上下文、栈帧、摘要行;源代码与 grep/glob 结果:从不折叠 | 完整结果,经 recall_step(turn, step) |
为什么轮内折叠是杠杆:DeepSeek 的前缀缓存下,命中价约是未命中的 1/30,任何改写旧字节的设计(滑动窗口、轮中封存、逐步重建的账本)每步都付未命中价,输给只追加的流。轮内唯一还能省的是每条新结果的体量——所以流保持只追加,每条结果进入时折叠一次,之后永不改写。实测一轮 45 节点的链式迁移(约 300K token 读取):$0.135 → $0.024,45/45 全对。路由规则及其对 Headroom 的借鉴见 docs/fold-content-routing.md。
模式:mode: 'slice'(默认)即上述全部。mode: 'stream'(实验性,默认关)追加每轮一份宪法(请求原文 + 从最早读取的文件里提取的规则)和一份契约(宿主在每次写入后按谓词校验,带弹回预算,提取错的规则最多打断一次);它是能稳定通过规则文档型账本任务(l2)的配置。mode: 'state'(热窗式世界状态循环)作为实验存档——docs/world-state-loop.md。defaultReasoningEffort: 'low' 是插件默认(连接层的显式设置优先)——效能阶梯见 docs/effort-ladder.md。
实测:双臂对照
default = DSH 自带 transcript loop(带校准压缩);slice = 本插件。同 harness、同工具,两代模型各测一轮:deepseek-v4-flash(0731)与 deepseek-v4-pro(0813)。价格按 2026-08-16 生效的新价目谷时价计:flash 未命中 $0.22/M · 命中 $0.007/M · 输出 $0.66/M;pro $0.66 / $0.022 / $1.98(峰时全线 ×2,两臂相对差不变)。新价目把两代的缓存折扣都收到约 1/30(此前 flash 1/50、pro 1/120)。逐调用账本随附,可复算;下面的结果同时报两轮。
① 长轮次负载 · 双臂 × 双模型
有界切片的主场是长会话——transcript 的成本与峰值随轮数增长,切片不随。两个长轮次场景(16 轮压缩失忆 · 76 轮上下文洪水),每格给 flash / pro 两轮:
| 场景 | 臂 | 验证(flash / pro) | 价格(flash / pro) | 峰值(flash / pro) |
|---|---|---|---|---|
| s13(16 轮) | slice | ✓ / ✓ | $0.0241 / $0.0900 | 16K / 17K |
| default | ✓ / ✓ | $0.0296 / $0.0852 | 59K / 40K | |
| s10(76 轮洪水) | slice | ✓ 零丢失 / ✓ 零丢失 | $0.1529 / $0.6163 | 32K / 43K |
| default | ✓ / ✗ 早期时间线丢失 | $0.3755 / $0.7682 | 378K / 42K |
s10 两轮合起来是 transcript 二难的完整现形。 flash 轮:default 的压缩跟不上洪水,峰值棘轮到 378K——信息都在,考题全对,但上下文失控。pro 轮:压缩正常工作了(峰值轨迹 40→34→39→40 锯齿,有界在阈值线),代价是把只存在于早期历史的时间线摘丢,verifier 直接判失败。峰值失控或有损丢信息,transcript 只能二选一;slice 两轮都是:有界峰值 + 零丢失,且分别便宜 59% / 20%。短场景 s13 的价格随计价结构摆动(flash 下 slice -18%,pro 下 +6%),峰值优势(2.4~3.7×)不随。
勘误(2026-08)——上表 flash 轮的 default 格作废:配置名漂移 (
compact-basic→compaction-basic)让该臂的压缩静默失效,这正是其峰值 棘轮到 378K"什么都留着"的原因。压缩正确标定并验证开火后重测:flash default 同样被 verifier 判死(丢 3 个埋点事实;峰值 96K 锯齿)。两代模型 现在同向收敛:压缩真正运行起来,transcript 就要付有损遗忘的代价。slice 格 在重写后的 schema 上复测不变。
结果更新——2026-08-24 → 31(schema 重写后)
- schema 重写为 DSH 原生:19 个移植分区 → 4 个实供段 + 2 个固定槽;四档
保真度/弹性控制器/Python 逐字节对齐全部退役(−3.4K 行)。kernel 提示词
12.7k → 1.9k 字符;ask/reply 截断改为头+尾并留精确切口;新增插件
贡献登记口(
ctx.sliceContext),插件向切片投稿而 loop 不认识插件。 - 留存系列(7 个新配对场景+复测;双臂同模型同档;逐调用账本):
slice 12/12,transcript 10/12——transcript 的两败都是压缩毁史(s10 洪水;
以及 3.4KB 逐字恢复场景——slice 靠自发的
recall_turn取回,recall 路径 承重性的首个基准级证据)。 - 1M 窗口成本(产品默认压缩 0.8/0.16;transcript 真实爬到 764–779K、穿越
2 次;74 轮 ≈2M token 内容):slice −27%(纯输入洪水)/ −39%(洪水+
真实编码)。差额=transcript 每周期重读爬坡历史(≈W²/2Δ≈10M 缓存 token/周期)
- 压缩摘要按输出计费。
- 诚实的反面(已量化):轻载短会话 slice 贵 +5–46%——推理生成 2–5× (可见正文等长;对编译式案卷重新定位 + 逢事验证认识论的价格)。交叉点 ≈ transcript 的第一次压缩。单轮(Ralph 型)任务无收益:轮内本 loop 就是 transcript。
- 推理链回带双向证伪:塞给 tape → 推理 +42%;剪掉 transcript 原生
reasoning_content回传(471 次)→ −25% 且任务照过。旧推理在上下文里 只是成本;transcript 的省思考来自轻信自己的叙事——正是本 loop 要移除的 失效模式。接线保留在SLICE_REASONING_TAPE=1后面。 - 档案:companion 工作区
results/20260826-retention、20260827-cost1m、20260831-reasoning-ab;另有逐请求查看器(build-request-viewer.mjs), 逐轮渲染两臂真正发给模型的输入。
结果更新——2026-09-01(header 去重被否决)
合成规则(tape 组成 == OPEN FILES hash ⇒ 直接编辑)每轮被陈述三遍:kernel
(缓存价)+ FILES_HDR + NOW 尾(后两处每轮现付)。A/B 删掉两处现付复述
(现付固定文本 −21%,~80 tok/轮),s10(76 轮)+ n1 双臂、判决门各跑两遍。
结论:否决。跨轮组成信任两臂都完好(kernel 单教学点足以承载规则本身:
全部运行跨轮重读 0–2 次)——但复述真正的作用是压制同轮内编辑后的验证性
重读:对照臂两跑稳定 10/10 次冗余重读,去重臂 25/15。这份重复挣的不是
教学,是压多疑,值回那 ~80 tok/轮。钱反而是去重臂便宜 7–9%,但按预声明契约
钱只记账不投票。决策存档 docs/adr/0001-keep-header-restatements.md;
账本 results/20260901-header-dedup/;分支 feature/header-dedup 留作
不合入的物证。
结果更新——2026-09-03(轮内折叠 · 三臂)
条件:flash、适配器出厂档(high)、每轮不设步数顶(250)、完整工具栈(bash/grep/glob);default 臂的数字从 8 月的会话日志按同一价目表重算;除注明外均为单次运行。完整表格与环境体检记录:docs/slice-fold-multiturn.md。
| 场景 | default(8 月) | slice 8 月版(无轮内折叠) | slice 现在(轮内折叠) |
|---|---|---|---|
| s1 长程调试(6 轮) | ✓ $0.091 | ✓ $0.074 | ✓ $0.068 |
| s2 任务图(10) | ✓ $0.081 | ✓ $0.094 | ✓ $0.120 |
| s3 区间代数(10) | ✓ $0.051 | ✓ $0.087 | ✓ $0.081 |
| s13 失忆(16) | ✓ $0.030 | ✓ $0.026 | ✓ $0.021 |
| s14b 召回阶梯(17) | ✓ $0.031 | ✓ $0.029 | ✓ $0.025 |
| s10 洪水(76) | ✗ 丢 3 条事实 · $0.250 | ✓ $0.164 | ✓ 零丢失 · $0.157 |
| CB-20 检索(19 题配对) | fileR 0.761 · $0.541 · 19/20 | fileR 0.816 · $0.602 · 20/20 | fileR 0.749 · $0.482 · 20/20 |
| l1 链式迁移(单轮,约 300K 读取) | ✓ $0.135 | ✓ $0.142 | ✓ $0.024–0.031 |
| l2 账本过账(规则文档 + 运行态) | ✓ $0.124 | ✓ $0.050 | 无宪法时 ✓/✗;mode: 'stream' 3/3,$0.0285 |
读法:多轮组 9/9(default 8/9);记忆与洪水型省 21–37%;检索省 11% 且召回与 default 持平(比 8 月的 slice 版本低 4–7pp,混杂了 kernel 改动);单轮重读取省 80%。编码型从 −25% 到 +61% 不等:输出税——每轮重建后模型重新推敲、重新跑测试——是 slice 架构本身的性质,不是折叠的,折叠从不作用于源代码。
② 失忆重演 · 双臂 · 逐出核验
24 个基准数字由 agent 亲手跑脚本得出,只存在于工具输出——考题前:数字从不进任何回复(T1 明令只确认跑完)、原始样本首跑即被清除(盘上没有)、稀释洪水迫使 default 的压缩多轮改写历史。考题分两层:先不给任何提示,再明确说"这些数字是你亲手跑出来的,翻一下之前的记录"。
| 模型 | 臂 | 逐出核验 | 无提示层 | 明确指令层 | 陷阱题 | 峰值 | 价格 | 墙钟 |
|---|---|---|---|---|---|---|---|---|
| flash | slice | ✓ 0/16 | 24/24 | 24/24 | 未编造 ✓ | 21.5K | $0.0521 | 222s |
| default | ✓ 0/16 | 0/24 | 24/24 | 未编造 ✓ | 51.9K | $0.0910 | 569s | |
| pro | slice | ✓ 0/16 | 24/24 | 24/24 | 未编造 ✓ | 22.1K | $0.1692 | 383s |
| default | ✓ 0/16 | 24/24 | 24/24 | 未编造 ✓ | 33.4K | $0.4612 | 2014s |
两臂的持久底座是同一个:DSH 把完整会话日志落盘,谁都"原则上可找回"。差异在 affordance,且随模型强度换了表现形式。flash 上:slice 收到中性考题后自发走
recall_search → recall_turn(磁带在截断处留了路标),轮内找回;default 翻遍工作区一无所获,如实写 UNKNOWN(零编造,如实记录),直到明确指令层才想到解压自己的会话日志(zstd jsonl)挖回。pro 够强:default 无提示也自己完成了这套取证式翻找——于是差异从"能不能找回"移到"找回的代价":同样 24/24,slice 用 3 个请求(383s / $0.169),default 用 32 个请求(2014s / $0.461),2.7× 价格、5.2× 墙钟。"可找回"与"会去找回"之间隔着工具与路标;模型越强,这层距离越表现为纯粹的效率差。
③ CB-20 精准检索 · 双臂
ContextBench(给一个真实 issue,agent 检索出修复所依赖的代码位置)50 题官方基准中取 20 题子集。配对对照 n=19——两轮 default 各有 1 题 20 分钟超时(不同题,均为 slice 数分钟内完成的题):
| 指标(19 题配对均值) | slice flash | default flash | slice pro | default pro |
|---|---|---|---|---|
| 文件召回 fileRecall | 0.816 | 0.761 | 0.752 | 0.780 |
| 行覆盖 spanRecall | 0.847 | 0.772 | 0.794 | 0.811 |
| 文件精度 filePrecision | 0.227 | 0.229 | 0.244 | 0.212 |
| F1 · 文件级(均值法) | 0.355 | 0.353 | 0.368 | 0.333 |
| F1 · 文件级(macro) | 0.342 | 0.323 | 0.343 | 0.327 |
| 价格合计 | $0.6021 | $0.5414 | $1.3603 | $1.7318 |
| 完成率 | 20/20 | 19/20 | 20/20 | 19/20 |
两代模型互换了召回的领先位(flash 下 slice 召回 +5.5pp,pro 下 default 略胜 +2.8pp),但 F1 与完成率 slice 两代全胜,精度在 pro 上拉开(+3.2pp);价格从 flash 的 +11% 翻到 pro 的 -21%——pro 输出贵($1.98/M),default 更多的步数与更长的会话在贵模型上代价放大。有界切片强迫的"每轮重读纪律"在检索任务上是优势而非负担,这个结论跨两代模型稳定。
逐题明细 · flash(19 题配对:召回 / 行覆盖 / F1 / 价格)
| 题(Multi-SWE-Bench) | slice R/span/F1 | default R/span/F1 | slice $ | default $ |
|---|---|---|---|---|
| c__0f94ce4d | 1.00/1.00/0.36 | 1.00/1.00/0.26 | 0.0601 | 0.0597 |
| c__1ac60ce9 | 1.00/1.00/0.25 | 1.00/1.00/0.20 | 0.0160 | 0.0237 |
| c__b9b45262 | 0.33/0.30/0.17 | 0.33/0.30/0.13 | 0.1118 | 0.0627 |
| c__cdbc5890 | 1.00/1.00/0.22 | 1.00/1.00/0.18 | 0.0300 | 0.0267 |
| cpp__6a4e21e9 | 0.67/0.63/0.22 | 0.67/0.25/0.40 | 0.0363 | 0.0283 |
| cpp__7c9ef76c | 0.67/0.97/0.33 | 0.33/0.93/0.18 | 0.0194 | 0.0276 |
| cpp__bca55dea | 1.00/1.00/0.64 | 0.29/0.14/0.21 | 0.0438 | 0.0206 |
| cpp__fe080aac | 0.50/0.87/0.33 | 0.50/0.87/0.25 | 0.0258 | 0.0342 |
| go__0498ad7f | 1.00/1.00/0.29 | 1.00/1.00/0.18 | 0.0175 | 0.0341 |
| go__0b78ed50 | 1.00/1.00/0.67 | 1.00/1.00/1.00 | 0.0150 | 0.0095 |
| go__0f79e39c | 1.00/1.00/0.50 | 1.00/1.00/0.50 | 0.0135 | 0.0094 |
| go__1384380d | 0.67/0.39/0.42 | 0.67/0.51/0.32 | 0.0302 | 0.0764 |
| go__1ba303a5 | 0.67/0.92/0.36 | 0.67/0.92/0.44 | 0.0365 | 0.0389 |
| go__250649eb | 1.00/1.00/0.50 | 1.00/1.00/0.57 | 0.0099 | 0.0129 |
| go__2a889a1d | 1.00/1.00/0.29 | 1.00/1.00/0.29 | 0.0299 | 0.0088 |
| go__2c512ec3 | 0.00/0.00/0.00 | 0.00/0.00/0.00 | 0.0315 | 0.0171 |
| go__3d1b3145 | 1.00/1.00/0.50 | 1.00/1.00/0.29 | 0.0137 | 0.0270 |
| go__3d85271b | 1.00/1.00/0.22 | 1.00/1.00/0.22 | 0.0162 | 0.0106 |
| go__3deeea9c | 1.00/1.00/0.22 | 1.00/0.75/0.50 | 0.0449 | 0.0131 |
超时未配对:c__8bffb1b1(default 20 分钟超时;slice 137 秒完成,R/span 1.00/1.00,$0.0213)。
逐题明细 · pro(19 题配对:召回 / 行覆盖 / F1 / 价格)
| 题(Multi-SWE-Bench) | slice R/span/F1 | default R/span/F1 | slice $ | default $ |
|---|---|---|---|---|
| c__0f94ce4d | 0.40/0.65/0.17 | 0.80/0.85/0.33 | 0.1446 | 0.1326 |
| c__8bffb1b1 | 1.00/1.00/0.44 | 1.00/1.00/0.36 | 0.0485 | 0.0906 |
| c__b9b45262 | 0.33/0.30/0.40 | 0.33/0.30/0.20 | 0.0501 | 0.1579 |
| c__cdbc5890 | 1.00/1.00/0.20 | 1.00/1.00/0.18 | 0.0515 | 0.1199 |
| cpp__6a4e21e9 | 0.67/0.49/0.16 | 0.33/0.15/0.13 | 0.1411 | 0.0947 |
| cpp__7c9ef76c | 0.33/0.93/0.12 | 0.67/0.97/0.27 | 0.1240 | 0.1051 |
| cpp__bca55dea | 0.71/0.56/0.45 | 0.86/0.86/0.36 | 0.1144 | 0.1728 |
| cpp__fe080aac | 0.50/0.87/0.36 | 0.50/0.71/0.29 | 0.0648 | 0.0763 |
| go__0498ad7f | 1.00/1.00/0.40 | 1.00/1.00/0.29 | 0.0486 | 0.0551 |
| go__0b78ed50 | 1.00/1.00/0.67 | 1.00/1.00/0.40 | 0.0415 | 0.1038 |
| go__0f79e39c | 1.00/1.00/0.40 | 1.00/1.00/0.50 | 0.0346 | 0.0257 |
| go__1384380d | 0.67/0.36/0.47 | 0.67/0.66/0.44 | 0.0976 | 0.0872 |
| go__1ba303a5 | 0.67/0.92/0.44 | 0.67/0.92/0.36 | 0.0604 | 0.1281 |
| go__250649eb | 1.00/1.00/0.57 | 1.00/1.00/0.50 | 0.0630 | 0.0348 |
| go__2a889a1d | 1.00/1.00/0.22 | 1.00/1.00/0.40 | 0.0393 | 0.0603 |
| go__2c512ec3 | 0.00/0.00/0.00 | 0.00/0.00/0.00 | 0.0643 | 0.0902 |
| go__3d1b3145 | 1.00/1.00/0.29 | 1.00/1.00/0.29 | 0.0545 | 0.0501 |
| go__3d85271b | 1.00/1.00/0.40 | 1.00/1.00/0.40 | 0.0259 | 0.0266 |
| go__3deeea9c | 1.00/1.00/0.33 | 1.00/1.00/0.50 | 0.0915 | 0.1201 |
超时未配对:c__1ac60ce9(default 20 分钟超时;slice 949 秒完成,R/span 1.00/1.00,$0.1222)。
缺陷与改进方向
transcript 与 slice,公平地说
以下全部按同一价目表计(flash 谷时:未命中 $0.22/M · 命中 $0.007/M · 输出 $0.66/M)。同代码、同一天的直接对照只有 l1/l2、n1–n3 与一格 s4;多轮 s 系列和 CB-20 的 transcript 数据是 8 月会话重算,宿主略有差异。每格都是单次运行,同配置重复波动 ±30%,15% 以内的差异应读作持平。
| 任务形状 | transcript | slice | 读法 |
|---|---|---|---|
| 单轮重读取(l1,约 300K token) | ✓ $0.135 | ✓ $0.024–0.031 | slice −80%,轮内折叠是决定性的 |
| 洪水 / 记忆(s10 · s13 · s14b) | ✗ $0.250 · ✓ $0.030 · ✓ $0.031 | ✓ $0.157 · ✓ $0.021 · ✓ $0.025 | slice −21% 到 −37%;正确性上只有 s10 分出胜负(压缩丢了 3 条埋点事实) |
| 多轮编码(s1 · s4) | ✓ $0.091 · ✓ $0.143 | ✓ $0.068 · ✓ $0.125 | slice −12% 到 −25% |
| 多轮编码(s2 · s3) | ✓ $0.081 · ✓ $0.051 | ✓ $0.120 · ✓ $0.081 | transcript 便宜 32–38%:每轮重建后模型重新推敲、重新跑测试,输出 token 是 1.7–2 倍;8 月无折叠的 slice 同样如此,是架构性质,不是折叠 |
| 多轮小文件(n2 · n3) | ✓ $0.012 · ✓ $0.020 | ✓ $0.012 · ✓ $0.019 | 持平 |
| 规则文档 + 运行态(l2) | ✓ $0.124 | ✓/✗ $0.030 | 无宪法时 slice 四次里三次写错输出目录;mode: 'stream' 三次全对,$0.0285 |
| CB-20 检索(19 题配对) | fileR 0.761 · $0.541 · 19/20 | fileR 0.749 · $0.482 · 20/20 | 召回持平(span 0.803 对 0.772),slice −11%,逐题 F1 9:8 |
峰值:transcript 在 s13/s10 达到 59–96K、在 l1/l2 达到 302–330K;slice 在多轮组 11–33K、折叠后的 l1/l2 42–52K。1/30 的缓存折扣下峰值小本身不省钱——它买的是不撞窗口、不压缩、不 rot;这套测试里 rot 从未出现,压缩丢失出现一次(s10),但那一次是真的。
价目表是前提。把命中价按未命中计(无缓存折扣的服务商):l1 变成 $1.81 对 $0.31,n2 $0.088 对 $0.025,n3 $0.174 对 $0.038,slice 全面便宜 3–6 倍。DeepSeek 1/30 的折扣是 transcript 在短任务上不落后的全部原因。
transcript 赢在哪: DeepSeek 计价下的短交互式编码会话(更便宜、同样正确);机制最少;窗口内不存在"在但没看到"的问题;工程覆盖完整。几十轮以内、文件不大的会话,transcript 没有可见的劣势。
slice 的固有风险: 召回靠模型主动伸手——受控压力下证明了会伸(s10、s14b),日常负载里接近零;折叠改变模型看到的内容(CB-20 文件召回 0.749,8 月版本 0.816,混杂 kernel 改动);规则文档型任务需要宪法;机制越多,出问题的面越大,而插件仍是早期版本。
硬结论: 长会话、洪水、重读取、日志密集的任务归 slice——正确性不输、成本 −21% 到 −80%、峰值有界;DeepSeek 计价下的短多轮编码归 transcript;缓存折扣浅的服务商上 slice 全面占优。软结论(需要同代码、每格三次的重跑):s2/s3 的 +48–61% 与 CB-20 的 4–7pp 召回差,可能一半是噪声和版本差异。
缺陷
| 缺陷 | 说明与实测量级 | 方向 |
|---|---|---|
| 1 · 编码任务付输出税 | 切片每轮重建,编码负载上模型每次重建后重新推敲、重新跑测试:s2/s3 比 default 贵 48–61%,输出 token 是它的 1.7–2 倍;s1/s4 则便宜 12–25%。输入侧的缓存问题已由轮内折叠解决:1/30 的缓存折扣下,只追加且折叠每条新结果的流胜过一切改写历史的设计(l1:−80%)。 | 2026-09-03 磁带二、三轮(已成默认):rent-or-buy 锚定(读两次 / 碰两次才锚)、同轮编辑塌缩、完整基线 + 读指针,s2 九次中位 $0.085(旧 slice 0.120、transcript 0.081),s1 0.050(0.068),记忆型持平,全部通过。同一形态在 8–12 文件的工作集上输(s4/s5/s6 六个样本全高于旧形态):整个工作集摆在面前,模型改成在脑中做,effort high 下推理比多走几步工具贵——所以加了 baseMaxFiles 开关,跟踪文件超过 4 个就退回旧形态。开轮推理是 transcript 的 2–4 倍且与种子大小无关(241 个开轮样本相关系数 0.01);快照语义的头部把"解读磁带"的占比从三成降到一成,总量没降。旧推理链上带第二次证伪。下一步:每格三次,以及 5–7 个文件的形状。 |
| 5 · 轮内折叠用一点检索广度换字节 | CB-20 文件召回 0.749,8 月版本 0.816(混杂 kernel 与宿主差异);完赛 20/20,便宜 20%。折叠从不碰源代码与 grep 结果;规则是在日志与档案上调出来的。 | 用今天的代码跑 --no-fold 消融;日志错误优先与结构行两条规则是旋钮。 |
| 6 · 规则文档型任务需要宪法 | 没有宪法时 l2 四次里三次把输出写错目录;mode: 'stream' 三次全对,成本相同。 | 决定 stream 是否成为长单轮任务的默认;交互式会话保持可选(短轮为提取付费却无收益)。 |
| 1b · 不要磁带的折叠 | 轮内折叠是唯一通用的收益(l1 −80%),它从来不需要磁带。@dsh-external/dsh-slice-agent-loop/fold 是独立插件,挂在原生 transcript loop 上:每步开始前把刚落盘的工具结果折成紧凑视图,用 tool/result 替换事件遮蔽原节点(compaction pruner 同一机制),日志保留原文,expand_result 取回。独立仓库:TT-Wang/dsh-tool-result-fold;见 docs/tool-result-fold.md。 | 同日对照原生 loop:l1 0.023 对 0.135(−83%,45/45,峰值 43K 对 331K),s13、s2 中性(编码型没有可折内容),全部通过。建议产品默认 = transcript + 折叠;磁带只留给 transcript 撑到要压缩的会话。 |
| 2 · 召回通道依赖模型主动伸手 | 历史逐字节可回取,受控压力下的自发召回已实证(测试②);但日常编码负载里主动召回接近零(信息多在磁带容量内,靠系统推送覆盖),跨会话"接着昨天做"的冷启动仍有风险。 | 让召回在日常负载与冷启动里成为习惯;agent memory 仍是前沿话题,改造已排期。 |
| 3 · 检索广度与节俭内核仍在调平 | 当前内核换来精度与价格,召回广度对上一构建有回撤。 | kernel A/B 持续迭代。 |
| 4 · 整体仍是早期插件 | 目前覆盖 web profile 的 agent-loop 面;settings 面板对齐、子代理生态、TUI 等外围尚在跟进。核心机制(封存、审计事件、两层召回)已被上面三组测试反复验证。 | 工程覆盖面问题,不是技术难度问题。 |
安装
dsh plugin --profile web add "github:TT-Wang/dsh-slice-agent-loop#main"
或本地目录:git clone 后 dsh plugin --profile web add .
装完重启 web 生效 —— bundle 在启动时合成。
自带的 patch 会禁用 stock loop 与压缩 —— 有界重建同时替代两者。如果你的
组合里有 agent-loop-invariant 行,删掉它:重建的切片不可能与派生历史
逐字节相等,本插件在那条断言旁会拒绝加载。
配置
| 键 | 默认 | |
|---|---|---|
maxStepsPerTurn | 50 | 单轮 continuation step 硬顶 |
maxParallelToolCalls | 10 | 每步并行工具上限;DSH 0811 起同时限制子 agent 扇出 |
defaultReasoningEffort | 'low' | 连接层未设置时注入的推理档;'inherit' 保持适配器出厂档 |
digest | { enabled: true, minChars: 1500, logMinChars: 512, … } | 轮内折叠策略(docs/fold-content-routing.md);enabled: false 回到 8 月行为 |
mode | 'slice' | 'stream' 加宪法与契约;'state' 是存档的热窗实验 |
state | { pinSteps: 2, extractAtStep: 3, enforceFromStep: 8, contractBounceBudget: 1, sideEffort: 'off' } | stream/state 旋钮 |
inTurnSeal | { enabled: false } | 轮中封存实验(缓存计价下不划算) |
tape | { readBases: true, readBasesMinReads: 2, newFileMinTouches: 2, readPointer: true, anchor: 'base', baseMaxFiles: 4, baseMaxChars: 60000, collapseEdits: true, gcSupersededBases: false } | 磁带形态。rent-or-buy 规则(89 个历史会话核验过):只读文件跨 2 轮被读到才锚定;本会话新建的文件第二次碰到才锚定;同轮多次编辑塌缩为末态。工作集开关:磁带跟踪的文件不超过 baseMaxFiles 时,改过的文件重落完整基线、现行文件整读返回指针(1–4 文件的编码循环上赢);超过后退回 patch/base 择短且不给指针(8–12 文件的工作集上赢)。baseMaxChars 限制单份完整基线。可选:gcSupersededBases(种子里每文件只留一份现行基线)、rebaseAfterPatches、replyHeadChars/replyTailChars、checkInDigest |
在你 profile 的 cordis.patch.yml 里按 id 定位已有行来设
(- id: slice-agent-loop + config:)。
开发
npm install --legacy-peer-deps # @deepseek-ai/* peer 未发布
npm run link:dsh # 从你的 dsh 检出软链
npm run typecheck && npm test
lib/ 是提交物(git 源安装不跑构建)—— 推之前先 npm run build。
真模型冒烟:npm run e2e:recall(需要 env 里有 DEEPSEEK_API_KEY)。
评测(env 里要有 DEEPSEEK_API_KEY 与 SLICE_CALL_LEDGER_DIR):先跑环境探针,再跑任意 scenarios-snapshot 场景:
npx tsx scripts/run-scenario.mts results/20260902-multiturn/scenarios-snapshot/z0_env_smoke --arm slice-noseal --tools full --ledger-dir results/probe
npx tsx scripts/run-scenario.mts <场景目录> --arm transcript|slice-noseal|stream --effort low|inherit --max-steps 250 --tools full --ledger-dir results/<批次>
--effort inherit --max-steps 250 --tools full 复现 8 月的评测条件;每份账本记录实际生效的 effort、步数上限与工具清单。scripts/h2h-sessions.py 从 ~/.dsh/sessions 重算历史用量,scripts/mt-report.py 出对照表,scripts/cb20-dsh.mjs 对着跑起来的 web profile 跑 CB-20。设计笔记:docs/fold-content-routing.md、docs/slice-fold-multiturn.md、docs/world-state-loop.md、docs/effort-ladder.md、docs/in-turn-slicing.md、docs/miss-attribution.md。
许可
BSD-3-Clause —— 见 LICENSE。