前言¶
DeepSeek Harness(DSH)采用「一切皆插件」的理念,插件生态由社区维护。在开发智能体时,长期记忆是一个常见需求:既要保留对话、事实、场景与人格等分层信息,又要保证多进程写入不丢数据、检索可控。dsh-pet-memory 插供了基于分层记忆与 append-only 文件设计的本地记忆方案,适合需要长期稳定记忆的 DSH 场景。
它是什么¶
dsh-pet-memory 是一个陪伴型长期记忆 DSH 插件,由 ly2601620664 维护,分类为「记忆」。它采用分层记忆结构(对话→事实→场景→人格),支持规则抽取与时间衰减检索,所有数据以本地文件存储,仅追加不重写,多进程写入安全。
核心功能¶
分层记忆结构¶
| 层 | 内容 | 存储文件 |
|---|---|---|
| 人格/关系档案 | “我叫他笨蛋”、”关系阶段 3” | persona.md |
| 场景 | 一段对话的摘要 | scenes.jsonl(只追加) |
| 事实 | “他喜欢喝冰美式”、”约定:周末去爬山” | facts.jsonl(只追加) |
| 命中统计 | 每条事实被检索到几次 | hits.jsonl(只追加) |
三个注入点¶
systemPrompt.section:每轮把「人格 + 高价值记忆 + 相关场景」放进系统提示词。- 工具:提供
memory_search/memory_add/memory_profile。 session/event:回合结束时用规则抽取新事实。
数据目录与存储设计¶
默认数据目录为 $DSH_HOME/dsh-pet-memory(通常为 ~/.dsh/dsh-pet-memory),可通过 config.dir 或环境变量 DSH_PET_MEMORY_DIR 覆盖。
所有事实、命中、场景均以 append-only 方式写入,永不整文件重写。读取时对同 kind+text 的条目进行折叠:合并为一条,salience 取最大、ts 取最早、hits 累加。命中统计单独文件,通过 touch() 更新时间戳,不触碰正文。
已修复的严重问题¶
| 问题 | 后果 | 修复方法 |
|---|---|---|
touch() 用 tmp+rename 全量重写 |
多进程并发时丢数据(实测 40 条全灭) | 拆出 hits.jsonl,append-only |
section 未设 interpolate: false |
记忆里出现 {{ 会让整轮 prompt 渲染抛错 |
设 interpolate: false + 渲染前 neutralize() |
textOf 用空格拼接 block |
行首锚定的清洗规则全部失效(实测 83% 场景被污染) | 改用 \n 拼接 |
textOf 不区分 block 类型 |
助手内心推理被当成”他说的话”写进记忆 | 只取 type === 'text' |
hits.includes(f.text) 字符串子串匹配 |
limit=1 误伤多条 |
改用对象数组按 id 匹配 |
addScene 无去重 |
fork/compaction 重放导致重复场景 | 按 summary 去重 |
catch {} 静默 |
落盘失败零日志,”以为在记其实没记” | 统一 warn 日志 |
| 无注入防护 | 粘贴的第三方文本可把指令写进长期记忆 | isPromptInjection() 拦截 |
安装与启用¶
使用官方安装命令:
dsh plugin --profile <name> add github:ly2601620664/dsh-pet-memory
兼容版本:dsh 0.2.x(engines.dsh: >=0.2.1-rc.2 <0.3.0-0)。
配置项¶
dir: null # 数据目录,默认 $DSH_HOME/dsh-pet-memory
maxItems: 6 # 系统提示词里放几条事实
includeScenes: true # 是否把相关场景也放进提示词
verbose: false # 打印每轮抽取条数
migrateFrom: null # 一次性导入旧 memory.md 的路径
适用场景与注意¶
适合需要长期记忆的 DSH 场景,尤其是需要保留对话摘要、事实约定、场景上下文与人格关系档案的智能体。插件以当前 DSH 进程权限运行,安装前应检查源码与许可证。
短结尾¶
dsh-pet-memory 通过分层记忆与 append-only 文件设计,在本地实现安全、可检索的长期记忆,适合作为智能体的记忆中枢。更多细节见 GitHub 仓库。