前言¶
在 DeepSeek Harness(DSH)里做长会话时,模型上下文窗口迟早会被占满。常见做法是整段压缩或手工删历史,但压缩后细节难找回,删历史又可能丢掉约定和结论。社区维护者 wall1234567 的 dsh-rofm(原名 dsh-memory-recall,自 0.3.0 起更名)走另一条路:在上下文超过阈值时,用确定性代码把最早一段对话落盘到插件目录下的 memory/「回忆文件夹」;模型可见上下文里只留下简短的 compaction 注记。之后用户再说话时,按关键词命中、重要度 α 与代数衰减概率把相关记忆加回系统提示词里的回忆块。α、β 与关键词不由归档阶段另开一次模型调用,而由当前会话模型结合语境调用 memory_judge 提交。插件分类为「记忆」,当前版本 1.2.1(MIT),GitHub 仓库约 5 stars。DSH 生态是「一切皆插件」;目录站 SkillHub 与 DeepSeek / 幻方无官方从属关系,安装前请自行审阅源码与许可证。
这是什么¶
dsh-rofm 是纯 Host 侧插件:3 个模型工具(memory_judge / memory_recall / memory_image)、2 个 system-prompt section(回忆块、记忆评分任务)、3 个事件监听器;无 Client 半区、无命令、无定时器、无子进程。engine/ 记忆引擎零依赖、不 import DSH 包,可单独运行;在 DSH 里禁用插件时,工具与监听器随 Cordis 上下文卸载。所有参数在插件目录的 config.json,保存后热加载,无需重启进程。
核心机制¶
归档:腾空间且不额外调用模型¶
在每个模型步骤之前(agent/pre-step),插件用 DSH 的 tokenMeter 计算上下文占用比例。超过 compress.triggerPercent(默认 60%) 时:
- 先按同样规则处理已注入的回忆块,再取最早约
compress.compressPercent(默认 20%) 的对话(按 token 累计,切在完整用户回合边界,不拆散 tool-call / tool-result)。 - 按
compress.targetChunkChars(默认 1200 字) 拆成多个回忆文件夹;超长句只在句末切分,拼接与原文一致。 - 文件夹以「待评分」落盘(
scored: false),上下文替换为官方 compaction checkpoint 短注记;会话界面仍保留原文。 - 若仍超阈值,可追加普通 pass(最多
maxExtraPasses);超过emergencyPercent(默认 85%) 时用更大比例紧急归档。
归档全程是确定性代码,不调用任何模型。对话中的图片会换成占位符,字节存到 memory/sessions/<session-id>/images/,元数据写在文件夹 meta.images 里。
评分:当前模型通过 memory_judge 激活记忆¶
归档后的下一次请求,system prompt 会出现 「记忆评分任务」 section(dsh-rofm:memory-tasks)。模型需结合当前语境调用 memory_judge,为新归档条目提交 α(0.01~1)、β(-10~10) 与 3~8 个关键词;复核条目可用 keep=true 保持原值。未评分的记忆不参与回忆——不匹配、不掷骰、不占名额。
工具参数形如:
{ "updates": [ { "id": "mem-…", "alpha": 0.6, "beta": 3, "keywords": ["…", "…", "…"], "reason": "…" } ] }
v1.2 起每轮最多列 100 条待评分 + 100 条待复核;区块明确要求本轮直接提交,避免模型把评分当成需用户批准的动作而积压。
自动回忆与主动工具¶
用户消息到达时,插件对 utterance 分词,在已评分文件夹里做关键词匹配;命中后以概率 α(第一代)或 α·p(n)(更高代数,默认 μ=5、σ=3) 决定是否加回,并受 recall.firstGenMax 等上限约束。注入内容在 dsh-rofm:recall system-prompt section(v1.1 布局;v1.2 曾试验「最早历史消息」已回退)。回忆块带 β 使用说明;重启后靠各会话 recall-state.json v2 快照恢复。
v1.2 另增:
memory_recall:模型按关键词主动触发回忆(参数含keywords、可选limit1~8)。memory_image:按关键词、记忆 id 或文件名查找归档图片的绝对路径,模型再用宿主read_image读取(不重新上传附件)。
安装与启用¶
插件以 link 形式安装时,memory/ 数据写在插件目录内,升级代码即可。官方 README 给出两种方式。
在 DSH Agent 里安装本地目录(将路径换成你的插件绝对路径):
plugin_manager(action: "install_bundle", target: "/path/to/dsh-rofm")
若本机有 dsh CLI,也可:
dsh plugin --profile desktop add link:/path/to/dsh-rofm
源码仓库:https://github.com/wall1234567/dsh-rofm。README 说明从 GitHub 取得目录后,同样用 install_bundle 或 link 指向该目录。安装后「设置 → 插件」里会出现 dsh-rofm(标题:记忆回忆 / Memory Recall),安装即生效(HMR);下一请求起可见记忆评分任务,并可调用 memory_judge。要求 Node ≥20(部分会话日志 zstd 工具需 Node ≥22.15)。
典型用法与运维¶
调参与开关¶
编辑插件目录 config.json 保存即热加载。常用项包括:
| 字段 | 默认 | 含义 |
|---|---|---|
enabled |
true |
总开关 |
compress.triggerPercent |
60 |
触发归档的上下文占用百分比 |
compress.compressPercent |
20 |
单次归档目标移除比例 |
recall.enabled |
true |
是否启用回忆 |
recall.persistInjected |
true |
是否持久化已注入回忆到 recall-state.json |
storage.dir |
memory |
回忆根目录(相对插件目录) |
α 是回忆概率乘数,不是「权重标签」:α 接近 1 时,关键词命中后几乎每次都会加回,容易抵消归档腾出的空间;α 超过 importance.warnAbove(默认 0.8) 时插件会记录警告。
查看记忆与自检¶
在插件目录执行:
node tools/show-recall.mjs
node tools/show-recall.mjs --session <session-id>
node tools/selfcheck.mjs
show-recall 可列出各会话的回忆文件夹、α/β、待评分状态,以及当前会注入模型的回忆块摘要;selfcheck.mjs(v1.2)独立校验配置、memory/ 与 recall-state、会话日志中的本插件注记形态。仓库零依赖,不需要 npm install;npm run check 串联测试、模拟、selfcheck 与引擎 CLI help。
归档原文在 memory/sessions/<session-id>/mem-…/context.json;遥测在同级 stats.jsonl。
适用场景与注意¶
适合需要长会话、可回溯约定与结论的 DSH 用户:归档不额外消耗 LLM 轮次,回忆由概率控制,β 在块内提示模型能否把片段当事实或指令使用。子代理默认不归档/不回忆(compress.applyToSubagents / recall.applyToSubagents 默认 false),可按需在配置里打开做隔离测试。
务必注意:插件以当前 DSH 进程权限读写 memory/ 与会话相关路径,安装前应阅读 GitHub 源码与 MIT 许可证,确认数据落盘位置与隐私边界。若模型长期不调用 memory_judge,待评分条目会积压在任务区块且无法被回忆。v1.2 之前试验注入形态可能导致旧会话「历史加载失败」,README 提供 tools/repair-session-log.mjs 修补缺失 message id。
结尾¶
dsh-rofm 把「腾上下文」和「长期记忆」拆开:归档确定性落盘,评分与信赖度交给理解当前对话的模型,再用关键词与 α 概率把片段加回系统提示词。需要详情、配置表与测试说明时,可查阅 SkillHub 目录页 与 GitHub 仓库 README。