一、为什么 Hermes 适合 Agent 工程
Agent 的本质是让模型在循环中自主决策:思考、调用工具、观察结果、继续推理。这要求模型具备三项能力:
- 结构化输出:能稳定生成 JSON 或特定标记,便于程序解析;
- 函数调用:能根据工具定义选择正确的工具和参数;
- 多轮一致性:在多次交互中保持角色和上下文不漂移。
Nous Research 的 Hermes 系列模型(如 Hermes 2 Pro、Hermes 3)在这三点上表现突出。它支持 OpenAI 风格的 tools 参数,也支持 <tool_call> 标记格式,输出干净、幻觉少,非常适合作为 Agent 的推理核心。
但模型只是引擎,Agent 工程才是底盘。
二、Agent 工程的四个核心问题
一个生产级 Agent 循环,必须回答:
- 状态放哪? 对话历史、工具结果、中间变量如何组织?
- 工具怎么注册? 如何让模型知道有哪些工具、参数是什么?
- 错误怎么办? 工具失败、模型输出格式错误、超时如何恢复?
- 如何观测? 每一步的输入输出、耗时、Token 消耗如何追踪?
Hermes 的函数调用能力解决了“模型如何表达意图”,而工程代码负责“如何执行意图并闭环”。
三、最小 Agent 循环实现
下面用不到 50 行代码,实现一个基于 Hermes 函数调用的 Agent 循环。假设 Hermes 通过 OpenAI 兼容接口提供服务。
import json
from openai import OpenAI
client = OpenAI(base_url="http://localhost:8000/v1", api_key="none")
# 1. 工具定义
tools = [{
"type": "function",
"function": {
"name": "get_weather",
"description": "查询指定城市的天气",
"parameters": {
"type": "object",
"properties": {"city": {"type": "string"}},
"required": ["city"]
}
}
}]
# 2. 工具实现
def get_weather(city: str) -> str:
return f"{city}:晴,25°C"
# 3. Agent 循环
def run_agent(user_input: str, max_steps: int = 5):
messages = [{"role": "user", "content": user_input}]
for _ in range(max_steps):
resp = client.chat.completions.create(
model="hermes-3",
messages=messages,
tools=tools,
tool_choice="auto"
)
msg = resp.choices[0].message
messages.append(msg)
if not msg.tool_calls:
return msg.content # 没有工具调用,直接返回答案
for call in msg.tool_calls:
fn = call.function.name
args = json.loads(call.function.arguments)
result = get_weather(**args) if fn == "get_weather" else "未知工具"
messages.append({
"role": "tool",
"tool_call_id": call.id,
"content": result
})
return "达到最大步数,任务未完成"
print(run_agent("北京今天天气怎么样?"))
这段代码展示了 Agent 工程的最小闭环:用户输入 → 模型决策 → 工具执行 → 结果回填 → 模型再决策。Hermes 负责生成 tool_calls,工程代码负责执行并维护 messages 状态。
四、从能跑到可靠:工程化要点
少量代码能跑通原型,但要让 Agent 稳定工作,还需要以下工程实践。
1. 工具注册与校验
工具定义应集中管理,参数用 JSON Schema 严格约束。执行前校验参数类型,避免模型幻觉导致崩溃。Hermes 对 Schema 遵循度高,但工程侧仍需防御。
2. 错误处理与重试
工具调用可能失败。不要直接把异常抛给模型,而是将错误信息作为 tool 消息返回,让模型决定重试或换工具。例如:
try:
result = get_weather(**args)
except Exception as e:
result = f"工具执行失败:{e}"
3. 并行工具调用
Hermes 支持一次返回多个 tool_calls。工程上可以并行执行,再按 tool_call_id 回填,显著降低延迟。
4. 状态持久化
messages 列表就是 Agent 的状态。每一步后保存快照,即可实现断点续跑、回放调试。生产环境建议用数据库或对象存储持久化。
5. 可观测性
记录每次模型调用的输入、输出、Token 数、耗时,以及每个工具的调用参数和结果。图结构或 Trace ID 能让整个循环可追踪。
6. 安全边界
工具执行应在沙箱或受控环境中进行。对文件、网络、命令执行等敏感操作,必须加权限校验和人工确认节点。
五、Hermes 的提示工程技巧
Hermes 对系统提示敏感。为提升 Agent 稳定性,建议:
- 在系统提示中明确角色:“你是一个乐于使用工具的助手”;
- 列出工具使用规范:“仅在需要实时信息时调用工具”;
- 要求结构化输出:“如果无需工具,直接给出最终答案”;
- 对多轮对话,保持工具结果格式统一。
Hermes 3 还支持 tool_choice 强制调用,适合必须执行某工具的流程。
六、总结
Hermes 提供了可靠的函数调用能力,让模型能“说出”要做什么;Agent 工程则负责“安全、可观测、可恢复地执行”。二者结合,才能从 Demo 走向生产。
核心公式:
Agent = Hermes(推理与函数调用) + 状态管理 + 工具执行 + 错误恢复 + 可观测性
少量代码即可起步,但真正的壁垒在工程细节。当你把 Agent 循环当作一个分布式状态机来设计时,Hermes 的模型能力才能被最大化释放。