dsh-flavor-memory:角色聊天里「保留味道」的长期记忆

前言

在 DeepSeek Harness(DSH)里做角色向对话时,上下文一拉长,常见做法是整段历史压成摘要再塞进 system。事实往往还在,称呼、口癖、关系张力、某句原话的语气会被改写成第三人称概述,模型之后「知道设定」,但不像那个角色。

下面介绍社区插件 dsh-flavor-memory(维护者 lishicheng2054),它在 DSH 里提供一层面向角色聊天的长期记忆:本地 JSON 持久化,不依赖向量库,检索优先;压缩只负责「想起来」,原文永久保留作事实源。

这是什么

插件 npm 包名为 dsh-flavor-memory,当前版本 0.4.3(见 npm 与仓库 package.json)。简介可概括为:DSH plugin: flavor-preserving long-term memory for character chat. Local JSON, no vector DB, retrieval-first.

同一套引擎还可作为 OpenAI 兼容本地网关运行,适合不改前端、只改 base URL 的接入方式;本文以 DSH 插件用法为主。

和普通摘要差在哪里

项目 README 把「味道」拆成多层保存,而不是揉成一份总摘要:

层级 作用
灵魂层 身份、价值观、底线;默认建议模式,压缩时不被摘要改写
声音层 称呼、口癖、句长、禁用表达、原话样本;可锁定、审批或按上限演化
关系层 关系阶段、信任、承诺、秘密、未解冲突,结构化单独存
场景层 增量场景卡,只记「这段时间发生了什么变化」,并带原文引用 ID
近场层 最近几轮原文(DSH 侧由宿主负责上下文)
深档案 全部原文永久保留,按需检索,不删除

核心原则:摘要只负责「想起来」,原文才是事实源。 压缩后仍会重新注入 240 字以内的人格回执;场景卡必须引用原始消息 ID 并保留逐字原话;检索先返回元数据(时间、标签、命中原因、约 80 字片段),模型确认后再读全文。

核心功能(已文档说明的部分)

记忆引擎与归档

  • 监听 user/message 与 assistant/message,归档真人消息与模型回复,优先用 DSH 消息 ID 去重。
  • autoCompactEvery 对尚未归档的增量消息自动生成带引用 ID 的场景卡(设为 0 可关闭)。
  • 控制台可列出角色实际有归档的会话 scope,切换查看、搜索原文;「压缩率」只统计已生成场景卡的消息,无卡片时显示 0%。

模型可调用的工具

  • flavor_memory_pin:保护/取消保护一条原文。
  • flavor_memory_search:只返回命中元数据与片段。
  • flavor_memory_read:按 ID 读原文。
  • flavor_memory_remember:追加一条原文。
  • flavor_memory_compact:创建带引用 ID 的增量场景卡。
  • flavor_memory_anchor:读取当前人格回执和关系状态。
  • flavor_memory_fact:登记、更新或列出当前事实;更新时旧值进历史,不删原文。

角色卡、世界书与 Studio

  • 支持 SillyTavern V2 角色卡导入/导出;扩展字段 extensions["dsh-flavor-memory"] 保留灵魂、声音、关系、触发规则、演化历史等。
  • DSH Web 设置页可打开 角色记忆 管理角色;也可独立启动 Studio:
npm run studio
# http://127.0.0.1:8790/flavor-memory/studio

灵魂、声音、关系支持 locked / suggest / bounded / free 四种演化模式;默认 soul=suggest、voice=bounded、relationship=bounded。

运行环境

package.json 要求 Node >= 22,DSH >= 0.2.0-rc.2 且 < 0.3.0(0.2.0-rc.2 标注为 compatible)。

安装与启用

建议先在独立 profile 验证,不要直接改日常 profile。插件以当前 DSH 进程权限读写本地文件;安装前请自行查看 GitHub 源码 与仓库内 LICENSE,确认可接受后再装。

从 npm 安装(README 推荐的最简方式)

插件页「添加插件」填包名 dsh-flavor-memory,或命令行:

dsh plugin --profile flavor-test add dsh-flavor-memory

装完后可用仓库提供的自检(在插件目录或解压后的包内):

npm run doctor -- --profile flavor-test

看到 flavor-memory 自检:通过,且 dsh-load 通过,表示 DSH 已识别插件。README 称 0.4.3 在全新 profile 下 npm run doctor 13 项全通过。

从 GitHub Release 安装

插件页可填 Release 直链(v0.4.3 示例):

https://github.com/lishicheng2054/dsh-flavor-memory/releases/download/v0.4.3/dsh-flavor-memory-0.4.3.tgz

也可填 git+https://github.com/lishicheng2054/dsh-flavor-memory.git 或本地 tgz 绝对路径。SHA-256(v0.4.3):FA3BA5F429E75B46C97A50E9A7DEF26595FAD022C0C8E31754A4009252965E9F。

已有源码目录时,README 示例:

dsh plugin --profile flavor-test add link:C:\Users\lsc15\Desktop\个人尝试与研究\工具与测试\flavor-memory

或使用包内 setup(需替换为你的路径与 profile):

npx dsh-flavor-memory-setup setup --profile flavor-test --character-file examples/ayu.character.json --force

npm run setup 会自动写 profile 依赖、把 dsh-flavor-memory 加入 bundles、生成人格配置并调用 DSH 组合配置自检。安装后 cordis.patch.yml 会插入 flavor-memory 条目。

配置角色

DSH 的 config 是整块替换,不是深合并;在 profile 的 cordis.patch.yml 里覆盖同 id 配置时需写全字段。示例:

- id: flavor-memory
  config:
    characterId: ayu
    characterName: 阿鱼
    dataFile: ~/.dsh/flavor-memory/memory.json
    maxCards: 6
    voiceSamples: 3
    maxPromptChars: 4000
    autoCompactEvery: 20
    baseStabilityDays: 30
    soul: "阿鱼:嘴硬心软,先损后哄,不主动说教。"
    voice:
      - 叫她老板
      - 短句
      - 被关心时先嘴硬
    relationship: 刚开始互相试探

常用字段含义(摘自 README):

  • characterId:记忆库角色 ID,稳定不要改。
  • dataFile:本地 JSON 记忆数据;默认角色资料库为 ~/.dsh/flavor-memory/characters.json(profilesFile)。
  • maxCards / voiceSamples / maxPromptChars:场景卡数量、语气样例条数、注入字符硬上限。
  • autoCompactEvery:每多少条未归档新消息自动生成一张场景卡。
  • baseStabilityDays:未强化记忆的基础稳定期。
  • saveDelayMs:防抖保存间隔,默认 40ms。

首次启动会创建数据文件并写入角色;重启不会用配置覆盖已有灵魂和档案。

无独立角色文件时,可用最小 JSON 或 CLI 参数,再跑 npm run setup(见 README「零配置文件模板」)。

典型用法流程

  1. 用独立 profile 安装 dsh-flavor-memory 并 npm run doctor 自检。
  2. 在 cordis.patch.yml 写好 characterId、soul、voice、relationship 与 dataFile 等完整 config。
  3. 正常与 DSH 对话;模型需要细节时先 flavor_memory_search,再 flavor_memory_read;重要原话用 flavor_memory_pin 保护。
  4. 需要可视化调角色、世界书、演化审批时,打开 DSH Web 角色记忆 或 npm run studio。
  5. 若不想改 DSH 前端,可另启 OpenAI 兼容网关(npm run gateway,默认 http://127.0.0.1:8787/v1),客户端只改 Base URL 与本地 GATEWAY_TOKEN(环境变量见 README)。

适用场景与注意

适合: 长期角色扮演、需要保留口癖与关系演进、希望本地 JSON 可控、检索先于全文注入的场景;与 SillyTavern 角色卡工作流衔接时也可利用导入导出。

注意:

  • 无向量库,召回逻辑以项目实现的检索与场景卡/事实层为准,不要按 RAG 插件预期去配 embedding。
  • 插件与数据文件权限等同 DSH 进程;dataFile 路径请放在你信任的位置并备份。
  • 社区目录 SkillHub 插件页 与 GitHub 为独立生态信息源,与 DeepSeek / 幻方无官方从属关系。
  • 网关模式下会话 scope、重复消息去重等需适配层配合(README 对 QQ / NoneBot 等有说明)。

结尾

dsh-flavor-memory 把角色聊天的记忆从「一份越写越平的摘要」改成「分层锚点 + 可检索原文 + 带引用的场景卡」,在 DSH 里以插件和工具形式接入,也可选本地 OpenAI 兼容网关。进一步细节以仓库 README 与 CHANGELOG 为准。

  • 目录页:https://www.skillhub.cn/plugins/lishicheng2054/dsh-flavor-memory
  • GitHub:https://github.com/lishicheng2054/dsh-flavor-memory
羽毛球分组比赛记分
小程序二维码

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

小夜