Jason-Liao/dsh-memory-tdai ↗★ 0
dsh-memory-tdai
Four-layer long-term memory for DeepSeek Harness (L0 conversation → L1 atoms → L2 scenes → L3 persona) with auto-recall and auto-capture — adapted from TencentCloud/TencentDB-Agent-Memory
安装
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Jason-Liao/dsh-memory-tdai说明文档
阅读完整 README ↗🚀 使用
开箱即用(默认配置)
装好重启后什么都不用配:
- 正常聊天——你的对话会被自动记录和提炼。
- 跨会话提问——新开一个会话,问"你还记得我喜欢怎么工作吗?",模型会通过自动回忆或
memory_search用上之前的记忆。 - 手动查——直接让模型"查一下我上周讨论过的 X",模型会调
conversation_search找到原文。
数据都存哪
~/.dsh/memory-tdai/
├── conversations/ L0 原始对话(每日 jsonl)
├── records/ L1 原子记忆(SQLite vectors.db + 索引)
├── scene_blocks/ L2 场景块
├── persona.md L3 人设档案
└── .metadata/ 管线进度游标
删除整个目录 = 清空记忆(谨慎)。
开箱即用(默认配置)
装好重启后什么都不用配:
- 正常聊天——你的对话会被自动记录和提炼。
- 跨会话提问——新开一个会话,问"你还记得我喜欢怎么工作吗?",模型会通过自动回忆或
memory_search用上之前的记忆。 - 手动查——直接让模型"查一下我上周讨论过的 X",模型会调
conversation_search找到原文。
⚙️ 配置
默认零配置。可用 bundle 行 config(cordis.patch.yml 或 --patch)或环境变量覆盖:
| 配置 | 默认 | 环境变量 |
|---|---|---|
| 数据目录 | $DSH_HOME/memory-tdai | DSH_MEMORY_DATA_DIR |
| LLM 路由 provider | 部署默认(deepseek-official) | DSH_MEMORY_PROVIDER |
| LLM 路由 model | 部署默认(deepseek-v4-flash) | DSH_MEMORY_MODEL |
| 自动捕获 | 开 | DSH_MEMORY_CAPTURE_ENABLED(0/1) |
| 自动回忆 | 开 | DSH_MEMORY_RECALL_ENABLED(0/1) |
| L1 抽取 | 开 | DSH_MEMORY_EXTRACTION_ENABLED(0/1) |
管线节奏参数(在 bundle 行 config 里,见上游 config.ts):pipeline.everyNConversations(默认 5 轮触发一次 L1,warmup 渐进)、persona.triggerEveryN(默认 50 条记忆触发一次人设生成)等。
🧠 Embedding 配置(专业用户)
默认零配置即可运行(关键词检索)。需要语义级检索(向量 + 关键词混合、RRF 融合排序)时,配置一个 OpenAI 兼容的 embedding 端点即可。DeepSeek 官方 API 没有 embedding 端点,需使用第三方 OpenAI 兼容服务。
完整字段
在 bundle 行 config 的 embedding 组下(~/.dsh/profiles/web/cordis.patch.yml 给 memory-tdai 行加 config):
| 字段 | 必填 | 默认 | 说明 |
|---|---|---|---|
enabled | 否 | true | 总开关(provider 为 none 时仍视为禁用) |
provider | 是 | none | 任意非 none/local 的值(如 openai、dashscope)都被当作 OpenAI 兼容远端;qclaw 走本地代理转发 |
baseUrl | 是 | — | 兼容端点的 base URL,如 https://dashscope.aliyuncs.com/compatible-mode/v1 |
apiKey | 是 | — | 端点密钥 |
model | 是 | — | 模型名,如 text-embedding-v4、text-embedding-3-small、BAAI/bge-m3 |
dimensions | 是 | — | 向量维度,必须与模型输出一致(见下表),不一致会导致向量表建错、查询全空 |
sendDimensions | 否 | true | 是否在请求体里发送 dimensions 字段。OpenAI text-embedding-3-* 支持(Matryoshka 可降维);BGE-M3 等开源模型会拒绝未知字段(HTTP 400),设 false |
maxInputChars | 否 | 5000 | 单条文本超长截断阈值 |
timeoutMs | 否 | 10000 | 单次 embedding 请求超时 |
recallTimeoutMs | 否 | 同上 | 回忆路径超时(用户侧,应更短) |
captureTimeoutMs | 否 | 同上 | 捕获路径超时(后台,可更长) |
conflictRecallTopK | 否 | 5 | L1 去重时的候选召回数 |
proxyUrl | 否 | — | 仅 provider="qclaw" 时使用(本地代理转发) |
常用端点示例
### 1. 未配置 embedding 时,检索是"关键词模式",不是"语义模式"
**这是什么意思?** 记忆检索有两种引擎,能力差别很大:
| 检索方式 | 工作方式 | 例子(记忆内容:"用户喜欢喝咖啡") |
|---|---|---|
| **关键词检索(默认)** | 按字面词匹配(jieba 中文分词 + SQLite FTS5) | 问"咖啡" ✅ 命中;问"我早上喝什么提神" ❌ 查不到(句子里没有"咖啡"二字) |
| **向量检索(需配置)** | 把文字转成向量,按语义距离匹配 | 问"提神的饮品" ✅ 也能命中"咖啡" |
**为什么会这样?** 向量化需要一个 embedding API(把文字变成数字向量的服务)。DeepSeek 官方 API 目前**没有** embedding 端点;插件也不会在未配置的情况下偷偷调用第三方服务。所以默认走关键词模式——够用,但"望文生义"。
**怎么升级?** 在插件配置(bundle 行 config)里提供一个 **OpenAI 兼容的 embedding 端点**(OpenAI `text-embedding-3-small`、阿里云百炼 `qwen3-embedding`、硅基流动、vLLM/Ollama 自托管等皆可),插件自动切换为"向量 + 关键词"混合检索(RRF 融合排序),语义匹配能力大幅增强。不配置也不影响使用,只是检索更"字面"。
> jieba 是中文分词器——"我喜欢喝咖啡"入库前会被切成"我/喜欢/喝/咖啡"再建立索引,这正是 FTS5 能匹配中文的关键。关键词模式对中文检索已经可用,只是做不到"同义替换"级别的语义理解。
---