前言¶
在 DeepSeek Harness(DSH)里给智能体挂长期记忆,常见做法是插件化接入:模型通过 memory_write、memory_search 等工具读写事实,系统在 prompt 里自动召回一段摘要。社区里的 dsh-memory@0.1.0 用 SQLite FTS5 存 flat text,但默认分词器对中文不友好——整句往往变成一个 token,检索几乎失效。长期事实还需要 scope、标签、去重、过期复核和可控的 prompt 预算,而不只是追加和搜索。
下面介绍维护者 tr1v3r 发布的 @tr1v3r/dsh-ltm(社区分类:记忆)。它以本地 SQLite 为主存储,提供 CJK 感知分词检索、BM25 与字符 n-gram 混合重排、近重复检测与记忆生命周期管理,并支持从 dsh-memory 迁移;不强制联网,也不需要 API Key 或 embedding 服务。
这是什么¶
@tr1v3r/dsh-ltm 是面向 DeepSeek Harness 的结构化长期记忆插件:数据落在本地 SQLite(默认 $DSH_HOME/memory/ltm.db),与旧版 memory/memory.db 独立,不会写入 legacy 路径。
在 DSH「一切皆插件」的生态里,插件经 profile 的 Cordis 配置加载;社区目录页见 skillhub.cn/plugins/tr1v3r/dsh-ltm,源码与文档在 GitHub tr1v3r/dsh-ltm(MIT 许可证)。npm 包当前版本为 0.3.3(见仓库 package.json)。
核心功能¶
检索与存储¶
- 本地 SQLite + FTS5,配合 CJK 感知分词与 hybrid BM25 + char n-gram rerank,改善中文查询效果。
- 写入前近重复检测(Jaccard ≥
dedupeThreshold默认 0.8,或 cosine ≥dedupeCosineThreshold默认 0.92);重复项可返回候选而非写入,除非force: true。 - 结构化 scope、tags;
staleAfterDays(默认 90)未确认的记忆在展示上标记为 stale,可用memory_confirm刷新复核时间戳。 - 自动 prompt 召回段:可配置最近条数、UTF-16 字符上限;可选离线
promptMaxTokens+ 本地tokenizer.json做 token 预算(需自行准备资产,启动时校验,无网络请求)。
项目隔离(autoProjectScope)¶
默认 autoProjectScope: true 时,每个 agent 按 session.header.cwd 解析项目:Git 仓库用 canonical common Git directory(子目录与 linked worktree 共享 scope);非 Git 工作区用规范目录名。写入与去重限定在当前 project scope;搜索与自动 recall 只见当前 project 与全局(scope="")。memory_list 与 CLI 仍可跨 project 做管理面操作。scope 是上下文隔离,不是 OS 级权限边界。
模型侧工具¶
与 dsh-memory 习惯兼容:
memory_write(text, tags?, pinned?, force?)memory_search(query, limit?)memory_forget(id)
新增:
memory_update(id, text?, tags?, pinned?, expectedRevision?)memory_confirm(id | "*", expectedRevision?)memory_list(scope?, tags?, stale?, limit?)memory_merge(targetId, sourceIds[], …)
每条记忆带 revision;对 memory_update / memory_confirm / memory_forget / memory_merge 传入 expectedRevision 可在单事务内 CAS,冲突返回 MEMORY_REVISION_CONFLICT 且不写入。省略版本字段则保持旧版无 CAS 行为。
CLI 与管理¶
独立 CLI 入口 dsh-ltm,支持 list / search / show / edit / tag / pin / merge / confirm / forget / upgrade-schema / export / import 等,均可 --json。另有只读 doctor 做质量诊断(不输出记忆正文)。从 dsh-memory 的一次性导入在仓库 scripts/legacy-migration/,不在已发布 CLI 内;库间备份转移用 export / import。
安装与启用¶
DSH peer 依赖需匹配 README 列出的运行时范围(含已验证的 0.2.1-rc.1 desktop 与 0.2.1-rc.2 CLI,以及 pre-0.2.0 区间;其他 0.2.x 预发布需自行验证兼容)。Node 引擎要求 ^22.19.0 || >=24.0.0。
@tr1v3r/dsh-ltm 0.1.2 及以上可用 bundle 一键安装并注册配置:
dsh plugin --profile web add @tr1v3r/dsh-ltm
将 web 换成你的 profile 名(例如 dsh-tui),然后重启该 profile。bundle 会把数据库路径设为 $DSH_HOME/memory/ltm.db。
若从 dsh-memory 切换,须先禁用旧插件条目:两者都注册 memory_write、memory_search、memory_forget。若曾手动插入 ltm 条目,启用 bundle 前需删掉,避免重复实例。安装不会自动迁移旧库,迁移见下文。
0.1.0–0.1.1 无 bundle manifest 时,可手动在 profile 的 cordis.patch.yml 插入:
- insert:
- id: ltm
name: '@tr1v3r/dsh-ltm'
config:
path: !!js dshHomePath('memory/ltm.db')
path 为必填,代码侧无默认值;也可设为 :memory:。
配置要点¶
| 配置项 | 默认 | 含义 |
|---|---|---|
path |
(必填) | SQLite 路径或 :memory: |
defaultScope |
"" |
关闭自动 project 时的固定 scope |
autoProjectScope |
true |
按 session cwd/Git 推导 project |
promptRecentCount |
10 |
recall 段未 pin 的最近条数 |
promptMaxChars |
2000 |
recall 段 UTF-16 字符硬上限 |
maxTextChars |
2000 |
单条记忆最大字符 |
searchLimitDefault / searchLimitMax |
10 / 50 |
搜索条数上下限 |
staleAfterDays |
90 |
未确认多久视为 stale |
非法配置(空 path、阈值不在 [0,1] 等)在插件加载时抛错,而不是等到第一次工具调用。
可选 token 预算示例(须同时设置两项 token 相关字段,并自备本地 tokenizer.json):
promptMaxChars: 2000
promptMaxTokens: 512
promptTokenizerPath: /path/to/pinned-model-revision/tokenizer.json
典型用法¶
1、Profile 内由模型使用工具¶
智能体在对话中调用 memory_search 查已有事实,用 memory_write 写入;若返回近重复候选,用 memory_update 修订同一条,或确认后 force: true 写入。长期有效的偏好可 pinned: true。不确定 id 时先搜索,同一事实的状态变化优先 memory_update 而非重复 write。
2、CLI 浏览与维护¶
默认库路径为 $DSH_HOME/memory/ltm.db:
npx -p @tr1v3r/dsh-ltm dsh-ltm --db /path/to/ltm.db search "部署命令" --json
npx -p @tr1v3r/dsh-ltm dsh-ltm --db /path/to/ltm.db list --json
带 CAS 的编辑示例(先 show 读到 revision,再传入 --expected-revision):
dsh-ltm --db /path/to/ltm.db edit 42 --text "更新后的内容" --expected-revision 3
3、schema v1 → v2¶
旧库无 revision 列时,普通打开会被拒绝,需停掉所有写入方(含运行中的插件)后显式升级:
dsh-ltm --db /path/to/ltm.db upgrade-schema
dsh-ltm --db /path/to/ltm.db upgrade-schema --backup /path/to/new-backup.db
4、从 dsh-memory 迁数据¶
安装插件本身不迁移 memory/memory.db。一次性从 retired dsh-memory 导入需使用仓库内 scripts/legacy-migration/(见该目录 README)。在 dsh-ltm 库之间备份与转移,用 export / import,可保留 project scope 与 review 时间戳。
适用场景与注意¶
适合需要在 DSH 里长期积累个人或项目级事实、且重视中文检索与记忆生命周期(去重、复核、scope 隔离)的开发者。设计目标是个人长期事实库,而非大规模文档库:同 scope 内每次非 forced memory_write 会扫描该 scope 全部记忆做去重,写入成本随条数与长度增长;多会话可共享本地 WAL 库,但 SQLite 写仍串行,遇 SQLITE_BUSY 需自行重试。
插件以当前 dsh 进程权限运行,可读写配置的 SQLite 路径;安装前请查阅源码与 MIT 许可证,确认路径与 profile 配置符合你的安全预期。社区目录与 DeepSeek / 幻方无官方从属关系。
结尾¶
@tr1v3r/dsh-ltm 把 DSH 长期记忆做成本地优先:CJK 感知搜索、结构化 scope、去重与过期复核、可选 revision CAS,以及从 dsh-memory 的迁移路径——默认不必联网。目录页:https://www.skillhub.cn/plugins/tr1v3r/dsh-ltm;仓库:https://github.com/tr1v3r/dsh-ltm。