开篇:AI Agent 挑战赛的兴起

2025-2026 年,AI Agent 挑战赛像雨后春笋一样冒出来。

从 $2M 级别的企业挑战赛,到 Herald/Hermes 这样的开源 Agent 框架赛事,开发者们在这些比赛中展示了各种创意——从自动代码审查、智能运维助手,到完全自主的电商客服。

Hermes Agent Challenge 是其中比较有代表性的一个。它不是一个"谁做出最强模型"的比赛,而是"谁用已有的模型和工具,做出最有效的 Agent 系统"的比赛。

这个定位很有意思。它考验的不是"你能不能用更好的模型",而是"你能不能用现有的东西,搭出最好的系统"。

这篇文章不是官方报道——是参与者的观察和思考。


一、Hermes Agent Challenge 的设计

挑战赛的核心规则:

  1. 使用 Hermes 框架(一个开源 Agent 框架)搭建 AI Agent
  2. Agent 需要自主完成一系列任务:信息检索、工具调用、多步骤推理
  3. 评判标准:不是"结果好不好",而是"Agent 的决策过程是否合理,方法是否可复现"

1.1 任务示例

挑战赛中的典型任务类型:

任务类别:
1. 信息检索型:从给定的文档集合中找到特定信息,总结后输出
2. 工具调用型:调用多个 API 完成一个工作流
3. 多步骤推理型:根据不完全信息做推理,逐步求证
4. 错误恢复型:在工具调用失败时,Agent 能否自动恢复并继续

这些任务设计的共同点:需要 Agent 展示"决策能力"而不仅仅是"回答能力"。

1.2 评判标准

挑战赛的评分不是"通过/不通过"的二元判定,而是多维度的评分:

@dataclass
class AgentEvaluationResult:
    """
    Agent 的评估结果(Hermes Challenge 评分模型)
    """

    # 任务完成度 (40%)
    task_completion: float          # 0-1: 任务完成的比例

    # 决策质量 (25%)
    decision_quality: float          # 0-1: 每一步决策是否合理
    tool_selection_accuracy: float   # 0-1: 是否使用了正确的工具

    # 错误处理 (20%)
    error_recovery: float            # 0-1: 出错时的处理能力
    graceful_degradation: float      # 0-1: 无法完成任务时的降级处理

    # 可解释性 (15%)
    reasoning_quality: float         # 0-1: 推理过程是否清晰
    auditability: float              # 0-1: 决策过程是否可以追溯

    @property
    def total_score(self) -> float:
        return (
            self.task_completion * 0.4 +
            self.decision_quality * 0.25 +
            self.error_recovery * 0.20 +
            self.reasoning_quality * 0.15
        ) * 100


def evaluate_submission(agent_logs: str, expected_results: Dict) -> AgentEvaluationResult:
    """评估 Agent 的一次任务执行"""

    # 从日志中提取关键事件
    events = parse_agent_events(agent_logs)

    # 1. 任务完成度:Agent 是否完成了所有步骤
    completed_steps = [e for e in events if e["type"] == "task_completed"]
    total_steps = len(expected_results["steps"])
    task_completion = len(completed_steps) / max(total_steps, 1)

    # 2. 决策质量:工具选择是否正确
    tool_calls = [e for e in events if e["type"] == "tool_call"]
    correct_tool_calls = sum(
        1 for tc in tool_calls 
        if tc["tool_name"] == expected_results["expected_tool"][tc.get("step", 0)]
    )
    tool_accuracy = correct_tool_calls / max(len(tool_calls), 1)

    # 3. 错误恢复:当工具调用失败时,Agent 怎么处理
    failures = [e for e in events if e["type"] == "tool_failure"]
    recoveries = [e for e in events if e["type"] == "error_recovery"]
    error_recovery = min(len(recoveries) / max(len(failures), 1), 1.0)

    # 4. 推理质量:Agent 的思考过程是否清晰
    reasoning_steps = [e for e in events if e["type"] == "reasoning"]
    reasoning_quality = min(len(reasoning_steps) / 5, 1.0)  # 期望至少 5 步推理

    return AgentEvaluationResult(
        task_completion=task_completion,
        decision_quality=tool_accuracy,
        tool_selection_accuracy=tool_accuracy,
        error_recovery=error_recovery,
        graceful_degradation=error_recovery,
        reasoning_quality=reasoning_quality,
        auditability=reasoning_quality,
    )

二、从参赛作品中学到的

2.1 高分作品的特征

对比分析公开的参赛作品,高分作品有几个共同特征:

特征 1:误差处理和正常流程一样被重视

这不是猜测——从公开的裁判反馈来看,那些在"意外情况"(API 超时、工具返回空值、中间步骤失败)面前表现从容的 Agent,分数明显更高。

一个常见的模式:

class ErrorAwareAgent:
    """
    高分 Agent 的特征:知道怎么处理异常

    低分 Agent 的特征:假设一切顺利
    """

    def execute_task(self, task: Dict) -> Dict:
        """
        执行任务(带全流程错误处理)
        """

        try:
            # 步骤 1: 检索信息
            info = self.retrieve_information(task["query"])
        except Exception as e:
            # 代替直接报错:尝试替代方案
            print(f"[Agent] 主检索失败: {e},尝试备选方案")
            info = self.fallback_retrieve(task["query"])

            if not info:
                return {
                    "status": "partial",
                    "error": f"无法检索到相关信息: {e}",
                    "completed_steps": [],
                    "suggestion": "请检查文档库是否包含所需信息",
                }

        # 步骤 2: 调用工具
        tool_results = []
        for tool_call in task["tools"]:
            try:
                result = self.call_tool(tool_call)
                tool_results.append(result)
            except TimeoutError:
                print(f"[Agent] 工具超时: {tool_call['name']},重试一次")
                # 重试一次
                try:
                    result = self.call_tool(tool_call, timeout=30)
                    tool_results.append(result)
                except:
                    print(f"[Agent] 工具 {tool_call['name']} 不可用,跳过")
                    continue

        # 如果有部分失败,仍返回已完成的步骤
        if len(tool_results) < len(task["tools"]):
            return {
                "status": "partial",
                "completed_steps": tool_results,
                "failed_steps": len(task["tools"]) - len(tool_results),
                "note": "部分工具调用失败,已跳过不可用的服务",
            }

        return {"status": "completed", "result": self.aggregate(tool_results)}

特征 2:不以"正确答案"为目的,以"正确过程"为目的

高分 Agent 不急着猜答案。它们会先确认自己理解了问题,然后逐步求证。

低分 Agent 的典型行为:
- 看到问题就猜答案,猜对了拿分,猜错了没分
- 没有中间推理步骤,裁判看不到决策过程

高分 Agent 的典型行为:
- 先复述问题,确认理解
- 逐步推理,每一步都有日志
- 不确定的时候,解释不清楚的地方

特征 3:工具调用不是为了调用而调用

低分 Agent 经常犯的错误:不管需不需要,先把所有工具都调一遍。

高分 Agent 的做法:
- 先判断需要哪些工具
- 只调必要的工具
- 工具结果出来后,检查是否需要再调其他工具


三、从参赛中学到的几个关键工程实践

3.1 System Prompt 设计的艺术

参赛作品中,system prompt 的设计区别很大。好的 system prompt 不是"告诉 Agent 做什么",而是"告诉 Agent 怎么思考"。

# 低分 prompt 的特征:
SYSTEM_PROMPT_LOW = """
你是一个 AI Agent。你的任务是完成用户分配的任务。
请调用合适的工具来完成任务。
"""

# 高分 prompt 的特征:
SYSTEM_PROMPT_HIGH = """
你是一个 AI Agent。你的工作方式是:

## 工作原则
1. 先理解,再行动:每次任务开始前,复述你的理解
2. 逐步推进:一次只做一件事,不要同时调用多个工具
3. 确认结果:每个工具调用后,检查结果是否合理
4. 诚实面对失败:如果某个工具调用失败,说明原因和替代方案

## 决策流程
当你需要做决策时,请展示你的思考过程:
- 我当前的任务目标是什么?
- 为了实现这个目标,有哪些可选的路径?
- 我选择这个路径的理由是什么?
- 执行结果是什么?我需要调整方向吗?

## 错误处理
- 如果工具调用超时或报错:重试一次,换用不同的参数
- 如果重试也失败:跳过这个工具,继续其他步骤
- 如果无法完成整个任务:返回已完成的部分,说明未完成的原因
"""

好的 system prompt 本质上是给 Agent 装了一个"决策框架"。低分 Agent 依赖模型自身的推理能力,高分 Agent 通过 prompt 给模型提供了推理路径。

3.2 日志系统的质量决定了调试效率

参赛作品一个让人意外的发现:高质量的日志记录比复杂的 Agent 架构更常见于高分作品

class AgentLogger:
    """
    高分 Agent 的日志系统
    """

    def __init__(self):
        self.events = []

    def log_decision(self, 
                     step: str, 
                     observation: str, 
                     options: list,
                     chosen: str,
                     reason: str):
        """记录一个决策过程"""

        self.events.append({
            "type": "decision",
            "step": step,
            "observation": observation,
            "options_considered": options,
            "chosen_option": chosen,
            "reasoning": reason,
        })

    def log_tool_call(self, 
                      tool: str, 
                      params: dict, 
                      result: str,
                      duration_ms: float):
        """记录一次工具调用"""

        self.events.append({
            "type": "tool_call",
            "tool": tool,
            "params_summary": str(params)[:200],
            "result_summary": str(result)[:200],
            "duration_ms": duration_ms,
        })

    def generate_report(self) -> str:
        """生成可读的决策报告"""

        report = ["=== Agent 决策报告 ===\n"]

        for event in self.events:
            if event["type"] == "decision":
                report.append(f"🤔 [决策] {event['step']}")
                report.append(f"   观察: {event['observation'][:100]}")
                report.append(f"   选择: {event['chosen_option']}")
                report.append(f"   原因: {event['reasoning'][:200]}")
            elif event["type"] == "tool_call":
                report.append(f"🛠️ [工具] {event['tool']}")
                report.append(f"   耗时: {event['duration_ms']:.0f}ms")
                report.append(f"   结果: {event['result_summary']}")
            report.append("")

        return "\n".join(report)

为什么日志质量不重要?

因为在 Hermes Challenge 这样的比赛中,人工评审不仅要看结果,还要看过程。如果你的 Agent 日志记录了一团乱七八糟的推理和毫无章法的工具调用,即使最终结果对了,也很难拿高分。


四、一个具体的获奖案例

4.1 案例:多层信息检索 Agent

有一个获奖作品特别有意思——它解决的是"从混乱的信息源中找到正确答案"的问题。

这个任务的难度在于:
- 信息分布在不相关的文档中
- 有些文档包含误导性信息
- Agent 需要自己判断哪些信息可靠

获奖方案的思路:

class MultiLayerRetrievalAgent:
    """
    多层信息检索 Agent(获奖作品的核心思路)

    架构:
    1. 第一层:广泛搜索,获取候选信息
    2. 第二层:交叉验证,比对不同来源
    3. 第三层:综合判断,生成答案

    关键:每一层都在产生"推理痕迹",而不是简单的结果
    """

    def research(self, query: str) -> Dict:
        """三层检索"""

        # 第一层:广泛搜索
        print(f"[Layer 1] 搜索: {query}")
        candidates = self.broad_search(query)  

        # 第二层:交叉验证
        print(f"[Layer 2] 验证: 找到 {len(candidates)} 个可能来源")
        verified = []
        for candidate in candidates:
            # 检查来源可信度
            credibility = self.check_credibility(candidate)

            # 检查信息一致性(多个来源是否一致)
            consistency = self.check_consistency(candidate, candidates)

            verified.append({
                "source": candidate["source"],
                "content": candidate["content"],
                "credibility_score": credibility,
                "consistency_score": consistency,
                "overall": (credibility + consistency) / 2,
            })

        # 第三层:综合判断
        print(f"[Layer 3] 综合: 从 {len(verified)} 个验证结果中生成答案")
        reliable = [v for v in verified if v["overall"] > 0.7]

        if len(reliable) >= 2:
            # 多个可靠来源,可以给出高置信度答案
            answer = self.synthesize(reliable)
            confidence = "high"
        elif len(reliable) == 1:
            # 只有一个可靠来源,标注低置信度
            answer = reliable[0]["content"]
            confidence = "medium"
        else:
            # 没有可靠来源
            answer = "无法从可靠来源获取信息"
            confidence = "low"

        return {
            "answer": answer,
            "confidence": confidence,
            "sources_used": [v["source"] for v in reliable],
            "reasoning_steps": len(self.decision_log),
        }

这个方案的亮点不是"技术复杂",而是思路清晰。评审能清楚地看到 Agent 的每一步决策、为什么选择这个来源、为什么排除那个来源。即使最终结果错了,评审也能看到 Agent 的推理是合理的。


五、我的观点:挑战赛的价值不在结果

写这篇文章时,我想分享一个和比赛结果无关的观察。

我看了很多参赛作品,印象最深刻的不是第一名——而是那些知道自己的 Agent 什么时候不行的参赛者。

有一个作品让我印象深刻。在某个任务中,它的 Agent 在第三个步骤遇到了一个从未见过的错误类型。Agent 没有继续尝试,而是停下来说:

"我遇到了一个未知错误,类型是 X。这个情况不在我的训练数据中。我建议以下替代方案..."

然后给出了 3 条具体的建议,每一条都比让它继续执行更好。

这种能力比"完成所有任务"更让我认可。 因为它展示了对 Agent 边界的真实理解——知道 Agent 什么能做、什么不能做,比让 Agent 什么都试着做更重要。

5.1 从挑战赛到生产环境

很多参赛者赛后分享了他们的教训。我整理了最常见的几个,供参考:

教训 1:"更复杂的模型 ≠ 更好的 Agent"

一位二等奖获得者分享说:"我们的初版用了当时最贵的旗舰模型,效果反而没有最终版本好。最终版本用的模型参数量少了 10 倍,但因为我们把大部分逻辑都写在了 prompt 和工具调用验证里,Agent 的表现更稳定。"

教训 2:"工具调用的容错性比什么都重要"

Hermes Challenge 中有一个专门的"压力测试"任务——在 Agent 运行过程中随机让工具调用失败。很多初期表现优秀的 Agent 在这个任务中翻了车。

一位参赛者在复盘中说:"我们的 Agent 在前 3 个任务都拿到了近乎满分,第 4 个任务(压力测试)只拿了 40 分。因为我们假设所有工具调用都会成功——这个假设在压力测试中被完全打破了。"

教训 3:"不要为了展示而展示"

有的参赛作品在 Agent 的响应中加入了大量花哨的格式——Markdown 表格、表情符号、彩色日志。但评审更关心的是:Agent 在每一步做了什么决策,而不是它怎么展示结果。

5.2 如果你也想参加下一届

基于这次观察,我给想参加下一届的人的建议:

  1. 先搞好 error handling,再搞功能——error handling 占了评审分数的 20%,但很多参赛者最后一天才想起加
  2. 日志日志日志——评审看不到 Agent 在想什么,只能通过日志推测。日志质量决定了评审对你的 Agent 的理解程度
  3. 一个干净的 system prompt 比十次调试更有价值——花时间打磨 prompt,让它清晰地定义 Agent 的决策框架
  4. 测试你的 Agent 在"工具挂了"时的表现——这是高分和低分的分水岭

结尾

Hermes Agent Challenge 这样的比赛,真正的价值不在于"选出最好的 Agent",而在于让参与者(和围观者)看到:好的 Agent 不是靠模型堆出来的,是靠工程设计堆出来的。

一个简单的模型 + 精心设计的 system prompt + 清晰的决策流程 + 完整的错误处理 + 高质量的日志,远胜过一个强大的模型 + 随意的架构。

如果你错过了这次挑战赛,下一届可以试试。不用赢,参与本身就是最好的学习方式。


文章由文字工作者编写。Hermes Challenge 的描述基于公开信息和参与者反馈。评分标准和获奖作品的分析来自个人观察。