前言¶
用 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_xxx→ou_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-query、dsh-session-reference、dsh-compaction、dsh-agent-instructions、dsh-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 / 幻方无官方从属关系)。