dsh-ebbing-context:分层上下文压缩,越旧越粗、从不删除

前言

在 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

  1. 把仓库内容放进 profile 的 node_modules/dsh-ebbing-context/
  2. 在 profile 的 cordis.patch.yml 里加一行 dsh-ebbing-context:(路径写法见 SPEC 的「目录与开发」)
  3. 重启 DSH

装完确认三件事:插件卡片显示运行中、context_map / compress 两个工具都在、/context-status 能出地图。

卸载:执行 dsh plugin remove dsh-ebbing-context 之后还要:

  1. 打开 profile 的 cordis.patch.yml,删掉 dsh-ebbing-context 那一节(包括面板里改过的 config),否则下次启动会在 stderr 刷 patch 指向不存在的警告。
  2. 日志在 $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 节。

典型用法

  1. 用 /context-status 或工具 context_map 查看当前分层结构与 token 占用。
  2. 当上下文压力增大、插件在本轮收尾附上地图后,由模型调用 compress,按地图填写 l0/l1/l2/l3 与对应的 to(l3 除外)。
  3. 需要逐字原文时,配合「会话搜索」插件的 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 决定,插件只负责校验、写入与提醒。目录页与仓库:

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

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

小夜