Small Hermes 自我进化 Agent 架构¶
Ch04.109 Small Hermes 自我进化 Agent 架构¶
📊 Level ⭐⭐ | 15.3KB |
entities/small-hermes-self-evolving-agent-architecture.md
核心洞察¶
Agent自我进化之所以难,是因为七个维度的困难相互纠缠,而非某个单独技术问题。Small Hermes(Rust)的解法是一组相互支撑的设计决策,缺一不可。
七重困境 → 设计决策映射¶
| 困境 | 解法 |
|---|---|
| 方向问题(进化往哪走) | 人类始终在回路中,每个候选需用户审批 |
| 容量问题(有限窗口管理无限知识) | 三层上下文架构:Pinned/Active Index/Triggered Skills |
| 一致性问题(记忆冲突) | Supersedes链 + 五种冲突解决策略 |
| 质量问题(进化质量) | 保守提示词+人工审批+元反思(三层防线) |
| 成本问题(反思代价) | 双轨反思:全量(Session End)+ 微反思(Per-Turn,启发式触发) |
| 安全问题(进化与安全矛盾) | 不可变核心(代码层面硬约束)+ 可变外围 |
| 组合问题(O(n²)交互复杂度) | 最小接口 + 单向数据流 |
三层上下文架构¶
Pinned Memory(始终加载)
→ 核心偏好、关键约束,永远在系统提示中
Active Memory Index(索引加载)
→ 所有活跃记忆的一行摘要,让LLM知道"我知道什么"
→ 需要时可主动查询详情
Triggered Skills(按需加载)
→ 只注入与当前查询相关的技能全文
→ 用token overlap匹配,不依赖嵌入模型
反思机制设计¶
保守提示词原则:"宁可漏掉一个值得提炼的技能,也不要产生一个低质量的技能"
微反思启发式:
fn should_micro_reflect(turns_since_last, messages) -> bool {
if turns_since_last < 3 { return false; }
if has_intent_keywords(messages) { return true; } // 记住/以后/偏好
if tool_call_count(messages) >= 2 { return true; }
if has_write_ops(messages) && output_length > 1500 { return true; }
false
}
单向数据流约束¶
- Agent Loop运行时,Memory和Skill Store是只读的
- 反思只产生候选,不直接修改存储——审批是唯一的写入路径
- 工具调用是无状态的
- 上下文组装是纯函数——同样的输入永远产生同样的系统提示
反模式警示¶
- RAG ≠ 进化:RAG是检索,进化是修改Agent自身行为
- 自动接受 = 灾难:人类审批不是摩擦,是特性
- 过早向量化:50技能下token overlap延迟<1ms,不需要向量数据库
- 微调 ≠ 进化:不可审计、不可逆、数据质量不可控
- 忽视组合:循环依赖导致意想不到的副作用
成熟度模型¶
| Level | 描述 |
|---|---|
| L0 | 无进化 |
| L1 | 被动记忆 |
| L2 | 主动反思(人类审批必须)← Hermes当前 |
| L3 | 元认知(反思策略自动调整) |
| L4 | 自主进化(在LLM架构下安全实现存疑) |
反直觉真相:自我进化的关键不是"进化得多快",而是"退化得多慢"。安全围栏、人工审批、冲突检测这些"减速带"是进化的保障。
深度分析¶
七重困境的相互纠缠性¶
七重困境并非独立存在,而是相互耦合:
- 方向×成本:没有清晰方向→无效反思→浪费算力
- 容量×组合:容量越大→组合爆炸越严重→需要最小接口
- 安全×进化:安全收紧→进化受限→不可变核心是解耦手段
- 一致×质量:记忆冲突→反思素材质量下降→需要冲突解决策略
Small Hermes的核心贡献在于同时给出七个解法,且七个解法相互支撑,形成自洽的设计体系。
三层上下文架构的工程价值¶
三层上下文架构解决了LLM Agent的上下文经济学问题:
| 层级 | Token成本 | 更新频率 | 加载策略 |
|---|---|---|---|
| Pinned | 常驻 | 低(需审批) | 始终加载 |
| Active Index | 索引开销 | 中 | 按需展开 |
| Triggered Skills | 峰值 | 高(每次交互) | 精确匹配 |
token overlap匹配的精妙之处:不需要额外的嵌入模型,在50个技能下延迟<1ms,同时保持了精确性。当技能规模超过阈值后,才需要考虑向量检索升级。
双轨反思的成本控制逻辑¶
全量反思(Session End)和微反思(Per-Turn)的本质区别:
// 全量反思:~2000-5000 tokens in
// 产出:技能候选 + 记忆候选 + 冲突候选
// 触发:会话结束,累积数据充分
// 微反思:~500 tokens in
// 产出:最多1个记忆 + 1个技能
// 触发:启发式(intent keywords / 工具调用≥2 / 大文件写入)
双轨设计让反思成本与信息价值匹配:高频轻量×低频重量,避免每次交互都付出全量反思的代价。
不可变核心的哲学意义¶
"安全约束必须在代码层面强制执行,不能依赖LLM的理解"——这个原则划清了工程约束和提示工程的边界:
- 工程约束(
forbid unsafe code、路径沙箱、API key隔离)→ 确定性保证 - 提示工程("请不要做X")→ 概率性保证,在对抗场景下不可靠
不可变核心将安全关键的约束与业务逻辑分离,确保核心行为不被"进化"破坏。
单向数据流与系统可靠性¶
单向数据流是Small Hermes的系统稳定性保障:
关键性质: - 上下文组装是纯函数:同样的记忆+技能+输入 → 同样的系统提示(可重现性) - 写入路径唯一:只有审批后才能修改存储(可控性) - 工具调用无状态:工具调用不产生副作用(隔离性)
这三条性质使得系统行为可预测、问题可定位、故障可回滚。
与其他Hermes篇章的关系¶
| 篇 | 关系 | 说明 |
|---|---|---|
| hermes-agent-self-evolving-source-analysis | 同系列 | Hermes官方Agent的self-improve机制源码解析,与small Hermes互相印证 |
| hermes-self-evolution-closed-loop-skill-reuse-winty | 补充 | 6阶段完整闭环的具体实现(npm发包案例) |
| hermes-agent-deep-dive | 扩展 | 阿里云飞樰的深度解析,包含RL训练闭环和Harness Engineering |
| acker-agent-evolution-three-routes-convergence | 框架 | 三路线汇聚框架:small Hermes对应"学习层(进化)" |
| openclaw-hermes-source-code-agent-architecture-review | 对比 | OpenClaw与Hermes架构对比,Channel契约和Gateway设计 |
实践启示¶
Self-Evolving系统设计原则¶
- 先解耦再进化:先有纯函数上下文组装和单向数据流,再引入进化机制
- 进化必须有方向:人类在回路中,进化方向由用户定义,不是Agent自主决定
- 容量管理优先于检索优化:三层上下文架构优先于RAG/向量检索
- 安全约束工程化:安全关键约束必须在代码层面强制,不可依赖提示词
判断系统是否真正自进化的标准¶
| 检查项 | 说明 |
|---|---|
| 新任务会先查Memory/Skill | 不是每次从零开始 |
| 任务失败后能自动记录 | 失败信号→写入存储 |
| 同类任务第二次执行步数下降 | 经验复用生效 |
| 人类审批是必选项 | 不是自动接受 |
| 不可变核心存在 | 安全约束与进化解耦 |
小规模优先策略¶
Small Hermes的经验:50个技能下不需要向量数据库,token overlap匹配足够。具体来说: - 触发匹配:基于token重叠率,不需要嵌入模型 - 延迟:<1ms(50技能规模) - 精度:对于技能命名良好的场景足够
过早引入向量数据库是技术债务,在规模尚小时徒增复杂度。
反模式警示(详细版)¶
| 反模式 | 原因 | 正确做法 |
|---|---|---|
| RAG即进化 | RAG是检索增强,不修改Agent行为 | 进化是修改Agent自身(记忆/Skill),RAG是获取更多上下文 |
| 自动接受一切 | 人类审批是特性不是摩擦 | 每个技能候选需用户确认 |
| 过早向量化 | 50技能下token overlap延迟<1ms | 用最小技术栈解决问题 |
| 微调即进化 | 数据质量不可控、灾难性遗忘、不可审计、不可逆 | 显式知识沉淀(Skill/Memory)更可控 |
| 忽视组合 | 循环依赖导致意想不到的副作用 | 最小接口+单向数据流约束 |
→ 原文存档