第七章
记忆系统
🎧 语音播放
理解 Hermes 如何记住对话历史
🎯 本章目标
- 理解三层记忆架构
- 掌握 SQLite 存储机制
- 理解 FTS5 全文搜索
📚 前置知识
- 第五章的 Agent 循环
💡 学完收获
- 理解记忆的重要性
- 能够调试记忆相关问题
7.1 为什么需要记忆?
没有记忆的 Agent,就像金鱼——每次对话都是全新的:
💡 对比
无记忆: "你好,我叫小明" → "你好小明!"...下次对话:"你叫什么?" → "我不知道"
有记忆: "你好,我叫小明" → "你好小明!" → 下次对话:Agent 记得你叫小明
7.2 三层记忆架构
最快速 · 最短时
Working Memory 工作记忆
当前对话的消息列表,保存在内存中
中等速度 · 中等容量
Session Memory 会话记忆
SQLite 存储的对话历史,支持跨会话
最慢速 · 最大容量
Semantic Memory 语义记忆
FTS5 全文搜索,跨会话检索
7.3 数据流图
记忆系统数据流 Memory System Flow
flowchart TD
A["👤 用户输入"] --> B["📝 构建 Prompt"]
B --> C["🧠 AIAgent"]
C --> D["💾 获取记忆"]
D --> E["📋 messages.append"]
E --> F["📡 LLM 调用"]
F --> G{"tool_call?"}
G -->|有| H["⚡ 执行工具"]
G -->|无| I["✅ 返回响应"]
H --> J["💾 保存到 SQLite"]
J --> K["🔍 更新 FTS 索引"]
K --> C
style D fill:#dbeafe,stroke:#2563eb
style J fill:#ede9fe,stroke:#7c3aed
style K fill:#d1fae5,stroke:#059669
7.4 SQLite 存储
Hermes 使用 SQLite 存储对话历史:
messages 表
- session_id
- role (user/assistant)
- content
- tool_calls
- timestamp
sessions 表
- session_id
- model
- created_at
- message_count
7.5 FTS5 全文搜索
FTS5 让你能搜索历史对话:
示例查询
# 搜索包含 "Python" 的历史消息
results = hermes_state.search_messages("Python")
# 返回相关对话片段
[
{"session": "abc123", "content": "Python 是一门很棒的语言"},
{"session": "def456", "content": "我最近在学习 Python 爬虫"}
]
💡 FTS5 的优势
FTS5 是 SQLite 的全文搜索扩展,比 LIKE 查询快 10-100 倍。Hermes 用它来实现"记得以前说过什么"的功能。
7.6 记忆的检索
Agent 需要记忆时,通过以下方式检索:
1
当前会话
从内存获取
2
最近历史
从 SQLite 加载
3
语义搜索
FTS5 查询
4
构建上下文
合并到 Prompt
📚 本章总结
本章重点:
- 三层记忆:工作记忆 → 会话记忆 → 语义记忆
- SQLite 存储消息历史
- FTS5 实现全文搜索
一句话记忆点: 记忆系统就是 Agent 的"海马体"——没有它,Agent 就是金鱼
延伸思考
- 如果对话非常长(比如 1000 条消息),全部记忆会怎样?
- 除了 FTS5,还有哪些搜索历史的方法?