第七章

记忆系统

🎧 语音播放

理解 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 就是金鱼

延伸思考

  1. 如果对话非常长(比如 1000 条消息),全部记忆会怎样?
  2. 除了 FTS5,还有哪些搜索历史的方法?