记忆助理 · dsh-memory-assistant
给 AI 一份不会随对话变长的长期记忆:把对话压成卡片,检索时只读几张,定位不到就追问。
三个特点
① 超长期 卡片是索引,原文留在会话文件里。库可以一直长,每轮占用的上下文不变重。
② 检索开销与记忆库大小无关 检索本身 0 token(本地算分),每次只读 3 张卡 + 一段原文,约 150 token/次—— 库里是 100 张还是 10 万张,都是这个数。
对照:
- 整库常驻上下文:约 40 token/张卡(1000 张 ≈ 4 万/轮,1 万张 ≈ 40 万/轮),随库线性涨
- 让模型自己翻目录:实测 2.7 万 token/次
③ 找不到会问,不编 三态:精确命中 / 无精确但有相关 / 没有。判「精确」只看字面(标题/关键词/引用),不看分数。 没有就说没有;前两名并列、或者问得太笼统,就反问你一句——而不是硬给一个像的。
成本怎么算
索引是一次性 + 增量,检索是每次——这两笔账要分开看:
| 动作 | 什么时候花 | 量 |
|---|---|---|
| 建索引(全量,一次性) | 第一次导入 | 约 40–50 次模型调用;以作者测试库(883 张卡)计,合计约 50 万 token(估算:输入≈40 万,输出≈12 万)。你的库多大,这笔就按比例是多少 |
| 增量索引 | 每来一段新对话 | 1–2 次调用,约 5–15k token |
| 检索 | 每次对话 | 检索器 0 token;读 3 张卡 + 一段原文 ≈ 150 token |
所以真正每天都发生的,是最后一行。而这一行与库的大小无关:
- 整库常驻上下文:约 40 token/张卡,库越大越贵
- 本插件检索:≈150 token/次,库从 0 涨到 10 万张都不变
代价是首次建索引那一笔(一次性)+ 每段新对话的一小笔(增量)。已经存在的记忆不会反复付费。
适合这些场合:用户说「当初」「上次」「之前那个」,要具体日期/数字/原话,或者要引用旧决定。
它怎么工作
写入端:对话 → 切成段 → 每段抽 1–3 张卡(标题 / 一句话 / 三行大纲 / 关键词 / 段号)
检索端:2–3 个关键词 → 卡片打分(关键词 + 全文 + 概念码)→ 「精确 / 相关 / 没有」三态
读出端:命中就回原文取那一段;没命中就说没找到,或追问
卡片本身不存日期,只存「哪一段」;要时间就按段号回原文取——一处真源,不会两处打架。
三态输出
| 状态 | 含义 | 助手怎么做 |
|---|---|---|
| 精确命中 | 问句里的名词都出现在同一张卡上 | 回原文,直接答,带出处 |
| 无精确命中 | 没有卡讲到同一件事,但有几张沾到一两个词 | 明说「没找到 X,但提到 Y 的有这几件」,再问一句 |
| 没有 | 这些词库里从没出现过 | 反问,不拿相近话题凑 |
判「精确」只看字面,不看分数——分数会被概念码抬高,这正是「自信地答错」的来源。
安装
在 DSH 的 设置 → 插件 里搜索 dsh-memory-assistant 安装,或:
dsh plugin --profile desktop add dsh-memory-assistant
装完重启 DSH,设置页会出现「记忆助理」一栏。
第一次用
- 打开 设置 → 记忆助理 → 只整理当前对话(先拿一小批验证)
- 确认能看到卡片数、关键词数
- 回到对话里问一件刚聊过的事,看它能不能定位
全部对话整理会按段调模型,按实际用量计费;每整理完一段就落盘,可以随时暂停、下次接着来。
隐私与存储
- 只读
~/.dsh/sessions里的会话文件,不改动任何对话 - 卡片、日志、概念表都存本地:
~/.dsh-memory-assistant(可在设置里改目录) - 检索本身不调模型,0 token;只有整理新对话和建关键词表时才调
- 附件只记「名字 + 大小」一行,内容不入库
成本
单张卡约 40 token。检索 0 token,花的是读片段 1–2k。 中等场景(300 条记忆 / 10 万字 / 每天 20 轮)一个月约 18 万 token,比常驻摘要省约 5 倍。
命令
mem recall "公告板 怎么丢的" --top 3 # 检索(三态 + 候选)
mem feedback --key w:0086 --verdict good # 记一条满意度
mem stats # 卡片数 / 查询数 / 需追问率 / 满意率
mem import status # 导入进度
mem concepts audit --tier B # 关键词体检(只看不改)
mem concepts restore --v 12 # 回滚到某个历史版本
mem 不在 PATH 时,直接跑 node <插件目录>/bin/mem.js。
开发
node --check lib/*.js bin/*.js client.js
node bin/mem-probe.mjs # 6 道探针回放,对比三种配置的命中率
- 数据:
~/.dsh-memory-assistant/{cards.jsonl, ask_log.jsonl, feedback.jsonl, concepts.json} - 卡片字段:
key / title / one_line / outline[3] / keywords[3-6] / codes / entities / pointer{u,quote,project} - 修改概念表一律走
writeConcepts():先备份concepts.bak-vN.json,版本 +1
测试环境(作者本机,2026-11-14)
下面是作者的测试库,用来说明效果的量级。你自己装完是 0 张卡,这些数字会随你的使用增长。
| 项 | 值 |
|---|---|
| 记忆卡片 | 883 张 |
| 关键词 / 别名 | 229 个 / 778 条(表版本 v16) |
| 已挂关键词的卡 | 872 / 883(11 张按规则留空) |
| 探针回放 | 6 道题,6/6(含一道「库里没有」的对照题) |
| 实测检索开销 | 22 次查询共 3,491 token,均值 159/次 |
| 全量建索引 | 约 40–50 次模型调用,估算 50 万 token |
许可
MIT
No comments yet. Be the first to write one.