Hermes 上下文工程对照分析

对标:AI 代理的上下文工程:构建 Manus 的经验教训

作者:季逸超(Yichao “Peak” Ji),Manus 联合创始人

发表日期:2025 年 7 月 18 日

分析日期:2026-06-02


Manus 原文七条核心经验速览

季逸超团队四次重建 agent 框架,把过程称为「手搓 SGD」。放弃微调模型路线,全押上下文工程。如果模型进步是上涨的潮水,agent 要做漂浮的船,不是钉在海床上的柱子。

七条经验:

  1. KV 缓存命中率 — 生产环境最重要指标,别在系统提示放时间戳
  2. 屏蔽原则 — 工具定义永远不变,用 API 层级控制动作空间
  3. 文件系统作为扩展记忆 — 128K 窗口不够,文件系统无限持久
  4. 注意力操纵 — Todo 列表让模型注意力偏向目标
  5. 保留失败信息 — 别隐藏错误,模型从中学习
  6. 警惕少样本陷阱 — 重复模式让模型陷入惯性
  7. 上下文工程是实验科学 — 四次重构才找到局部最优

逐条对照 Hermes 源码

1. KV 缓存命中率

Manus 说的:最重要指标,一个 token 差异就能让缓存全失效。别在系统提示开头放时间戳。

Hermes 怎么做:✅ 做得很好

  • 4 断点缓存agent/prompt_caching.py 在 system prompt + 最后 3 条非系统消息上打 cache_control 标记,TTL 支持 5m/1h
  • SOUL.md 是纯静态:没有时间戳,没有动态变量,每次加载内容不变
  • Personality 是 ephemeralagent/system_prompt.py 明确注释——“ephemeral_system_prompt is NOT included here. It’s injected at API-call time only”——不破坏会话缓存的系统提示
  • 系统提示不含时间:源码明确说「不注入当前时间戳,模型需要时自己调工具获取」

差距:没有 JSON 序列化确定性检查。如果用 yaml.dump 改 config.yaml 时改了 key 顺序,缓存会静默失效,不会被检测到。


2. 屏蔽原则(工具定义不动,用 API 控制)

Manus 说的:别动态修改工具定义——缓存全失效,旧上下文引用不存在的工具导致模型困惑。用 logits 掩码控制动作空间。

Hermes 怎么做:✅ 基本对齐

  • 工具定义只在会话初始化时注册一次tools/registry.py → 启动时 discover_builtin_tools() 一次性加载所有工具 schema
  • Toolsets 控制粒度hermes tools enable/disable NAME → 改变的是「哪些工具被加载到当前 session」,而不是「先加载再动态删除」
  • /reset 后才生效:工具变更需要新会话,这天然避免了 Manus 说的「上下文引用已不存在的工具」
  • 工具 schema 在整个 session 中不变:JSON 序列化一次,后续不会重新序列化

差距:Hermes 没有 Manus 那种「通过 token 前缀掩码 logits」的细粒度状态机控制。tool_call 时模型完全自主选择,极端情况下可能选错工具。Manus 的做法更激进——所有浏览器工具以 browser_ 开头,通过前缀直接限制可用工具组。


3. 文件系统作为扩展记忆

Manus 说的:128K 窗口不够,文件系统是无限的外部记忆。模型学会按需读写,URL 还在就把网页内容从上下文踢出去。

Hermes 怎么做:✅ 多层级外部记忆

  • 短期:上下文窗口 + context compression(agent/context_engine.py
  • 中期:state.db(SQLite + FTS5),sessions 可回溯,session_search 检索
  • 长期:Memory 系统,跨 session 注入用户偏好和环境事实
  • 持久:Skills 系统,可复用程序知识,文件系统存储
  • 外挂:Obsidian vault + wechat-articles 目录,无限容量

关键差距:Hermes 的上下文压缩是有损的context_engine.pyshould_compress() 在 token 超阈值时触发 → 用 auxiliary model 做摘要压缩。这正是 Manus 警告的「过度激进压缩导致信息丢失」。Manus 的做法是「只要 URL 保留,网页内容就可以从上下文移除」——这是一种智能的引用置换,Hermes 没有。


4. 注意力操纵(Todo 列表)

Manus 说的:Agent 创建 todo.md 边做边勾,用自然语言让模型注意力偏向目标。不需要架构变更。

Hermes 怎么做:✅ 已经有类似机制

  • Todo 工具todo-system skill → 支持 pending/in_progress/completed 状态
  • Goal 系统/goal 命令 → 设置持久目标,跨 turn 保持
  • Memory 注入:每轮开始把 memory 注入上下文,相当于「记住你要干什么」
  • SOUL.md + Personality:系统提示中预制行为模式,同样是注意力操纵
  • Skills 索引注入:可用 skills 列表在每轮开始时注入

差距:Hermes 的 todo 是给用户的视图,不像 Manus 那样是模型自己维护的注意力锚点。Manus 的 todo.md 是 agent 自己写、自己读的自我循环;Hermes 的 todo 更多是外部指令。这种差异意味着 Hermes 的模型缺少一个「长循环中自我提醒」的机制。


5. 保留失败信息

Manus 说的:最有效的方法就是保留失败信息。模型看到失败动作和堆栈跟踪,会隐式更新内部信念。清理痕迹是最蠢的做法。

Hermes 怎么做:⚠️ 部分做到

  • 工具错误确实返回给模型model_tools.pyexcept Exception as e: return json.dumps({"error": ...}) → 错误作为 tool result 附加到上下文
  • 但错误被 sanitize 了_sanitize_tool_error(error_msg) → 过滤敏感信息(路径、key 等)
  • 堆栈跟踪不完整:只返回 str(e),不返回完整 traceback。完整 traceback 在日志里(logger.exception),但模型看不到日志

差距:Manus 强调的是「完整保留失败观察和堆栈跟踪」。Hermes 的异常处理返回 sanitized error,丢失了堆栈信息——而堆栈跟踪恰恰是模型做「自我纠错」最有价值的上下文。


6. 警惕少样本陷阱

Manus 说的:上下文中的重复动作-观察对会让模型陷入模式。审查 20 份简历时 agent 机械重复类似操作。解法:引入受控随机性——不同的序列化模板、替代措辞、微小噪音。

Hermes 怎么做:⚠️ 被动防护

  • Memory 系统:持久化的是「用户偏好」而非「过去的具体行动序列」,天然避免 few-shot 陷阱
  • Session 系统session_search 可以回溯,但不会把整个历史 session 自动注入上下文
  • Skills 系统:skill 是「抽象的工作流」而非「具体的操作序列」,不会造成模式化
  • Context compression:压缩后的摘要丢失了原始动作-观察的模式细节

差距:Hermes 没有主动的「受控随机性」机制。如果一个 session 中出现 20 次类似的 tool call,没有任何东西来打破这个模式。Manus 的做法更主动——在不同序列化模板、替代措辞、顺序噪音中随机选择。


7. 上下文工程是实验科学

Manus 说的:四次重构 agent 框架才找到局部最优。分享的不是真理,是能让别人少踩坑的经验。

Hermes 怎么做:✅ 设计上就是实验平台

  • Skills 系统:每次解决复杂问题都能保存为 skill,积累迭代。这正是「手搓 SGD」的制度化版本
  • Curator 系统:自动追踪 skill 使用频率,标记过时 skill,归档维护。相当于自动化的经验管理
  • Profile 系统:可以开独立实例做 A/B 测试,不影响主环境
  • Cron 系统:定时任务自动运行,观察长期稳定性
  • 可插拔的 context engineagent/context_engine.py 支持不同压缩策略,可以实验性替换

这正是 Hermes 设计哲学里「self-improving through skills」的体现。 Manus 说「我们四次重构」,Hermes 把这个过程做成了产品特性。


总评

Manus 原则Hermes 状态差距
KV 缓存命中率✅ 4 断点缓存 + 静态 SOULJSON 序列化不确定性未检测
屏蔽原则✅ 工具定义不动,toolsets 控制无 token 级 logits 掩码
文件系统记忆✅ 多层(state.db + memory + skills + Obsidian)无「引用置换」智能压缩
注意力操纵✅ SOUL + todo + goal + memory 注入todo 是外部指令非自我循环
保留失败信息⚠️ 错误返回给模型但 sanitized无完整 stack trace 给模型
少样本陷阱⚠️ memory/skills 天然避开无主动「受控随机性」
实验科学✅ skills + curator + profiles

可改进方向

基于以上分析,Hermes 有三个值得关注的改进点:

  1. 引用置换压缩:在 context compression 中识别「可外部化的引用」(URL、文件路径),保留引用但移除内容,类似 Manus 的做法
  2. 保留完整错误上下文:tool error 返回时附带 sanitized stack trace,让模型能真正做自我纠错
  3. 受控随机性:在重复 tool call 场景中引入微小的序列化变化,打破少样本模式

📎 原文链接:https://manus.im/zh-cn/blog/Context-Engineering-for-AI-Agents-Lessons-from-Building-Manus