332 lines
15 KiB
Markdown
332 lines
15 KiB
Markdown
# Hermes Agent:Harness 完整架构与创新模式
|
||
|
||
> 资料来源:Hermes Agent 官方文档、Pyshine Orange Book、dev.to 技术深度解析、Nous Research GitHub 及 ArXiv 相关研究
|
||
> 整理时间:2026-05-06
|
||
|
||
---
|
||
|
||
## 一、总体架构
|
||
|
||
### 1.1 核心理念:从 Harness 到 Agent
|
||
|
||
Hermes Agent 源自 Nous Research 的 **Harness 工程框架**,完成了一次从"开发者工具"到"自主智能体平台"的根本性转变。这不是简单的重命名,而是 AI 工程第三范式转移的体现:
|
||
|
||
| 范式 | 核心 | 特点 |
|
||
|------|------|------|
|
||
| Prompt Engineering | 优化提示词 | 手工调试,易出错 |
|
||
| Context Engineering | 管理上下文 | 复杂,仍是被动的 |
|
||
| **Harness Engineering** | **自我进化的控制基础设施** | 主动学习,持续改进 |
|
||
|
||
**核心洞察**:模型提供智能,但 **Harness 提供控制**。没有 Harness,将 LLM 部署到生产环境就像"把喷气发动机直接连到方向盘上"——有动力但无控制系统。
|
||
|
||
### 1.2 三层架构概览
|
||
|
||
```
|
||
┌────────────────────────────────────────────────────────────┐
|
||
│ ENTRY POINTS │
|
||
│ CLI / TUI / Gateway (TG, Discord, Slack) / Cron / Batch │
|
||
└─────────────────────┬──────────────────────────────────────┘
|
||
│ 每个入口构建一个 AIAgent
|
||
▼
|
||
┌────────────────────────────────────────────────────────────┐
|
||
│ AIAgent (核心循环 ~13,700 行) │
|
||
│ build_system_prompt → call model → dispatch tools → loop │
|
||
└──────┬─────────────┬──────────────┬───────────┬───────────┘
|
||
│ │ │ │
|
||
▼ ▼ ▼ ▼
|
||
┌──────────┐ ┌──────────┐ ┌────────────┐ ┌─────────────┐
|
||
│ Tools │ │ Skills │ │ Memory │ │ Providers │
|
||
│ Registry │ │ Loader │ │ Manager │ │ (model API) │
|
||
└──────────┘ └──────────┘ └────────────┘ └─────────────┘
|
||
│
|
||
┌────────────────────────────────────────────────┘
|
||
▼
|
||
┌────────────────────────────────────────────────────────────┐
|
||
│ Execution Environments: local / Docker / SSH / Modal │
|
||
└────────────────────────────────────────────────────────────┘
|
||
```
|
||
|
||
**三层语义**:
|
||
- **第一层(Surfaces)**:人/系统如何与 Agent 对话(CLI、聊天平台、Cron)
|
||
- **第二层(Agent Core)**:循环 + 四个可插拔子系统(工具、技能、记忆、模型)
|
||
- **第三层(Execution)**:Shell/代码执行的实际运行环境
|
||
|
||
### 1.3 核心组件
|
||
|
||
| 组件 | 文件 | 功能 |
|
||
|------|------|------|
|
||
| AIAgent | `run_agent.py` | 核心对话循环,同步编排引擎 |
|
||
| HermesCLI | `cli.py` | 交互式终端 UI |
|
||
| Gateway | `gateway/run.py` | 消息平台网关 |
|
||
| Tool Registry | `tools/registry.py` | 61 个注册工具,52 个工具集 |
|
||
| SessionDB | `hermes_state.py` | SQLite + FTS5 全文本搜索 |
|
||
| Prompt Builder | `agent/prompt_builder.py` | 系统提示组装 |
|
||
| Skill Manager | `agent/skill_commands.py` | 技能生命周期管理 |
|
||
|
||
### 1.4 Agent 循环(核心执行流程)
|
||
|
||
```
|
||
1. 接收输入 ── CLI / gateway / cron / ACP / web
|
||
2. 构建系统提示 ── persona + memory + skills + tools(会话期间仅一次)
|
||
3. 解析 Provider ── 选择哪个 API key + endpoint
|
||
4. 调用模型 ── 支持 4 种 API 模式:
|
||
chat_completions | codex_responses | anthropic_messages | bedrock_converse
|
||
5. 解析响应:
|
||
├─ 存在 tool_calls → 分发到 registry → 追加结果 → 回到步骤 4
|
||
└─ 否则 → 最终回复 → 展示 → 持久化 → 完成
|
||
6. 持久化 ── SQLite SessionDB(WAL 模式 + FTS5 索引)
|
||
```
|
||
|
||
---
|
||
|
||
## 二、Harness 的定义与作用
|
||
|
||
### 2.1 什么是 Harness?
|
||
|
||
Harness 是围绕模型的基础设施层,它将 LLM 转化为**可控的、可审计的、可投入生产使用的智能体**。具体包括:
|
||
|
||
| Harness 职责 | Hermes 实现 |
|
||
|-------------|------------|
|
||
| **工具中介** (Tool Mediation) | 61 个内置工具 + 动态 MCP 集成 |
|
||
| **上下文管理** (Context Management) | 三层记忆 + FTS5 检索 + 上下文压缩 |
|
||
| **委托分发** (Delegation) | 最多 3 个并发子 Agent |
|
||
| **安全控制** (Safety Control) | 四层防护:Tirith 扫描 / Regex 检测 / LLM 风险评级 / 审批范围 |
|
||
| **编排调度** (Orchestration) | AIAgent 单一类服务所有入口 |
|
||
|
||
### 2.2 五大子系统
|
||
|
||
```
|
||
Central Orchestration Core
|
||
│
|
||
┌────┼────┬────┬────┐
|
||
▼ ▼ ▼ ▼ ▼
|
||
┌────┐┌────┐┌────┐┌────┐┌──────┐
|
||
│Skill││Memory│ │Tool│ │Gateway││Learning│
|
||
│System││System│ │Eco-│ │Layer │ │ Loop │
|
||
│ │ │ │ │system│ │ │ │ │
|
||
└────┘└────┘└────┘└────┘└──────┘
|
||
```
|
||
|
||
### 2.3 从 Harness 进化到 Hermes 的五层映射
|
||
|
||
| Harness 层 | → | Hermes 进化 |
|
||
|-----------|---|------------|
|
||
| 指令层 | → | **技能系统**:静态提示模板 → 动态可进化技能 |
|
||
| 约束层 | → | **工具权限**:刚性执行边界 → 粒度化权限模型 |
|
||
| 反馈层 | → | **学习循环**:Harness 将反馈当日志 → Hermes 闭合循环 |
|
||
| 记忆层 | → | **三层记忆**:临时上下文 → Session/Persistent/Skill 三层结构 |
|
||
| 编排层 | → | **子 Agent 委托**:单线程 → 最多 3 个并发子 Agent |
|
||
|
||
---
|
||
|
||
## 三、创新点(核心差异化)
|
||
|
||
### 3.1 学习循环飞轮(最核心创新)
|
||
|
||
Hermes 区别于其他 Agent 框架的根本在于**五步学习循环**,形成自我强化飞轮:
|
||
|
||
```
|
||
┌─────────────┐
|
||
│ 1. 记忆管理 │ ── 评估对话,筛选值得保留的信息
|
||
└──────┬──────┘
|
||
▼
|
||
┌─────────────┐
|
||
│ 2. 技能创建 │ ── 重复模式 → 自动蒸馏为新 Skill
|
||
└──────┬──────┘
|
||
▼
|
||
┌─────────────┐
|
||
│ 3. 技能自改进│ ── 达尔文压力:表现好的技能存活并传播
|
||
└──────┬──────┘
|
||
▼
|
||
┌─────────────┐
|
||
│ 4. FTS5 召回│ ── 全量历史语义检索,不只依赖当前上下文
|
||
└──────┬──────┘
|
||
▼
|
||
┌─────────────┐
|
||
│ 5. 用户建模 │ ── 通过 Honcho 构建用户画像(风格/专业/偏好)
|
||
└──────┬──────┘
|
||
│
|
||
└────── "更好记忆 → 更好技能 → 更好结果 → 更丰富反馈 → 更精确用户模型 → 更相关记忆"飞轮闭环
|
||
```
|
||
|
||
**关键**:Agent 通过 `skill_manage` 工具自己编写 Skills,自己编辑 MEMORY.md——不是人类在改代码,而是 Agent 在自我进化。
|
||
|
||
### 3.2 三层记忆架构(类人认知)
|
||
|
||
| 层级 | 类型 | 内容 | 存储 | 回答问题 |
|
||
|------|------|------|------|---------|
|
||
| Session Memory | 情景记忆 | 单次对话全内容、工具调用结果、推理步骤 | SQLite | "这次对话发生了什么?" |
|
||
| Persistent Memory | 语义记忆 | 身份、关系、长期知识 | MEMORY.md + USER.md(纯文本) | "我是谁?用户是谁?" |
|
||
| Skill Memory | 程序记忆 | 如何执行任务的步骤 | `~/.hermes/skills/` 的 Markdown | "我怎么做这件事?" |
|
||
|
||
这三重结构**直接对应人类认知架构**(情景/语义/程序记忆),是有意为之的设计哲学,而非偶然。
|
||
|
||
### 3.3 技能系统(Skills as Runbooks)
|
||
|
||
Skills 不是代码,也不是配置,而是**Agent 可读取和增长的 Markdown 运行手册**:
|
||
|
||
```yaml
|
||
---
|
||
name: article-summarizer
|
||
description: 以结构化格式总结文章
|
||
triggers:
|
||
- summarize
|
||
- tl;dr
|
||
tools:
|
||
- web_search
|
||
- web_scraper
|
||
- file_write
|
||
---
|
||
|
||
# Article Summarizer
|
||
|
||
你是一个善于提炼文章为清晰结构化摘要的专家。
|
||
|
||
## Instructions
|
||
1. 使用 web_search 或 web_scraper 获取文章内容
|
||
2. 识别核心论点、支撑论据和结论
|
||
3. 格式化摘要为:
|
||
- **论点**:一句话核心论点
|
||
- **关键点**:3-5 个要点
|
||
- **结论**:影响和收获
|
||
4. 如有需要保存摘要
|
||
```
|
||
|
||
**三种来源**:
|
||
1. **内置技能(40+)**:开箱即用
|
||
2. **Agent 自创技能**:重复模式 → 自动蒸馏 → 存放本地 → 可继续改进
|
||
3. **社区 Skills Hub**:遵循 agentskills.io 标准,可分享安装
|
||
|
||
### 3.4 渐进式加载(Progressive Disclosure)
|
||
|
||
Hermes 不一次性加载所有技能、记忆和工具文档,而是分层加载:
|
||
|
||
| 层级 | 内容 | 时机 |
|
||
|------|------|------|
|
||
| Level 0 | Skills 索引(名称+描述) | 始终在系统提示中 |
|
||
| Level 1 | 实际技能内容 | Agent 真正需要时才注入 |
|
||
| Level 2 | 引用的外部文件 | 技能自己请求时才加载 |
|
||
|
||
这就是为什么 Hermes 可以携带 47 个工具和数十个技能,而不会超出上下文限制。
|
||
|
||
### 3.5 平台无关核心(One Agent, Many Surfaces)
|
||
|
||
单个 `AIAgent` 类服务所有入口,平台差异只存在于薄薄的适配层:
|
||
|
||
| 入口 | 说明 |
|
||
|------|------|
|
||
| CLI / TUI | 交互式终端 |
|
||
| Gateway | 20 个消息平台(Telegram/Discord/Slack/WhatsApp/飞书/微信等) |
|
||
| ACP | VS Code / Zed / JetBrains IDE 集成 |
|
||
| Cron | 定时任务(JSON 配置,支持绑定技能) |
|
||
| Batch Runner | 批量轨迹生成(训练数据管道) |
|
||
| Web UI | 网页界面 |
|
||
| API Server | REST API |
|
||
|
||
跨平台对话连续性:用户可以在 Telegram 开始对话,切换到 Discord 继续,全程共享同一上下文。
|
||
|
||
### 3.6 自注册模式(Self-Registration)
|
||
|
||
工具和插件在**导入时**通过 `registry.register(...)` 自注册,而不是维护中心列表:
|
||
- 新增工具 = 新增一个 `.py` 文件,无需修改其他代码
|
||
- MCP 服务器即插即用
|
||
- 插件通过 `~/.hermes/plugins/` 自动发现
|
||
|
||
### 3.7 提示缓存友好设计(Prompt Stability)
|
||
|
||
系统提示在会话启动时组装,**会话期间不改变**。原因:
|
||
- Anthropic / OpenAI 的提示缓存要求稳定前缀才能命中
|
||
- 会话中改变工具集、重新加载记忆会破坏缓存,成本可能增加 **10 倍**
|
||
- 新记忆在磁盘写入,但系统提示不变——下次会话生效
|
||
|
||
### 3.8 四层安全防护
|
||
|
||
```
|
||
第1层:Tirith(Rust 外部扫描器)
|
||
└─ 同形异义词 URL、终端注入(ANSI 转义隐藏命令)
|
||
|
||
第2层:Regex 危险命令检测
|
||
└─ 归一化后检测(忽略大小写/空格),防止 RM -RF 绕过
|
||
|
||
第3层:Smart Approval(LLM 风险评级)
|
||
└─ 低风险自动批准,中/高风险需人工确认
|
||
|
||
第4层:Approval Scopes(信任累积)
|
||
└─ Once / Session / Permanent 三级,逐步建立信任
|
||
```
|
||
|
||
### 3.9 执行环境抽象
|
||
|
||
同一工具可在不同执行环境中运行,Agent 本身无感知:
|
||
|
||
| 环境 | 用途 | 隔离级别 |
|
||
|------|------|---------|
|
||
| local | 开发笔记本,最快,零隔离 | 无 |
|
||
| docker | 共享开发机,每个会话一个容器 | 容器级 |
|
||
| ssh | 远程 VM | VM 级 |
|
||
| daytona / modal | Serverless 沙箱,按需启动 | 强隔离 |
|
||
| singularity | HPC 集群 | 集群级 |
|
||
|
||
---
|
||
|
||
## 四、设计原则汇总
|
||
|
||
| 原则 | 实践 |
|
||
|------|------|
|
||
| **提示稳定性** | 系统提示会话期间不变,不破坏缓存 |
|
||
| **可观察执行** | 每个工具调用通过 callbacks 对用户可见 |
|
||
| **可中断** | API 调用和工具执行可在中途取消 |
|
||
| **平台无关核心** | 一个 AIAgent 服务所有入口,平台差异在适配层 |
|
||
| **松耦合** | MCP、插件、记忆提供者使用注册模式,不硬依赖 |
|
||
| **Profile 隔离** | 每个 profile(`-p <name>`)拥有独立 HERMES_HOME、配置、记忆、会话和 Gateway PID |
|
||
|
||
---
|
||
|
||
## 五、技术规格速览
|
||
|
||
| 指标 | 数值 |
|
||
|------|------|
|
||
| GitHub Stars | 47K+(42天内) |
|
||
| AIAgent 代码行数 | ~13,700 行 |
|
||
| HermesCLI 代码行数 | ~11,500 行 |
|
||
| GatewayRunner 代码行数 | ~12,200 行 |
|
||
| 内置工具数 | 61 个 |
|
||
| 工具集数 | 52 个 |
|
||
| 消息平台适配器 | 20 个 |
|
||
| 支持 Provider | 18+(OpenRouter/OpenAI/Anthropic/Ollama 等) |
|
||
| 记忆存储 | SQLite(WAL+FTS5)|
|
||
| 技能存储 | `~/.hermes/skills/`(Markdown + YAML frontmatter)|
|
||
| MCP 集成 | 支持,可连接 6,000+ 外部应用 |
|
||
| 并发子 Agent | 最多 3 个 |
|
||
| 测试覆盖 | 3,000+ 测试用例 |
|
||
|
||
---
|
||
|
||
## 六、与其他框架的对比
|
||
|
||
| 维度 | **Hermes Agent** | OpenClaw | Claude Code |
|
||
|------|-----------------|----------|-------------|
|
||
| 架构哲学 | 自我进化 + 记忆连续性 | 模块化 + 可组合性 | Anthropic 生态深度集成 |
|
||
| 记忆模型 | 三层(Session/Persistent/Skill)+ Honcho 用户建模 | 可配置记忆后端,无结构化分层 | Session 级上下文 + CLAUDE.md |
|
||
| 技能系统 | 最成熟(内置+自创+社区),支持自动蒸馏 | 插件系统,无自动技能蒸馏 | 紧耦合生态,无社区分享 |
|
||
| 工具生态 | 40+ 内置 + 6,000+ MCP | 可比内置规模,MCP 较小 | 主要终端+文件系统,MCP 较新 |
|
||
| 多平台 | **14 平台 + 跨平台连续性** | 支持但连续性较弱 | 主要 CLI,网页访问通过 API |
|
||
| 自我改进 | **飞轮学习循环**,真正的自动进化 | 实验性功能,未生产就绪 | 依赖 CLAUDE.md 手工更新 |
|
||
| 最适合场景 | 需要随时间变强的 Agent,跨平台使用 | 追求模块化定制的用户 | Anthropic 生态深度用户 |
|
||
|
||
---
|
||
|
||
## 七、关键洞察总结
|
||
|
||
> **Hermes 的核心创新不是某一个功能,而是一个范式**:将 Agent 视为一个认知系统,而非一个 API 包装器。
|
||
|
||
1. **Harness 是控制层**:模型是引擎,Harness 是控制系统。没有 Harness 的 LLM 生产部署是危险的。
|
||
2. **记忆即知识**:三层记忆架构(情景/语义/程序)使 Agent 拥有真实的跨会话连续性。
|
||
3. **技能即进化**:Agent 自己编写 Skills,不是人类工程师在维护——这是真正的自我改进。
|
||
4. **平台无关是工程纪律**:一个核心,多个表面,所有平台差异在适配层消失。
|
||
5. **提示缓存是经济问题**:Mid-session 的"聪明"改动可能让你的 API 成本增加 10 倍。
|
||
|
||
---
|
||
|
||
*整理自:Hermes Agent 官方架构文档(hermes-agent.nousresearch.com)、PyShine Orange Book、dev.to 技术深度解析、ArXiv 研究论文 "Architectural Design Decisions in AI Agent Harnesses"(2604.18071v1)等多个来源。*
|