第 9 章

Hermes 1 → 2 → 3 → 4 版本里程碑

第九章:Hermes 版本里程碑:从 1 到 4 的技术演进

每一代 Hermes 都不仅仅是参数规模的扩张,而是训练哲学的根本性转变。理解这条演进脉络,是掌握 Hermes 4 能力边界的前提。


9.1 版本演进总览

NousResearch 的 Hermes 系列自 2023 年发布以来,历经四个主要版本,每一代都在训练数据构成、对齐策略和目标任务上发生了质的飞跃。下表给出了各版本的关键维度对比:

维度 Hermes 1 Hermes 2 Hermes 3 Hermes 4
发布时间 2023 Q2 2023 Q4 2024 Q2 2025 Q1
基础模型 LLaMA-13B Mistral-7B / LLaMA-2-70B LLaMA-3-8B/70B LLaMA-3.1-405B
核心定位 通用指令跟随 增强推理与角色扮演 多模态+函数调用 原生 Agent 轨迹训练
训练数据规模 ~300K 对话 ~1M 对话 ~3M 对话+合成数据 ~10M Agent 轨迹
主要对齐方法 SFT SFT + RLHF SFT + DPO SFT + Atropos RL
工具调用能力 有限 标准 FC 原生 40+ 工具
AgentBench 得分 N/A 18.2 34.7 61.3

9.2 Hermes 1:指令跟随的奠基者(2023 Q2)

9.2.1 诞生背景

2023 年春,ChatGPT 的爆火使开源社区意识到"指令跟随能力"的战略价值。LLaMA 原始权重虽然在预训练上质量极高,但缺乏自然对话能力。Hermes 1 的使命就是用精心筛选的对话数据,让 LLaMA-13B 具备实用的助手能力。

9.2.2 核心技术突破

数据质量革命

Hermes 1 的最大贡献不在于模型规模,而在于数据哲学。NousResearch 团队从 GPT-4 生成的海量对话中进行了严格的质量筛选,保留率仅约 15%。筛选标准包括:

# Hermes 1 数据筛选的核心逻辑(重建版)
def quality_filter(conversation: dict) -> bool:
    instruction = conversation["instruction"]
    response = conversation["response"]
    
    # 指令长度检查:过短的指令往往模糊
    if len(instruction.split()) < 5:
        return False
    
    # 响应与指令的关键词覆盖率
    instruction_keywords = extract_keywords(instruction)
    coverage = sum(1 for kw in instruction_keywords 
                   if kw in response) / len(instruction_keywords)
    if coverage < 0.6:
        return False
    
    # 排除纯闲聊对话
    if is_chitchat(instruction, response):
        return False
    
    return True

训练配方

Hermes 1 使用标准 SFT(Supervised Fine-Tuning),在 4 块 A100-80G 上训练约 3 个 epoch:

# 训练启动命令(近似重建)
torchrun --nproc_per_node=4 train.py \
  --model_name_or_path meta-llama/Llama-13b-hf \
  --data_path ./hermes_v1_filtered.json \
  --bf16 True \
  --num_train_epochs 3 \
  --per_device_train_batch_size 4 \
  --gradient_accumulation_steps 8 \
  --learning_rate 2e-5 \
  --lr_scheduler_type cosine \
  --warmup_ratio 0.03

9.2.3 Benchmark 表现

评测集 LLaMA-13B(基础) Hermes 1 提升幅度
MT-Bench 4.2 6.8 +61.9%
AlpacaEval 38.4% 67.2% +75.0%
MMLU 46.9 52.3 +11.5%
HumanEval 15.8 24.1 +52.5%

9.2.4 局限与不足

Hermes 1 本质上仍是"模仿学习"——它学会了模仿 GPT-4 的风格,但缺乏真正的推理链训练。在需要多步推理的数学题和复杂逻辑任务上,表现明显不足。


9.3 Hermes 2:推理与角色扮演的双线突破(2023 Q4)

9.3.1 战略转型

2023 年下半年,开源社区经历了"7B 时代"的觉醒——Mistral-7B 的发布证明小模型也能达到惊人的能力密度。Hermes 2 顺势切换到 Mistral-7B 作为主要基础模型,同时推出了 LLaMA-2-70B 版本。

更重要的是,Hermes 2 引入了角色扮演(Roleplay)数据思维链(Chain-of-Thought)数据,形成双轨训练策略。

9.3.2 核心创新:ChatML 格式统一

Hermes 2 的一个被低估的贡献是推广了 ChatML 格式,这一格式后来成为开源社区的事实标准:

<|im_start|>system
你是一个有帮助的 AI 助手,名为 Hermes。
<|im_end|>
<|im_start|>user
请解释量子纠缠的基本原理。
<|im_end|>
<|im_start|>assistant
量子纠缠是量子力学中最神秘的现象之一...
<|im_end|>

这种格式的优势在于:

  1. 清晰的角色边界,防止角色混淆
  2. 支持多轮对话的自然扩展
  3. 与主流推理框架(vLLM、llama.cpp)完美兼容

9.3.3 推理能力的飞跃

Hermes 2 引入了大量 CoT(Chain-of-Thought) 训练数据,包括:

# Hermes 2 CoT 数据示例(数学推理)
example = {
    "instruction": "一个工厂每天生产 500 个零件,其中 3% 是次品。\n"
                   "如果质检员每天检查 200 个零件,\n"
                   "平均需要多少天才能发现 5 个次品?",
    "response": """让我一步步来计算:

**第一步:计算次品率**
- 每天生产 500 个零件
- 次品率 3%
- 每天次品数 = 500 × 0.03 = 15 个

**第二步:计算抽检中次品的概率**
- 质检员每天检查 200/500 = 40% 的零件
- 期望发现次品数 = 15 × 40% = 6 个/天

**第三步:计算发现 5 个次品所需天数**
- 每天期望发现 6 个次品
- 发现 5 个次品所需天数 = 5/6 ≈ 0.83 天

**答案:约 0.83 天(即不到一天)**""",
    "source": "hermes2_math_cot"
}

9.3.4 RLHF 的初步引入

Hermes 2 在部分版本中引入了基础的 RLHF 流程:

阶段一:SFT(监督微调)
  ↓
阶段二:奖励模型训练(基于人类偏好对比数据)
  ↓
阶段三:PPO 优化(最大化奖励模型分数)

但这个阶段的 RLHF 仍然是"防御性"的——主要用于减少有害输出,而非提升复杂推理能力。

9.3.5 Benchmark 突破

评测集 Hermes 1 Hermes 2 (7B) Hermes 2 (70B)
MT-Bench 6.8 7.4 8.1
GSM8K 32.1% 63.4% 81.2%
HumanEval 24.1% 42.3% 67.8%
MMLU 52.3% 64.1% 76.4%

9.4 Hermes 3:多模态与函数调用时代(2024 Q2)

9.4.1 时代背景

2024 年上半年,两个趋势重塑了开源 LLM 格局:

  1. LLaMA-3 发布:Meta 带来了迄今最强的开源基础模型
  2. 函数调用标准化:OpenAI 的 Function Calling API 成为行业标准,开源社区迫切需要追赶

Hermes 3 以 LLaMA-3-8B/70B 为基础,重点攻克了这两个方向。

9.4.2 原生函数调用支持

Hermes 3 实现了完整的**结构化函数调用(Structured Function Calling)**系统:

# Hermes 3 函数调用示例
import json

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_weather",
            "description": "获取指定城市的当前天气",
            "parameters": {
                "type": "object",
                "properties": {
                    "city": {
                        "type": "string",
                        "description": "城市名称"
                    },
                    "unit": {
                        "type": "string",
                        "enum": ["celsius", "fahrenheit"],
                        "description": "温度单位"
                    }
                },
                "required": ["city"]
            }
        }
    }
]

# 模型输出格式
tool_call_response = {
    "tool_calls": [
        {
            "id": "call_abc123",
            "type": "function",
            "function": {
                "name": "get_weather",
                "arguments": json.dumps({"city": "北京", "unit": "celsius"})
            }
        }
    ]
}

9.4.3 合成数据的战略转型

Hermes 3 的训练数据中,合成数据首次超过 50%。NousResearch 构建了自动化的数据生成管道:

真实任务种子
    ↓
GPT-4 生成多样化变体
    ↓
自动质量打分
    ↓
过滤 + 去重
    ↓
人工抽检(5% 样本)
    ↓
加入训练集

这一策略的关键洞察是:规模化的合成数据,在质量可控的前提下,能比有限的人工标注数据覆盖更广的任务分布

9.4.4 DPO 替代 PPO

Hermes 3 完全放弃了 PPO,转向 DPO(Direct Preference Optimization)

为什么放弃 PPO?

# DPO 训练的核心逻辑
def dpo_loss(model, ref_model, chosen, rejected, beta=0.1):
    """
    chosen: 被人类标注为更好的响应
    rejected: 被人类标注为较差的响应
    beta: KL 散度权重
    """
    # 计算当前模型的对数概率
    log_prob_chosen = model.log_prob(chosen)
    log_prob_rejected = model.log_prob(rejected)
    
    # 计算参考模型的对数概率
    ref_log_prob_chosen = ref_model.log_prob(chosen)
    ref_log_prob_rejected = ref_model.log_prob(rejected)
    
    # DPO 损失
    chosen_reward = beta * (log_prob_chosen - ref_log_prob_chosen)
    rejected_reward = beta * (log_prob_rejected - ref_log_prob_rejected)
    
    loss = -torch.log(torch.sigmoid(chosen_reward - rejected_reward))
    return loss.mean()

9.4.5 关键 Benchmark

评测集 Hermes 2 (70B) Hermes 3 (8B) Hermes 3 (70B)
MT-Bench 8.1 8.0 8.9
BFCL(函数调用) N/A 72.4% 84.1%
AgentBench 18.2 28.3 34.7
MMLU 76.4% 73.1% 82.6%

9.5 Hermes 4:首个原生 Agent 轨迹模型(2025 Q1)

9.5.1 范式革命

Hermes 4 是整个系列的质变节点。之前三代模型的训练数据本质上都是"对话片段"——单次问答或短对话序列。Hermes 4 首次以完整 Agent 轨迹作为主要训练数据。

什么是 Agent 轨迹?

轨迹 = 任务描述 + [观察₁→动作₁→观察₂→动作₂→...→观察ₙ→最终响应]

一条完整轨迹包含:

9.5.2 Atropos RL 框架

Hermes 4 的训练引入了 Atropos——一个专为 Agent 场景设计的强化学习框架。

┌─────────────────────────────────────────────────────┐
│                  Atropos 训练循环                    │
│                                                      │
│  ┌──────────┐    轨迹    ┌──────────────┐           │
│  │  Agent   │──────────→│  环境执行器  │           │
│  │ (模型)   │           │  (工具/沙箱) │           │
│  └──────────┘           └──────┬───────┘           │
│        ↑                       │ 观察结果            │
│        │ 策略更新               ↓                   │
│  ┌─────┴──────┐    评分   ┌──────────────┐         │
│  │  RL 优化器  │←─────────│    评判者    │         │
│  │  (PPO/GRPO)│           │  (Judge LLM) │         │
│  └────────────┘           └──────────────┘         │
└─────────────────────────────────────────────────────┘

9.5.3 训练数据构成

Hermes 4 的 ~10M 训练样本包含:

数据类型 比例 来源
Agent 轨迹(成功) 45% Atropos 自动采集
Agent 轨迹(失败+修正) 20% 对比学习数据
工具调用对话 15% 合成生成
通用指令跟随 12% 前代精选
代码生成 8% GitHub+合成

9.5.4 核心能力突破

多步规划能力

# Hermes 4 处理复杂任务的思维方式
task = "分析公司过去6个月的销售数据,找出下降趋势,并提出改进建议"

# Hermes 4 的内部规划(<think> 标签内)
planning = """
<think>
这个任务需要多个步骤:
1. 首先读取销售数据文件
2. 检查数据格式和时间范围
3. 计算每月销售额
4. 识别下降趋势(可能需要计算环比/同比)
5. 对下降原因做假设分析
6. 基于数据生成改进建议

工具调用顺序:read_file → python_exec → python_exec → final_response
</think>
"""

错误自我修复

Hermes 4 在训练时见到了大量"错误-修复"轨迹,因此具备显著的自我纠错能力:

[工具调用] python_exec: "import pandas as pd; df = pd.read_csv('data.csv')"
[工具结果] Error: FileNotFoundError: data.csv not found

[Hermes 4 自我修复]
<think>文件不在当前目录,需要先列出文件</think>
[工具调用] shell_exec: "ls -la"
[工具结果] sales_data_2024.csv  report.xlsx  ...

[工具调用] python_exec: "df = pd.read_csv('sales_data_2024.csv')"
[工具结果] 成功读取 1842 行数据

9.5.5 Benchmark 全面提升

评测集 Hermes 3 (70B) Hermes 4 (405B) GPT-4o
AgentBench 34.7 61.3 68.4
GAIA (Level 1) 42.1% 71.8% 73.2%
Terminal-Bench 31.2% 58.9% 62.1%
HumanEval 82.6% 91.4% 90.2%
BFCL 84.1% 92.7% 91.3%

9.6 版本迁移注意事项

9.6.1 从 Hermes 2/3 迁移到 Hermes 4

Prompt 格式变化

# Hermes 3 的系统提示风格
hermes3_system = "You are Hermes, a helpful AI assistant."

# Hermes 4 推荐的系统提示(更明确的 Agent 定位)
hermes4_system = """You are Hermes, an autonomous AI agent with access to tools.
You think step-by-step before acting, use tools when needed, 
and verify your results before responding."""

工具调用格式升级

Hermes 4 采用更严格的 JSON Schema 验证:

# Hermes 3(较宽松)
tool_call_h3 = "<tool>get_weather(city='北京')</tool>"

# Hermes 4(标准 JSON)
tool_call_h4 = {
    "name": "get_weather",
    "parameters": {"city": "北京", "unit": "celsius"}
}

9.6.2 性能权衡

场景 推荐版本 原因
资源受限(<16GB VRAM) Hermes 3 (8B) 性能/资源比最优
单次问答任务 Hermes 3 (70B) 成本更低
复杂 Agent 任务 Hermes 4 (405B) Agent 能力质变
本地部署+Agent Hermes 4 量化版 唯一本地 Agent 级选择

9.6.3 兼容性检查清单

在从 Hermes 3 迁移到 Hermes 4 时,请检查以下项目:

□ 系统提示是否包含 Agent 相关描述?
□ 工具定义是否符合 JSON Schema 规范?
□ 上下文窗口是否从 8K 扩展到了 32K+?
□ 是否启用了思维链(<think> 标签)?
□ 错误处理逻辑是否适应多步重试?
□ 超时设置是否为长轨迹预留了足够时间?

9.7 版本演进的深层逻辑

回顾四代 Hermes 的演进,可以看到一条清晰的哲学脉络:

Hermes 1: 学会"说话"(指令跟随)
    ↓
Hermes 2: 学会"思考"(多步推理)
    ↓
Hermes 3: 学会"使用工具"(函数调用)
    ↓
Hermes 4: 学会"完成任务"(Agent 轨迹)

每一代的突破不是简单的参数叠加,而是训练数据哲学的根本转变。Hermes 4 的里程碑意义在于:它是第一个用任务完成轨迹而非对话片段来定义智能的开源模型


本章小结

思考题

  1. Hermes 4 的训练数据中有 20% 是"失败轨迹"——为什么错误案例对 Agent 训练如此重要?
  2. 从 SFT → RLHF → DPO → Atropos RL 的演进反映了什么核心问题?每种方法解决了什么,又带来了什么新问题?
  3. 如果你需要在 Hermes 3 (70B) 和 Hermes 4 (量化到 70B) 之间选择,你会如何评估两者的能力边界?
  4. "用轨迹训练"与"用对话训练"在根本上的区别是什么?这对模型的泛化能力有何影响?
本章评分
4.7  / 5  (55 评分)

💬 留言讨论