dsh-lcm:面向 DeepSeek Harness 的无损上下文压缩引擎

前言

在 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),以避免推理模型把预算耗在隐藏思考上却无文本块返回。

典型用法(可复现思路)

  1. 按上文命令安装并重启 profile,确认 compaction-lcm 已启用。
  2. 运行长会话直至触发自动压缩(auto: true 且上下文越过 thresholdRatio 等阈值)。
  3. 当模型需要被摘要「挤掉」的精确字符串或文件路径时,调用 lcm_expand,参数使用 checkpoint 中的 seq 或工具文档中的 result / checkpoint 形式。
  4. 当只记得片段、不记得 seq 时,用 lcm_search 或别名 search 在持久日志中检索;人侧可用 /lcm-search <pattern> 把命中写回会话。
  5. 查看 /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 乘数后再切换。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜