AI-Workshop 文献分享 #10 -- Hermes Agent 记忆框架:四层架构与设计哲学
分享人:qyr | 日期:2026-07-11
主题:Hermes Agent 记忆框架设计与实现
一、四层记忆架构
Hermes 采用四层分层结构:
工作记忆 -> 内建长期记忆 -> 完整会话历史 -> 可插拔的外部记忆组件
核心设计理念:不是尽可能的多记,而是判断哪些是值得记住的。
记忆拆成两个部分:稳定的事实(长期记忆) vs 完整的历史。
二、工作记忆(L1)
- 存储位置:内存,不持久化
- 生命周期:仅单轮推理步骤,结束后丢弃
- 包含内容:调试信息、报错信息、中间变量等临时信息
- 设计原则:不会也不应该进入上下文和长期记忆,避免污染
工作记忆与会话历史是不同的概念。工作记忆是单轮内部的临时工作区,而非跨轮次的记忆。
三、内建长期记忆(L2)
3.1 快照机制
两个 Markdown 文件管理内建记忆:
- MEMORY.md:环境信息、项目约定等(上限 2200 字符)
- USER.md:用户风格、偏好等(上限 1375 字符)
会话加载时,读取这两个文件生成系统提示词,并创建快照。快照缓存在 session.db(SQLite)中。
关键规则: 1. 本轮会话中使用的快照不会改变,即使修改了源文件 2. 通常要到下次会话启动或记忆压缩才更新快照 3. 通过 gateway 调用时,新建 AI 实例仍使用 session 缓存的快照
设计目的:确保 prefix 稳定性,提高 prefix cache 命中率(降低费用),便于调试。
3.2 内核级工具
memory 操作在 Hermes 中是内核操作,不走通用流水线。
通用流水线(不持久化):
LLM tool_call -> 分发器 -> 参数校验 -> 初始化 -> 执行 -> 序列化 -> 回填
memory 操作单独处理,因会直接修改记忆文件。
操作原语:只有三种——add、replace、remove。没有 embedding,没有图谱化,但人能看懂。
匹配算法:KMP 字符串匹配。匹配到多个结果时报歧义。
原子写入流程: 1. 上锁——避免其他会话同时修改 2. 重新读取 MEMORY.md 和 USER.md 最新内容(不用快照) 3. 修改并写入临时文件 4. 原子覆盖——用 tempfile 一次性覆盖目标文件
3.3 威胁扫描
memory 操作在写入前进行威胁扫描,因这两个文件作为 system prompt 在每次对话中使用。
检查内容包括: - 角色劫持 - 恶意指令注入 - 密钥诱导 - SSH 后门 - 隐形 Unicode 字符
四、完整会话历史(L3)
- 记录当前会话的完整对话过程,保证上下文连贯性
- 区别于 L1(单轮内部)和 L2(跨会话),L3 是会话级的
- 会话过长时可进行压缩或摘要处理
- 与 L2 配合:稳定事实进 L2,过程记录留 L3
五、外部记忆组件(L4)
- 对接外部存储,按需扩展记忆能力
- 典型组件:RAG、知识图谱、向量数据库
- 可插拔设计,按场景选择启用
- 与 L2 互补:L2 管精简稳定的核心事实,L4 管大规模检索
六、总结
三个要点:
- 四层架构各司其职:工作记忆(单轮临时)-> 内建长期记忆(跨会话稳定事实)-> 会话历史(跨轮次上下文)-> 外部记忆(大规模检索)
- 快照机制:牺牲实时性换取 prefix 稳定性,提升 cache 命中率
- 设计哲学:稳定优于实时,简单优于复杂,安全内建于流程