在本地Qwen2.5 14B模型上,ToolCallingAgent与CodeAgent的对比。
在配备 M4 芯片的 Mac 上使用 smolagents 进行测试,比较 ToolCallingAgent 与 CodeAgent 的性能:在多种温度设置下,结合本地 Qwen2.5 14B 指令模型与编码器模型时的处理速度及路由准确率。
来源: ToolCallingAgent vs. CodeAgent: Which Performs Better on a Local LLM?
本地代理设置会很快暴露出弱点。这里的设备是一台配备16GB统一内存的苹果M4基础款Mac,既没有云推理功能,也没有额外的VRAM可供调用,因此即便是中等规模的上下文窗口也会引发内存交换。我们使用了smolagents库中的两种代理类型:ToolCallingAgent和CodeAgent,分别在本地运行的两个模型上进行了测试:qwen2.5-coder:14b和qwen2.5:14b-instruct。这两个模型参数量均为14B,架构也相同,都在同一台设备上运行。
- Qwen2.5:14b-instruct是14B系列中的通用模型,通过大量指令和对话数据训练,能够很好地执行指令。
- qwen2.5-coder:14b虽然使用相同的架构,但经过了大量代码数据的额外预训练以及针对该场景的微调。
在硬件预算如此紧张的情况下,两种配置都不太可能表现出色。更值得探讨的问题是它们各自会在哪些方面出现瓶颈,以及选择不同类型的智能体是否能够缓解这些限制。
实验设置
在同一个任务上,针对两种类型的智能体分别进行了0、0.1、0.3和0.6的温度扫描测试:该任务是找出西雅图最好的五家披萨店,查看每家店的等待时间,然后仅推荐那些等待时间低于用户设定阈值的地点。用于计算等待时间并与其阈值进行比较的函数都是确定性的。
@tool
def get_wait_time(restaurant_name: str) -> int:
"""Current wait in minutes for a restaurant. Deterministic, not a live lookup."""
@tool
def restaurants_in_wait_limit(wait_time: int, wait_threshold: int) -> bool:
"""True if the wait is within the customer's threshold."""
这种确定性设计是经过刻意设计的。实时查询会让模型猜测一个合理的等待时间并继续执行。而强制函数调用则用于验证关键点:即智能体是否会依赖工具而非自行生成数值,以及当温度参数或智能体类型发生变化时这一情况是否依然成立。
我们跟踪了三项指标:延迟时间、任务是否完成,以及路由准确率——后者指的是每次调用中整个工具链中正确执行的部分所占的比例。由于这并非正式的基准测试,可将这些数值视为一种检测手段。
两种智能体的差异
使用ToolCallingAgent时,每一步都会生成一次JSON格式的工具调用。模型负责提供参数,框架负责执行工具,之后再进入下一步。五家餐厅和两个功能总共会产生十次独立的调用,每次都是让结构化输出出错的新机会。
CodeAgent采取了另一种方法,生成一段可一步运行的Python代码。一个循环就能遍历所有餐厅,并在其中调用两个函数。由于正确的循环在单次运行中对所有餐厅都有效,因此只需做出一次决策,而非十次。
结果
在Qwen2.5:14b-instruct模型上
两种智能体的表现都不错。CodeAgent在所有温度设置下的路径规划准确率均为1.00,而ToolCallingAgent的准确率则在0.95到1.00之间。两者的正确性几乎没有差距。
速度方面的表现则有所不同。ToolCallingAgent的运行速度大约只有CodeAgent的一半,每次运行大约需要5分钟,而CodeAgent大约需要2.5分钟。造成这种差异的原因是结构上的。ToolCallingAgent在每一步都需要调用新的模型,重新发送对话上下文并从头开始生成内容;而CodeAgent只需支付一次调用费用。在本地机器上,由于每次生成内容本身就已经很慢,这样的额外开销不容忽视。
在Qwen2.5-coder:14b上的表现
在这款模型上,两种智能体的表现出现了显著差异。ToolCallingAgent在任何温度设置下都无法达到50%的路由准确率,其准确率始终在0.40到0.50之间波动。虽然它的运行速度比在指令模型上快一些,但这并非好兆头——它之所以快,是因为放弃了继续尝试。一旦丢失了推理线索,它就停止发送调用请求,从而在完成更少工作的前提下提前结束运行。
CodeAgent以1.00的路由准确率轻松夺冠,这一成绩与最佳指令模型的数值相当。这也在意料之中,因为它始终要求编码模型生成Python代码,而从不要求生成结构化的JSON。
值得注意的要点
CodeAgent在循环处理方面的优势确实存在。在指令模型中,尽管两种模型的路由准确率均为1.00,但通过批量处理任务,CodeAgent的效率是ToolCallingAgent的两倍。
Qwen2.5:14b-instruct表现为一款可靠的通用型模型,既擅长处理结构化的JSON请求,也能轻松完成简单代码编写。而Qwen2.5-coder:14b则更适用于要求较高的编码任务,因为它在生成结构化JSON以及保持多次调用间的一致性方面可能存在问题。
一个未解之谜
还有一个问题需要解答。这两种智能体之间存在两处差异:CodeAgent会将所有任务批量处理为一个程序,并且使用Python而非结构化的JSON格式来编写代码。接下来的实验可以通过让CodeAgent在批量执行的同时输出结构化的工具调用指令,来区分这两者的差异。实验结果将表明,其优势究竟主要来自循环机制,还是因为模型认为生成代码比生成一系列JSON调用更为容易。