问题:上下文窗口的硬边界与 AI 的 "失忆症"
当前主流 LLM 应用面临一个结构性困境:无论上下文窗口扩展到 128K 还是 200K,对话历史终究会被截断,用户偏好、项目约定、过往教训随会话结束而流失。每次开启新对话,代理都回到 "出厂设置",用户不得不重复交代技术栈、沟通风格、项目路径等基础信息。这种 "失忆症" 不仅消耗 token,更阻碍了代理向真正的个人助手进化。
Nous Research 开源的 Hermes Agent 通过一套分层记忆架构与用户建模机制,试图在 bounded context 的约束下实现跨会话的个性化持续进化。其核心洞察是:与其追求无限上下文,不如在有限容量内实现精准的记忆策展与动态用户画像更新。
三层记忆架构设计
Hermes 的记忆系统由三个层级构成,分别对应不同时间尺度与使用场景:
1. 持久记忆(Persistent Memory):双文件冻结快照
系统维护两个独立的记忆文件,存储于 ~/.hermes/memories/:
- MEMORY.md(2,200 字符,约 800 tokens):代理的 "个人笔记",记录环境事实、项目约定、工具 quirks、已完成的任务日记
- USER.md(1,375 字符,约 500 tokens):用户画像,包含姓名、角色、时区、沟通偏好、技术熟练度、忌讳事项
这两个文件在会话启动时以 frozen snapshot 模式注入系统提示,之后不再变动。这种设计刻意牺牲动态更新能力,换取前缀缓存(prefix cache)的性能优势 ——LLM 只需计算一次系统提示的 KV cache,后续对话复用即可。
代理通过 memory 工具管理记忆,支持 add、replace、remove 三种操作。replace 和 remove 采用子串匹配而非精确匹配,只需提供能唯一标识条目的短片段即可。当容量接近上限(>80%)时,代理会触发整合逻辑,将多个相关条目合并为更紧凑的表述。
2. 会话记忆(Session Memory):FTS5 全文检索
所有 CLI 和消息平台对话存储于 SQLite(~/.hermes/state.db),启用 FTS5 全文索引。与持久记忆不同,会话记忆不占用系统提示 token,仅在代理显式调用 session_search 时按需检索。
| 特性 | 持久记忆 | 会话搜索 |
|---|---|---|
| 容量 | ~1,300 tokens | 无上限(所有历史会话) |
| 速度 | 即时(已在上下文) | ~20ms FTS5 查询 |
| 成本 | 每轮固定 token 开销 | 零成本(无 LLM 调用) |
| 使用场景 | 关键事实常驻上下文 | "上周我们是否讨论过 X?" |
这种分层策略实现了热数据常驻、冷数据按需的访问模式,在有限上下文预算内最大化有用信息的可达性。
3. 技能记忆(Skill Memory):程序性知识的自进化
技能系统存储代理从经验中提炼的可复用程序性知识。当代理完成复杂任务后,可自主创建或改进技能文档,存储于 ~/.hermes/skills/。技能采用 agentskills.io 开放标准,支持跨项目共享。
技能记忆的独特之处在于自我改进循环:代理在使用技能过程中持续观察效果,自动优化技能实现。这种闭环学习使代理的能力随时间累积,而非每次从零开始。
Honcho 用户建模:辩证式画像构建
Hermes 集成 Honcho 引擎实现 dialectic user modeling—— 一种基于对话历史的异步用户心理建模机制。与传统静态用户画像不同,Honcho 持续分析用户的表达方式、决策模式、知识盲区与偏好演化,构建随时间深化的用户模型。
关键设计原则:
- 渐进式细化:初始画像基于少量交互,随对话增加逐步丰富
- 偏好捕获:自动识别沟通风格(简洁 vs 详尽)、技术偏好(TypeScript vs JavaScript)、工作流程习惯
- 漂移管理:当用户行为模式变化时,模型通过新证据逐步调整旧假设
用户模型与持久记忆协同工作:USER.md 存储显式声明的偏好("我喜欢在终端使用深色主题"),Honcho 处理隐式推断的行为模式(用户倾向于先探索再决策)。
工程实现要点
容量管理与整合策略
当记忆达到容量上限时,系统返回结构化错误,提示代理执行整合:
Memory at 2,100/2,200 chars. Adding this entry (250 chars) would exceed the limit.
Consolidate now: use 'replace' to merge overlapping entries...
可落地参数:
- 设置容量告警阈值:80%(1,760/2,200 字符)
- 整合策略:将分散的项目相关条目合并为单条综合描述
- 淘汰策略:优先移除时间戳超过 90 天的非关键环境事实
安全扫描机制
所有记忆条目在写入前经过安全扫描,检测:
- 提示注入模式(prompt injection patterns)
- 凭证外泄尝试(credential exfiltration)
- 隐形 Unicode 字符(zero-width spaces, bidirectional overrides)
这一层防御至关重要,因为记忆内容直接注入系统提示,一旦被污染将影响所有后续对话。
外部记忆提供商扩展
Hermes 支持 8 种外部记忆提供商(Honcho、Mem0、Hindsight 等),运行在内置记忆之上而非替代。这些提供商补充了向量检索、知识图谱、自动事实提取等能力,适用于需要更深记忆的场景。
局限性与权衡
- 容量硬边界:2,200 + 1,375 字符的容量对复杂项目可能捉襟见肘,需要主动的策展与整合
- 冻结快照的延迟:记忆更新需等到下次会话才生效,长会话中可能出现 "已更新但未生效" 的认知失调
- 用户建模的隐私边界:长期行为追踪引发数据最小化与用途限制的问题,需明确的记忆清除机制
结语
Hermes Agent 的记忆架构展示了在 bounded context 约束下实现长期个性化的可行路径:不是追求无限记忆,而是追求精准策展。通过热 / 冷数据分层、冻结快照优化、技能自进化与用户建模的协同,代理能够在每次对话中 "记得" 你是谁、你的项目如何组织、你们之前如何协作。这种 "渐进式熟悉" 的体验,正是从工具向伙伴进化的关键一步。
参考来源
- Hermes Agent 官方文档 - Persistent Memory: https://hermes-agent.nousresearch.com/docs/user-guide/features/memory
- Nous Research GitHub - Hermes Agent: https://github.com/NousResearch/hermes-agent
内容声明:本文无广告投放、无付费植入。
如有事实性问题,欢迎发送勘误至 i@hotdrydog.com。