feiyu-memory:DSH 本地纯文件长期记忆

前言

在 DSH 里跑智能体时,上下文窗口有限,单靠会话历史很难跨天、跨任务保留「用户偏好、做过的事、稳定事实」。常见做法要么把整段聊天记录塞进 prompt(贵且噪声大),要么接向量库和 embedding 服务(依赖多、数据路径复杂)。feiyu-memory 走另一条路:把记忆落成主机目录下的纯文本与 JSON,用本地规则做召回与抽取,不装 npm 运行时依赖、不向外部发 embedding 请求。下面介绍它是什么、怎么装、怎么用,以及使用时要注意的边界。

这是什么

feiyu-memory 是由维护者 wudaoyu65-collab 发布的 DSH 记忆类插件(社区目录:feiyu-memory)。当前 package 版本为 0.2.0,许可证 MIT,要求 Node >= 18。

定位一句话:给 DSH 的本地纯文件长期记忆——热层 / 事件层 / 事实层 / 摘要层,每步按 token 预算注入相关片段;实现只用 Node 内置模块(fs / path / os),没有一行记忆数据需要离开本机(面板数据服务仅绑定 127.0.0.1,见后文)。

四层数据形态(README 原文):

热层 hot.md      你手写/自动维护的「每次都得知道」的事
事件层 events.jsonl  一行一条经历,带时间、重要度、情绪、存活系数
事实层 facts.json    槽位表:key → value,可失效、可钉住(换人换说法不打架)
摘要层 summary/      按天压缩过去的事件,省 token

为什么用纯文件

资料里强调的设计动机可以概括为四点:

  • 可读可改:直接编辑 hot.md,下次注入即生效;删目录即「全忘光」。
  • 可审计:召回、衰减、去重在明文 JS(约 500 行量级)里,不藏在 embedding 黑盒。
  • 零运行时 API 成本:默认本地规则抽取,闲置时不消耗模型 token。
  • 可迁移:数据目录拷走即完整记忆库。

核心功能

每步注入与轮次固化

插件通过 DSH 宿主钩子工作(README 归纳):

环节 接口
每步注入 agent.ctx.systemPrompt.context({name, order, text}),宿主按步重算,内容不变则不重复提交
取当前提问 agent/pre-step 只读捕获
轮次收尾 agent/turn-stopping → 异步规则抽取 → 写 events / facts
挂到 agent agent/created
工具 ctx.tools.register 共 4 个

记忆注入走动态上下文,而不是往 decision.messages 里塞 user 消息,避免把记忆写进会话日志、越聊越贵。

召回打分

src/recall.js 中的规则(资料原文):

sim   = 提问 token 的 idf 加权覆盖率(不是 Jaccard)
decay = 0.5 ^ (天数 / 半衰期)        # 情绪浓的事件换更短半衰期
s     = sim × decay × importance
C     = 1 - e^(-3s)
命中条件:C ≥ minScore

默认 minScore 为 0.35;相似度刻意不用 Jaccard,避免「问句短、事件长」时相关事件被压分。

四个 Agent 工具

工具 作用
feiyu_remember 写一条记忆(event 经历 / fact 长期事实)
feiyu_recall 按关键词检索,返回热层/事实/事件片段
feiyu_forget 标记遗忘(markSuperseded,不硬删,可追溯)
feiyu_stats 事件数 / 事实数 / 热层字数 / 数据目录

侧边栏「记忆」面板

同一 bundle 含 client.js:在侧边栏挂「记忆」图标,用 Canvas 2D 力导向图展示 hot / fact / event / summary 节点与边;pre-step 召回命中时有沿边脉冲动画。图数据来自 Host 在回环地址起的小 HTTP 服务(路径含 /graph、/stats、/hits、/forget、/pin),面板每 2 秒轮询。节点过多或帧率过低时会降级关闭辉光等效果。

安装与启用

这是 Host-only bundle,无构建步骤。官方说明两种方式:

方式一:DSH 界面

  1. 把本仓库放到任意目录(建议绝对路径,避免中文与空格)。
  2. 打开 DSH → 设置 → 插件 → 安装 bundle,目标目录选仓库根目录。
  3. 重启 DSH(插件代码变更需重启才会加载新模块)。

方式二:命令行写入 profile

在仓库根目录执行:

node tools/install-profile.mjs
# 默认 ~/.dsh/profiles/desktop,可用 DSH_PROFILE_DIR / DSH_PROFILE 覆盖

脚本会幂等写入 link: 依赖、把 feiyu-memory 加入 dsh.profile.bundles、在 node_modules 下建 junction;会先备份 package.json。

注意:部分受限 profile / 会话预设不带 plugin_manager 权限,安装需在桌面 UI 或权限完整的会话里完成。

插件以当前 DSH 进程权限运行;安装前请自行阅读 GitHub 仓库 源码与 MIT 许可证,确认符合你的安全策略。

数据目录与配置

默认数据目录:

~/.dsh/feiyu-memory/
├── hot.md
├── facts.json
├── events.jsonl
├── summary/
├── config.json
└── feiyu.log          # 出错日志,最多 200 行

换盘可在 cordis.patch.yml 打开 dataDir,或在 config.json 里写 dataDir。彻底清空记忆:删除整个目录,下次启动会重建空库。

配置优先级:行 config(cordis.patch.yml)> data/config.json > 默认值。常用键(默认值来自 README 表格):

键 默认 含义
enabled true 关闭后不注入
injectTokenBudget 1200 每步注入预算(按字符 ×4 估算)
recallLimit 3 最多命中几条事件
minScore 0.35 证据分门槛
eventHalfLifeDays 30 普通事件半衰期
emotionalHalfLifeDays 7 情绪浓事件半衰期
disableExtract false true 时只写不抽(隐私敏感)
viewHttp true 是否起面板数据服务
viewPort 17654 数据服务起始端口(向后试 10 个)

完整键列表见仓库 README「配置」一节。

典型用法

经过上面的安装与重启,智能体在对话中会自动按预算注入热层、事实与命中事件;轮次结束时默认会做本地规则抽取(可在配置里用 disableExtract: true 关闭)。

需要显式操作时,在 Agent 可用工具里调用(参数形态以仓库实现为准):

  • 主动记下经历或事实:feiyu_remember
  • 按关键词查记忆:feiyu_recall
  • 标记某条记忆被新信息取代:feiyu_forget
  • 查看库规模与路径:feiyu_stats

热层适合人工维护「每次对话都要知道」的短文本:直接编辑 ~/.dsh/feiyu-memory/hot.md,保存后下次注入生效。

维护者提供的自检(在仓库根目录,使用临时目录,不碰真实记忆库):

npm test
node test/selftest.mjs

适用场景与注意

更适合:希望长期记忆可编辑、可备份、可审计;不想为记忆单独部署向量库或 embedding API;接受基于关键词与规则的召回,而不是语义 embedding 检索。

务必知晓:

  • 面板 HTTP 只绑 127.0.0.1,但本机任意进程理论上可访问该端口;介意则设 viewHttp: false。
  • 插件不发起对外网络请求做记忆;仓库 data/ 在 .gitignore,发布版不含个人记忆。
  • DSH 社区目录 SkillHub 与 DeepSeek / 幻方无官方从属关系;生态理念是「一切皆插件」,安装第三方 bundle 前请自行审代码。

结尾

feiyu-memory 把 DSH 智能体的长期记忆拆成四层纯文件,用 token 预算注入和本地规则抽取串起「记—召—忘—摘要」闭环,适合看重本机可控与零运行时依赖的开发者。源码与说明见 GitHub:wudaoyu65-collab/feiyu-memory,目录页见 SkillHub 插件页。

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

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

Xiaoye