AI Agent 工作原理深度解析 — 以 Hermes Agent 为例
从 ReAct 循环到工具系统,从记忆到多 Agent 协作,用一款真实开源框架讲清楚 AI Agent 到底怎么工作的。
🎬 一、开篇:当 Chatbot 变成 Agent
假设你跟你的 AI 助手说:
“帮我查一下东京下周的天气预报,把结果存到 Obsidian 笔记里,然后发封邮件告诉我同事。”
如果这是一个传统 Chatbot,它会回答你:“好的,我建议你查一下天气网站,然后用 Obsidian 的手动功能记下来,再到邮箱里发邮件。“——它只能说,不能做。
但如果这是一个 AI Agent,它会:
- 用浏览器打开天气网站 → 查到东京下周的天气
- 用文件工具在 Obsidian vault 创建一篇 Markdown 笔记
- 调用邮件客户端发送总结邮件
整个过程不需要你碰一下键盘。
这就是 AI Agent 和 Chatbot 的根本区别:Chatbot 回答问题,Agent 执行任务。它不再只是语言模型——它是一个能调用工具、操作环境、自主决策的数字员工。
那么,一个 AI Agent 内部到底是怎么工作的?是什么机制让语言模型从”会说话”变成了”会干事”?
这篇文章用 Hermes Agent(一个完全开源的生产级 AI Agent 框架)作为解剖样本,一步步拆解 Agent 的核心原理。Hermes 由 Nous Research 开发,它支持 20+ 模型提供商、运行在 CLI / Telegram / Discord / Feishu 等 20+ 平台上、有持久化记忆和自进化技能系统——用来理解 AI Agent 的架构再合适不过。
▲ Hermes Agent 完整系统架构:接入层 → 核心层 → 能力层 → 模型层,四层分离设计
🧠 二、Agent 核心循环:Think → Act → Observe
2.1 ReAct 范式
所有现代 AI Agent 都建立在一个底层范式上:ReAct(Reasoning + Acting)。
2023 年,Shinn 和 Yao 等人发表了开创性的论文 ReAct: Synergizing Reasoning and Acting in Language Models,提出了一种思路:为什么不把 LLM 的推理(Reasoning)和行动(Acting)结合起来,而不是分开?
ReAct 的核心循环极其简洁:
Observe(观察环境/用户输入)
→ Think(推理,决定下一步做什么)
→ Act(调用工具采取行动)
→ Observe(观察工具返回的结果)
→ Think(根据新信息推理)
→ Act(继续行动或给出最终答案)
→ ...
这个循环持续进行,直到 Agent 判断任务完成(即不再需要调用工具,直接输出文本回复)。
2.2 Hermes 的主循环:run_conversation()
在 Hermes Agent 中,这个循环的实现位于 agent/conversation_loop.py,核心函数 run_conversation() 约 3900 行,是 Agent 的心脏。
简化后的伪代码:
def run_conversation(agent, user_message, conversation_history):
# 1. 构建/恢复系统提示词(缓存的,会话内只构建一次)
active_system_prompt = restore_or_build_system_prompt(agent)
# 2. 准备消息列表(system + history + 当前用户消息)
messages = build_messages(active_system_prompt, conversation_history, user_message)
# 3. 主循环
while api_call_count < max_iterations and iteration_budget.remaining > 0:
# 3a. 调用 LLM
response = call_llm(messages, tools=agent.tool_definitions)
# 3b. 检查是否有工具调用
if response.has_tool_calls():
for tool_call in response.tool_calls:
# 分配工具调用
result = handle_function_call(
name=tool_call.function.name,
args=tool_call.function.arguments
)
# 把结果追加到消息列表
messages.append({"role": "tool",
"content": result,
"tool_call_id": tool_call.id})
# 继续循环,让 LLM 看到工具结果后决定下一步
continue
# 3c. 没有工具调用 → 输出最终回复,循环结束
if response.has_text():
final_response = response.text
break
return {"final_response": final_response, "messages": messages}
2.3 一次 Turn 的完整生命周期
当用户发送一条消息时,Agent 内部经历以下阶段:
| 阶段 | 做了什么 | 对应代码 |
|---|---|---|
| Prologue | 消毒用户输入、恢复/构建系统提示词、加载记忆、预压缩检查 | build_turn_context() |
| LLM Call | 将 messages + tool definitions 发给 LLM API | call_llm() |
| Parse | 解析 LLM 返回,区分是文本还是 tool_calls | 响应解析器 |
| Dispatch | 如果是 tool_calls,逐个调用 handle_function_call() | model_tools.py |
| Append | 将工具执行结果以 tool role 追加回消息列表 | 循环体内 |
| Repeat | 带着新消息继续调 LLM | 回到步骤 2 |
| Return | 当 LLM 返回纯文本时,作为最终回复输出 | 循环结束 |
2.4 迭代预算控制
Agent 不能在工具调用循环里无限跑下去。Hermes 有两层保护:
max_iterations(默认 90 次):绝对上限,超过就强制退出iteration_budget:更细粒度的预算控制,每次迭代消耗一个单位,用完后触发 “grace call”(最后一次机会)然后退出
当循环耗尽时,Agent 会输出一个提示告知用户。
▲ 一次 Turn 的完整生命周期:Prologue → LLM 调用 → 决策循环 → 输出结果。橙色虚线框内是核心的 ReAct 循环。
🔧 三、工具系统:Agent 的双手
没有工具的 LLM 只能写作文。有了工具,它才能操作世界。工具系统是 Agent 架构中最关键的工程组件之一。
3.1 工具声明与注册
在 Hermes 中,每个工具都是一个独立的 Python 文件,通过 registry.register() 在模块级别自注册。
# tools/example_tool.py
from tools.registry import registry
def my_tool(param: str) -> str:
return json.dumps({"result": f"处理了: {param}"})
registry.register(
name="my_tool",
toolset="example",
schema={
"name": "my_tool",
"description": "这是一个示例工具",
"parameters": {
"type": "object",
"properties": {
"param": {"type": "string", "description": "输入参数"}
},
"required": ["param"]
}
},
handler=lambda args, **kw: my_tool(param=args.get("param", "")),
check_fn=lambda: True, # 环境检查,不满足则不显示
requires_env=["EXAMPLE_API_KEY"], # 需要的环境变量
)
关键设计亮点:注册是声明式的,不需要在中央列表里手动添加工具。
tools/registry.py 中的 discover_builtin_tools() 函数会扫描 tools/ 目录下的所有 .py 文件,通过 AST 静态分析(不是 import 执行!)判断文件是否包含顶层的 registry.register() 调用,然后才真正 import。
def discover_builtin_tools(tools_dir=None):
for path in sorted(tools_path.glob("*.py")):
source = path.read_text()
tree = ast.parse(source)
if any(is_registry_register_call(stmt) for stmt in tree.body):
importlib.import_module(f"tools.{path.stem}")
💡 这意味着新增一个工具只需要写一个文件 + 一行
registry.register(),框架自动发现和加载。
3.2 ToolEntry 数据结构
注册后的工具被包装为 ToolEntry 对象:
class ToolEntry:
__slots__ = (
"name", # 工具名,LLM 通过这个名字调用
"toolset", # 所属工具集(如 web, terminal, file)
"schema", # OpenAI Function Calling 格式的 JSON Schema
"handler", # 实际执行的函数
"check_fn", # 可用性检查函数
"requires_env", # 需要的环境变量列表
"is_async", # 是否异步
"description", # 人类可读描述
"emoji", # 显示用 emoji
)
这个结构体在三个地方被使用:
- 生成
tool_definitions→ 传给 LLM API 作为 tool schema - 调度执行 →
handle_function_call()查找并调用 handler - UI 展示 →
hermes tools list显示可用工具
3.3 工具调度流程
当 LLM 返回 tool_calls 时,model_tools.py 中的 handle_function_call() 负责调度:
LLM 返回: {function: "web_search", arguments: {query: "东京天气"}}
│
▼
1. 参数类型强制转换 (coerce_tool_args)
└─ 字符串 "42" → 整数 42(schema 一致性)
│
▼
2. Tool Search Bridge 检查
└─ 如果是 tool_search/tool_describe → 走目录查询路径
│
▼
3. 安全中间件检查
└─ pre_tool_call hook → 权限验证 → 命令审批
│
▼
4. 调用 handler
└─ 执行实际函数 → 返回 JSON 字符串
│
▼
5. 结果限幅 (max_result_size_chars)
└─ 防止超长结果撑爆上下文
│
▼
6. post_tool_call hook
└─ 审计日志、性能追踪
3.4 Toolset 分组管理
Hermes 的工具按功能分组为 toolsets,可以在配置中按需启用/禁用:
| Toolset | 工具举例 | 场景 |
|---|---|---|
web | web_search, web_extract | 信息检索 |
browser | browser_navigate, browser_click | 网页交互 |
terminal | terminal() | 执行 Shell 命令 |
file | read_file, write_file, patch | 文件操作 |
code_execution | execute_code | 沙箱 Python 执行 |
memory | memory() | 读写持久化记忆 |
delegation | delegate_task | 子代理分发 |
cronjob | cronjob() | 定时任务管理 |
每个工具集中包含的工具只有在满足条件时才会暴露给 LLM,通过 check_fn 实现:
# 只有设置了 OPENROUTER_API_KEY,web_search 工具才可见
def check_requirements() -> bool:
return bool(os.getenv("OPENROUTER_API_KEY"))
3.5 与其他框架的对比
大多数 Agent 框架的工具系统都遵循 OpenAI Function Calling 格式的 schema,差别在于:
- Hermes:工具是 Python 函数 + 声明式注册,零配置自动发现,每个工具可以独立控制可见性
- Claude Code:工具硬编码在二进制中,用户无法自定义
- Codex:Rust 二进制,工具通过 sandbox 权限系统控制,MCP 插件扩展
- OpenClaw:通过插件系统扩展工具
📝 四、系统提示词工程:Agent 的灵魂
系统提示词(System Prompt)是 Agent 大脑的操作系统。它告诉 LLM:你是谁、你能用什么工具、你的可用资源是什么、你要遵守什么规则。
4.1 三层架构
Hermes 的 build_system_prompt_parts() 函数(位于 agent/system_prompt.py)将系统提示词拆为三层:
┌─────────────────────────────────────────────┐
│ Volatile(易变层) │
│ - 记忆快照(当前会话的最新记忆) │
│ - 用户画像信息 │
│ - 时间戳(当前日期时间) │
├─────────────────────────────────────────────┤
│ Context(上下文层) │
│ - AGENTS.md / .cursorrules 项目上下文文件 │
│ - 调用者附加的系统消息 │
├─────────────────────────────────────────────┤
│ Stable(稳定层) │
│ - Agent 身份标识(SOUL.md 或默认身份) │
│ - 工具使用指引 │
│ - Skills 索引(当前加载的技能) │
│ - 环境提示(OS、终端类型、平台) │
│ - 模型族操作指导 │
│ - 任务完成指引 │
│ - 并行工具调用指引 │
└─────────────────────────────────────────────┘
4.2 提示词缓存优化
这个三层结构的设计有一个核心目标——最大化前缀缓存命中率。
现代 LLM API(Anthropic、OpenAI 等)支持 Prompt Caching:如果上下文的开头部分与上一次请求相同,缓存命中可以节省 50-90% 的延迟和成本。
Hermes 的策略是:
- 系统提示词在整个会话生命周期内只构建一次,缓存到
agent._cached_system_prompt - 中间不会重建或修改系统提示词的任何部分(这是缓存命中的关键前提)
- 唯一触发缓存失效的事件是上下文压缩(Context Compression)——压缩后需要重建提示词以反映新的记忆状态
def build_system_prompt(agent):
"""只在会话开始时或压缩后调用"""
parts = build_system_prompt_parts(agent)
return "\n\n".join([parts["stable"], parts["context"], parts["volatile"]])
def invalidate_system_prompt(agent):
"""压缩后调用,强制下次重建"""
agent._cached_system_prompt = None
agent._memory_store.load_from_disk()
4.3 分段注入的条件逻辑
不同工具的存在与否会影响系统提示词的内容:
if "memory" in agent.valid_tool_names:
tool_guidance.append(MEMORY_GUIDANCE) # 如何正确使用记忆工具
if "session_search" in agent.valid_tool_names:
tool_guidance.append(SESSION_SEARCH_GUIDANCE) # 如何搜索历史会话
if "skill_manage" in agent.valid_tool_names:
tool_guidance.append(SKILLS_GUIDANCE) # 如何管理技能
这样只会加载与当前可用工具相关的指引,避免冗余文本占用上下文窗口。
💾 五、记忆系统:跨会话的持续性
普通 Chatbot 每次对话都是”失忆”的——关了窗口,一切归零。Agent 需要记住你的偏好、你的项目结构、之前犯过的错误和积累的经验。
5.1 记忆架构
Hermes 的记忆系统是双轨制:
记忆存储 (SQLite / Honcho / Mem0 / ...)
├── memory(工具笔记)
│ └── 环境细节、工具使用技巧、项目约定
│ └── 示例:"用户使用 pytest 测试,习惯用 -n 4 并行"
│
└── user(用户画像)
└── 姓名、角色、偏好、风格
└── 示例:"用户是开发者,偏好 SwiftUI,中文沟通"
5.2 记忆的读写时机
记忆不是每次都重写的,而是有策略地管理:
- 读取:每次新会话开始时,记忆存储调用
format_for_system_prompt()将当前记忆格式化为文本,注入到系统提示词的 Volatile 层 - 写入:由
memory工具触发。当 Agent 发现有用信息(用户偏好、环境细节、纠正内容)时,主动调用memory(action='add')保存 - 更新:当信息过时或用户纠正时,用
memory(action='replace')或memory(action='remove')更新
5.3 后端可插拔
Hermes 支持多种记忆后端:
| 后端 | 特点 | 配置 |
|---|---|---|
| 内建 SQLite | 无需额外服务,零配置 | 默认 |
| Honcho | 多用户、知识图谱关联 | 需 Honcho 插件 |
| Mem0 | 语义搜索、自动关联 | 需 API key |
| Hindsight | 知识图谱 + 时间线 | 需额外配置 |
这种可插拔设计使得记忆系统从”简单的键值存储”扩展到”关系图谱 + 语义搜索”。
📚 六、技能系统:Agent 的自我进化
如果说记忆是 Agent 的”短期 RAM”,技能就是它的”长期程序库”。这是 Hermes 与其他 Agent 框架最核心的区别之一。
6.1 什么是 Skill
Skill 是一个 SKILL.md 文件,结构为 YAML 前端元数据 + Markdown 正文:
---
name: systematic-debugging
description: 4 阶段根因调试方法
tags: [debugging, python, workflow]
version: 1.2.0
---
# 系统性调试
## 触发条件
当遇到 Bug 需要根因分析时:
## 步骤
1. **复现** — …
2. **隔离** — …
3. **根因** — …
4. **修复** — …
每个 Skill 包含:
- 元数据:名称、描述、标签、版本
- 正文:Markdown 格式的完整工作流
- 引用资源(可选):脚本、模板、参考资料
6.2 Skills 的加载机制
加载流程:
- Hermes 在工具列表中发现
skill_manage工具 → 在系统提示词中添加 Skills 使用指引 - 初始扫描:
skills_list检查所有可用 Skill → 构建为<available_skills>区块注入系统提示词 - 基于任务匹配:Agent 根据用户问题判断是否需要加载某个 Skill
- 主动加载:用户也可以
/skill <name>手动加载
6.3 Skills 与记忆的区别
| 维度 | 记忆 (Memory) | 技能 (Skill) |
|---|---|---|
| 内容 | 事实、偏好、配置 | 流程、方法、最佳实践 |
| 结构 | 短文本片段 | 结构化 Markdown |
| 生命周期 | Agent 自动管理 | 用户/Agent 手动创建 |
| 作用域 | 个人化信息 | 通用化工作流 |
| 示例 | ”用户用 pytest" | "如何调试 Python 内存泄漏” |
6.4 自我改进循环
这是 Hermes 最有意思的特性——Agent 可以在工作中自我改进:
完成任务
→ 意识到这个流程有复用价值
→ 调用 skill_manage(action='create') 保存为 Skill
→ 下次遇到类似任务时自动加载
→ 发现问题/流程更新 → skill_manage(action='patch') 更新
🔀 七、任务委派与多 Agent 协作
不是所有任务都需要由主 Agent 亲自完成。有些任务适合并行处理,有些任务需要独立的环境。
7.1 delegate_task() 原理
Hermes 的 delegate_task 工具可以创建一个完全隔离的子 Agent:
主 Agent(当前会话)
│
├── 任务 A → delegate_task()
│ └── 子 Agent(独立会话 + 独立的 terminal + 独立的上下文)
│ ├── Research 子任务
│ └── 返回摘要报告
│
├── 任务 B → delegate_task()
│ └── 另一个子 Agent
│ ├── 代码审查子任务
│ └── 返回审查结果
│
└── 汇总两个子 Agent 的结果,输出给用户
子 Agent 的特点是:
- 独立会话:有自己的消息历史和上下文
- 独立 terminal:有自己独立的 Shell 环境
- 有限的工具集:默认继承主 Agent 的工具
- 无记忆访问:没有持久化记忆,每次重新获取需要的信息通过 context 传递
- 无法再委派:叶子节点不能继续 spawn 子节点
7.2 使用场景
| 场景 | 为什么用委派 | 代码 |
|---|---|---|
| 并行调研 | 同时搜索多个来源,不阻塞主流程 | delegate_task(goal="查论文A", ...) |
| 独立代码审查 | 审查期间不干扰主 Agent 的工作目录 | delegate_task(goal="审查PR diff") |
| 耗时子任务 | 子任务慢但可以不等待 | delegate_task(goal="跑完整测试套件") |
7.3 多 Agent 模式的对比
- Hermes:通过
delegate_task实现轻量级委派,适合短时子任务 - Claude Code:支持子代理,但没有 Hermes 的委派 API 那样结构化的接口
- Codex:Multi-Agent v2(2026 年 6 月),每个子线程有独立的运行时
- OpenClaw:Gateway 原生支持多 Agent,每个 Agent 有自己的 workspace、session 和 auth
⚡ 八、上下文管理
LLM 有上下文窗口限制——即使最新的 GPT-5.5 有 1M token 窗口,一个长时间运行的 Agent 也会触及天花板。上下文管理是 Agent 工程中必须解决的问题。
8.1 主动压缩
Hermes 的压缩策略是主动的——不是在溢出时才动作,而是提前检测:
每次 LLM 调用后:
检查 token 使用量 → 估算剩余窗口
├─ 如果 < 阈值 → 不操作
└─ 如果 > 阈值 → 触发压缩
├─ 保存当前对话历史
├─ 执行 compress_conversation()
│ ├─ 精简工具调用结果(保留关键信息,去掉完整输出)
│ ├─ 合并连续的 non-tool 轮次
│ └─ 保留对话骨架
├─ 重建系统提示词(触发 _invalidate_system_prompt)
└─ 输出 "[Context compressed]" 通知用户
8.2 被动恢复
当 API 返回 413 Payload Too Large 或上下文溢出错误时:
- Hermes 先检查是否开启了压缩(
compression.enabled) - 如果启用了 → 自动压缩历史后重试
- 如果禁用了 → 输出错误提示,让用户手动
/compress或/new
8.3 压缩 vs 截断
关键区别:压缩不是简单地从消息列表头部截断。截断会丢失早期的关键决策信息。Hermes 采用摘要+骨架模式:
压缩前:
[用户] "写一个 FastAPI 用户管理模块"
[助手] → tool_call: terminal("fastapi new ...")
[工具] 返回: 完整输出 2000 行...
[助手] → tool_call: write_file(...) → 返回: 成功
[助手] "已完成,API 端点如下..."
[用户] "加个 rate limiting"
...
压缩后:
[用户] "写一个 FastAPI 用户管理模块"
[助手] → tool_call: terminal("fastapi new ...")
[工具] 返回: [已压缩 — 命令成功执行,耗时 3.2s]
[助手] → tool_call: write_file(...) → 返回: 成功
[助手] "已完成,API 端点如下..."
[用户] "加个 rate limiting"
...
工具结果中的长输出被替换为摘要标签,但对话流程和关键决策保存在保留。
🌉 九、多平台网关
Agent 不一定要生活在终端里。Hermes 的 Gateway 架构让它能同时运行在多个平台。
9.1 Core + Adapter 架构
┌──────────────┐
│ Agent Core │
│ (LLM + 工具) │
└──────┬───────┘
│
┌──────┴───────┐
│ Gateway │
│ Router │
└──────┬───────┘
│
┌────────────────────┼────────────────────┐
│ │ │
┌──────┴──────┐ ┌───────┴───────┐ ┌───────┴──────┐
│ Telegram │ │ Discord │ │ Feishu │
│ Adapter │ │ Adapter │ │ Adapter │
└─────────────┘ └───────────────┘ └──────────────┘
│ │ │
Telegram API Discord API Feishu API
每个平台适配器负责:
- 连接管理:WebSocket / Webhook 长连接
- 消息转换:平台特有格式 ↔ 标准消息格式
- 媒体处理:图片、语音、文件的转换
- 平台特性适配:Markdown 支持度差异、交互限制
9.2 跨平台挑战
| 特性 | Telegram | Discord | Feishu | CLI |
|---|---|---|---|---|
| Markdown 表格 | ✅ | ✅ | ❌ | ✅ |
| 内联代码 | ✅ | ✅ | ✅ | ✅ |
| 长消息截断 | 4096 字符 | 2000 字符 | 无限制 | 无限制 |
| 交互按钮 | ✅ | ✅ | ✅ | ❌ |
| 语音消息 | ✅ | ❌ | ✅ | ❌ |
| 图片 | ✅ | ✅ | ✅ | ✅ |
一个 Agent 核心需要在适配层处理所有这些差异,但对上层 LLM 调用而言,它看到的只是统一的消息接口。
9.3 平台支持的广度
截至 2026 年中,Hermes Gateway 支持 20+ 平台:Telegram、Discord、Slack、WhatsApp、Signal、Email、SMS、Matrix、Mattermost、Home Assistant、钉钉、飞书、企业微信、iMessage、微信、API Server、Webhooks 等。
这是 Hermes 区别于其他 Agent 框架的显著优势——大多数框架只聚焦于 CLI 或单一平台。
⚔️ 十、主流 AI Agent 横向对比
理解了 Agent 的工作原理后,我们来比较一下 2026 年主流的四款 Agent 框架:Hermes Agent、Claude Code、OpenAI Codex 和 OpenClaw。
10.1 总览对比
| 维度 | 🏠 Hermes Agent | 🌀 Claude Code | ⚡ OpenAI Codex | 🌐 OpenClaw |
|---|---|---|---|---|
| 开源性 | ✅ MIT 开源 | ❌ 闭源 | ✅ Apache 2.0 | ✅ 开源 |
| 核心语言 | Python | TypeScript | Rust | TypeScript |
| 模型锁定 | ❌ 无绑定(20+ Provider) | ✅ 仅 Claude 模型 | ✅ 仅 OpenAI 模型 | ❌ 多 Provider |
| 模型灵活度 | ⭐⭐⭐⭐⭐ 任意切换 | ⭐⭐ Claude 独占 | ⭐⭐ OpenAI 独占 | ⭐⭐⭐⭐ 多 Provider |
| 代码能力 | ⭐⭐⭐ 通用 Agent | ⭐⭐⭐⭐⭐ 顶级编码 | ⭐⭐⭐⭐⭐ 顶级编码 | ⭐⭐⭐ 通用 Agent |
| 多平台 | ⭐⭐⭐⭐⭐ 20+ 平台 | ⭐ 仅 CLI | ⭐⭐ CLI + 桌面 App | ⭐⭐⭐⭐⭐ 多 Channel |
| 记忆持久化 | ✅ 内建 SQLite + 外部 | ❌ 无 | ✅ 有 | ✅ 有 |
| 技能/自进化 | ✅ 成熟(核心特性) | ❌ 无 | ✅ Skills(较新) | ✅ Skills |
| 子代理 | ✅ delegate_task | ✅ Sub-agents | ✅ Multi-agent v2 | ✅ 多 Agent 原生 |
| 沙箱安全 | ⚠️ 权限审查 | ✅ 内建安全 | ✅ OS 级 Seatbelt/Landlock | ⚠️ 权限策略 |
| 定时任务 | ✅ Cron 内建 | ❌ | ❌ | ❌ |
| Webhook | ✅ | ❌ | ❌ | ✅ |
| 多 Profile | ✅ | ❌ | ✅ | ✅ |
| MCP 支持 | ✅ 原生 | ✅ | ✅ | ✅ |
| 社区 | ⭐⭐ 建设中 | ⭐⭐⭐⭐ 大厂驱动 | ⭐⭐⭐⭐⭐ 97K+ Stars | ⭐⭐⭐ 增长中 |
| 安装复杂度 | ⭐⭐⭐⭐⭐ 极简 | ⭐⭐⭐⭐ 简单 | ⭐⭐⭐⭐ 简单 | ⭐⭐⭐ 需指导 |
10.2 深度分析:每家之长短
🏠 Hermes Agent — 瑞士军刀
核心定位:通用 AI Agent 框架,不绑定任何模型,可部署到任何平台。
优势:
- 模型自由:支持 20+ 提供商,从 DeepSeek Flash(省钱)到 Claude Opus 4(高质量),随时
/model切换 - 自我进化:Skills 系统是独一无二的特性——Agent 能自己记录和复用工作流,越用越强
- 多平台覆盖:CLI 到 Telegram 到飞书到邮件,同一 Agent 核心在所有平台一致运行
- 持久化记忆:开箱即用的跨会话记忆,无需额外服务
- 自动化:内建 Cron 定时任务 + Webhook,可以做数据采集、日报推送等无人值守工作
- Profile 隔离:多个独立配置文件,工作和个人环境互不干扰
劣势:
- 代码能力中等:本身定位是通用 Agent,不专门优化编码场景(但可以委派给 Claude Code 做代码)
- 社区较小:相比 OpenAI/Anthropic 的产品,社区规模和生态仍在增长中
- 沙箱较薄弱:权限审查依赖 TIRITH,没有 OS 级的强制沙箱
- 性能:Python 核心比 Codex 的 Rust 重,高并发场景有开销
最佳场景:个人助手、多平台自动化、研究分析、知识管理、需要长期记忆和技能积累的场景。
🌀 Claude Code — 代码专家
核心定位:终端原生编码 Agent,Anthropic 出品,Claude 模型独占。
优势:
- 顶级编码能力:Claude 4 Opus/Sonnet 在 SWE-bench 等基准上持续领先,复杂重构、大型代码库理解表现出色
- 安全设计:内建命令审批流程,用户可见每个待执行的 shell 命令
- 与 Claude 生态集成:Projects、Artifacts、MCP 等无缝衔接
- 良好的工作流:与 git 集成、PR 流程、代码审查支持
劣势:
- 严格额度限制:Pro 用户在重度使用时常触发速率限制(社区反映在约 20 条 prompt / 5 小时窗口后出现限制1),完成大型任务需要精打细算——这是社区最大的吐槽点
- 模型锁定:只能用 Claude 模型,无法使用其他模型做特定任务
- 单平台:只有 CLI,不支持 Telegram/Discord 等多平台使用
- 无持久记忆:会话间不能记住用户偏好和历史
- 无自动化调度:没有 Cron/Webhook,不能做定时任务
- 闭源:无法自定义扩展内部行为
社区反馈:2026 年初的配额缩减(约 20 prompt 耗尽 5h 额度)引发了大量 GitHub Issue 投诉,用户反映”完成一个完整功能都困难”。Claude Code 强在质量,弱在可用量。
最佳场景:单次深度代码任务、复杂重构、代码审查。不适合持续运行、多平台或在模型间灵活切换的场景。
⚡ OpenAI Codex — 安全优先的编码平台
核心定位:OpenAI 官方的终端编码 Agent,开源 Rust 实现。
优势:
- 最严格的沙箱安全:macOS 上使用 Apple Seatbelt 框架,Linux 上使用 Landlock + seccomp,从内核级别限制文件系统和系统调用——这是所有 Agent 中最强的安全模型
- 代码能力顶尖:基于 GPT-5.5(400K 上下文),Terminal-Bench 2.0 SOTA 82.7%
- 开源 + 大社区:Apache 2.0 协议,97K+ GitHub Stars,480+ 贡献者
- 成熟的多 Agent:Multi-Agent v2,每个子线程保持独立运行时状态
- 丰富的特性集:MCP、插件、Skills、Permissions 系统、AGENTS.md 项目指引
- 频繁更新:几乎每天发布新版本(v0.145.0-alpha 级别)
劣势:
- 模型锁定:仅支持 OpenAI 模型家族(GPT-5.x),无法切换其他提供商
- Rust 核心高复杂度:97K Stars 也有 8980 个 Open Issues,贡献门槛高
- 仅终端 + 桌面 App:不支持 Telegram/飞书等多平台
- OpenAI 依赖:需要 ChatGPT Plus/Pro 或 API key 使用,有使用成本
- 部分特性实验性:Codex Cloud、部分 Sandbox 功能仍标为实验性
最佳场景:软件开发的完整工作流(编码、调试、审查、PR)、需要严格安全沙箱的环境、OpenAI 生态用户。
🌐 OpenClaw — 多 Agent 平台
核心定位:个人 AI 助手平台,Gateway 原生多 Agent 架构。
优势:
- Gateway 原生架构:从第一天起就是 Gateway-First 设计,Agent 通过 Gateway 路由消息,天然支持多 Agent 运行时
- 丰富 Channel 支持:Discord、飞书、Google Chat、iMessage、Teams、QQ Bot、Signal、Slack、Telegram、WhatsApp 等
- 完整的工作区管理:每个 Agent 有独立 workspace、session、auth
- 技能系统:支持 Skills,类似 Hermes 的过程知识复用
- 现代化的 onboarding:交互式设置向导 (
openclaw onboard),用户体验好 - Crestodian 对话式运维:可以用自然语言对话修复配置
劣势:
- 文档分散:docs.openclaw.ai 和 docs2.openclaw.ai 两个域名,信息割裂
- 核心语言:TypeScript,对部分 Python 生态用户不太友好
- 社区规模中等:不如 Hermes 在 Nous 社区中的活跃度
- 沙箱安全薄弱:依赖权限策略配置,无 OS 级强制沙箱
- 迁移复杂度:从 Hermes 迁移有独立流程(
openclaw onboard --flow import),但学习曲线存在
最佳场景:多 Agent 协作环境、需要多平台收发消息的个人助理、Ops 运维场景。
10.3 选型建议
| 你的需求 | 推荐框架 | 理由 |
|---|---|---|
| 写代码、重构、修 bug | Claude Code 或 Codex | 编码能力最强,专项优化 |
| 全平台个人助理(工作+生活) | Hermes Agent | 多平台 + 记忆 + 技能 + 定时任务 |
| 需要严格安全沙箱 | OpenAI Codex | 内核级沙箱,无可匹敌 |
| 多 Agent Ops 平台 | OpenClaw | Gateway 原生多 Agent 架构 |
| 不想被一个模型绑定 | Hermes Agent | 20+ Provider,随时切换 |
| 自动化定时任务 | Hermes Agent | 唯一内建 Cron + Webhook 的框架 |
| 轻量级单次编码任务 | Claude Code | 命令行一句话,即开即用 |
| 给团队用的 AI 平台 | OpenClaw | 多 Agent + 多 Channel + 权限管理 |
🔮 十一、总结与展望
11.1 Agent 的核心要素
通过解剖 Hermes Agent,我们看到了一个生产级 AI Agent 需要哪些组件:
- ReAct 循环 — Think → Act → Observe 的持续迭代
- 工具系统 — 将 LLM 与真实世界连接的自注册、自发现机制
- 系统提示词工程 — 缓存友好的三层架构,兼顾稳定性与时效性
- 持久化记忆 — 跨会话的知识沉淀
- 技能/过程知识 — Agent 的自我进化能力
- 委派与合作 — 多 Agent 并行工作
- 上下文管理 — 在有限的窗口内高效工作
- 多平台适配 — 一个核心,多渠道
11.2 当前局限
Agent 在实际生产中仍然面临一些没有完美解决的问题:
- 工具执行可靠性:LLM 可能产生格式错误的 tool_calls、幻觉参数、或者在不该调用时调用
- 错误恢复成本:一次失败的 API 调用 → 重试 → 上下文膨胀 → 更多的 token 消耗
- 上下文窗口永远不够:即使 1M token 也会在长时间自主任务中耗尽
- 安全与权限:让 Agent 既能自由操作,又不会做不该做的事——这个平衡尚未完美解决
11.3 趋势与方向
展望未来 1-2 年,AI Agent 的几个明确方向:
- 从框架到操作系统:Agent 越来越像一个自主操作系统——管理进程(子代理)、调度资源(上下文/算力)、持久化状态
- 多 Agent 协作(MoA):不是单个更强的 Agent,而是多个专业 Agent 像团队一样协作
- 记忆即基础设施:从”可选功能”变成”核心基础设施”,类似数据库之于 Web 应用
- Agent-to-Agent 通信:不同框架的 Agent 互相发现、互相委派任务(MCP 是这个趋势的第一步)
- 长期自主任务:从”几分钟的任务”到”持续数天的项目”——Hermes 的 Cron + Webhook + Skills 正在指向这个方向
文中涉及的 Hermes Agent 源码分析基于 NousResearch/hermes-agent 项目。核心循环代码在 agent/conversation_loop.py,工具注册在 tools/registry.py,系统提示词构建在 agent/system_prompt.py。