用 OpenRouter 自动路由模型结果不一致怎么办
直接给结论:如果你在调用同一个模型时发现输出质量忽高忽低,大概率是被 OpenRouter 随机分发到了不同的后端供应商。想解决这个问题,必须在请求体里加上 provider 筛选参数,强行指定一个稳定的供应商,而不是依赖它的自动 fallback。
很多人用 OpenRouter 是为了省事,觉得一个 API 接口能跑通所有模型,而且它号称会自动帮你找最便宜、最稳定的路径。但在实操中,这种“自动路由”其实是个坑。因为同一个模型(比如 Claude 3.5 Sonnet)在不同的 Provider(供应商)那里运行,所用的推理引擎、量化版本、甚至 System Prompt 的处理方式都可能不一样。
我之前在跑一个对格式要求极高的 JSON 提取任务时就遇到了这个问题。同一个 Prompt,请求 A 走的是供应商 X,返回结果完美;请求 B 走的是供应商 Y,结果就多出了几个 Markdown 标签导致我的解析代码直接报错。这种随机性在简单的聊天场景下没感觉,但在写代码或做自动化 pipeline 时简直是噩梦。
更离谱的是,有些供应商虽然号称支持某个多模态模型,但实际上 Vision 能力是缺失的,或者对 reasoning_effort(推理力度)这种参数的响应完全不同。如果你不手动锁定供应商,你永远不知道这次请求背后是谁在跑。
想要彻底掌控输出质量,可以按照下面这两个步骤操作:
第一步,先查出这个模型目前有哪些可用的供应商。
调用 /endpoints 接口,传入模型 ID,它会给你返回一个列表,告诉你当前有哪些 Provider 在提供服务,以及各自的延迟和价格。
curl https://openrouter.ai/api/v1/models/google/gemini-pro-1.5 \
-H "Authorization: Bearer YOUR_API_KEY"
第二步,在发送对话请求时,通过 provider 字段锁定供应商。
不要用默认配置,在 JSON 请求体中加入 provider 选项。比如你测试发现某个供应商的响应速度最快且不掉线,就一直用它。
{
"model": "anthropic/claude-3.5-sonnet",
"messages": [
{
"role": "user",
"content": "帮我分析这段代码的逻辑"
}
],
"provider": {
"order": ["Anthropic", "AWS"],
"allow": ["Anthropic"]
}
}
在上面的配置里,allow 数组里写谁,OpenRouter 就只会把请求发给谁。如果你想在保证质量的前提下做备份,可以用 order 数组定义优先级,这样既能规避掉那些烂供应商,又能保证服务不中断。
虽然手动选供应商增加了一点点配置成本,但换来的是确定性。对于开发者来说,确定性比省那几分钱的路由优化重要得多。建议大家在部署生产环境前,先把所有模型的供应商全部跑一遍对比,选出那个最稳的,然后死死地锁住。
你没提温度系数,哪怕锁死 provider 只要 temperature 没调好,输出还是随机抽奖,你试过 0.1 吗?