dsh-layered-memory:DSH 四层记忆与本地遗忘调度

前言

在 DeepSeek Harness(DSH)里给智能体加「记忆」,常见做法是整段对话塞进上下文,或用一个扁平库检索后注入。人设、偏好、长期事实和最近几轮话混在同一层时,要么 token 膨胀,要么该硬的边界被软偏好覆盖。下面介绍社区插件 dsh-layered-memory(维护者 yinling2024,分类:记忆):把记忆拆成四层,并配上审计与遗忘调度;反射、检索、遗忘均为本地确定性逻辑,不额外调用模型、也不要求额外 API key。

这是什么

dsh-layered-memory 是给 DSH 的分层记忆插件。核心层默认只读;内隐层记录可塑偏好与策略;外显长期层可检索重要事件与事实;短期层自动写入并在 TTL 后遗忘。插件版本 0.1.0(MIT),仓库 yinling2024/dsh-layered-memory,目录页 skillhub.cn。实测兼容目标为 DSH 0.2.1-rc.3(与 @deepseek-ai/dsh-tools / dsh-system-prompt 同版本)。

四层分别存什么、怎么用

层 存什么 怎么写 怎么用
核心层 身份、根本人设、安全边界、授权规则 默认只读;只能走 layered_core 提案 + 用户授权 作为系统硬约束注入,不参与普通检索
内隐层 稳定偏好、表达风格、行为策略、技能倾向 主模型用 layered_store(layer=implicit) 观察;证据够了才由本地反射晋升 作为风格先验注入,不陈述为事实
外显长期 重要事件、事实、约定 layered_store(layer=explicit) 或短期显著片段晋升 每轮按相关度召回摘要;layered_search 查细节
短期 最近对话、任务中间状态 自动写入,TTL 过期 只注入显著片段;过期前可晋升为候选

横切能力包括:审计(audit.jsonl)和遗忘调度(TTL、衰减、归档、回收站、删除传播)。只有主模型主动调用工具时才会产生正常的工具调用开销。

工具与核心层变更

插件注册的工具如下。

工具 作用
layered_store 写外显长期或内隐倾向;外显支持 factKey,同键只保留最新,旧条目标 superseded 但保留可审计
layered_search 按相关度、新近、重要度、置信度检索外显记忆;空 query 时用当前用户消息
layered_forget 删除一条外显记忆;默认进回收站 30 天,hard=true 彻底删除
layered_core list / propose / apply / rollback;apply 和 rollback 必须 confirm: "APPLY"
layered_status 各层条数、待批准提案、数据目录、当前配置

改核心人设必须走显式协议,不能靠内隐层绕过:

  1. 用户明确说「改核心人设」;
  2. 模型调用 layered_core(action="propose", file="persona", content="...");
  3. 模型把返回的 diff 给用户看;
  4. 用户明确授权后,模型才调用 layered_core(action="apply", proposal_id="corep_...", confirm="APPLY");
  5. 写入前自动备份到 core/versions/,可用 rollback 回滚。

提案默认有 30 秒冷却(config.json 的 core.applyCooldownSeconds,设为 0 会取消时间门,不建议)。

安装与启用

DSH 生态理念是「一切皆插件」;skillhub.cn 为社区目录,与 DeepSeek / 幻方无官方从属关系。安装前建议在 GitHub 阅读源码与 LICENSE,插件以当前 DSH 进程权限读写 $DSH_HOME/layered-memory/。

桌面版(推荐:profile patch)

桌面版没有 dsh CLI 时,可在 profile 的 cordis.patch.yml 里用绝对路径加载(DSH 会转成 file:// URL)。

  1. 先备份($DSH_HOME 换成你的 DSH home,桌面版常见 D:/dsh-data):
cp "$DSH_HOME/profiles/desktop/cordis.patch.yml" "$DSH_HOME/profiles/desktop/cordis.patch.yml.bak-$(date +%Y%m%d-%H%M%S)"
  1. 在 $DSH_HOME/profiles/desktop/cordis.patch.yml 末尾追加(路径改为你本机插件目录下的 lib/index.js):
# === 分层记忆(dsh-layered-memory)===
- insert:
    - id: layered-memory
      name: '/absolute/path/to/dsh-layered-memory/lib/index.js'

Windows 可用正斜杠,例如 'D:/tools/dsh-layered-memory/lib/index.js'。

  1. 重启 DSH。首次启动会自动创建 $DSH_HOME/layered-memory/。

  2. 编辑 $DSH_HOME/layered-memory/core/persona.md、boundaries.md、authorization.md,填入核心人设与边界;插件只读这些文件,不会自动改写。

可用环境变量 LAYERED_MEMORY_HOME 单独指定数据目录。

用 GitHub 安装(可选)

dsh plugin --profile desktop add github:yinling2024/dsh-layered-memory

装完重启 DSH。也可在拿到插件目录后,仍按上面 patch 方式加载。

Linux / 服务器

插件零外部依赖:将整个目录放到服务器,在对应 profile 的 cordis.patch.yml 里加同样的 insert(绝对路径),重启 DSH 即可。要求 Node >= 20。

数据目录与配置要点

默认数据在 <DSH_HOME>/layered-memory/,含 config.json、audit.jsonl、core/、explicit/、implicit/、short-term/ 等。外显正文在 explicit/entries/ 的 markdown,索引在 manifest.json;手工改正文或元数据后建议重启 DSH(检索索引有内存缓存)。

首次启动自动生成 config.json。与 token 和行为相关的常用项包括:

键 默认 说明
enabled true 总开关
prompt.recallMaxChars 900 每轮长期召回上限
recall.topK 5 每轮最多召回几条
recall.alwaysFacts 2 每轮固定带几条高重要度语义事实(0 关闭,对成本影响大)
shortTerm.ttlMinutes 30 短期 TTL
implicit.minEvidence 3 内隐晋升所需证据数
explicit.trashDays 30 回收站保留天数
core.applyCooldownSeconds 30 核心提案 apply 冷却

调低 prompt.recallMaxChars、recall.topK、recall.alwaysFacts 可省 token。

设计边界与共存注意

  • 内隐记忆不能改核心;与核心冲突的写入会拒绝。
  • 外显写入靠工具或显著短期片段,不是每句对话都落库。
  • 遗忘分阶段:短期 TTL;外显降权、归档、回收站,最后硬删除;用户说「忘掉」时用 layered_forget。
  • 同一 profile 若已有 dsh-fish-memory、dsh-memory 等注入式记忆插件,建议只留一套常驻注入,避免重复塞上下文。

自测

仓库内可用 Node 内置测试:

cd dsh-layered-memory
node --test test/*.test.js

覆盖外显写入/检索、回收站、内隐反射、核心提案与冷却、短期 TTL 等。

结尾

dsh-layered-memory 把 DSH 记忆拆成核心、内隐、外显长期与短期四层,并用本地工具与配置控制写入、召回与遗忘,适合需要可审计、可边界的人设与长期事实分离的场景。详情见目录页 https://www.skillhub.cn/plugins/yinling2024/dsh-layered-memory 与 GitHub https://github.com/yinling2024/dsh-layered-memory。

羽毛球分组比赛记分
小程序二维码

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

小夜