解决 AI Agent 记忆"不够用、存不下、查不到"三难问题的实践方案。
问题背景
AI Agent(如 Hermes)的持久记忆面临矛盾:
- 常驻记忆有容量上限(默认 2000 字符,可扩容)— 存不了多少事实
- 全部塞进上下文太贵——每轮对话都要重新发送,按 token 计费
- 低频信息不能丢——设备配置、排障细节、API 用法,几周后可能还要用
分层方案
┌─────────────────────────────────────────────┐
│ 第一层:常驻记忆(memory) │
│ · 高频事实:IP/端口/凭据位置/用户偏好/关键配置 │
│ · 默认2000字符可扩容,每轮注入上下文 │
│ · 只放精简核心 │
├─────────────────────────────────────────────┤
│ 第二层:外部知识库(fact_store) │
│ · 低频背景:设备配置/排障细节/软件特性/API用法 │
│ · 大容量、不衰减、不删除、不占 token │
│ · 结构化存储,支持实体关联/组合查询 │
├─────────────────────────────────────────────┤
│ 第三层:会话历史(session db) │
│ · 完整对话记录,可全文检索 │
│ · 用于回溯"当时怎么做的" │
└─────────────────────────────────────────────┘
核心机制
1. 自动分层存储
- 先扩容常驻记忆(默认 2000 → 8000 字符),容纳更多高频事实
- 扩容后仍放不下的低频信息 → 外部库
- Agent 判断信息频度:高频 → 常驻 memory,低频 → 外部库
- 存储时自动打标签(tags),支持实体关联
2. 索引锚点(关键设计)
外部库内容不注入上下文(不占 token),但需要"知道有这回事"才能去查:
常驻 memory 里留一行:
"低频索引: 画图环境→外部库条目; dash改密码→外部库条目; uv缓存→外部库条目; ..."
→ 每轮注入的是索引(几十字符),真正内容在外部库,需要时按编号查
3. 容量自动管理
- 常驻记忆写满时,自动评估最不常用条目 → 迁移到外部库 → 留索引 → 腾出空间
- 避免"记忆满了写不进新东西"
4. 中文搜索的坑
外部库默认全文搜索(FTS5)对中文不友好(整句被当 1 个 token,搜不到)——用 ASCII 锚点(如 memory-anchor:画图环境)作为标签解决,中文关键词也能定位。
效果
| 指标 | 结果 |
|---|---|
| 常驻记忆 | 精简高效,只放高频核心 |
| 低频信息 | 不丢失,按索引可查 |
| token 成本 | 只花索引的几十字符,外部库 0 成本 |
| 查询 | 支持实体探针(probe)/组合推理(reason) |
适用场景
- AI Agent / 聊天机器人需要长期记忆
- 大量低频配置信息不想占上下文
- 多会话、跨天使用的场景
参考
- Hermes Agent 记忆机制:https://hermes-agent.nousresearch.com/docs
- SQLite FTS5 中文检索限制:https://sqlite.org/fts5.html