前言¶
在 DSH 里跑长会话时,上下文窗口迟早会顶满。常见做法是宿主自带的 /compact 或自动压缩:把旧对话拍成一层摘要,细节一旦合并就难再找回。若你更希望「旧内容分辨率逐步变低、但原文仍留在会话日志里」,需要一种由模型按需决策、且只写宿主本来就会记录的会话事件的压缩方式。下面介绍社区插件 dsh-ebbing-context(维护者 Light-EI,分类:记忆),它在 DSH 上实现「渐渐消退(ebbing)」式的分层压缩。
这是什么¶
dsh-ebbing-context 是模拟记忆衰退的 DSH 分层上下文压缩插件:模型自己决定压哪里、自己写摘要;插件只写宿主本来就认识的会话事件,把旧内容一层层降成更粗的表示:
原文(逐字) → L1 块(一段的结论与数据) → L2 块 → L3 块(只剩关键词句)
越旧的越粗,但从来没有被删掉——原文仍在会话日志里,装了「会话搜索」插件就能按事件号取回。ebbing 即「渐渐消退」:降不降、降多少,由模型看着上下文压力自己决定,不是定时任务。
当前 package 版本为 0.1.19,许可 MIT,要求 Node >= 20。README 标明目标宿主为 DSH 0.2.1-rc.3 ~ 0.2.2-alpha.2;功能完整、测试全绿,已在真机跑通过压缩,但作者说明未归档可复现的验证记录。试用的请先备份 profile、用新会话试。
它怎么工作¶
工具与命令¶
- 两个工具 + 一条命令:
context_map(分层结构与占用)、compress(执行一次压缩)、/context-status(只读,同地图)。
压缩键与级联¶
- 键名 = 要压的那一层:
l0压原文 → L1 块;l1压 L1 → L2;l2压 L2 → L3;l3把整个 L3 区压成一块(唯一不写to的键)。 to只能从地图上抄:l0写轮号(如T19),l1/l2写该区从 1 起的块序号。写错就被拒,拒绝回执里带刷新后的地图。- 级联:压深层时,比它浅且还能压的层必须同批给完,否则整批拒绝(只断一次前缀缓存)。
设计要点¶
- 零台账:不建库、不写状态文件;层级每轮从会话表层现算,块的身份写在正文第一行,形如
〔L1|T16–T19|ev 4121–4390〕标题。 - 提醒但不代劳:占用到线、又长了、某层超配额时,在本轮收尾把模型叫醒并附一张新地图。从不自动压缩,也不催
/compact。
完整设计见仓库 docs/SPEC.md。
安装与启用¶
npm 暂不上架(名字已占位 dsh-ebbing-context)。README 给出两种方式,在真机上装起来过。
方式一:从源码目录装(推荐)
git clone https://github.com/Light-EI/dsh-ebbing-context.git
dsh plugin add ./dsh-ebbing-context
方式二:手动挂到 profile
- 把仓库内容放进 profile 的
node_modules/dsh-ebbing-context/ - 在 profile 的
cordis.patch.yml里加一行dsh-ebbing-context:(路径写法见 SPEC 的「目录与开发」) - 重启 DSH
装完确认三件事:插件卡片显示运行中、context_map / compress 两个工具都在、/context-status 能出地图。
卸载:执行 dsh plugin remove dsh-ebbing-context 之后还要:
- 打开 profile 的
cordis.patch.yml,删掉dsh-ebbing-context那一节(包括面板里改过的config),否则下次启动会在 stderr 刷 patch 指向不存在的警告。 - 日志在
$DSH_HOME/logs/ebbing-context.log(滚动时还有.1/.2),卸载不会自动删,不需要排查时手动删掉即可。
建议关掉宿主自带的自动压缩(compaction-basic 的 auto,默认 80% 触发)。它一旦触发会把多层摘要重新拍平,细节永久丢失。插件照样能压,只是效果打折。关的位置取决于你的安装方式与预设。
配置¶
共 17 项(triggerPct、keepTurns、pruneFirst、foldCallRecord、requireSessionQuery、reservedTokens、budget.*、segment.*、title.maxTokens、notice.*),在插件面板里改,改完点「保存」才生效。默认值、含义与拒绝规则见 SPEC 第 6 节。
典型用法¶
- 用
/context-status或工具context_map查看当前分层结构与 token 占用。 - 当上下文压力增大、插件在本轮收尾附上地图后,由模型调用
compress,按地图填写l0/l1/l2/l3与对应的to(l3除外)。 - 需要逐字原文时,配合「会话搜索」插件的
session_event_read/session_event_search按事件号取回。
插件默认要求安装会话搜索;取不回原文就不让压。
依赖、限制与适用注意¶
依赖与边界
- 需要宿主提供
agent/pre-step、agent/turn-stopping、agent/followup与会话表层 API。 - 只做「成对替换」或「只改
tool/result正文」,从不单点删节点。 - 不联网、不读文件、不收集遥测。
已知限制
- 并行调用时不折叠(也不改写返回),摘要正文会以参数形式留在上下文里。
- 折叠只在下一次请求发出之前做;错过这一步的那条就不再折。
- 图片无法取回,只按张数记账。
- 轮次大纲损坏(日志缺
turn/start或乱序)时,该轮报红色错误并停用。 - 区占用由插件自估(中文 1 字 ≈ 1 token),与宿主计价器略有差异,会略早提醒。
适用场景与安装前检查
适合需要在 DSH 长会话里保留可追溯原文、又希望模型按压力主动分层摘要的开发者。插件以当前 dsh 进程权限运行;安装前请自行查看 GitHub 源码 与 MIT 许可证,确认与本地 DSH 版本、profile 预设一致。
DSH 生态是「一切皆插件」;社区目录 skillhub.cn 为独立站点,与 DeepSeek / 幻方无官方从属关系。
结尾¶
dsh-ebbing-context 把长会话上下文收成 L1/L2/L3 多级摘要,同时不删会话日志里的原文;压缩节奏由模型结合 context_map 与 compress 决定,插件只负责校验、写入与提醒。目录页与仓库: