DeepSeek Harness 上下文压缩机制:13 帧图文拆解

跟着源码级拆解视频逐帧看懂 dsh 压缩:什么时候触发、裁什么、摘什么,日志又怎么在替换后重建整个会话。

最近更新: 2026-09-23

机制拆解视频的开场标题卡,提出「你的智能体上下文压缩质量如何」的提问,也是本页 DeepSeek Harness 压缩机制图文的源头。
开场之问:DeepSeek Harness 到底怎么压缩上下文?

这页图文基于一支源码级拆解视频,逐帧讲清 DeepSeek Harness 的上下文压缩机制。先说清画面属性:原片是旁白讲解的机制示意动画——作者用幻灯片把压缩流水线一步一步画出来,不是产品界面实录。也正因为是示意,每个机制都被干净地隔离在一页里,适合当架构课本来读。

文中关键数值——80% 默认触发阈值、8192 码点裁剪(保留开头 4096 + 结尾 1024)、16% 近期原文保留——已对照 deepseek-harness 官方仓库文档核验一致(thresholdRatio 0.8、thresholdChars 8192、retainRatio 0.16,2026-09-23 查证)。官方文档没有展开的细节(如检查点的八类信息划分)来自作者小木头对源码的解读,文中已标注。

一分钟版本

  • 压缩在 dsh 里是插件能力而非内置逻辑:ctx.compaction 是能力接口,compaction-basic 是默认实现;上下文占用接近窗口 80%、服务端报超窗、或你手动输入 /compact,都会触发整理。
  • 摘要之前先裁剪:超过 8192 码点的工具结果只保留开头 4096 和结尾 1024;裁完若压力达标,连摘要这步模型调用都省了。
  • 被压缩的历史变成结构化检查点,最近约 16% 窗口原文保留;持久日志完整记录每个事件,模型视图随时可以靠重放重建。

压缩流水线,12 步走完

压缩在架构里的位置

  1. 1

    先看位置:DeepSeek 的请求链里多了压缩一段

    视频开场对比请求结构:Codex 式请求是输入 + 上下文 + 模型请求,DeepSeek Harness 在上下文和模型调用之间插入了一个专门的压缩阶段。这页就是整支视频的地图——压缩是请求流水线里的正式一环,不是事后补救。

    对比两种请求结构:Codex Harness 发送输入、上下文与模型请求,DeepSeek Harness 则在中间插入了一个紫色标注的压缩阶段。
    请求流水线在上下文和模型调用之间多出压缩一段。去视频 0:32 处看
  2. 2

    认角色:一项能力,多个插件协作

    压缩被拆成一条能力缝:/compact 命令是人工入口,ctx.compaction 是能力接口,compaction-basic 是接口背后的默认实现;旁边还有两个可选搭档——负责计量压力的 token meter 和负责裁剪工具结果的 tool result pruner。把 compaction-basic 换掉,其余照常工作。

    $ctx.compaction
    $dsh-compaction
    $compaction-basic
    $command-compact
    DeepSeek Harness 压缩能力地图:/compact 命令入口、ctx.compaction 接口由 compaction-basic 提供默认实现,token meter 与 tool result pruner 两个插件环伺其外。
    一条能力缝、五个角色:命令、接口、默认实现加两个可选搭档。去视频 2:18 处看
  3. 3

    记住三个触发入口

    压缩从三个地方启动。每次请求前的 pre-step 检查会把估算压力和默认 80% 阈值(可按模型配置)比较;服务端已经报超窗时,恢复流程跳过常规阈值、先修复现场;你在 agent 空闲时输入 /compact,则不等 80% 直接按需整理。

    $agent/pre-step
    $context-overflow
    $/compact · agent idle
    DeepSeek Harness 三种压缩触发入口示意图:请求前预检对照 80% 默认阈值、超窗恢复路径、以及 agent 空闲时的手动 /compact。
    三条启动路径,只有第一条真的等 80%。去视频 3:50 处看
  4. 4

    看懂计量表:提供商读数 + 变化估算

    token meter 对自己的定位很诚实:它以最近一次成功调用的提供商用量为锚点,再估算这之后模型可见内容的变化——新增消息往上加,替换可能往下减。片中的进度条是定性示意,不代表实测比例。

    DeepSeek Harness 的 token meter 页面:以提供商用量为锚点、加上表层变化估算,进度条旁注明新增消息会推高估算出的上下文压力。
    计量表是估算:上次官方读数,加上之后的漂移。去视频 4:20 处看

裁剪、选区与摘要

  1. 5

    先裁日志,再谈测量

    第一个杠杆不是摘要,是删除。一条超长工具结果就能占满大半个上下文,把它的中段裁掉,压力可能直接回落到阈值以下。后面几章的机制,都默认这道最便宜的工序已经跑过。

    一条超长工具结果被保留头尾、裁掉中段,DeepSeek Harness 的上下文压力条显示仅靠这道裁剪就可能回到阈值以下。
    先裁再说——一条巨大的工具结果可能就是全部问题。去视频 1:15 处看
  2. 6

    拆裁剪器:8192 码点,保留 4096 + 1024

    工具结果文本超过 8192 个 Unicode 码点(三个 Web 预设当前的配置)就会被重写:保留开头 4096 码点、一条裁剪标记、结尾 1024 码点。计量单位是码点不是 token,而且这一步完全不调用模型。这两个数值与官方 compaction-tool-result-pruner 默认值(thresholdChars 8192、headChars 4096、tailChars 1024)一致。

    $threshold: 8192 code points
    $keep head 4096 + tail 1024
    DeepSeek Harness 工具结果裁剪器规则:超过 8192 码点的结果只留开头 4096 与结尾 1024、中段换成裁剪标记,且这一步不调用模型。
    8192 码点是门槛;开头 4096、标记、结尾 1024。去视频 5:40 处看
  3. 7

    选区:近期 16% 原文保留,切线避开配对

    裁完压力还超,compaction-basic 就开始选区:从最新消息向前累计,原文保留到大约 16% 窗口预算为止(即官方 retainRatio 默认值),并且切线永远落在工具调用和它的结果之外——配对不拆散。按完整消息节点累计,实际保留量可能略超 16%;此时只是选定区间,还没有生成任何摘要。

    从最新消息向前累计、原文保留约 16% 窗口预算——DeepSeek Harness 的选区把切线放在 call_id 配对的工具调用与结果之外。
    从最新往前走,切线永不落在调用与结果之间。去视频 6:00 处看
  4. 8

    生成检查点:compaction/start 与八类信息

    摘要以追加指令的方式运行:请求保留原 system、原 tools 和选定的旧消息,末尾追加一条 user 消息,要求把对话整理成结构化检查点。视频把它画成八类信息——用户目标与意图、关键技术概念、文件与代码、错误与修复、待完成工作、当前工作、下一步行动、关键背景与约束。官方文档确认存在检查点前言,八类的具体划分是作者的示意解读。

    $compaction/start
    DeepSeek Harness 的检查点生成页:compaction/start 请求在末尾追加一条 user 指令,把选定的旧消息整理成从用户目标到下一步行动共八类信息的结构化检查点。
    摘要指令要求产出结构化检查点——八类是作者的示意画法。去视频 7:05 处看
  5. 9

    摘要合格,才准替换

    摘要要过三道关才能顶替历史:模型完整结束并给出非空文本(报错、中断、达到输出上限截断都算失败);只保留 text 内容——reasoning 和 tool calls 不写入检查点,图片输出直接拒绝;含包装的摘要估值必须小于被替换旧区间的估值。

    DeepSeek Harness 摘要替换前的三道验证门槛:完整且非空的输出、只保留 text 内容(reasoning 与图片被拒)、摘要估值小于被替换区间。
    任何一关不过,摘要都到不了模型面前。去视频 7:56 处看

替换、重放与边界

  1. 10

    日志只追加,模型视图被替换

    成功之后,持久日志追加 start、summary、checkpoint、end 一串事件,而模型可见历史通过一次表层替换换新——画面里写作 surfaceOp: undefined:检查点在前,保留下来的近期原文在后。上游什么都没删,日志仍是完整记录。

    $surfaceOp: { op: 'replace' }
    $compaction/start · summary · end
    持久日志只追加 start、summary、checkpoint、end 事件;DeepSeek Harness 的表层替换把模型可见历史换成检查点加保留的近期原文。
    日志只增不减,被换掉的只是模型视图。去视频 8:48 处看
  2. 11

    恢复靠重放日志

    因为日志只追加且完整,恢复从不需要原始上下文:按事件顺序读回,逐条应用 surfaceOp 的 append 或 replace,模型视图就重建出来了——旧内容、检查点、近期原文各归其位。被压缩过的会话能挺过重启,靠的就是这个。

    $surfaceOp: append / replace
    DeepSeek Harness 的日志重放恢复:按顺序读回事件、逐条应用 surfaceOp 的 append 或 replace,从旧内容到检查点再到近期尾部重建模型视图。
    恢复就是对只追加日志的确定性重放。去视频 9:05 处看
  3. 12

    收束:接口稳定,实现可换

    结尾页把整条流水线收成四个动作——测量压力、裁剪工具结果、按需摘要、替换模型视图——并划清分工:ctx.compaction 保持稳定,compaction-basic 是当前默认实现,agent loop、token meter 和 /compact 入口环绕在外。每一块都能独立演化而不牵连其他。

    收尾页划分 DeepSeek Harness 压缩的分工:测量压力、裁剪工具结果、按需摘要、替换模型视图,ctx.compaction 稳定而 compaction-basic 可换。
    四个动作、一个稳定接口、一个可替换实现。去视频 10:00 处看

对应官方 0.1.7 的部分

这页拆的是插件流水线,而官方 0.1.7 版本线正从产品侧打磨同一处接缝——alpha 更新说明写明为主动压缩预留输出容量与上下文余量,长命令超时后可转入后台继续跑。想算清这些长任务的真实开销, 看这份 token 用量与成本追踪指南.

常见问题

触发、丢失与上限——画面本身说不清的部分。

压缩是怎么触发的?会不会打断我正在跑的任务?

三个入口:请求前预检(默认 80% 阈值)、服务端超窗恢复、以及空闲时手动 /compact。触发点都在请求之间,不会拦腰打断正在生成的回合;/compact 在 agent 忙碌时会提示暂不可用,你排队发出的消息等它跑完再继续。

压缩之后上下文会不会丢?

旧回合的原文会离开模型视野,但不是凭空消失:它们被整理成覆盖目标、文件、错误、待办的结构化检查点;最近约 16% 窗口原文保留;持久日志里每个原始事件都还在。丢的是模型对旧原文的直接引用,不是记录本身。

8192 码点裁剪,会不会把重要的工具输出砍断?

有可能,这是设计取舍:裁剪器只认位置不认语义,保留开头和结尾,中段一律替换成标记。好处是确定性——绝不把 emoji 之类的代理对切坏;代价是语义上重要的中段内容,要靠你自己在必要时重跑命令取回。

这些数字是写死的吗?

不是。80% 是 thresholdRatio 默认值,16% 是 retainRatio 默认值,都能按提供商和模型分别配置;裁剪器的 8192/4096/1024 码点预算同样可配。本文数值以 2026-09-23 官方仓库文档为准——把它们当当前默认值,不是常量。

长任务还是被截断了,压缩救不了怎么办?

压缩救的是会话太长,救不了单件超大产物:系统提示、工具定义、会话前缀压不动,一条巨大的工具调用也不会被拆开。这种情况把任务拆小,或转给子代理、后台任务去跑,让主会话只收结论。

相关攻略

DSH 学习路线里的相邻课题。

来源与署名

全部 13 帧画面截自同一支视频——旁白讲解的机制示意动画,非官方产品界面、非实机录屏;每张图都可深链回原片对应秒数。同一支拆解在 YouTube 由 01Coder、在 Bilibili 由 五里墩茶社 发布(同一作者:小木头)。

DSH Plugins 是独立的 DeepSeek Harness 插件市场,与 DeepSeek 官方无关,也不代表官方背书。第三方插件未经安全审计,安装前请审查源码。

每周获取最新的 DeepSeek Harness 插件,绝不滥发。