做 AI 应用开发最头疼的事之一:项目里从 DeepSeek 切到通义千问,整个调用链路都得重写。参数名不一样、返回格式不一样、流式 SSE 结构也不一样。有没有办法换个模型只改一行代码?本文把几种主流的统一调用方案讲清楚。


一、先看问题:切换一个模型到底要改多少东西

假设一个 Python 项目,原来用 DeepSeek,现在想试试通义千问的效果。你需要改:

# === 之前:DeepSeek ===
import openai
client = openai.OpenAI(
    api_key="sk-deepseek-xxx",
    base_url="https://api.deepseek.com"
)
response = client.chat.completions.create(
    model="deepseek-chat",
    messages=[{"role": "user", "content": "你好"}],
    temperature=0.7,
    max_tokens=4096,
    stream=True
)

# === 之后:通义千问 ===
# 1. base_url 换了 → https://dashscope.aliyuncs.com/compatible-mode/v1
# 2. api_key 换了 → 阿里云的 AccessKey
# 3. model 名换了 → "qwen-plus"
# 4. 如果不用 compatible-mode,请求格式完全不同
#    → POST /api/v1/services/aigc/text-generation/generation
#    → 参数名从 messages 变成 input.messages
#    → 返回格式也不一样,要重写解析逻辑
# 5. 流式 SSE 字段名变了
# 6. token 计数字段名变了

这还没算上认证方式不同(Bearer Token vs API Key + Secret vs 签名认证)、错误处理差异、并发限制不同等隐性改动。换一个模型,少则改几十行,多则几百行。如果项目中用了 3 个模型,光是"今天试这个、明天试那个"的胶水代码就占了开发时间的一大块。


二、为什么每家 API 都不一样

不是厂商故意为难开发者,而是历史原因 + 各自演进的结果:

原因 说明
没有统一标准 大模型 API 是 2022 年底才爆发的新领域,不像 HTTP/REST 有几十年沉淀的规范
OpenAI 先发优势 ChatGPT 火了之后,OpenAI 的 API 格式成了事实标准,但不是所有厂商都愿意完全兼容
阿里/百度/字节各自有云平台 通义千问走阿里云 DashScope 体系,文心一言走百度智能云体系,豆包走火山引擎体系——它们要兼容的是自家的云平台规范,不是 OpenAI
能力差异导致参数不同 有的模型支持 function calling,有的不支持;有的支持 vision,有的不支持。参数字段自然不同

但从 2024 年下半年开始,趋势已经在收敛——越来越多的厂商提供了 OpenAI 兼容模式。OpenAI 的 /v1/chat/completions 格式正在成为事实上的行业标准


三、三种统一调用方案

方案一:自己写适配层(Adapter 模式)

思路:每种厂商写一个 Adapter,把它的 API 翻译成统一的内部格式。

你的业务代码
    │
    ▼
┌────────────────┐
│ 统一调用接口     │  ← 你定义的:chat(messages, model, options)
└───────┬────────┘
        │
   ┌────┼────┬────┐
   ▼    ▼    ▼    ▼
DeepSeek 千问  豆包  GPT
Adapter Adapter Adapter Adapter
# 统一接口
class UnifiedLLM:
    def chat(self, messages, model, **kwargs):
        adapter = self.get_adapter(model)
        return adapter.chat(messages, **kwargs)

# DeepSeek Adapter(本身就是 OpenAI 格式,最省事)
class DeepSeekAdapter:
    def chat(self, messages, **kwargs):
        return self.client.chat.completions.create(
            model=self.model_name,
            messages=messages,
            **kwargs
        )

# 通义千问 Adapter(非 compatible-mode)
class QwenAdapter:
    def chat(self, messages, **kwargs):
        # 把 OpenAI 格式的 messages 转成 DashScope 格式
        dashscope_messages = [
            {"role": m["role"], "content": m["content"]}
            for m in messages
        ]
        return self._call_dashscope(dashscope_messages, **kwargs)

优点:完全自主可控,想怎么封装就怎么封装。

缺点

  • 每加一个新模型,写一个 Adapter,调试一轮,1-3 天
  • 上游 API 变更(比如豆包改了参数名),你需要同步更新 Adapter
  • 流式 SSE 解析每家的 data: 行结构不同,Adapter 里要分别处理
  • function calling、vision、audio 等高级特性的适配工作量更大
  • 5 个模型 = 5 个 Adapter = 长期维护成本

适合:只用 1-2 个模型,且团队有专门负责基础设施的人。


方案二:用 LiteLLM 等开源统一 SDK

LiteLLM 是 Python 生态里比较流行的开源方案,用 OpenAI 的调用格式,自动路由到 100+ 模型:

from litellm import completion

# 换模型就是换 model 参数
response = completion(
    model="deepseek/deepseek-chat",      # DeepSeek
    messages=[{"role": "user", "content": "你好"}]
)

response = completion(
    model="qwen/qwen-plus",              # 通义千问
    messages=[{"role": "user", "content": "你好"}]
)

response = completion(
    model="doubao/doubao-pro-32k",       # 豆包
    messages=[{"role": "user", "content": "你好"}]
)

优点:开源免费,社区活跃,支持的模型多。

缺点

  • 只支持 Python,Node.js / Java / Go 用不了
  • 部分国内模型的 API 更新可能不及时(毕竟是海外项目)
  • 需要自己管理多套 API Key
  • 没有计费、限流、监控等企业级功能

方案三:使用 AI API 聚合平台(推荐)

国内已有成熟的 AI API 中转平台(如星枢无极),把所有模型统一成 OpenAI 兼容格式。核心逻辑是:平台帮你维护适配层,你只对接一个标准接口,任何模型切换都只改 model 参数。

from openai import OpenAI

client = OpenAI(
    api_key="平台分配的 Key",
    base_url="https://api.591ll.com"    # 统一入口
)

# 用 DeepSeek 做推理
response = client.chat.completions.create(
    model="deepseek-v4-pro",
    messages=[{"role": "user", "content": "用 Python 写一个快速排序"}]
)

# 同一个 Key、同一个 base_url,换通义千问做中文创作
response = client.chat.completions.create(
    model="qwen3",
    messages=[{"role": "user", "content": "写一篇产品发布公告"}]
)

# 再换豆包做对话
response = client.chat.completions.create(
    model="doubao-pro",
    messages=[{"role": "user", "content": "你好,帮我分析一下这段代码"}]
)

三种方案对比:

维度 自写 Adapter LiteLLM AI API 聚合平台
开发量 大(每个模型 1-3 天) 小(pip install) 零(注册即用)
维护成本 高(厂商 API 变更时你自己改) 中(等社区更新) 无(平台维护)
语言支持 你自己写的 仅 Python 所有(OpenAI SDK 兼容)
多 Key 管理 自己管 自己管 一个 Key 搞定
成本监控 统一后台
并发/限流 自己控制 看上游限制 平台级流控
适合场景 只有 1-2 个模型 个人 / 小团队 Python 项目 企业 / 生产环境

四、流式响应(SSE)的统一处理

流式场景最容易踩坑——每家的 SSE 数据行格式不一样:

# DeepSeek(OpenAI 格式)
data: {"id":"xxx","choices":[{"delta":{"content":"你好"}}]}

# 通义千问(非 compatible-mode)
data: {"output":{"text":"你好"},"usage":{"total_tokens":1}}

# 豆包
data: {"choices":[{"delta":{"content":"你好"}}]}  # 格式接近 OpenAI 但不完全

如果用聚合平台,这些差异全在平台侧处理掉了,你的流式代码只写一次,所有模型通用:

stream = client.chat.completions.create(
    model="任意模型",
    messages=[{"role": "user", "content": "你好"}],
    stream=True
)

# 这段代码对所有模型都生效
for chunk in stream:
    if chunk.choices[0].delta.content:
        print(chunk.choices[0].delta.content, end="")

五、总结

多模型切换保持格式一致,本质上就一个思路:在调用链上加一层抽象

你现在的情况 推荐的方案
只用 1 个模型 直连,不需要适配
用 2 个模型,都是 OpenAI 兼容 同一套代码,只改 model 和 base_url
2-3 个模型,格式不统一 用聚合平台,注册即用,维护成本为零
5+ 模型,有基础架构团队,月调用量巨大 自建 API 网关 + 适配层
个人开发者,Python 项目 LiteLLM 或聚合平台都行

最省事的做法是直接找个已经把所有模型统一成 OpenAI 格式的平台,API Key 和 base_url 一换,代码完全不用动。星枢无极目前支持 40+ 国产大模型,全部兼容 OpenAI SDK,文本、图片、视频一个 Key 搞定,对多模型切换场景来说是最直接的解决方案。


本文基于 2026 年 6 月国内大模型 API 生态撰写。各厂商 API 格式以官方最新文档为准。

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐