Hermes Agent 全栈入门
边学边练请访问 7 天玩转 Hermes Agent 子站,涵盖课表、角色实验室、代码沙箱与社区资源。本文是理论底座;子站提供可交互的 Tool Call Inspector 与 Persona Lab,建议对照阅读。
本文要解决什么问题
很多初学者把 Agent 理解成「给 LLM 接几个 API」。这在 Demo 阶段能跑,一到生产就会遇到三类典型失败:
- 选错工具:模型在十个工具里点了「搜索」而不是「计算器」,或 参数 city 写成了 country。
- 角色漂移:多轮对话后 Agent 忘记自己是「DevOps 助手」,开始闲聊或越权操作。
- 链路不可观测:用户只看到最终一句「查询失败」,无法定位是 Schema 问题、超时还是 Fallback 未配置。
Hermes Agent 在本站语境下,是一套围绕 工具调用(Tool Calling)与自主推理(Autonomous Reasoning) 的工程方法论,名称来自 Nous Research 的 Hermes 系列模型——它们在函数调用、结构化输出与多轮工具链上经过专门对齐训练。你不必绑定 Hermes 模型才能学这套方法;核心是 协议、图谱、角色与可观测性 四件事做对了,换 GPT-4o、Qwen2.5 或本地 Ollama 同样适用。
读完本文,你应能回答:
- Agent 的「四件套」各自负责什么,边界在哪里?
- OpenAI Functions、Hermes
<tool_call>、Claude XML 三种格式如何选型与解析? - Active / Passive 工具描述如何影响注意力与调用准确率?
- 五层 System Prompt 与 ReAct+、Plan-and-Execute 如何组合?
- MCP、LangChain、AutoGen 在架构里分别占哪一层?
一、Agent 四件套:LLM + Tool Graph + Memory + Persona
Hermes 课程 (hermes_frontend 子站)用一张「四件套」心智图贯穿 7 天学习:内核、工具图谱、记忆宫殿、角色面具。它们不是四个独立微服务,而是同一条推理环路上的四个职责分区。
1.1 LLM 内核:不是「更聪明的聊天框」
在 Agent 架构里,LLM 承担三项 不可外包 的认知工作:
| 职责 | 说明 | 常见误区 |
|---|---|---|
| 意图路由 | 判断用户是要查天气、改代码还是闲聊 | 用关键词 if-else 替代,导致同义句失败 |
| 工具选择 | 在 Tool Graph 中选中一个或多个工具及参数 | 工具过多且不分类,注意力稀释 |
| 结果综合 | 将 tool_response 转为人话,并决定是否继续调用 | 把原始 JSON 直接返回给用户 |
Hermes 模型族的优势在于:预训练与 SFT 阶段大量见过 结构化工具回合,对 <tool_call> 块的出现位置、JSON 合法性更稳定。但 工具描述工程 仍决定上限——同一模型,Passive 描述与 Active 描述的工具选择准确率可差 20% 以上(业界 benchmark 常见区间,具体因任务而异)。
注意力机制与工具选择(直觉模型)
可以把一次推理想象成:System Prompt + 工具描述 + 历史消息共同构成「候选动作空间」。模型不是执行 if user.contains("天气") 这样的代码,而是在高维 表示里比较「继续生成文本」与「闭合 tool_call 块」两类轨迹的似然。描述里出现 WHEN / WHEN NOT 相当于在特征空间里拉开类间距离;Passive 描述里只有「参数 query: 字符串」,类间边界模糊,模型更容易选错邻居工具。
1.2 Tool Graph:工具不是列表,是图谱
「Tool Graph」强调三点:
- 节点 = 单个工具(含 Schema、描述、超时、权限)。
- 边 = 允许的调用顺序或数据依赖(例如:必须先
read_pdf再summarize)。 - 元数据 = 成功率、延迟 P99、Fallback 指向哪条边。
与「扁平 tools 数组」相比,图谱思维迫使你回答:
- 哪些工具 互斥(查天气 vs 查股价,不应同时误触)?
- 哪些工具 必须串行(PDF 未读不能摘要)?
- 失败时走 哪条备用边?
LangChain 的 @tool + bind_tools 是图谱的一种轻量实现;MCP 则是把图谱节点托管到独立 Server 上。详见本文第六节。
工具分类(Hermes 课程 Day 3)
| 类别 | 代表工具 | 风险等级 | 描述要点 |
|---|---|---|---|
| 信息类 | search、read_file、wiki | 低 | 强调 freshness 与来源 |
| 计算类 | calculator、python_repl | 中 | 强调精确,禁止心算 |
| 行动 类 | send_email、git_push | 高 | 必须写审批与幂等 |
| 感知类 | vision、speech_to_text | 中 | 写清输入格式与大小限制 |
1.3 Memory:三层记忆,避免「什么都塞进 Context」
| 层级 | 典型实现 | 写入时机 | 读取时机 |
|---|---|---|---|
| 工作记忆 | 当前 messages 列表 | 每轮 user/assistant/tool | 每轮推理 |
| 情节记忆 | 会话摘要、Handoff 包 | 每 N 轮或角色切换 | 新 Agent 接手时 |
| 语义记忆 | 向量库、用户偏好表 | 显式工具或离线 job | RAG 检索后注入 Prompt |
Hermes 路径 Day 4 专讲记忆;入门阶段只需遵守一条纪律:工具返回的大块文本不要永久进 System Prompt,应摘要后写入 episodic 或向量库,否则成本与漂移双杀。
会话压缩示例策略
当 messages 超过 8k tokens 时:保留 System + 最近 6 轮 + 一条「Earlier summary: …」情节记忆。压缩本身可以是一次 无工具的 LLM 调用,输出结构化 {facts, open_tasks, user_prefs},再写回 Memory。这与 Tool Graph 正交,但决定了长任务是否可完成。