Jason-Liao/dsh-memory-tdai0

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

包名
dsh-memory-tdai
版本
1.0.0
许可证
NOASSERTION
最近更新
2026年8月16日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:Jason-Liao/dsh-memory-tdai

🚀 使用

开箱即用(默认配置)

装好重启后什么都不用配:

  1. 正常聊天——你的对话会被自动记录和提炼。
  2. 跨会话提问——新开一个会话,问"你还记得我喜欢怎么工作吗?",模型会通过自动回忆或 memory_search 用上之前的记忆。
  3. 手动查——直接让模型"查一下我上周讨论过的 X",模型会调 conversation_search 找到原文。

数据都存哪

~/.dsh/memory-tdai/
├── conversations/     L0 原始对话(每日 jsonl)
├── records/           L1 原子记忆(SQLite vectors.db + 索引)
├── scene_blocks/      L2 场景块
├── persona.md         L3 人设档案
└── .metadata/         管线进度游标

删除整个目录 = 清空记忆(谨慎)。


开箱即用(默认配置)

装好重启后什么都不用配:

  1. 正常聊天——你的对话会被自动记录和提炼。
  2. 跨会话提问——新开一个会话,问"你还记得我喜欢怎么工作吗?",模型会通过自动回忆或 memory_search 用上之前的记忆。
  3. 手动查——直接让模型"查一下我上周讨论过的 X",模型会调 conversation_search 找到原文。

⚙️ 配置

默认零配置。可用 bundle 行 configcordis.patch.yml--patch)或环境变量覆盖:

配置默认环境变量
数据目录$DSH_HOME/memory-tdaiDSH_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.ymlmemory-tdai 行加 config):

字段必填默认说明
enabledtrue总开关(provider 为 none 时仍视为禁用)
providernone任意非 none/local 的值(如 openaidashscope)都被当作 OpenAI 兼容远端;qclaw 走本地代理转发
baseUrl兼容端点的 base URL,如 https://dashscope.aliyuncs.com/compatible-mode/v1
apiKey端点密钥
model模型名,如 text-embedding-v4text-embedding-3-smallBAAI/bge-m3
dimensions向量维度,必须与模型输出一致(见下表),不一致会导致向量表建错、查询全空
sendDimensionstrue是否在请求体里发送 dimensions 字段。OpenAI text-embedding-3-* 支持(Matryoshka 可降维);BGE-M3 等开源模型会拒绝未知字段(HTTP 400),设 false
maxInputChars5000单条文本超长截断阈值
timeoutMs10000单次 embedding 请求超时
recallTimeoutMs同上回忆路径超时(用户侧,应更短)
captureTimeoutMs同上捕获路径超时(后台,可更长)
conflictRecallTopK5L1 去重时的候选召回数
proxyUrlprovider="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 能匹配中文的关键。关键词模式对中文检索已经可用,只是做不到"同义替换"级别的语义理解。

---