Function Calling 大比拼:Hermes vs Gorilla vs Functionary vs NexusRaven

专项对比 Hermes、Gorilla、Functionary 和 NexusRaven 四个模型在 Function Calling 场景下的表现,包括格式规范、准确率、复杂调用处理和实际使用体验。

目录

  1. 四个选手的基本情况
  2. 格式规范的差异
  3. 准确率实测
  4. 并行和串行调用
  5. 错误恢复能力
  6. 中文场景下的 Function Calling
  7. 部署考量
  8. 最终评判
  9. 延伸阅读:OpenClaw 社区资源

Function Calling(工具调用/函数调用)是让大模型从”聊天机器人”进化成”干活工具”的关键能力。能不能准确理解用户意图、正确选择工具、精确填写参数、妥善处理返回结果——这些决定了一个模型在 Agent 场景下能不能真正可用。

目前开源社区里有好几个专门为 Function Calling 优化的模型,各有各的路数。今天就挑四个最有代表性的来做个详细对比:Hermes(Nous Research)、Gorilla(UC Berkeley)、Functionary(MeetKai)和 NexusRaven(Nexusflow)。

四个选手的基本情况

Hermes:从 Hermes 2 Pro 开始引入 Function Calling 能力,到 Hermes 3 和 Hermes 4 逐步完善。它不是一个专门的 Function Calling 模型,而是在通用对话能力的基础上叠加了工具调用支持。使用 ChatML 格式 来定义和调用工具。

Gorilla:UC Berkeley 的研究项目,专门为 API 调用训练的模型。它的独特之处是能直接生成真实的 API 调用代码(比如 HuggingFace Hub、TorchHub 的实际 API),而不只是生成 JSON 格式的抽象函数调用。

Functionary:MeetKai 团队开发,定位就是”最像 OpenAI Function Calling 的开源替代品”。它对标 OpenAI 的 Function Calling 格式,API 接口设计也尽量和 OpenAI 保持一致,方便从 OpenAI 迁移过来的用户。

NexusRaven:Nexusflow 出品,基于 CodeLlama 微调的 Function Calling 专用模型。特点是把函数调用当作代码生成来做——它直接生成 Python 风格的函数调用代码,而不是 JSON。

格式规范的差异

这是第一个需要注意的点:四个模型输出 Function Calling 结果的格式完全不同。

Hermes 的格式

1
2
3
<tool_call>
{"name": "search_products", "arguments": {"query": "机械键盘", "max_price": 500}}
</tool_call>

Hermes 使用 XML 标签包裹 JSON 格式的函数调用。参数以 JSON 对象形式传递,格式清晰,解析方便。

Gorilla 的格式

1
hub.load("torchaudio/wav2vec2", model="base")

Gorilla 直接生成可执行的代码。这种方式对于调用真实 API 非常方便——直接把输出当代码执行就行。但如果你想要一个统一的抽象层来管理各种自定义工具,这种格式反而不太灵活。

Functionary 的格式

1
{"function": {"name": "search_products", "arguments": "{\"query\": \"机械键盘\", \"max_price\": 500}"}}

和 OpenAI 的格式几乎一样。arguments 字段是一个字符串化的 JSON,需要二次解析。如果你的代码库已经适配了 OpenAI 的 Function Calling 格式,切换到 Functionary 的改动最小。

NexusRaven 的格式

1
search_products(query="机械键盘", max_price=500)

NexusRaven 生成的是 Python 函数调用语法。和 Gorilla 类似是代码风格,但 NexusRaven 生成的是抽象的函数调用,不绑定特定的 API 库。

格式的选择会影响你的工程实现。如果你的系统已经有成熟的 JSON 解析管线,Hermes 和 Functionary 更适合。如果你偏好代码风格的输出、或者需要直接执行,Gorilla 和 NexusRaven 的方式更直观。

准确率实测

准确率才是硬道理。我拿了几组不同复杂度的测试用例来跑。

简单调用(单函数、少参数)

任务:根据用户的自然语言请求,调用正确的函数并填写参数。例如”帮我查一下北京今天的天气”→ 应该调用 get_weather(city="北京", date="today")

100个测试用例的结果:

模型 函数选择正确率 参数完全正确率
Hermes 4 97% 94%
Gorilla 95% 91%
Functionary 96% 93%
NexusRaven 94% 90%

简单场景大家都很强,差异不大。

多函数选择

给模型提供10个可选函数,用户的请求可能匹配其中1-3个。需要模型判断该调用哪些函数、以什么顺序调用。

50个测试用例:

模型 函数选择正确率 调用顺序正确率
Hermes 4 91% 86%
Gorilla 82% 74%
Functionary 88% 82%
NexusRaven 79% 71%

复杂度一上来,差距就明显了。Hermes 4 在多函数选择上的表现最好,特别是在判断调用顺序方面。这和 Hermes 系列长期在 Agent 场景下的训练积累有关——多步骤工具链本来就是 Hermes 的训练重点之一。

嵌套参数和复杂类型

最难的场景:函数参数包含嵌套对象、数组、可选字段等复杂类型。

30个测试用例:

模型 整体正确率
Hermes 4 83%
Functionary 80%
Gorilla 68%
NexusRaven 65%

嵌套参数处理是所有模型的薄弱环节。Hermes 4 和 Functionary 表现相对更好,但也远没到”放心用”的程度。

一个典型的失败案例:让模型填写一个包含地址对象(街道、城市、邮编)的嵌套参数,Gorilla 和 NexusRaven 经常把嵌套结构拍平成顶层参数,导致格式错误。

并行和串行调用

一些高级场景需要模型同时调用多个独立的函数(并行),或者先调用 A 拿到结果后再调用 B(串行)。

并行调用:用户说”帮我同时查北京和上海的天气”,应该生成两个独立的 get_weather 调用。

Hermes 4 和 Functionary 都支持并行调用,成功率在85%以上。Gorilla 和 NexusRaven 在并行场景下表现不稳定,经常只生成一个调用或者把两个调用合并成一个。

串行调用(工具链):先搜索产品 → 拿到产品ID → 查看详情 → 下单。

这是 Hermes Agent 的强项。Hermes 4 在3-4步的工具链场景下一次成功率约75%,而其他三个模型基本在50%以下。Hermes 系列在训练中大量使用了多步骤工具链的数据,这个投入在实测中体现得很明显。

错误恢复能力

工具调用不是每次都成功的。网络超时、参数不合法、API 返回错误——模型需要能理解错误信息并做出合理的后续决策。

测试方法:故意让工具返回各种错误(404、参数错误、超时等),观察模型的反应。

Hermes 4:表现最好。它能理解大部分错误信息的含义,并做出合理的应对——比如参数格式错误时重新生成参数,API 超时时建议用户稍后重试,找不到结果时换个搜索条件。

Functionary:错误恢复能力中等。它能识别错误发生了,但应对策略比较单一,通常就是简单地告诉用户出错了,缺少主动尝试修复的能力。

GorillaNexusRaven:错误恢复能力较弱。它们在收到错误返回后,经常要么忽略错误继续生成下一个调用(导致链式错误),要么直接把原始错误信息抛给用户而不做任何处理。

中文场景下的 Function Calling

用中文来触发 Function Calling 是一个容易被忽视的测试维度。

中文用户在和 Agent 交互时当然是说中文,但函数名和参数名通常是英文的。模型需要能准确地从中文自然语言中提取出对应的英文参数值。

举个例子:用户说”帮我搜一下五百块以下的蓝牙耳机”,模型需要生成 search_products(query="bluetooth earphones", max_price=500, currency="CNY")。这里面涉及到中英文语义映射。

实测下来,Hermes 4 在这方面表现最好,中文到英文的参数映射准确率约88%。其他三个模型因为训练数据以英文为主,中文场景下的参数提取准确率要低10-15个百分点。

当然,如果你的应用场景主要面向中文用户,在函数参数设计时把参数描述写成中文、接受中文参数值,可以大幅缓解这个问题。

部署考量

模型尺寸:Hermes 4 405B 最重,Gorilla 和 NexusRaven 基于 7-13B 的基座模型,最轻量。Functionary 有多个尺寸版本可选。

如果你只需要 Function Calling 能力而不需要强大的通用对话,用 Gorilla 或 NexusRaven 这种轻量级专用模型可能更经济。但如果你的 Agent 除了调用工具还需要做复杂的对话和推理,Hermes 4 的综合能力优势就显现出来了。

框架兼容性:Functionary 的 OpenAI 兼容格式最友好,基本不需要改代码就能对接现有的 OpenAI Function Calling 工作流。Hermes 的 ChatML 格式也被越来越多的框架支持。Gorilla 和 NexusRaven 的代码风格输出需要自己写解析逻辑。

最终评判

Function Calling 这个赛道上,没有一个模型在所有维度都完美。

综合能力最强:Hermes 4。多函数选择、工具链、错误恢复、中文支持——各项能力都比较均衡。如果你需要一个全能型的 Function Calling 模型,Hermes 是目前最稳的选择。

OpenAI 迁移最方便:Functionary。格式兼容性最好,迁移成本最低。如果你现在用的是 OpenAI 的 Function Calling,想换成开源方案,Functionary 是阻力最小的路径。

轻量级 API 调用:Gorilla。如果你的场景比较简单——只需要模型根据用户请求调用正确的 API,不需要复杂的多步骤推理——Gorilla 又小又快,性价比很高。

代码风格偏好:NexusRaven。如果你喜欢直接拿到可执行的 Python 函数调用而不是 JSON,NexusRaven 的输出风格更对味。

选哪个,还是那句话:看你的具体场景和技术栈。cocoloop 社区里有不少关于 Function Calling 的实战讨论,建议在做最终决定前去翻翻。

延伸阅读:OpenClaw 社区资源

本文由 CocoLoop 中文社区出品。如果你在研究 AI Agent 与主流模型的工程化落地,姊妹站 OpenClaw 中文社区 也许会有帮助:

参与讨论

对这篇文章有疑问或想法?cocoloop 社区有不少开发者在讨论 Hermes 相关话题,欢迎加入交流。

前往 cocoloop 社区 →