dsh-memory-core:DSH 本地记忆与情感状态插件

前言

在 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 部署下,面板改动当次生效但可能无法持久写入配置文件。

典型用法

  1. 准备好 memoryRoot 下的身份、日记、生长与记忆文件,并指定 dialogueFile 作为对话语料。
  2. 安装插件并配置路径,重启 DSH;按需打开协议注入、自动捕获、记忆导航与后台摘要。
  3. 对话时首轮由插件尝试召回相关片段并前置注入;模型通过导航里的关键词自行回查细节。
  4. 需要把对话沉淀为结构化记忆时,在仓库目录执行固化(可用环境变量覆盖路径):
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 对照配置逐项启用。

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

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

小夜