接入 MCP 长期记忆
一句话版:DSH 负责连接 MCP、发现和调用工具;记忆内容、存储、检索及删除策略由外部 memory server 负责。会话里“记得上文”不等于跨会话持久记忆。
源码基线:0.1.5-alpha.1 / 5dda764ed3,2026-09-09 核验。 以下使用官方示例锁定的版本,不把它们当作各项目的最新版本。DSH npm latest / next 为 0.1.2-rc.1(alpha 通道 0.1.5-alpha.1),先按 升级指南 准备源码构建。
1. 选一个后端开始
出厂组合没有启用这三个 memory server;一次只接一个更容易定位问题。
| 后端 | 官方示例版本 / 命令 | 特点 | 示例存储位置 |
|---|---|---|---|
| MCP Reference Memory | @modelcontextprotocol/server-memory@2026.7.4 / mcp-server-memory | 本地实体、关系、观察组成的知识图谱;无需额外模型 | $HOME/.dsh-mcp-reference-memory.jsonl,可设 MEMORY_FILE_PATH |
| Memorix | memorix@1.3.0 / memorix serve | 可在本地启发式模式工作,额外模型 / embedding 配置由它自己管理 | ~/.memorix/data,可设 MEMORIX_DATA_DIR |
| Engram | v1.20.0 / engram mcp | 持久记忆与 Git 项目范围由 Engram 管理 | ~/.engram,可设 ENGRAM_DATA_DIR / ENGRAM_PROJECT |
建议先用 Reference Memory 验证完整链路:依赖少、文件位置明确。它的搜索是名称、类型、观察内容的大小写不敏感子串匹配,不是语义检索,也没有自动摘要、冲突解决或遗忘策略。
2. 用 Reference Memory 跑通
以下是 macOS / Linux shell 示例。先准备已构建的匹配源码与新的 demo home,不在日常记忆库中做测试。
export DSH_SOURCE="/absolute/path/to/deepseek-harness"
export DSH_HOME="$HOME/.dsh-memory-demo"
export MEMORY_FILE_PATH="$DSH_HOME/memory/reference.jsonl"
umask 077
mkdir -p "$DSH_HOME/memory" "$DSH_HOME/examples/mcp-memory"
npm install --global @modelcontextprotocol/server-memory@2026.7.4
command -v mcp-server-memory
cp "$DSH_SOURCE/apps/cli/config/examples/mcp-memory/mcp-reference-memory.cordis.yml" \
"$DSH_HOME/examples/mcp-memory/mcp-reference-memory.cordis.yml"
cd "$DSH_SOURCE"
pnpm dsh web --patch "$DSH_HOME/examples/mcp-memory/mcp-reference-memory.cordis.yml"
配置模型凭据,选择测试工作区,并等待 mcp__... 工具发现完成。DSH 会启动这个已安装的可执行程序;官方 overlay 本身不负责运行包管理器或安装依赖。
这里特意把 MEMORY_FILE_PATH 放入 demo home,方便整体备份;这是本文显式选择的位置,不是所有 memory server 的默认行为。路径应为绝对路径,父目录需存在且可写。
固定工作目录与项目范围
官方示例的 cwd: !!js process.cwd() 取 Host 启动目录。Web UI 后来选择另一个 Workspace,不会自动重写这个 MCP server 的 cwd。
Reference Memory 的本例通过固定文件路径保持范围。Memorix / Engram 还依赖 Git 项目身份;为它们复制 overlay 后,将 config.cwd 明确设为测试仓库的绝对路径:
# 复制后的 memory overlay 中,替换原有 config.cwd 一行
cwd: /absolute/path/to/test-repo
切换后端、存储路径或项目身份后应重启对应连接,再做跨会话验证。不要把“存储范围换了”误判为丢失记忆。
3. 验证写入 → 新会话召回 → 使用
使用不会与已有数据撞名的测试值,例如 lapsang-20260830-demo7。
| 步骤 | 示例提示 | 验收证据 |
|---|---|---|
| 会话 A 写入 | “请调用记忆工具,保存我的验证饮品是 lapsang-20260830-demo7。” | 实际写入工具名称、参数与成功结果 |
| 新会话 B 召回 | “请查记忆:我的验证饮品是什么?” | 搜索 / recall 工具被调用,返回完整唯一值 |
| 会话 B 使用 | “根据这个偏好,为会议推荐一种饮品。” | 回答确实使用召回结果,而非随机猜测 |
新建 Session B 时保持同一 Host、同一后端及存储范围,别粘贴会话 A 的内容。模型只口头说“记住了”或“找到了”不算完成验证。
跨会话测试通过后,可再停止并重启 Host,保留同一环境变量 / 项目范围,创建 Session C 重新召回。重启是额外持久化检查,不是第一次跨会话测试的必要步骤。
如果模型很少主动使用工具,可在已有 instructions 中增补一条约定:“用户明确要求记住时调用写入工具;需要历史信息时先搜索记忆,再使用相关结果。”保留原 persona,不必整体替换 system prompt。
4. 改用 Memorix 或 Engram
从官方示例目录选择对应 overlay,使用独立存储和明确的 cwd;同一次试验保持一个后端。
| 后端 | 安装 | 启动前检查 |
|---|---|---|
| Memorix | npm install --global memorix@1.3.0 | command -v memorix;Node 要求至少 22.18,DSH 的要求更严格 |
| Engram | go install github.com/Gentleman-Programming/engram/cmd/engram@v1.20.0 | 官方示例要求 Go 1.25.10+;command -v engram 应找到可执行文件 |
对应文件为 memorix.cordis.yml 与 engram.cordis.yml。按上节方式复制、修改 cwd,再用同样的 pnpm dsh web --patch ABSOLUTE_PATCH_PATH 启动。
Memorix 的可选 provider 配置在它自己的 ~/.memorix/config.toml 或项目 memorix.toml。Engram 的项目选择与存储也由其自身负责。这些配置不是 DSH 的 settings.yaml。
5. 数据、备份与停用
- DSH home 与记忆库分开看:默认的
~/.engram、~/.memorix/data和 reference JSONL 不会因为你备份了另一个DSH_HOME就自动被包含。 - 本地存储不等于零出站数据:模型使用的召回内容会进入其请求上下文;外部 server 若启用额外模型 / embedding,也可能产生自己的请求。
- 备份前停止写入:停下相应运行时 / MCP server 后,再按后端方式保存数据文件、项目范围及配置。
- 停用不等于删除:移除 overlay 或停用 MCP 行只停止接入;清理测试实体或整库数据应由对应后端的删除功能及数据管理流程完成。
- 只保存明确需要长期保留的信息,避免把密钥或无关敏感内容写进测试记忆。
6. 常见问题
| 现象 | 排查顺序 |
|---|---|
| 没有 memory 工具 | 启动参数是否带 overlay;可执行文件是否在 Host 的 PATH;等待异步发现完成 |
| 启动报找不到程序 | 先在启动 DSH 的同一个 shell 中运行 command -v;安装与启动 shell 的 PATH 可能不同 |
| 新会话“忘了” | 查真实写入结果,再核对文件路径、Git 项目身份与连接到的后端 |
| 写入报错 | 路径是否绝对、父目录是否存在、文件是否可写;查看工具错误而非只读模型回复 |
| 能精确搜到、模糊表达搜不到 | Reference Memory 用子串匹配,不带语义检索 |
| 子进程断开 | DSH 会退避重连并重新同步工具;预算耗尽后撤回工具,需重载或重启 |