我给 DSH 装记忆插件,踩了五个坑,其中一个让我丢了一条记录

我给 DSH 装记忆插件,踩了五个坑,其中一个让我丢了一条记录

我一直有个困扰:DSH 的会话一长,前面聊定的事就淡了。压缩一次,上下文一挤,之前说好的约定就得重新讲一遍。

所以我装了 Yuuyuko-uu/dsh-fish-memory(鱼的记忆)。它的思路不是「把历史全存下来」,而是「记一部分、会淡忘、需要时自己想起来」------每条记忆有鲜活度,半衰期默认 30 天,不删但越来越难被想起。

功能本身挺好用。但装的过程里我踩了五个坑,其中第四个让我亲手埋掉了一条正经记录。这篇按我踩的顺序写,希望你能跳过。

坑一:装完 DSH 起不来,我以为是插件坏了

第一次装完重启,DSH 直接弹「The application could not start」,错误里一堆看不懂的:Unexpected token ''、is not valid JSON、readProfileManifest。

我第一反应是插件有问题,卸了重装,还是一样。折腾到第三次我才去看 README,里面写得清清楚楚:

那是 profile 的 package.json 被存成了 UTF-8 带 BOM。跟插件无关:内容都是对的,只是开头多了三个看不见的字节,DSH 读它就崩。

我当时是用 Windows 记事本改过一次 profile 的 package.json(加了个配置项),保存时它自动加了 BOM。内容一个字没错,但文件开头多了 EF BB BF 三个字节,JSON 解析器读到就报错。

修法很简单,PowerShell 一行:

powershell 复制代码
$p = "<你的 profile 路径>\package.json"
[System.IO.File]::WriteAllText($p, [System.IO.File]::ReadAllText($p), (New-Object System.Text.UTF8Encoding($false)))

数据一点没丢。但这里有个连带教训:后来我让 AI 帮我改这个文件,它用了 Set-Content -Encoding UTF8,又崩了一次。Windows 自带的这个参数默认带 BOM。改配置文件这件事,工具选错比手改更容易出事。

另外提醒一句:真正的 profile 目录里同时有 cordis.yml、cordis.patch.yml、package.json 三个文件。机器上别处那些同名的 package.json 都不算,我一开始就改错过一个。

坑二:直接装更新,装完还是老版本

这个坑比较隐蔽。我看有新版本,直接跑:

bash 复制代码
dsh plugin --profile web add dsh-fish-memory

重启,进设置,功能没变。查了版本才发现还是旧的。

原因是可能拿到了包管理器缓存里的旧副本。README 里明确要求必须先卸再装:

bash 复制代码
dsh plugin --profile web remove dsh-fish-memory
dsh plugin --profile web add dsh-fish-memory

卸的时候我担心数据会丢,实测没有:设置存在 .dsh\fish-memory-config.json,记忆存在 .dsh\fish-memory\(一个会话一个 JSON 文件),卸载只删代码。

坑三:我用「重装 DSH」来更新插件

这个纯属我自己想岔了。当时觉得「反正都是更新,重装一遍 DSH 最干净」。

结果配置被动了一遍,插件还得重新装。README 里有一句提醒正好说这事:「别用『重装 DSH』来更新插件 ------ 那是两件事,重装可能动到配置档。」

DSH 的安装目录和插件所在的 profile 是两套东西。更新插件只走插件自己的卸装流程,别去动宿主。

坑四:我给错事实键,亲手埋掉一条记忆

这个是最值得说的,因为它不报错,你根本不知道自己错了。

插件有个「事实键」的设计:有些记忆记的是会变的东西,光看句子像不像判不出来。比如「身高一米七」和「长胖到 55 公斤」几乎是两件事,但词面上很像;「拼团还没开」和「拼团开了」是同一件事的前后,词面上却不像。

所以每条记忆可以带一个事实键,写「对象.方面」,比如 她.身高、约定.身边位置。同一个键 = 同一件事,只留最新那条,旧的标成「已被取代」------不再被想起来,但东西留着、能撤销。

我当时觉得这个设计好,就自己动手给一批旧记忆补键。补的时候我犯了个错:我把值也写进键里了 ,写成了 她.身高170。

结果就是:身高真变了之后,键也跟着变成 她.身高175,两条永远碰不上,「只留最新」这个机制彻底失效------而且更糟的是,它不会报错,你只会觉得「怎么这条记忆老是重复」。

README 的原话是:键里不许写具体的值,拿不准就留空,留空完全没关系,给错键却会埋掉一条正经记忆。

我那次确实埋了一条。后来是靠设置页的「清洗补键」把错的摘掉、重新补的。那个功能有个细节挺好:先「试 8 条看看」,一个字节都不写,只把键摆出来给你看,确认了再真洗;洗错了还能一键「把补的键全摘掉」回到洗之前------而且只摘自动补的,你自己填的键不动。

我现在给键的原则是:只写「对象.方面」,拿不准就不写。

坑五:导入旧档案,扫出 0 条

我有一堆以前写的 markdown 设定和日记,想着导进来。选了文件夹,点「扫描档案」,候选 0 条。

原因是我的档案大多是「一大段话没有分行」,或者干脆内容都在表格和代码块里。它认得 .md .markdown .txt .text .log .rst .org,子文件夹往下找两层,但解析是按行的------整段不分行就没法拆成条目。

改法很土但有效:把长段落按句拆成短行。

还有个流程上的预期要纠正:导入不是「自动变记忆库」。实际是四步------扫描出候选、你勾选、点「开始提炼」、它把原文改写成第一人称记忆(顺手给每条出检索词、日期、重要度)。提炼会调模型,走你 DSH 里正在用的那个,一批几条慢慢跑,可以随时停。

用下来值得说的三点

一、它真的会淡忘,这不是 bug。 默认半衰期 30 天。我发现有一条三个月前的偏好想不起来了,一开始以为是失效,看了「最近一次召回」那张表才明白:它会写清楚哪条没进去、为什么------命中的词太普通(证据不够)、或者那条太旧淡下去了。

这张表是它最有用的诊断入口,比猜有用。

二、注入有硬上限:一次最多 6 条,加起来不超过 800 字。 超了的这次先进不来,下次可能就进了。所以我现在的习惯是:真正重要的东西标成「长期事实」,那类不占这 6 条名额、按重要度固定带前几条,不看这句话问了什么。

三、那个 900KB 的体积不是负担。 装完我发现包大了快 900KB,以为是塞了什么。实际是一份通用中文词表,用来分词,只在本地当查找表用,不占上下文、不影响每轮 token,也不会因为你聊得多就变大。词表来自 jieba 的 extra_dict(MIT),只保留词条、去掉了词频和词性。

分词的意义在于:你问什么,它按「命中的词够不够特别」找。有了词表,「车」不会撞进「车站」里。

总结

五个坑里,前三个是环境和流程问题(BOM、先卸再装、别重装宿主),后两个是使用方法问题(事实键别写值、导入要先分行)。真正让我改变用法的是第四个------它教会我一件事:不报错的配置错误最贵,因为你会一直以为机制就是这么不灵。同类插件的中文说明与验证档位,我是在站内按分类对照着看的。

适合与不适合

适合:长期在同一个 DSH 会话里做持续项目、需要跨会话记住偏好与约定的人;手上有旧 markdown 档案想导入的人;愿意花十分钟理解「鲜活度 / 事实键 / 注入上限」这三个概念的人。

不适合 :希望记忆永久不过期的人,默认 30 天半衰期;不想碰 profile 配置文件的人,一旦带 BOM 会启动崩溃;需要跨设备同步的人,数据只在本地 .dsh\fish-memory\;期待「导入即整理好」的人,中间还得自己勾选和提炼。

标签:dsh-fish-memory、DeepSeek Harness、记忆插件、踩坑复盘、BOM

本文基于笔者在 DSH 0.2.1-rc.3 上的实际安装记录,数据与版本信息来源于插件详情页。

相关推荐
陈随易11 分钟前
神级 Skill,让 AI 用 HTML 代替 Markdown 回复
前端·后端·程序员
Gopher_HBo11 分钟前
go tool trace 使用指南(Go 1.24)
后端
一条Go12 分钟前
能力套餐:菜单、权限、开通范围怎么拆成三层而不打架
后端·github·saas
就像楞次定律12 分钟前
【Linux 学习记之二】C++ 构建体系与底层链接机制的深度透视(2)
linux·后端
烬羽15 分钟前
LangChain v1 中间件实战:不碰主流程,也能给 Agent 装上"外挂"
后端·langchain·agent
泡海椒18 分钟前
jquick-pdf 生成征信报表(相关矩阵版):靛蓝主题报告里动态图与说明面板并排的实测笔记
后端
IT枫斗者枫哥21 分钟前
Java 退款请求超时,先查原单还是重试?
java·后端
特立独行的猫A25 分钟前
我用仓颉写了个多平台发文工具:一份 Markdown,一条命令发六个平台
java·后端·python
HUANGZHENXUAN12327 分钟前
代码解析(二):detect_video.py —— 一个纯函数 + 一段主循环
后端