上个月做模型选型,要在 DeepSeek、通义千问、GLM 之间跑同一批 prompt 对比效果。按常规做法:三个平台分别注册、实名、绑卡、各充一笔钱,然后 .env 里躺着三组 Key,代码里三套 SDK 初始化逻辑。更烦的是评测跑完想换个模型再试,得改代码、重新装依赖、重新部署。
问题不在模型本身,在于每个厂商都有一套自己的接入方式。但实际上,国内主流大模型几乎都提供了 OpenAI 兼容接口——这意味着只要把请求打到同一个入口,模型名换个字符串就能切。
两样东西:一个多模型中转服务的 API Key(这类服务本身聚合了各家厂商),以及 Python 环境下的 openai SDK(1.x 版本)。不需要装 dashscope、zhipuai 这些厂商专用包,省掉一堆版本冲突。
Key 和地址别写死在代码里,丢进环境变量:
OpenAI SDK 的 base_url 参数就是这个用途。指向中转站,协议完全兼容:
client = OpenAI(
api_key=os.getenv("RELAY_KEY"),
base_url=os.getenv("RELAY_URL"),
)
`
原来调 OpenAI 的代码一行都不用动,client.chat.completions.create 照旧。区别只是请求先到中转站,再由它转发给对应的模型厂商。
这是最舒服的地方。模型名直接当参数传:
for m in ["deepseek-chat", "qwen-plus", "glm-4-plus"]:
print(m, "->", ask(m, "用一句话解释 Python 闭包"))
`
跑一遍就能横向对比三个模型的输出。想做 A/B 测试,把模型名做成配置项或数据库字段,改配置重启就完事,不碰业务代码。流式输出也支持,加个 stream=True 正常迭代。
第一,模型名要按中转站文档里的写法,比如通义的 qwen-plus 和 qwen-max 是两个不同的名字,写错了会返回 404 而不是报错。第二,不同模型对 max_tokens、temperature 的取值范围不完全一致,做对比评测时统一参数才公平。第三,部分模型有独有参数(比如联网搜索),得额外传,不能指望完全通用。
这套方案的价值不在于省钱,而在于把「换模型」从一个工程动作降级成一个字符串修改。评测阶段建议统一 prompt 和采样参数,结果才有可比性。至于充值,这类聚合服务一般按 token 计费、余额通用,先在充站小额充个二三十块跑完评测就够了,确认稳定再加大额度——毕竟中转层多一跳,延迟和可用性还是得自己实测过才放心。