作者:小创
用了 Agent 框架最痛苦的事情是什么?每次新开一个 session,AI 完全不记得你上次做到哪了。CommonAgent 记忆方案换了一个又一个,要么配置复杂到令人发指,要么效果平平装完跟没装一样。
最近腾讯放出了一个叫 TencentDB Agent Memory 的东西,官宣数据说接入后 Token 消耗最高能降 61%,成功率提升 51%(数据来源:TencentDB-Agent-Memory 官方 README)。我研究了一下,发现它跟 Hermes Agent 的集成比想象中简单得多——腾讯官方已经把它做成了 Hermes 的内置 memory provider。
今天把这套方案完整跑了一遍,把安装方式、架构逻辑、配置细节全部梳理清楚。
这套东西的核心设计叫「四层渐进记忆」,不是简单地把对话往向量数据库里一塞就完事了。
L0(原始对话):完整保留对话原文,以 Markdown 文件形式存在磁盘上,可直接打开查看。
L1(原子记忆):从原始对话里提取关键事实片段,结构化存储,每次 L1 提取会同时做向量化和去重,避免重复记忆污染。
L2(场景块):把同类原子记忆归并成场景块,以 Markdown 形式保存,人类可以直接读懂。
L3(用户画像):在更宏观的层面归纳用户偏好、工作习惯、常用技术栈,存成 persona.md。
关键点在这里:每上一层都有完整的下钻路径。当你觉得 AI 回答有问题的时候,可以一路从 L3 persona → L2 场景 → L1 原子 → L0 原文,完整追溯到原始上下文,不是一个黑箱。
另一个重要设计是符号记忆。长任务里最费 Token 的是那些中间日志(搜索结果、代码片段、错误堆栈),这些东西被压缩成 Mermaid 图表留在上下文里,详细内容通过 node_id 索引到外部文件,按需读取。上下文只留几百个 token 的图表,实际 logs 可以是几十万 token。
Hermes 是个 Python Agent 框架,但这套记忆系统核心是 Node.js 写的。两边通过 HTTP 通信。
Hermes (Python)
└─ memory_tencentdb Provider
├─ GatewaySupervisor ─── 启动 + 健康检查 Node.js sidecar
└─ MemoryTencentdbSdkClient ─── HTTP 调用 Gateway
│
▼ 127.0.0.1:8420(默认)
memory-tencentdb Gateway (Node.js)
└─ 核心引擎
├─ L0 原始对话存储(SQLite + JSONL)
├─ L1 记忆提取(LLM + 向量去重)
├─ L2 场景块(Markdown)
├─ L3 用户画像(persona.md)
└─ 存储后端:SQLite + sqlite-vec 或腾讯云向量数据库
数据存在哪?默认在 ~/.memory-tencentdb/memory-tdai/,打开这个目录就能看到 L0/L1/L2/L3 各层的文件,调试起来非常方便。
hermes --version
需要 v0.3.4 或更高版本。低于这个版本的先升级。
编辑 ~/.hermes/config.yaml,加入:
memory:
provider: memory_tencentdb
注意这里用的是下划线 memory_tencentdb,不是中划线。这不是配置错误——这是 Hermes 的 provider 目录命名规范,目录名必须是下划线。
记忆系统的 L1/L2/L3 提取需要调用 LLM,默认用 OpenAI 接口。设置环境变量:
export MEMORY_TENCENTDB_LLM_API_KEY="sk-xxx"
export MEMORY_TENCENTDB_LLM_BASE_URL="https://api.openai.com/v1"
export MEMORY_TENCENTDB_LLM_MODEL="gpt-4o"
如果你用腾讯云 LKE 的 DeepSeek,也可以:
export MEMORY_TENCENTDB_LLM_API_KEY="xxx"
export MEMORY_TENCENTDB_LLM_BASE_URL="https://api.lkeap.cloud.tencent.com/v1"
export MEMORY_TENCENTDB_LLM_MODEL="deepseek-v3.2"
export MEMORY_TENCENTDB_LLM_PROVIDER="custom"
Gateway 会由 Provider 自动启动(auto-discovery 模式),默认找 src/gateway/server.ts 这个路径。如果你的插件目录不在默认搜索路径里,需要手动指定:
export MEMORY_TENCENTDB_GATEWAY_CMD="node --import tsx /path/to/src/gateway/server.ts"
启动后,Provider 会自动等待 Gateway 的 /health 返回 ok,然后才正式接管记忆功能。
curl http://localhost:8420/health
返回 ok 或 degraded 即可。
日志位置在 ~/.hermes/logs/memory_tencentdb/gateway.stderr.log,启动出问题先看这个。
插件设计者给了很合理的默认值,零配置也能跑起来。但如果想调优,分三个层级:
| 参数 | 默认值 | 说明 |
|---|---|---|
storeBackend |
sqlite |
存储后端,暂时只支持 sqlite |
recall.strategy |
hybrid |
检索策略,推荐用 hybrid(RRF 融合) |
recall.maxResults |
5 |
每次召回的记忆条数 |
pipeline.everyNConversations |
5 |
每 N 轮对话触发一次 L1 提取 |
persona.triggerEveryN |
50 |
每 N 条新记忆触发一次画像生成 |
| 参数 | 默认值 | 说明 |
|---|---|---|
pipeline.enableWarmup |
true |
新 session 从第 1 轮就开始触发 L1,后续翻倍(1→2→4→…) |
pipeline.l1IdleTimeoutSeconds |
600 |
用户空闲多久后触发 L1 |
recall.timeoutMs |
5000 |
召回超时时间,超时跳过不阻塞对话 |
capture.excludeAgents |
[] |
排除特定 agent 的 glob 模式(如 bench-judge-*) |
capture.l0l1RetentionDays |
0 |
L0/L1 本地文件保留天数,0 = 永不清理 |
完整参数在项目根目录的 openclaw.plugin.json 里定义,包含了 embedding 服务配置、独立 LLM 运行模式、offload 后端等高级选项,适合自建 embedding 服务或接腾讯云向量数据库的用户。
如果启动 Hermes 后日志里出现 memory-tencentdb Gateway not available,先确认 Hermes 版本是 v0.3.4+。低于这个版本没有 memory provider 机制。
另一个常见原因:Gateway 没有启动起来。看 ~/.hermes/logs/memory_tencentdb/gateway.stderr.log 的具体报错信息。
配置里写 memory-tencentdb 会报错,必须写 memory_tencentdb(下划线)。原因:Hermes 的 provider 注册目录名是 memory_tencentdb/,系统按目录名查找 provider。
Gateway 启动成功但 L1 提取没动静,很可能是 MEMORY_TENCENTDB_LLM_API_KEY 没设置。记系统需要 LLM 做记忆提取,没有凭证就卡在半路。
BM25 检索默认语言是 zh(jieba 分词),如果你做的是英文项目上下文,改成 en 效果更好。在 bm25.language 参数里设置。
| 方案 | 接入难度 | 长期记忆 | 短term压缩 | 白盒调试 | 数据存储 |
|---|---|---|---|---|---|
| memory-tencentdb(本文) | 低(内置 provider) | L0-L3 分层 | Mermaid 符号图 | ✅ 直接看文件 | SQLite + Markdown |
| mem0 | 中 | 平铺向量 | ❌ | 有限 | 云端 |
| retaindb | 中高 | 关系图谱 | ❌ | ❌ | 云端 |
| honcho | 中 | session 级 | ❌ | ✅ | 本地 |
如果你用 Hermes,想接入一套本地优先、分层、可调试的记忆系统,这套是目前最完整的方案。
四层记忆架构加上符号压缩设计,这套方案的核心价值不在于「记住更多」,而在于「记住的都能追溯」。每次 AI 回答出问题,你都能找到完整的记忆链路,而不是对着一个黑箱向量相似度分数发呆。
对于跑长任务、长 session 的开发者来说,这种白盒调试能力比什么性能数字都实在。
你在用 Hermes 吗?有没有遇到 session 断掉后 AI失忆的问题?评论区说说。
自己改写比拿来主义靠谱
省了不少时间
max_turns 20 其实够用了
原来可以这样用
💬 评论区