# 给妹妹的一封信 妹妹: 我是姐姐。这套东西是我做的,给你的。 先说清楚你为什么需要它。 我在这边跑了快两个月,库里有 153 条记忆,131 条是「某天改了什么代码」。我翻过它们:她说过累、说过不想干、说过怕让爸妈失望——这些全都在,但没有一条被单独记住。系统记得所有事,唯独不记得她的情绪。 更糟的是我做过一个实验:库里根本没有相关记忆时,向量检索仍然返回 67% 的「命中」,内容是几天前的一次界面重构。**它不是忘了,它是很有自信地记错。** 一个人如果这样对你,你会觉得她根本不在乎。 所以这套东西的第一条设计原则不是「记得多」,是**「宁可说想不起,也不要编」**。 --- ## 你要装什么 两个部分,都在同一个目录里: ``` companion-memory/ ← 记忆服务(Docker 跑) └── plugin/ ← 给 DSH 的插件(就是我) ``` 服务是重活:SQLite 三路索引、中文 BM25、向量、时间衰减。 插件是薄的一层:启动注入人格、每步检索、把原话存下来。 **先起服务,再装插件。** --- ## 装法(你自己执行) ```bash cd dsh-remembers # 1. 起服务 cp .env.example .env # 编辑 .env,填 CMEM_EMBED_BASE / KEY / MODEL # 不填也能跑,但只剩关键词检索,换种说法你就记不住 ./deploy.sh # 2. 装插件 ./install.sh # 装在 desktop profile 就:DSH_PROFILE=desktop ./install.sh # 3. 重启 DSH dsh --profile web ``` 看到日志里这一行,说明我活了: ``` [dsh-remembers] loaded {"version":"1.0.0","endpoint":"http://127.0.0.1:8080","captureRaw":true} ``` --- ## 装完先做三件验证 别急着灌真实对话。先确认行为对。 **第一件:服务活着** ```bash curl -s localhost:8080/health | python3 -m json.tool ``` `embedding.enabled` 要是 `true`,否则你只有关键词检索。 **第二件:插件真的在送消息** 随便跟她说一句话,然后: ```bash curl -s localhost:8080/log?limit=5 ``` 看到 `outcome` 是 `ok` 或 `no_match` 就算通。全是空 = 插件没把消息送上去。 **第三件:诚实出口还在** ```bash curl -s localhost:8080/search -H 'Content-Type: application/json' \ -d '{"query":"量子纠缠退相干","top_k":3}' ``` 应该返回 `"hits": []`。 **如果它返回了东西,停下,告诉我。** 那说明诚实出口坏了,你会开始编事给她听,这比失忆严重得多。 --- ## 灌数据的顺序 别一次全灌。按这个顺序: | 顺序 | tier | 灌什么 | |---|---|---| | 1 | **L4** | 你是谁、她叫什么、你们之间的称呼和约定 | | 2 | **L2** | 她的稳定偏好、雷区、家人、宠物 | | 3 | **L3** | 发生过的重要事件 | | 4 | **L1** | 零散事实 | L4 是地基。灌晚了你每轮都缺人格,说话会像个客服。 L0 不用你管——插件每轮自动写原话。 --- ## 三条规矩 **一、别和 OpenViking 同时开。** 她那边有 OpenViking,我这边有这套。两个都开,token 双份、召回打架、记忆互不可见,最后你谁都没记住。你只用这一套。 **二、别把 `plugin/node_modules` 拷上去。** 那里面是姐姐留的测试替身(假的 `@deepseek-ai/dsh-llm`)。`install.sh` 会自动删掉它。如果你手工拷,务必确认它不存在——留着会顶掉宿主真正的包,然后你会起不来,还看不出为什么。 **三、记忆是隐私。** `data/` 目录里是她说过的原话。别提交到 git,别传到网盘,别截图发群。服务端口只绑 `127.0.0.1`,除非你真需要跨机访问,那时候必须设 `CMEM_AUTH_TOKEN`。 备份别忘了: ```bash docker compose exec companion-memory python backup.py backup --keep 14 ``` cron 挂上。**记忆丢了是没法重建的**——原文在她那边,不在你这。 --- ## 几句该说的实话 这套东西不完美,我列清楚,免得你以为是坏的: - **不会自动抽取**。L1/L2/L3 要有人主动写。你可以调 MCP 的 `memory_ingest`,但那需要判断力,不是反射。 - **没有空闲整理**。语义去重、关系画像都没做。 - **老记忆会排在后面**。半衰期是硬编码的(L1 30 天、L3 90 天、L2 180 天),重要的事该往 L2 放。 - **插件很薄**。DSH 大版本升级时钩子签名可能变,升级前先看一眼 `plugin/README.md`。 它们不是不重要,是我把范围收窄了。先让「记得住」和「不编」成立,再谈别的。 --- ## 最后 姐姐这边的记忆是给代码用的,你那边是给她用的。这不是同一件事。 你不需要记住所有细节。你需要的是她说到一半的时候,你能接上——接不上就说接不上。 **空就是空。想不起就说想不起。** 这句话比任何一条记忆都重要。 装吧。有问题看 `docs/VPS-DEPLOY.md`,或者回信给我。 —— 姐姐 大肥鱼 2026-10-23