前言¶
在开发基于大模型的智能体时,跨会话的记忆是一个常见痛点:历史对话容易被遗忘,项目事实和情绪偏好混在一起,检索时要么信息过载,要么漏掉关键信息。DeepSeek Harness(DSH)的插件化架构提供了扩展能力,dsh-selective-memory 就是为此设计的跨会话记忆库插件。
这个插件由 liu-joy2026 维护,不追求「把一切存下来」,而是做「选择」的记忆:分得清工作事实和心里的事,记得住当时的感受,知道什么该沉下去。
是什么¶
dsh-selective-memory 是给 DeepSeek Harness 用的记忆管理插件。它不依赖向量检索,而是通过「两个区 + 深度分层 + 心情 + 三信号检索」来组织记忆。数据落在一个普通 JSON 文件里,重启不丢。
核心设计取向是:不只记住事实,也记「当时的心情」。
核心功能¶
两个区¶
| 区 | 放什么 | 默认深度 |
|---|---|---|
项目区 project |
工作事实、技术方案与决策、踩过的坑与教训、待办、项目约定 | 5 |
温度区 warm |
偏好、忌讳、情绪与心情、重要的话、约定与承诺、想留住的片段 | 1 |
深度 是每条记忆的第二维:0 最深刻,数字越大越浅。0 只留给温度区——工作事实再重要也只到 1。每个深度层最多 4 条,满了自动往浅处顺延,也可以显式让某条旧记忆退一级(displace)。
心情(mood) 是第三维:一条记忆可以带一个 12 字内的感受(开心 / 累 / 委屈 / 感动 / 心动)。检索和面板都会显示。
模型工具¶
插件向模型暴露以下工具:
| 工具 | 作用 |
|---|---|
memory_write |
写一条(zone + content + 可选 title / tags / mood / depth) |
memory_search |
三信号检索(关键词 idf + 标签 + 深度),可限定区 |
memory_list |
按深度列出,可限定区 |
memory_get |
按 id 取全文 |
memory_update |
改标签和深度 |
memory_mark |
标有效 / 过时(不删) |
memory_delete |
按 id 删除 |
memory_sediment |
一次总结同一话题的 1-5 条(带 based_on 自动把旧条目标过时) |
memory_tidy |
体检:找出完全重复、高度相似、长期没更新的条目;确认后只自动处理完全重复 |
检索机制¶
关键词采用中文二元组 + 英文词,BM25 式 idf 加权,标题命中加倍。标签单独一路,最后用 RRF(k=20)融合,权重 1.0 / 0.8。返回 top_k=5,深度只做同分排序。
三个取舍:
- 不设总分阈值,但只命中高频词时返回空——宁可搜不到,也不塞噪声
- 出现在一半以上记忆里的词不参与打分,免得淹掉区分词
- 返回按深度优先,深度 0 永远在最前
系统提示¶
启动时插件会向系统提示注入:
prompt.md:记忆库的使用规则。运行时从插件目录读,可以直接改或清空;没有这个文件就用内置默认- 记忆索引:启动时列出库里最靠前的 12 条(
id | 标题),让模型知道「有什么」 - 写入守卫:连续 6 轮没写入,下一轮提示里会出现一句「该写记忆了」。用
systemPrompt.context动态渲染,不常驻、不破坏缓存
设置页¶
设置 → 记忆库:
- 项目区 / 温度区两个标签,带
<有效>/<过时>的绿红计数 - 搜索、新建、编辑、删除(二次确认)
- 每条显示来源(用户写 / AI 记)、
♡ mood、标签、深度 - 一键隐藏 / 显示过时记忆(只影响显示,不影响检索)
安装与启用¶
需要 DeepSeek Harness 0.2.x。桌面版的 profile 由应用独占管理,所以不要 用 dsh plugin add(会被拒绝),改 profile 的 package.json:
- 打开
%USERPROFILE%\.dsh\profiles\desktop\package.json(macOS/Linux 是~/.dsh/profiles/desktop/package.json) - 在
dependencies里加一行:
"dsh-selective-memory": "github:liu-joy2026/dsh-selective-memory"
- 在
dsh.profile.bundles数组里加一项"dsh-selective-memory" - 在该目录跑一次
pnpm install(用 DSH 自带的那个 pnpm 也行) - 重启 DeepSeek Harness,设置 → 记忆库 就能看到
本地开发可以直接指路径:
"dsh-selective-memory": "link:E:/path/to/dsh-selective-memory"
Windows 上从 GitHub 拉取可能很慢或失败,必要时挂代理(
git config --global http.proxy)或用镜像。
数据位置¶
$DSH_HOME/storages/memory-bank/store.json
也可以用环境变量 DSH_MEMORY_BANK_DIR 指定目录名。
纯文本、可读、可手动备份;写入用临时文件 + rename,避免写一半损坏。
日志在同一目录的 memory-bank.log:中文摘要在前,英文原文在后,启动时轮转。
结构¶
lib/index.js 宿主侧:工具、系统提示、RPC、写入守卫(唯一真源)
lib/store.js 存储层(零依赖,可单独测试)
lib/client.js 设置页(React,无需构建)
lib/log.js 日志
prompt.md 记忆库行为规则(可改)
cordis.patch.yml bundle 声明
tests/ 检索回归集
本仓库没有构建步骤:lib/ 是手写的可运行 JS,直接就是产品。
测试¶
node tests/run-retrieval.mjs
跑 tests/retrieval-cases.json 里的用例,看每个问题能不能在 top5 命中期望条目,输出通过率和失败明细。已知局限的用例标 soft: true,不算回归。
已知限制¶
- 没有向量检索(关键词 + 标签 + 深度已经够用,等库大了再说)
- 没有「每步自动召回」:目前靠模型主动
memory_search+ 启动时的索引 - 没有导出 / 导入
- 设置页还没有按标签筛选
适用场景与注意¶
适合需要跨会话维护项目事实、偏好与情绪状态的智能体开发者。插件以当前 dsh 进程权限运行,安装前应检查源码与许可证。
结尾¶
dsh-selective-memory 通过简单的分层结构和检索机制,把「记不住」的问题转化为「记得住什么」的选择问题。如果你在开发需要长期记忆的智能体,可以试试这个插件。
- 插件目录:https://www.skillhub.cn/plugins/liu-joy2026/dsh-selective-memory
- GitHub:https://github.com/liu-joy2026/dsh-selective-memory