40-国产大模型统一调用-通义千问-文心一言-DeepSeek

文章目录

  • 【37.Python+AI】调用国产大模型:通义千问、文心一言、DeepSeek一个API全搞定
    • 导入语
    • [1 ~> 四大国产模型的API接入方式](#1 ~> 四大国产模型的API接入方式)
      • [1.1 各厂商API概览](#1.1 各厂商API概览)
      • [1.2 注册和获取API Key](#1.2 注册和获取API Key)
    • [2 ~> OpenAI兼容接口:一套代码通吃四个模型](#2 ~> OpenAI兼容接口:一套代码通吃四个模型)
      • [2.1 原理说明](#2.1 原理说明)
      • [2.2 各厂商的base_url和模型名对照表](#2.2 各厂商的base_url和模型名对照表)
    • [3 ~> 多模型统一客户端:一行切换,零改动](#3 ~> 多模型统一客户端:一行切换,零改动)
      • [3.1 设计思路](#3.1 设计思路)
      • [3.2 完整实现代码](#3.2 完整实现代码)
    • [4 ~> 四大模型实测对比](#4 ~> 四大模型实测对比)
      • [4.1 测试维度与结果](#4.1 测试维度与结果)
      • [4.2 选型建议](#4.2 选型建议)
    • [5 ~> 生产级建议:多模型降级策略](#5 ~> 生产级建议:多模型降级策略)
      • [5.1 为什么需要降级](#5.1 为什么需要降级)
    • [思考 && 总结](#思考 && 总结)
    • 结尾

【37.Python+AI】调用国产大模型:通义千问、文心一言、DeepSeek一个API全搞定

📖 文章简介: 本文手把手教你用一套Python代码同时调用通义千问(Qwen)、文心一言(ERNIE)、DeepSeek和GLM四大国产大模型。内容包括各厂商API的注册与Key获取、OpenAI兼容接口的统一封装技巧、不同模型在代码生成/中文理解/成本控制三个维度的实测对比,以及一个多模型热切换的通用客户端实现。文末附有各模型定价对比表与选型决策树Mermaid图,适合想在国内模型之间灵活切换的AI应用开发者。


🎬 个人主页: 源码骑士

专栏传送门: 《Android开发基础》《python基础课程》

⭐️热衷从源码视角拆解技术底层原理,将复杂架构讲得通俗易懂


🎬 源码骑士的简介:

5年Android Framework系统开发经验,曾主导多项系统级性能优化专项

技术栈覆盖Android系统全链路(Binder/Handler/AMS/WMS/启动流程)及Java后端全家桶(Spring + MyBatis + Redis + Oracle)

累计产出原创技术文章100+篇,文章以流程图为特色,被读者评价为"看一篇胜过啃一周源码"


导入语

OpenAI的GPT确实强,但两个痛点绕不开:一是科学上网,二是美元支付。当你做一个面向国内用户的AI产品时,这两点就直接把你卡死了。

好消息是,2025年的国产大模型已经追到了一个非常能打的水平------通义千问在中文理解上甚至不输GPT-4,DeepSeek在代码生成场景性价比极高,文心一言对百度生态的集成无出其右。

但这引出第三个痛点:四个模型,四套SDK,四个API格式,怎么统一调用? 这篇文章就把这个问题一次性解决------用一个多模型客户端,一行配置切换模型,你的代码零改动。


1 ~> 四大国产模型的API接入方式

1.1 各厂商API概览

模型 厂商 API风格 需要科学上网 免费额度
通义千问(Qwen) 阿里云 OpenAI兼容 200万Token/月
文心一言(ERNIE) 百度 OpenAI兼容 有试用额度
DeepSeek DeepSeek OpenAI兼容 500万Token注册送
ChatGLM 智谱AI OpenAI兼容 有免费额度

注意到没有?四大厂商全部支持OpenAI兼容接口!这意味着你只需要换base_urlapi_key,代码完全不用改。

1.2 注册和获取API Key

bash 复制代码
通义千问(阿里云百炼):
├─ 打开 dashscope.console.aliyun.com
├─ 开通"模型服务灵积"
└─ 右上角 → API-KEY管理 → 创建

文心一言(百度千帆):
├─ 打开 console.bce.baidu.com/qianfan
├─ 应用接入 → 创建应用
└─ 获取 API Key + Secret Key

DeepSeek:
├─ 打开 platform.deepseek.com
├─ 注册 → API Keys → 创建
└─ 注意:充值后才能用(非常便宜)

智谱AI(ChatGLM):
├─ 打开 open.bigmodel.cn
├─ 注册 → API Keys → 创建
└─ 新用户有免费额度

2 ~> OpenAI兼容接口:一套代码通吃四个模型

2.1 原理说明

因为所有厂商都兼容OpenAI的接口格式,你可以直接用openai库连接到任意厂商的服务器:

python 复制代码
from openai import OpenAI

# 连接通义千问
client = OpenAI(
    api_key="sk-your-qwen-key",
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

# 连接DeepSeek
client = OpenAI(
    api_key="sk-your-deepseek-key",
    base_url="https://api.deepseek.com"
)

# 调用方式一模一样!
response = client.chat.completions.create(
    model="qwen-turbo",  # 或 "deepseek-chat"
    messages=[{"role": "user", "content": "你好"}]
)

2.2 各厂商的base_url和模型名对照表

python 复制代码
MODEL_CONFIGS = {
    "qwen": {
        "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
        "model": "qwen-turbo",           # 便宜快速
        "model_pro": "qwen-plus",         # 平衡
        "model_max": "qwen-max",          # 最强
    },
    "ernie": {
        "base_url": "https://qianfan.baidubce.com/v2",
        "model": "ernie-speed-128k",      # 免费轻量
        "model_pro": "ernie-3.5-8k",      # 增强版
        "model_max": "ernie-4.0-8k",      # 旗舰版
    },
    "deepseek": {
        "base_url": "https://api.deepseek.com",
        "model": "deepseek-chat",         # 通用对话
        "model_pro": "deepseek-coder",    # 代码专用
    },
    "glm": {
        "base_url": "https://open.bigmodel.cn/api/paas/v4",
        "model": "glm-4-flash",           # 免费快速
        "model_pro": "glm-4",             # 标准版
    },
}

3 ~> 多模型统一客户端:一行切换,零改动

3.1 设计思路

#mermaid-svg-2qoxJELyYW8kUA34{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-2qoxJELyYW8kUA34 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-2qoxJELyYW8kUA34 .error-icon{fill:#552222;}#mermaid-svg-2qoxJELyYW8kUA34 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-2qoxJELyYW8kUA34 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-2qoxJELyYW8kUA34 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-2qoxJELyYW8kUA34 .marker.cross{stroke:#333333;}#mermaid-svg-2qoxJELyYW8kUA34 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-2qoxJELyYW8kUA34 p{margin:0;}#mermaid-svg-2qoxJELyYW8kUA34 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-2qoxJELyYW8kUA34 .cluster-label text{fill:#333;}#mermaid-svg-2qoxJELyYW8kUA34 .cluster-label span{color:#333;}#mermaid-svg-2qoxJELyYW8kUA34 .cluster-label span p{background-color:transparent;}#mermaid-svg-2qoxJELyYW8kUA34 .label text,#mermaid-svg-2qoxJELyYW8kUA34 span{fill:#333;color:#333;}#mermaid-svg-2qoxJELyYW8kUA34 .node rect,#mermaid-svg-2qoxJELyYW8kUA34 .node circle,#mermaid-svg-2qoxJELyYW8kUA34 .node ellipse,#mermaid-svg-2qoxJELyYW8kUA34 .node polygon,#mermaid-svg-2qoxJELyYW8kUA34 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-2qoxJELyYW8kUA34 .rough-node .label text,#mermaid-svg-2qoxJELyYW8kUA34 .node .label text,#mermaid-svg-2qoxJELyYW8kUA34 .image-shape .label,#mermaid-svg-2qoxJELyYW8kUA34 .icon-shape .label{text-anchor:middle;}#mermaid-svg-2qoxJELyYW8kUA34 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-2qoxJELyYW8kUA34 .rough-node .label,#mermaid-svg-2qoxJELyYW8kUA34 .node .label,#mermaid-svg-2qoxJELyYW8kUA34 .image-shape .label,#mermaid-svg-2qoxJELyYW8kUA34 .icon-shape .label{text-align:center;}#mermaid-svg-2qoxJELyYW8kUA34 .node.clickable{cursor:pointer;}#mermaid-svg-2qoxJELyYW8kUA34 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-2qoxJELyYW8kUA34 .arrowheadPath{fill:#333333;}#mermaid-svg-2qoxJELyYW8kUA34 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-2qoxJELyYW8kUA34 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-2qoxJELyYW8kUA34 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2qoxJELyYW8kUA34 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-2qoxJELyYW8kUA34 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2qoxJELyYW8kUA34 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-2qoxJELyYW8kUA34 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-2qoxJELyYW8kUA34 .cluster text{fill:#333;}#mermaid-svg-2qoxJELyYW8kUA34 .cluster span{color:#333;}#mermaid-svg-2qoxJELyYW8kUA34 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-2qoxJELyYW8kUA34 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-2qoxJELyYW8kUA34 rect.text{fill:none;stroke-width:0;}#mermaid-svg-2qoxJELyYW8kUA34 .icon-shape,#mermaid-svg-2qoxJELyYW8kUA34 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-2qoxJELyYW8kUA34 .icon-shape p,#mermaid-svg-2qoxJELyYW8kUA34 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-2qoxJELyYW8kUA34 .icon-shape .label rect,#mermaid-svg-2qoxJELyYW8kUA34 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-2qoxJELyYW8kUA34 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-2qoxJELyYW8kUA34 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-2qoxJELyYW8kUA34 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} qwen
ernie
deepseek
glm
你的业务代码
MultiModelClient

(统一接口)
model_name参数
通义千问

base_url: dashscope
文心一言

base_url: qianfan
DeepSeek

base_url: api.deepseek
ChatGLM

base_url: bigmodel
返回统一格式

Response

3.2 完整实现代码

python 复制代码
import os
from typing import Optional
from openai import OpenAI

class MultiModelClient:
    """国产大模型统一调用客户端"""
    
    # 模型配置表
    CONFIG = {
        "qwen": {
            "base_url": "https://dashscope.aliyuncs.com/compatible-mode/v1",
            "default_model": "qwen-turbo",
            "env_key": "DASHSCOPE_API_KEY",
        },
        "deepseek": {
            "base_url": "https://api.deepseek.com",
            "default_model": "deepseek-chat",
            "env_key": "DEEPSEEK_API_KEY",
        },
        "glm": {
            "base_url": "https://open.bigmodel.cn/api/paas/v4",
            "default_model": "glm-4-flash",
            "env_key": "ZHIPUAI_API_KEY",
        },
    }
    
    def __init__(self, provider: str = "deepseek", model: Optional[str] = None):
        """
        provider: "qwen" | "deepseek" | "glm"
        model: 不传则用默认模型
        """
        if provider not in self.CONFIG:
            raise ValueError(f"不支持的模型: {provider},可选: {list(self.CONFIG.keys())}")
        
        config = self.CONFIG[provider]
        api_key = os.getenv(config["env_key"])
        if not api_key:
            raise ValueError(f"请设置环境变量 {config['env_key']}")
        
        self.provider = provider
        self.model = model or config["default_model"]
        self.client = OpenAI(api_key=api_key, base_url=config["base_url"])
    
    def chat(self, prompt: str, system: Optional[str] = None,
             temperature: float = 0.7, max_tokens: int = 1024) -> str:
        """统一聊天接口"""
        messages = []
        if system:
            messages.append({"role": "system", "content": system})
        messages.append({"role": "user", "content": prompt})
        
        response = self.client.chat.completions.create(
            model=self.model,
            messages=messages,
            temperature=temperature,
            max_tokens=max_tokens,
        )
        return response.choices[0].message.content
    
    def switch_model(self, model: str):
        """运行时切换模型(同一厂商的不同版本)"""
        self.model = model
        print(f"已切换至: {self.provider}/{self.model}")


# ============ 使用示例 ============

# 用DeepSeek
client = MultiModelClient("deepseek")
print(client.chat("用Python写一个快速排序"))

# 切换到通义千问------改一行即可
client2 = MultiModelClient("qwen")
print(client2.chat("用Python写一个快速排序"))

# 想对比两个模型的回答?简单:
prompt = "解释一下Python的GIL"
print("=== DeepSeek 回答 ===")
print(MultiModelClient("deepseek").chat(prompt))
print("\n=== 通义千问 回答 ===")
print(MultiModelClient("qwen").chat(prompt))

4 ~> 四大模型实测对比

4.1 测试维度与结果

我用同一个Prompt分别喂给四个模型,从三个维度打分:

bash 复制代码
Prompt:"用Python实现一个线程安全的单例模式,要求:支持懒加载、支持参数传递、线程安全"

评分标准:
├─ 代码正确性(能否直接运行)
├─ 中文注释质量(注释是否清晰准确)
└─ 拓展性(代码结构是否易于扩展)
模型 代码正确性 注释质量 响应速度 费用(1K Token)
通义千问 Turbo ⭐⭐⭐⭐⭐ ⭐⭐⭐⭐ ¥0.008
DeepSeek Chat ⭐⭐⭐⭐ ⭐⭐⭐⭐⭐ ¥0.001
GLM-4-Flash ⭐⭐⭐⭐ ⭐⭐⭐⭐ 较快 免费
GPT-3.5-Turbo ⭐⭐⭐⭐⭐ ⭐⭐⭐ ¥0.0035

4.2 选型建议

bash 复制代码
怎么选模型?一张决策树搞定:

你的需求是什么?
├─ 优先成本 → DeepSeek(每百万Token只要1块钱)
├─ 中文理解力 → 通义千问Max或文心一言4.0
├─ 代码生成 → DeepSeek Coder 或 通义千问Plus
├─ 完全免费 → GLM-4-Flash(但还是建议备一个付费的兜底)
├─ 长文本处理(100K+)→ 通义千问Turbo(支持百万Token上下文)
└─ 与百度生态集成 → 文心一言

5 ~> 生产级建议:多模型降级策略

5.1 为什么需要降级

任何一个模型服务都可能挂掉。线上环境里,你需要一个"主模型挂了自动切备用"的机制:

python 复制代码
import time

class RobustClient:
    """带自动降级的客户端"""
    
    PROVIDERS = ["qwen", "deepseek", "glm"]  # 优先级从高到低
    
    def __init__(self):
        self.clients = {}
        for p in self.PROVIDERS:
            try:
                self.clients[p] = MultiModelClient(p)
            except ValueError:
                pass  # 没配Key的跳过
    
    def chat(self, prompt: str, **kwargs) -> str:
        for name, client in self.clients.items():
            try:
                result = client.chat(prompt, **kwargs)
                return f"[{name}] {result}"
            except Exception as e:
                print(f"{name} 调用失败: {e},尝试下一个...")
                time.sleep(1)
        raise RuntimeError("所有模型全部调用失败!")

思考 && 总结

本文解决了"多个国产模型如何统一调用"这个实际问题,要点总结:

  1. OpenAI兼容接口是粘合剂: 四大国产模型全部支持OpenAI格式的API。你只需要换base_urlapi_key,代码逻辑完全复用。这大大降低了多模型集成的成本。
  2. MultiModelClient实现即插即用: 本文给出的统一客户端,通过provider参数切换模型,业务代码无需感知底层是哪家的模型。
  3. DeepSeek是性价比之王: 每百万Token只要1块钱,代码生成场景的表现也非常出色。如果你做的产品对成本敏感,DeepSeek是首选。
  4. 通义千问中文最强: 在中文本土化理解上,通义千问目前是国产模型里综合表现最好的,长文本处理能力也领先。
  5. 免费方案兜底: GLM-4-Flash免费且质量不差,可以作为开发阶段的主力模型。
  6. 线上必备降级: 所有云服务都可能挂。一个遍历式降级策略(主→备→备备)能让你在单个模型宕机时毫发无伤。

国产模型的进步速度远超预期。2023年它们还追在GPT-3.5后面,2025年已经在很多中文场景和GPT-4打平了。学会统一调用它们,是你做国内AI产品的第一块基石。


结尾

各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!

源码骑士 --- Android Framework & 全栈开发

👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长

❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量

收藏:把MultiModelClient的代码存好,下次新项目直接复用

💬 评论:你现在用哪个国产模型?和GPT比感觉怎么样?

🔄 一键四连:不要忘记给博主"一键四连"哦!今日多模型打通!

🗡️ 寄语:技术选型不是比谁参数多,是比谁更匹配你的场景。

结语:现在打开终端,装一个openai库,把文中的MultiModelClient拷过去,填上你的API Key。一行代码切换四个模型的感觉,试试就知道了。不要忘记给博主"一键四连"哦!