dsh-cue-bank:给 DeepSeek Harness 加一套跨会话的事件触点记忆

前言

用 DSH(DeepSeek Harness)做日常开发,会话彼此隔离:上周谈过的方案,今天开新会话再提同一件事,agent 记不起细节;同一个会话里话题切走又切回来,中间的关键信息也已经滑出上下文。已有的补救手段各有局限——dsh-session-query 提供的是被动查询 API,需要有人调用;dsh-session-reference 要求用户显式 @ 引用;dsh-agent-instructions 只加载静态指令文件。它们都不会在合适的时机主动把记忆送回来。

DSH 的理念是「一切皆插件」,跨会话记忆这类能力可以由社区插件补足。dsh-cue-bank 的思路是模仿人脑的事件记忆:人能随时在任务间切换,靠的是给每个事件建立关键词、视角、触发物等多维触点,触点被当前情境激活后,再从长期记忆拉取事件细节。这个插件把同样的机制搬到了 DSH 上。

这是什么

dsh-cue-bank 是一个跨会话「事件触点记忆」插件,维护者是 itr-del,当前版本 0.1.0,MIT 许可证。它为 DeepSeek Harness 构建一个持久的事件触点库(关键词 + 用户惯用词),并在检测到话题切换时重新唤醒、注入相关记忆细节。

用两句话概括它的行为:

1、每轮对话结束,自动从文本中提取关键词和用户惯用词,写入全局触点库;
2、新消息与上一轮的关键词重合度低于阈值时,判定为话题切换,从库中召回相关记忆,随请求注入。

工作原理

写入侧:turn 结束自动建库

插件监听 agent/status=idle,在每轮 turn 结束时读取本轮文本,提取三类触点,upsert 进全局触点库(原子写 JSON):

  • 对话级触点:本轮关键词(2~4 字中文 gram + 英文词);
  • 任务级触点:session 聚合关键词,合并更新;
  • 用户惯用词:统计近 N 轮窗口内的高频个人用词,作为第二类触点单独记录。

触点每次被命中会更新 lastTouchedAt 并合并关键词,记忆随使用渐进完善。

唤醒侧:话题切换时注入

插件通过 systemPrompt.context() 注册动态上下文。每次 prompt 组装时,提取新消息关键词,与上轮关键词计算重合度;低于阈值(默认 0.25)判定为话题切换,触发触点库扫描,命中 top-N 后注入 <system-reminder> 记忆唤醒块。注入内容带来源标记(conversation / task)、命中触点、最近提及时间和细节摘要;若命中用户惯用词,追加「用户惯用词」提示行。

两个值得注意的设计:

  • 注入的是带来源的 runtime-context 快照,随请求发送,但不写入持久 session 历史。话题未切换时不注入,上下文保持干净。这是它与 dsh-agent-instructions(持久注入)的关键区别。
  • 插件是通用的:监听全局 agent/created,对所有 agent 挂载唤醒/写入钩子,不限于飞书。userId 从 session id 提取(如 feishu:ou_xxxou_xxx),按用户分片存储。

匹配算法与成本

匹配支持三种模式:

模式 说明
keyword TF 加权穷举,纯本地,词面重合准确、语义弱,零外部成本
vector 向量余弦,语义匹配强,走 OpenAI 兼容 embedding 接口
auto(默认) 有 key 用向量,无 key 自动降级关键词

向量模式默认使用 SiliconFlow 的 BAAI/bge-m3。README 特别说明:DeepSeek 官方 API 不提供 embedding 端点(引用 deepseek-ai/DeepSeek-V3 的 issue #806),所以向量模式走 OpenAI 兼容接口。

成本方面,库向量在写入时预计算并缓存,唤醒时只编码 1 条 query,不重复计费。按 bge-m3 / SiliconFlow 的 2026-08 行情,单次唤醒约 ¥0.000025,约每 1 万次话题切换 ¥0.25;关键词模式零外部成本。

安装与启用

一键安装(推荐),安装器通过 package.json 的 dsh.bundle manifest 解析插件(cordis.patch.yml),挂载到指定 profile:

dsh plugin --profile web add github:itr-del/dsh-cue-bank

也可以从 npm 安装(README 称已发布到 npmjs.com/package/dsh-cue-bank):

dsh plugin --profile web add dsh-cue-bank

如果想手动挂载,先在 profile 的 package.json 加依赖:

"dependencies": {
  "dsh-cue-bank": "^0.1.0"
}

再在 profile 的 cordis.patch.yml 插入 id: cue-bank 的配置块(含 storageRoot、matchMode、embedding、topic、inject 等默认配置,完整 YAML 见 README)。

然后安装依赖并重启:

cd ~/.dsh/profiles/web && pnpm install

重启 dsh web 后生效,插件在启动时加载。

启用向量模式只需设置环境变量(或配置 embedding.apiKey),无需改代码:

export SILICONFLOW_API_KEY=...

完全不设该 key,matchMode: auto 会自动降级为纯关键词本地匹配;也可以把 embedding.baseURL 改为自托管端点,实现完全本地运行。

配置

常用可调项(默认值):

默认 说明
storageRoot '' 空 = $DSH_HOME/storages/cue-bank
matchMode auto auto / keyword / vector
topic.switchThreshold 0.25 关键词重合度低于此值视为话题切换
topic.scanEveryTurn false 每轮都扫描(灵敏但开销大)
inject.maxCues 3 最多注入几条记忆
inject.maxDetailChars 400 单条细节截断长度
extract.userIdiomWindowTurns 10 惯用词统计窗口(轮)
dbg false 调试日志

触点库默认存于 $DSH_HOME/storages/cue-bank/users/<userId>.json,跨 profile、跨会话共享。单用户触点上限 200 条(LRU 淘汰),惯用词上限 50 条。完整配置表见 README。

测试与验证

仓库自带四组测试,README 给出的结果:

node test/keywords.test.js      # 22/22 通过
node test/store.test.js         # 16/16 通过
node test/embedding.test.js     # 18/18 通过(不发网络请求)
node test/integration.test.js   # 13/13 通过

覆盖写入建库、话题切换唤醒、同话题抑制、无关话题抑制、惯用词提取与参与唤醒。另外在真实 dsh 进程(headless profile)里验证过:插件加载无报错,turn 结束自动写入全局触点库。向量模式未配置真实 key,用本地 mock 的 OpenAI 兼容服务器验证了代码路径,包括 API 调用契约、余弦相似度判定、无 key 自动降级和超时中止。

与官方插件的差异

README 自述与 dsh 官方插件(dsh-session-querydsh-session-referencedsh-compactiondsh-agent-instructionsdsh-spill)核心能力几乎不重复,估计重复度 10-15%,方向相反:官方插件是「被动查询」,cue-bank 是「自动记忆 + 主动唤醒」。官方清单里没有的独有能力包括:turn 结束自动建库、话题切换阈值触发、无需用户提及的动态注入、用户用词画像、结构化全局存储。

适用场景与注意

适合的人群:长期使用 DSH、跨多个会话工作、话题经常切走又切回来,希望 agent 记得「之前聊过什么」以及「自己惯用哪些表述」的用户。不配置 embedding key 就是纯本地运行,维护成本很低。

使用前注意几点:

1、插件以当前 dsh 进程权限运行,安装前建议先读一遍源码和许可证(本项目为 MIT);
2、向量模式(matchMode: auto 且设置了 SILICONFLOW_API_KEY)会把对话文本编码后发送到 https://api.siliconflow.cn/v1(默认第三方 OpenAI 兼容端点),写入时的库向量也经该端点预计算。介意数据出本地的话,不要设置该 key,或改用自托管端点;
3、触点库有容量上限(触点 200 条 LRU 淘汰、惯用词 50 条),不适合当作全量归档来用。

结尾

dsh-cue-bank 把「被动查询历史」变成「在话题切换的时机主动把记忆送回来」,与官方插件方向互补,向量模式单次唤醒成本约 ¥0.000025,也可以完全本地运行。项目主页:https://github.com/itr-del/dsh-cue-bank;社区目录页:https://www.skillhub.cn/plugins/itr-del/dsh-cue-bank(该目录为独立社区站点,与 DeepSeek / 幻方无官方从属关系)。

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

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

小夜