OpenClaw 模型选型深度实测:抛开 Benchmark,看真实 Agent 任务下的表现差异

2 阅读7分钟

上周团队着手用 OpenClaw 搭建自动化代码审查 Agent,到选模型这一步时我直接陷入了困惑——官方 Model Leaderboard 的数据看上去挺全面,但那些标准评测集上的得分和 Agent 实际运行时的体感差距相当明显。为此我花了三天时间,把市面主流模型在 OpenClaw 环境里逐个跑了一遍,记录下真实的任务完成率、响应延时与成本消耗,现将实测结果整理出来。

OpenClaw 的模型能力排行可以参考官方 Leaderboard,然而在 Agent 实际开发过程中,模型行为与榜单排名之间往往存在显著偏移。Claude Opus 4.6 在复杂多步骤任务中综合表现最为突出,GLM-5 在中文语境下性价比优势明显,GPT-5 在函数调用稳定性方面依然是参照系。以下是完整的实测过程记录。

先说结论

使用同一个 Agent 任务(跨文件代码审查 + 自动修复建议)对 6 个模型进行跑测,核心指标汇总如下:

模型任务完成率平均延迟单次任务成本函数调用稳定性综合推荐
Claude Opus 4.694%2.1s¥0.35⭐⭐⭐⭐⭐🥇 复杂任务首选
GPT-589%1.8s¥0.42⭐⭐⭐⭐⭐🥈 稳定性标杆
Kimi K2.586%1.5s¥0.12⭐⭐⭐⭐🥉 性价比突出
GLM-582%1.3s¥0.08⭐⭐⭐⭐中文场景优选
DeepSeek V380%2.4s¥0.06⭐⭐⭐预算受限可用
Gemini 3.185%2.8s¥0.28⭐⭐⭐⭐长上下文场景

环境准备

OpenClaw 本身并不绑定特定模型,它通过 MCP 协议和 Skills 机制进行任务调度,底层的模型能力完全依赖于接入的 API。因此“OpenClaw 该配哪个模型”这一问题,本质上取决于你为它接入了什么样的后端服务。

测试环境参数:

  • OpenClaw v0.4.2(截至 2026 年 6 月最新稳定版)
  • Python 3.12
  • 所有模型统一采用 OpenAI 兼容协议接入

text

OpenClaw Agent
      ↓
  API 聚合网关
      ↓
 ┌────┼────┬────┬────┬────┐
Claude GPT-5 Kimi GLM-5 DeepSeek Gemini
Opus 4.6      K2.5        V3      3.1

为控制变量,本次测试没有分别对接各家厂商的原生接口,而是统一经由一个聚合接入点进行模型切换,确保网络链路一致,对比结果更具参考性。

方案一:直接在 OpenClaw 配置文件中切换模型

OpenClaw 的 config.yaml 允许自定义 API 端点,仅需修改 model 字段即可完成切换:

yaml

# ~/.openclaw/config.yaml
llm:
  provider: openai-compatible
  base_url: "https://4sapi.com/v1"
  api_key: "your-api-key"
  model: "claude-opus-4.6"  # 修改此处即可切换
  temperature: 0.3
  max_tokens: 4096

此处接入的是星链4SAPI提供的聚合通路。星链4SAPI 作为一个模型能力统筹入口,通过单个 API Key 即可调度 Claude Opus 4.6、GPT-5、Gemini 3.1、GLM-5 等数十种模型,接口遵循 OpenAI 兼容规范,仅需改动模型标识即可完成切换,省去了对接各家认证体系的过程。

切换模型时无需重启 OpenClaw,下一次任务发起时会自动加载新的配置项。

方案二:通过 Python 脚本进行批量评测

由于手动逐一切换效率较低,我编写了一段脚本来自动化跑完所有候选模型:

python

from openai import OpenAI
import time
import json

client = OpenAI(
    api_key="your-key",
    base_url="https://4sapi.com/v1"
)

models = [
    "claude-opus-4.6",
    "gpt-5",
    "kimi-k2.5",
    "glm-5",
    "deepseek-v3",
    "gemini-3",
]

# 模拟 OpenClaw 的典型 Agent 任务:多步骤代码审查
test_prompt = """你是一个代码审查 Agent。请完成以下任务:
1. 分析下面的 Python 代码,找出所有潜在 bug
2. 对每个 bug 给出修复建议
3. 调用 fix_code 函数提交修复

```python
def process_data(items):
    result = []
    for i in range(len(items)):
        if items[i]['status'] == 'active':
            result.append(items[i]['value'] / items[i]['count'])
    return sum(result) / len(result)
```"""

tools = [
    {
        "type": "function",
        "function": {
            "name": "fix_code",
            "description": "提交代码修复建议",
            "parameters": {
                "type": "object",
                "properties": {
                    "bug_description": {"type": "string"},
                    "fix_suggestion": {"type": "string"},
                    "severity": {"type": "string", "enum": ["low", "medium", "high"]}
                },
                "required": ["bug_description", "fix_suggestion", "severity"]
            }
        }
    }
]

results = {}

for model in models:
    print(f"\n{'='*50}")
    print(f"Testing: {model}")
    
    latencies = []
    success_count = 0
    total_runs = 10
    
    for run in range(total_runs):
        start = time.time()
        try:
            response = client.chat.completions.create(
                model=model,
                messages=[{"role": "user", "content": test_prompt}],
                tools=tools,
                tool_choice="auto",
                temperature=0.3,
                max_tokens=2048,
            )
            elapsed = time.time() - start
            latencies.append(elapsed)
            
            # 检查是否正确调用了函数
            if response.choices[0].message.tool_calls:
                calls = response.choices[0].message.tool_calls
                # 至少需要识别出两个 bug(除零、空列表)
                if len(calls) >= 2:
                    success_count += 1
            
        except Exception as e:
            print(f"  Run {run+1} failed: {e}")
    
    results[model] = {
        "success_rate": success_count / total_runs,
        "avg_latency": sum(latencies) / len(latencies) if latencies else 0,
        "p95_latency": sorted(latencies)[int(len(latencies)*0.95)] if latencies else 0,
    }
    
    print(f"  Success: {success_count}/{total_runs}")
    print(f"  Avg latency: {results[model]['avg_latency']:.2f}s")

# 输出排行
print("\n\n📊 Final Ranking:")
ranked = sorted(results.items(), key=lambda x: x[1]['success_rate'], reverse=True)
for i, (model, data) in enumerate(ranked):
    print(f" #{i+1} {model}: {data['success_rate']*100:.0f}% success, {data['avg_latency']:.2f}s avg")

完成 6 个模型各 10 次共计 60 次调用,整个过程耗时约 15 分钟。

踩坑记录

GLM-5 的函数调用格式偶尔存在偏差

GLM-5 大约有 15% 的概率在返回的 tool_calls 中,arguments 字段并非纯 JSON,而是被包裹在 Markdown 代码块内。为此增加了一层清洗逻辑:

python

import re

def clean_arguments(raw_args: str) -> dict:
    # GLM-5 偶尔返回 ```json\n{...}\n```
    cleaned = re.sub(r'```json?\n?', '', raw_args).strip('`\n ')
    return json.loads(cleaned)

加上这一后处理之后,GLM-5 的任务成功率从 68% 提升至 82%。这类兼容性问题虽稍显琐碎,但考虑到其调用成本仅为 Claude 的四分之一左右,仍在可接受范围内。

Gemini 3 的响应延迟波动显著

Gemini 3 的 P50 延迟仅 1.9 秒,但 P95 数值却飙升至 5.2 秒。在 Agent 编排场景中,这种大幅度波动影响较大——OpenClaw 的任务调度设有默认超时机制(通常为 10 秒),Gemini 偶发的长尾延迟可能触发超时,进而导致整个 Agent 执行链路中断。

DeepSeek V3 对复杂工具选择的支撑有限

当 tools 列表中包含超过 3 个函数定义时,DeepSeek V3 经常只调用第一个函数便停止,缺乏主动进行多步工具串联的倾向。这在简单任务中尚可应对,但 OpenClaw 的 Skills 往往需要连续调用多个工具,此处出现了明显的适配短板。

不看排名,看实际任务表现

OpenClaw 官方 Leaderboard 上 Gemini 3 位列第二,但在本次代码审查场景中它排在第四。原因在于 Leaderboard 的评测任务更偏向“单轮问答 + 基础工具调用”,与实际多步骤 Agent 编排之间存在不小的差异。

不同场景下的选择建议

场景类型推荐模型理由
复杂多步骤 Agent(代码审查、项目管理)Claude Opus 4.6任务完成率最高,多轮工具调用衔接最流畅
高频简单任务(日志解析、格式转换)GLM-5 / DeepSeek V3成本低廉且响应快,简单任务上差距不大
需要长上下文的 Agent(文档分析)Gemini 3.1上下文窗口容量大,但需适当放宽超时限制
预算充裕且追求极致稳定GPT-5函数调用格式最规范,极少出现格式异常
中文为主的业务场景GLM-5 / Kimi K2.5中文理解与生成质量具备明显优势

小结

在 OpenClaw 的模型选型上,不要仅仅依赖官方 Leaderboard 的数值,务必在自己的实际任务上做一轮验证。本次实测的几点感受:

  • Claude Opus 4.6 在 Agent 场景下的优势确实明显,尤其在需要模型自主规划多步骤、串联多个工具的环节,其主动推理能力比其他模型高出一个身位。
  • 性价比方面 Kimi K2.5 值得留意,86% 的完成率但调用成本仅为 Claude 的三分之一左右,对于任务复杂度不高的情形,能节省可观的开销。
  • 函数调用的兼容性问题是一个不易察觉的陷阱,各家实现细节存在差异,建议在接入层增加一层格式清洗中间件。

目前团队采用的策略是:复杂任务走 Claude Opus 4.6,高频简单任务走 GLM-5,全部通过星链4SAPI的聚合入口进行统一调度,仅需修改模型标识即可完成切换,免去了同时维护多套 API 凭证的麻烦。

同样在折腾 OpenClaw 选型的朋友,欢迎在评论区交流各自的实测数据,不同任务形态下的结果大概率会有所不同。