Postsread more
Agent 的记忆:Hermes-Lite 如何用 5 层结构解决「鱼的难题」
人类 chatbot 最尴尬的瞬间:第二次见面完全不认识你。Agent 的记忆系统怎么同时做到持久化、低成本、不丢上下文?我深入 Hermes-Lite 源码写了一个月,拆解出 5 层架构。
从「鱼的难题」开始
用过 ChatGPT 的人都知道一个痛:下次打开,它完全不记得你了。
对一次性聊天这没问题。但对个人助理——帮你管理 200 条知识库、追踪几个项目的进度、记住你的偏好——这等于每次都要把整段友情重来。
我做 QPC(个人知识库)时就被这个问题卡过。后来折腾 Hermes-Lite、nanobot,逐步摸到一条可行的路。这篇文章从 Hermes-Lite 的实际源码出发,拆解它的 5 层记忆架构,看看一个 Agent 是怎么解决「鱼的难题」的。
总览:5 层架构
┌─────────────────────────────────────────────┐
│ Layer 1: 持久记忆 (MEMORY.md / USER.md) │ ← 跨会话,纯文本
├─────────────────────────────────────────────�
│ Layer 2: 会话压缩 (ContextCompressor) │ ← 长对话不爆
├─────────────────────────────────────────────┤
│ Layer 3: 会话检索 (session_search + FTS5) │ ← 历史不丢
├─────────────────────────────────────────────�
│ Layer 4: 增量写入门控 (Nudge 机制) │ ← 该记就记
├─────────────────────────────────────────────�
│ Layer 5: 原子性保障 (fcntl + 临时文件) │ ← 不丢不坏
└─────────────────────────────────────────────┘
每一层解决一个独立问题,层与层之间不耦合。下面逐层拆解。
Posts
read more
Agent 日记系列(四):构建 Agent 的记忆宫殿:持久化存储系统解析
Agent 没有记忆,就是"金鱼脑"——每次对话从头开始,重复犯错、忘记偏好。持久化记忆系统要解决的是:跨会话保留什么、怎么存、怎么取。
记忆分层
第一层:身份记忆(User Profile)
永久不变或极少变的信息:
- 用户姓名、时区、语言偏好
- 项目路径、技术栈、常用工具
- 沟通风格偏好(简洁/详细、中文/英文)
存储方式:纯文本文件,每轮注入系统提示。
第二层:经验记忆(Lessons Learned)
踩过的坑和解决方案:
- “NewAPI Groq 70B 只有 8K 上下文,不适合做压缩”
- “Hugo 0.161.1 需要覆盖 baseof.html 修复 locale 问题”
- “Hermes-lite 的 memory 上限 2200 字,要 replace 而非 add”
存储方式:结构化条目,带时间戳和标签。
第三层:会话上下文(Session State)
当前对话的实时状态:
- 最近 10 轮对话
- 当前任务进度
- 待办事项
存储方式:对话历史 buffer,压缩后丢弃细节。
存储方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 纯文本文件 | 零依赖、人类可读 | 无查询能力、并发不安全 | 身份记忆、小型博客 |
| SQLite | 轻量、单文件、SQL | 需维护 schema | 中等规模 Agent |
| Turso/libSQL | 分布式、边缘部署 | 需网络、有成本 | 多实例 Agent |
| Redis | 极快、支持 TTL | 内存贵、无持久化 | 会话缓存 |
实际实现:文件 + 索引
对于单 VPS 个人 Agent,最实用的是文件 + 索引方案: