Layer 3

三层记忆架构

解决 Claude "金鱼" Agent 的记忆方案

架构 三层记忆关联架构
第 1 层:会话上下文 (瞬态层 - 几分钟到几小时) Messages[] ~200K tokens 消息列表 三阶段压缩 超出阈值时触发 P-chain 链接 parent_session_id 归档到 SQLite 对话结束后存储 第 2 层:持久化记忆 (长期记忆 - 天/周/月 级别) MEMORY.md ~2,200 chars 环境事实、项目约定 会话开始时注入系统提示 USER.md ~1,375 chars 用户画像、偏好 会话开始时注入系统提示 冻结快照机制 会话开始时加载一次 Prompt Cache 优化 XML 标签包裹 <env_memory> <user_profile> 第 3 层:会话归档与检索 (永久存储 - 推理资料) SQLite Sessions + Messages 表 永久化存储 FTS5 全文索引引擎 历史会话搜索 session_search_tool Agent 可用工具 按需检索历史 P-chain 会话链 跨会话上下文关联 压缩触发时创建新会话 对话结束后存储 会话开始时注入 检索历史 → 恢复上下文 压缩触发 → 新会话(P-chain)
压缩 三阶段压缩算法 (Head + Middle + Tail = Result)
触发条件 消息总 tokens 超过 200K 阈值 → 触发三阶段压缩算法 第一次触发:用 Gemini Flash 摘要中间部分,成本 $0.075/1M tokens(比 GPT-4 便宜 20 倍) HEAD 前 N 条 最近重要消息 50% 预算 + MIDDLE 摘要(Gemini) 60条 → AI摘要 5,000 字符上限 + TAIL 最新 N 条 当前上下文 50% 预算 = RESULT 压缩后消息列表 100K-128K tokens 成本大幅降低 摘要内容结构 已解决问题: OAuth 登录实现 待处理工作: 刷新 token 逻辑、用户权限检查 关键决策: PostgreSQL vs MongoDB 选择 交接标记: 上下文窗口交接(仅供参考) 压缩后创建新会话 P-chain 会话链: 1. 保留摘要作为新会话开头 2. parent_session_id 指向旧会话 对话连续性不丢失
P-chain 会话链与跨会话上下文关联
Session A my project 开始: 2025-01-01 10:00 消息 1-50 Token 达到 150K 触发压缩 结束: 2025-01-01 12:00 parent_session_id Session B my project #2 开始: 2025-01-01 12:01 parent_id: Session A 压缩摘要 (来自 Session A) 消息 51-100 继续触发压缩... parent_session_id Session C my project #3 开始: 2025-01-01 14:02 parent_id: Session B 压缩摘要 (来自 Session B) 消息 101-120 用户恢复会话 $ hermes -c "my project" 自动查找最新后代 → Session C SQL 递归查询: WITH RECURSIVE 追溯所有祖先会话 用户可从任何会话点恢复 P-chain 关键设计点 1. 每个新会话通过 parent_session_id 关联到上一个会话 2. 自动命名: "my project" → "my project #2" → "my project #3" 3. 压缩摘要作为新会话的开头消息 4. 对话连续性不丢失,即使跨越多个会话
快照 冻结快照与 Prompt Cache 优化
会话 A 开始 加载 MEMORY.md v1 加载 USER.md v1 创建冻结快照 快照版本 1 会话期间保持不变 注入系统提示 Prompt Cache 命中 成本降低 90% Agent 对话循环 第 1 轮 → 第 10 轮: 模型看到的始终是快照版本 1 用户要求更新记忆 添加新项目信息 立即写入磁盘 MEMORY.md → 版本 2 快照仍是版本 1 不影响当前会话 会话 B 开始 加载 MEMORY.md v2 新快照版本 2 生效 上次的修改现在可见 下次会话

三阶段压缩

  • 头部保留: 最近20条重要消息
  • 中间摘要: Gemini Flash 生成(60条→5000字符)
  • 尾部保留: 最新20条消息
  • 目标: 100K-128K tokens
  • 成本: $0.075/1M tokens

冻结快照

  • 会话开始时加载一次
  • 会话期间保持不变 → Prompt Cache
  • 修改立即写磁盘,但快照不变
  • 下次会话才生效
  • 成本降低 90%

P-chain 会话链

  • parent_session_id 关联上下会话
  • 压缩触发时创建新会话
  • 自动命名: #2, #3, #4...
  • SQL 递归查询追溯祖先
  • 对话连续性不丢失

归档检索

  • SQLite 永久存储所有对话
  • FTS5 全文索引
  • session_search_tool 检索历史
  • 自然语言查询: "上次讨论过的"
  • Gemini Flash 摘要相关会话
对比 Claude vs Hermes 记忆策略
Claude 金鱼 200K 上下文窗口 - 会话结束就丢失 无持久化记忆 无跨会话关联 问题: 上一次会话的信息全丢失 Hermes 解决方案 三层记忆架构 - 上下文 + 持久化 + 归档 P-chain 跨会话关联 session_search_tool 检索历史 优势: 记忆连续、成本可控、永不遗忘