前言¶
在 DeepSeek Harness(DSH)里跑长会话的智能体,迟早会碰到上下文窗口压力:触发 compaction 后,旧消息被摘要折叠,模型侧往往只保留一段自由散文式的 checkpoint。路径、标识符、命令片段若没写进摘要,后续轮次里就很难再逐字引用;日志里或许还在,但 checkpoint 不会把模型指回去。
社区插件 dsh-lcm(zy-xyz/dsh-lcm)走另一条路:在同样的 ctx.compaction 接缝上,用 LLM 写结构化 checkpoint,被折叠节点仍留在只追加的会话日志中,并用 seq 指针配合 lcm_expand / lcm_search 做按需取回。下文介绍它是什么、如何安装,以及选用前需要知道的代价与边界。
这是什么¶
dsh-lcm 是 DSH 的 Lossless Context Management(LCM)压缩后端,维护者为 zy-xyz,在 SkillHub 目录 中归类为「记忆」。当前仓库 package.json 版本为 0.16.0,许可证 MIT,要求 Node.js >= 18。
定位上,它是 @deepseek-ai/dsh-compaction-basic 的即插即用替代:配置面与默认值与 basic 对齐,持久化事务协议相同,变的主要是摘要形态与恢复工具。设计参考 LCM 论文(Ehrlich & Blackman, 2026-02)以及 dsh-compaction-instant 的协议工作。README 写明:通过保真门,但安装是有意为之的一步——启用后会为整个 profile 替换 compaction-basic,不是默认可选项。
与 basic、instant 的差异¶
下面用表格概括 README 中已核实的对比(摘要器与恢复路径是核心差别):
dsh-compaction-basic |
dsh-compaction-instant |
dsh-lcm | |
|---|---|---|---|
| 摘要器 | LLM | 确定性编译器 | LLM |
| 摘要形态 | 自由散文 | 逐字摘录 | 5 个叙述小节 + 枚举锚点清单 |
| 压缩后的原文 | 仅日志,模型侧无路径 | (seq N) + 召回工具 |
(seq N) + lcm_expand |
| summary-DAG 深度 | 1 | 1 | 由日志推导,深度不受 1 限制 |
除摘要步骤外,锁断言、compaction/start|summary|end 事务括起、framed < shadowed 收缩保证等,均沿用 harness 自带事务语义。
核心能力¶
结构化 checkpoint 与可发现恢复¶
checkpoint 被视为日志之上的视图,日志保留被折叠节点的完整内容。摘要可携带 seq N 指针;模型或工具链通过 lcm_expand 按 seq、result 或 checkpoint 引用把原始 token 逐字节还原。
在 README 引用的生产跨度测量中(约 436 194 token):摘要里直接可见的锚点约为 3/24(12.5%),经 lcm_expand 恢复的为 21/21,模型仍可获得 24/24,永久丢失 0。这与「纯摘要 checkpoint 不告诉模型其余内容还存在」形成对照。
字面保真(有基准支撑)¶
对照 dsh-compaction-basic,README 给出在两组语料上的 type-grouped verbatim recall:约 3.0–3.5× 更多原样字面量(4.3k 跨度 7/14 对 2/14,8.1k 跨度 15/24 对 4/24);相对未压缩原文仍可引述内容,本后端约 75%,basic 约 20%。作者同时说明:目标不是更「密」的摘要,而是更高保真;leaf 单元毛 token 成本约为 basic 单遍的 7.95×(见下文「叶的粒度」)。
工具与命令¶
安装 bundle 后,agent 与人类侧可使用(节选自主 README 工具表):
| 工具 / 命令 | 用途 |
|---|---|
lcm_expand |
按 seq(如 "3-7,15")、result、checkpoint 还原原文 |
lcm_search |
在持久日志上做关键词/正则检索;可选向量或 hybrid 排序 |
recall / search |
与原后端同名别名,行为一致 |
/lcm-search |
人侧检索,命中以持久 user 消息追加 |
/lcm-status |
checkpoint 数、深度、节省 token 等 |
/lcm-embed status、/lcm-embed backfill |
向量缓存与回填(需配置端点时才有语义成本) |
lcm_search 默认面向「agent 记得某个字符串」的词面/正则场景;README 指出在自然语言问题上直接当查询用,命中形态可能不匹配,语义路由需显式打开 vectorEnabled 等配置。
叶的粒度与成本¶
一次压缩按 leafSpanTokens(默认 24000) 切分为多片「叶」串行摘要,同深度叶在 condensationFanin: 4 时向上合并,避免 surface 平铺膨胀。调大 leafSpanTokens(如 48000)可减少调用次数,但每叶携带更多原文,漏引风险上升。
README 对 436 194 token 历史的外推:basic 单遍约 712 975 毛 token;dsh-lcm 19 叶约 5 665 439 毛 token(约 7.95×)。选用前应把 token 与延迟预算算进去,而不是只看摘要质量。
安装与启用¶
DSH 以插件组合 profile;社区目录 SkillHub 与官方仓库独立维护,安装前建议自行审阅源码与 MIT 许可证。插件在当前 DSH 进程权限下运行,与任何第三方插件相同。
官方 README 给出的安装方式如下(二选一):
dsh plugin --profile web add <本包路径或其 tarball>
从 GitHub 安装(文档记载的市场路径;示例 profile 为 web):
dsh plugin --profile web add github:zy-xyz/dsh-lcm
安装会在 profile 内执行 pnpm,并通过 dsh.bundle.patch 将 compaction-basic 标为 disabled: true、注册 compaction-lcm 与工具行。需要重启 DSH 进程后加载。卸载:
dsh plugin --profile web remove dsh-lcm
不启动进程也可检查 bundle 是否生效:
dsh --profile web --dump-config | grep -A1 -E 'id: compaction-basic|id: compaction-lcm'
期望看到 compaction-basic 带 disabled: true,且存在 compaction-lcm。
配置要点¶
dsh-compaction-basic 接受的键在此均有效,含义与默认值相同;现有 basic 配置可直接迁移。完整示例见仓库 config.example.yaml。
压缩引擎行(id: compaction-lcm,name: dsh-lcm)在 basic 通用项之外,增加 LCM 专用项,例如:
- id: compaction-lcm
name: dsh-lcm
config:
thresholdRatio: 0.8
headroomTokens: 65536
retainRatio: 0.16
maxTokens: 65536
auto: true
summaryRatio: 0.12
summaryFloorTokens: 512
checkpointCap: 16384
leafSpanTokens: 24000
condensationFanin: 4
anchorPointers: true
emptySummaryRetries: 2
检索与 lcm_search 的向量相关选项在 tool-lcm-expand(name: dsh-lcm/tool) 行配置;README 强调语义路由挂在 SEARCH 行,默认 vectorEnabled: false 时 hybrid 即词面结果。端点 URL、模型名、vectorApiKeyEnv 等须按你的环境填写,勿照搬示例中的内网地址。
预算公式在 basic 基础上仅多一行摘要目标:targetTokens = clamp(shadowed × summaryRatio, summaryFloorTokens, checkpointCap);请求上限为 max(4096, 2 × target),以避免推理模型把预算耗在隐藏思考上却无文本块返回。
典型用法(可复现思路)¶
- 按上文命令安装并重启 profile,确认
compaction-lcm已启用。 - 运行长会话直至触发自动压缩(
auto: true且上下文越过thresholdRatio等阈值)。 - 当模型需要被摘要「挤掉」的精确字符串或文件路径时,调用
lcm_expand,参数使用 checkpoint 中的seq或工具文档中的result/checkpoint形式。 - 当只记得片段、不记得
seq时,用lcm_search或别名search在持久日志中检索;人侧可用/lcm-search <pattern>把命中写回会话。 - 查看
/lcm-status了解当前 checkpoint 深度与节省的 token。
若从 basic 切换,原有指向 recall、search、/recall 的集成可继续工作;可在配置中设 legacyNames: false 仅保留 LCM 命名。
适用场景与注意¶
更适合:长时运行、需要压缩上下文又希望保留「可发现的逐字恢复」的 DSH agent;已在使用 dsh-compaction-basic、愿意接受更高 summarization token 成本以换取更多字面锚点与 lcm_expand 路径的场景;愿意按文档完成安装与 profile 验证的维护者。
需要谨慎:对 summarization 费用和延迟敏感、希望「一遍 LLM 压完」的配置;dsh 0.2.2-rc.1 等版本上 README 记载的 settings 覆盖限制;依赖自然语言问句直接驱动 lcm_search 而未配置向量路由的场景。
安装前请阅读仓库中的 docs/ACCEPTANCE.md、docs/PRODUCTION-INSTALL.md 与 bench/REPORT.md,核对与你环境相关的数字与回滚步骤。
结尾¶
dsh-lcm 不改变 DSH「一切皆插件」的组合方式,而是在既有 compaction 事务里换用 LCM 式摘要与恢复工具:日志留全量,checkpoint 带指针,按需 lcm_expand / lcm_search。若你的痛点是压缩后字面信息「看不见也找不回来」,可以按官方命令安装并在 profile 里显式启用;若更看重单次压缩成本,应继续评估 leaf 乘数后再切换。