前言¶
在 DeepSeek Harness(DSH)里做持久化 AI 角色时,模型权重不会随会话保留:换一轮对话,上下文就断了。常见做法是往 AGENTS.md 或外挂 Markdown 里堆人设与流水账,但档案变长之后,要么整段塞进 system prompt 挤占人设空间,要么靠人工翻文件,模型仍容易「忘了说过什么」或把旧结论当成本轮事实。
下面介绍社区插件 dsh-memory-core(维护者 KikaiLastest)。它在 DSH 上给角色加一层本地档案:按需从历史里召回、常驻记忆使用规则与导航索引、规则化固化与后台摘要,外加两标量情感状态。数据全部落在本机 Markdown / JSONL,不建数据库、不调向量库、不上云。
这是什么¶
dsh-memory-core 是 DSH 的「记忆」类插件:面向「跨会话行为连续、可追溯、且不把历史压过人设」的弱人格同一性场景。README 用仿生学比喻概括分工——档案与召回类似海马体,情感标量类似轻量杏仁核;它不承诺意识或语义 grounding,定位是协议 + 检索 + 落盘,而不是替代 AGENTS.md 里的人格权威。
生态上,DSH 奉行「一切皆插件」;插件目录在 SkillHub 等社区站点展示,与 DeepSeek / 幻方无官方从属关系。当前 GitHub 仓库星标为 0,许可证 MIT,package 版本 0.3.0。
核心功能¶
插件按 README 中的分层组织,各层职责如下。
记忆使用协议(P0a)¶
通过 systemPrompt.section 注入 5 条规则:历史仅供参考、可能过期、要能追溯来源、以新事实为准、禁止编造。刻意不重复 AGENTS.md 人格段,避免权威倒置。
按需历史召回(P0b)¶
在 agent/pre-step 且 step <= 1(首轮或 step 未定义)时,用中文 2-gram + BM25-lite + 覆盖率阈值,从本地档案召回 top K(默认 3),前置注入带 source.kind='memory-recall' 的消息。目标超时 150 ms,失败静默。召回是词面匹配,不是语义检索。
常驻记忆导航(P0c)¶
另一段 systemPrompt.section(order 960),把档案主题与最近记忆的一行摘要、关键词压到 summaryMaxChars(默认 600 字)以内。无记忆时不注入;需要细节时模型按关键词回查原文。
后台总结(P0d)¶
setInterval(默认每 10 分钟,unref())检查对话文件:空闲超过 30 分钟且有新增小节时,按「标题 + 首句」追加到 ~/.dsh/autocapture/summaries.jsonl。纯规则、不调 LLM,hash 与小节 key 双重水位保证幂等。
结构化固化(P1)¶
consolidate.mjs 把对话小节写入 memory/记忆/structured.jsonl:稳定 ID、source_id、逐字校验的 quote、幂等水位。status / supersedes 参与召回过滤;冲突需人工标 superseded,插件不自动判冲突。
情感状态(P2)¶
valence / arousal 两标量,规则分类 + 指数衰减 + 事件去重,只影响 systemPrompt 语气,不接调度与安全闸门。
写入脱敏(P3)¶
sanitize.mjs 在自动捕获与摘要落盘前用正则过滤 sk-、gh*_、github_pat_、AKIA、Bearer、password=、token=、api_key= 等,替换为 [REDACTED],可在配置或面板关闭。
本地档案布局¶
记忆根目录(memoryRoot)典型结构:
memory/
├── 身份.md
├── 日记.md
├── 生长/
│ ├── 状态.md
│ └── 生长记录.md
└── 记忆/
├── 事件流.jsonl
└── structured.jsonl
自动捕获与摘要写在 ~/.dsh/autocapture/(与 memory/ 分离)。换机器拷贝目录即可迁移。
安装与启用¶
官方 README 给出的安装方式如下(本地插件目录,不是凭名称拼 GitHub 地址):
dsh plugin --profile <你的 profile> add file:<这个目录>
也可在 DSH Desktop「插件管理」中选择本地目录。装完后重启 DSH。
在 cordis.patch.yml 中整行替换配置块,未写字段走默认。路径需按本机修改:
- insert:
- id: dsh-memory-core
name: dsh-memory-core
config:
memoryRoot: "D:\\path\\to\\memory"
dialogueFile: "D:\\path\\对话记录.md"
logFile: "D:\\path\\recall.log"
stateFile: "D:\\path\\affect\\state.json"
topK: 3
timeoutMs: 150
minCoverage: 0.2
minRatio: 0.3
enableStable: true
enableAutoCapture: true
enableMemoryNav: true
summaryMaxChars: 600
enableSummary: true
summarizeIntervalMinutes: 10
summarizeIdleMinutes: 30
enableSanitize: true
0.3.0 起,DSH 设置页左侧有 「记忆核心」 节(order: 58),可改 memoryRoot、dialogueFile、topK、召回阈值、导航/摘要/脱敏开关等;保存经 POST /dsh-memory-core/config/save 校验后写入 profile patch。日志路径、捕获路径、stateFile 等仍主要在 YAML 里改。无 configEditor 的 headless 部署下,面板改动当次生效但可能无法持久写入配置文件。
典型用法¶
- 准备好
memoryRoot下的身份、日记、生长与记忆文件,并指定dialogueFile作为对话语料。 - 安装插件并配置路径,重启 DSH;按需打开协议注入、自动捕获、记忆导航与后台摘要。
- 对话时首轮由插件尝试召回相关片段并前置注入;模型通过导航里的关键词自行回查细节。
- 需要把对话沉淀为结构化记忆时,在仓库目录执行固化(可用环境变量覆盖路径):
npm run consolidate
环境变量包括 DSH_MEMORY_DIALOGUE、DSH_MEMORY_ROOT、DSH_MEMORY_STRUCTURED、DSH_MEMORY_WATERMARK;未设置时从当前目录向上查找「对话记录.md」。
开发与回归可用:
npm test
npm run eval # 召回评测,需 DSH_MEMORY_ROOT / DSH_MEMORY_DIALOGUE
适用场景与注意¶
适合谁:希望 DSH 角色在本机 Markdown / JSONL 上长期记账、首轮轻量召回、又不想引入 SQLite 或 embedding 服务的开发者;档案规模在 README 建议的约 200 KB 量级内、主题不过度单一(否则高频 2-gram 会导致 idf 失效)。
运行与信任:插件以当前 DSH 进程权限读写配置中的路径;安装前应阅读 GitHub 源码 与 MIT 许可证,确认路径与脱敏策略符合你的安全要求。召回内容按不可信数据处理,仍可能影响模型话术。
已知限制(摘自 README):150 ms 为计算阶段协作式熔断目标,同步 readFileSync 无法被外部打断;导航与摘要为规则抽取;固化 fact 目前取小节标题;脱敏仅覆盖常见凭证形态。详细推导见仓库内 docs/DESIGN.md、docs/PLAN.md、docs/PHILOSOPHY.md。
结尾¶
dsh-memory-core 把 DSH 角色的「记性」收拢到本地文件:BM25-lite 召回、记忆协议与导航、规则固化与后台摘要、情感标量与写入脱敏,全部无库无云。若你在做本地常驻智能体,可从目录页与仓库 README 对照配置逐项启用。