dsh-selective-memory:给 DeepSeek Harness 的跨会话记忆库

前言

在开发基于大模型的智能体时,跨会话的记忆是一个常见痛点:历史对话容易被遗忘,项目事实和情绪偏好混在一起,检索时要么信息过载,要么漏掉关键信息。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 永远在最前

系统提示

启动时插件会向系统提示注入:

  1. prompt.md:记忆库的使用规则。运行时从插件目录读,可以直接改或清空;没有这个文件就用内置默认
  2. 记忆索引:启动时列出库里最靠前的 12 条(id | 标题),让模型知道「有什么」
  3. 写入守卫:连续 6 轮没写入,下一轮提示里会出现一句「该写记忆了」。用 systemPrompt.context 动态渲染,不常驻、不破坏缓存

设置页

设置 → 记忆库:

  • 项目区 / 温度区两个标签,带 <有效>/<过时> 的绿红计数
  • 搜索、新建、编辑、删除(二次确认)
  • 每条显示来源(用户写 / AI 记)、♡ mood、标签、深度
  • 一键隐藏 / 显示过时记忆(只影响显示,不影响检索)

安装与启用

需要 DeepSeek Harness 0.2.x。桌面版的 profile 由应用独占管理,所以不要 用 dsh plugin add(会被拒绝),改 profile 的 package.json:

  1. 打开 %USERPROFILE%\.dsh\profiles\desktop\package.json(macOS/Linux 是 ~/.dsh/profiles/desktop/package.json)
  2. 在 dependencies 里加一行:
"dsh-selective-memory": "github:liu-joy2026/dsh-selective-memory"
  1. 在 dsh.profile.bundles 数组里加一项 "dsh-selective-memory"
  2. 在该目录跑一次 pnpm install(用 DSH 自带的那个 pnpm 也行)
  3. 重启 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
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

Xiaoye