前言¶
在 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 |
各层条数、待批准提案、数据目录、当前配置 |
改核心人设必须走显式协议,不能靠内隐层绕过:
- 用户明确说「改核心人设」;
- 模型调用
layered_core(action="propose", file="persona", content="..."); - 模型把返回的 diff 给用户看;
- 用户明确授权后,模型才调用
layered_core(action="apply", proposal_id="corep_...", confirm="APPLY"); - 写入前自动备份到
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)。
- 先备份(
$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)"
- 在
$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'。
-
重启 DSH。首次启动会自动创建
$DSH_HOME/layered-memory/。 -
编辑
$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。