前言¶
在 DeepSeek Harness(DSH)里跑长期陪伴或长会话智能体时,常见做法是每轮把整段历史对话塞进上下文,token 很快顶满;或者只靠模型自己「记住」,旧细节一旦超出窗口就丢。DSH 生态里插件可以订阅会话事件、注入系统提示、注册工具——适合把「归档、分层、按需召回」做成独立模块,而不是在业务里重复写一遍。下面介绍维护者 sutanglime 发布的 dsh-companion-memory(GitHub:sutanglime/dsh-companion-memory,npm 包名同目录名,当前版本 0.3.1,MIT 许可证):全自动对话归档、渐进冷存、按用户线索从冷库召回,并在每轮请求前用 1600 tokens 预算上限 的记忆快照替换「每次都重读全部旧对话」。设计思路参考公开方案 Companion-AI-Memory-Context-Token-Optimization,本插件为独立实现,代码与提示词自行编写。
这是什么¶
dsh-companion-memory 是 DSH 专用插件(依赖 ctx.tools、ctx.systemPrompt、session/event、ctx.sessionQuery),分类属于「记忆」。它把记忆分成 pinned / hot / cold 三层,原文持续追加到本地归档;热度驱动细节→摘要→冷库的渐进冷却;用户给出线索时通过工具双通道召回。冷库正文不会每轮整包注入,只有快照里的连续性状态、固定事实与活跃记忆进入上下文。
默认数据目录为 $DSH_HOME/companion-memory/:
records.json 记忆卡
state.json 连续性状态、计数器、归档水印
archive.jsonl 原文归档(追加写)
核心机制¶
全自动归档与分层¶
| 机制 | 实现 |
|---|---|
| 全自动归档 | 订阅 session/event 提交后事件流,每轮用户与助手原文追加进 archive.jsonl |
| 冷热分层 | pinned / hot / cold 三层,tier 只决定调用位置,原文归档不动 |
| 热度公式 | heat = 0.45*F + 0.35*R + 0.20*O,F 为去重且每日封顶的有效提及频率 |
| 渐进冷却 | 细节(≤72h) → 摘要(≥24h 可用后) → 冷库(候选宽限期 7 天 + 热度 <0.30 或 14 天未提及) |
| 线索召回 | 双通道:记忆卡 0.80*S + 0.20*C(自带维度索引)+ 归档原文 BM25 词法检索;都不惩罚年代 |
| 预算约束 | 快照 1600 tokens = 固定 160 / 活跃 960 / 召回 480,互不借用 |
归档只取 user/message 与 assistant/message;工具结果、系统消息与推理不入档。Harness 写入的运行时上下文等 user 消息会标 system_context: true,可与真实用户发言区分。水印按 (session_id, seq) 记录,写入成功后才推进;漏记可用 memory_archive 的 backfill 幂等补回(首次建议手动执行,默认 backfillOnStart: false)。
注入策略¶
每轮把连续性状态 + 固定事实 + 相关活跃记忆作为动态上下文块注入,整体受 1600 tokens 约束;冷库正文不注入,只在用户给出线索时由工具取回。
注册工具¶
memory_remember— 写入/更新记忆卡(来源片段、主题、维度索引)。memory_recall— 按线索检索冷库:记忆卡通道 + 归档 BM25;返回matched/ambiguous/not_found,候选与正文共用 ≤3 条、≤480 tokens。memory_forget—delete、supersede、recall_only、unpin、allow_normal等;删除与更正会立即让已授权的召回副本失效。memory_continuity— 写入基础人格与当前相处状态;reset: true在用户明确要求时清空。memory_archive—stats、backfill、purge(清理本插件归档副本,需用户明确依据)。memory_status— 各层条目数、Top 热度、预算余量、最近一次冷却结果。
归档词法索引仅索引对话轮次,BM25+IDF,不惩罚年代;索引只放内存不落盘。无 embedding 时,记忆卡侧的 S 由本地词法相似度替代(fallback),与向量空间分数禁止混用。
安装与启用¶
本插件面向 DSH ≥0.2.0、Node ≥22。README 给出的分发与安装方式如下(勿把个人 $DSH_HOME/companion-memory/ 里的 json/jsonl 打进包——那是私密记忆,不是插件代码):
- 将
dsh-companion-memory/目录交给对方(npm 发布、插件市场或目录打包均可)。 - 对方通过
plugin_manager的install_bundle,target 指向该目录或 npm 包名dsh-companion-memory。 - 新 bundle 经 HMR 直接激活,无需重启 harness。
建议上手顺序:
memory_archive→backfill回填历史会话。memory_continuity写入自己的基础人格与当前相处状态。- 之后正常聊天,必要时用
memory_recall按线索取回冷库。
典型用法与边界¶
适用:需要长期陪伴、希望旧对话可检索但不想每轮全量重读上下文、能接受词法召回与同义改写较弱的场景。
注意(来自 README「已知边界」):
- 归档检索纯词法,同义改写召回差;专有名词通常更可靠。
minScore/rareDfRatio、热度权重为工程初值,需按真实对话校准。- 索引随条目占内存线性增长,超过
maxEntries会degraded。 - 删除/清理只覆盖本插件副本,不能替 DSH 删 harness 会话日志。
token_counter_mode为estimated,中文约 1 字≈1 token,非硬保证。- 插件以当前 DSH 进程权限读写
$DSH_HOME;安装前应自行审阅 GitHub 源码 与 MIT 许可证。
社区目录页(与 DeepSeek / 幻方无官方从属):skillhub.cn/plugins/sutanglime/dsh-companion-memory。问题与更新以仓库 Issues 为准。