DSH 长会话成本与自动压缩
DeepSeek Harness 长会话成本与自动压缩:增长、失效与恢复
- 作者
- DeepSeekAgent.io 编辑部
- 发布
- 更新
长会话成本并不只取决于最终回答有多长。Agent 每一轮都可能重新携带系统提示词、历史消息、工具定义与工具结果;当自动压缩没有及时完成,单次请求上下文会持续变大,累计计费可能远高于界面上某一轮看到的 Token。
近期社区在 0.1.7-rc.2 与 0.2.0-rc.2 中报告了自动压缩未触发、长会话后期成本扩大,以及 Goal Round 与截断工具结果相互放大的案例。这些是具体环境中的复现,不代表所有 Session 都会发生,但暴露了一条值得监控的故障链。
DSH 的压缩链路
Compaction 是可选能力,不属于 Agent Loop 主干。自动路径在请求生成前根据两类 Trigger 判断:
pressure:估算上下文接近配置阈值;context-overflow:Provider 已确认请求超过窗口。
压缩会选择一段保持 Tool Call/Result 配对的 Surface,用模型生成摘要,再以新的 User Message 替换旧区间。compaction/start、summary 与 end 记录完整事务;中途失败会留下可识别的失败尝试,而不是伪装成已经完成。
为什么窗口满了反而难以压缩
压缩本身也需要一次模型请求。若当前历史已经占满上下文,同时为摘要保留的输出空间过大,Provider 可能在摘要生成前就拒绝请求。此时自动压缩虽然被触发,却没有足够空间完成自救。
例如模型窗口为 80K、最大输出配置为 32K 时,真正可安全装入的历史远小于 80K。把进度条跑到 100% 再压缩,通常已经太晚。应给摘要请求、工具声明和下一轮输出保留明确余量。
工具结果截断如何放大循环
压缩前,DSH 可以先对过大的 Tool Result 做确定性剪枝,保留头尾并移除中间内容。但如果 Agent 依赖的关键证据正好被截断,模型可能重复读取文件、重跑命令或不断验证。Goal 尚未完成时,自动续轮又会继续扩大累计请求量。
因此排查高费用不能只看“模型推理太多”,还要对照:
- 哪一轮开始出现
[…]或 Spill File; - Agent 是否反复读取同一资源;
- Compaction 事件是否有
start但没有成功摘要; - Goal Driver 是否因未调用完成状态持续续轮;
- Sub-agent 是否同时复制大段上下文。
监控指标
| 指标 | 预警信号 |
|---|---|
| 单轮输入 Token | 连续多轮快速上升 |
| 缓存未命中输入 | 工具 Schema、系统提示或前缀频繁变化 |
| 工具重复率 | 相同路径或命令被反复读取 |
| Compaction 状态 | 多次失败、摘要无明显缩减或遗留锁 |
| Goal 轮数 | 已无新进展但仍自动继续 |
| 费用/分钟 | 与输出质量脱钩地持续增长 |
安全配置与恢复
- 上下文阈值不要贴近模型硬上限,为摘要和输出留出空间。
- 给长任务设置轮数、时间与费用预算,达到任一上限就暂停检查。
- 大文件优先按范围读取,不要每轮重新加载全文。
- 观察工具结果剪枝标记,关键证据写入独立短摘要。
- 自动压缩失败时停止 Agent,临时扩大窗口后执行一次手动压缩,再恢复原配置。
- 恢复前检查可能已经执行的副作用,避免重复发布、写入或远程操作。
如何做可复现实验
固定模型、Profile、任务与工具集合,分别记录前 10 轮与后 10 轮的平均输入 Token、缓存命中、压缩次数、工具调用和费用。再设置一个更保守的压缩阈值重跑。只有当任务成功标准一致时,才能把费用差归因于压缩策略,而不是任务难度或输出质量。