文章目录
- 【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_url和api_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("所有模型全部调用失败!")
思考 && 总结
本文解决了"多个国产模型如何统一调用"这个实际问题,要点总结:
- OpenAI兼容接口是粘合剂: 四大国产模型全部支持OpenAI格式的API。你只需要换
base_url和api_key,代码逻辑完全复用。这大大降低了多模型集成的成本。 - MultiModelClient实现即插即用: 本文给出的统一客户端,通过
provider参数切换模型,业务代码无需感知底层是哪家的模型。 - DeepSeek是性价比之王: 每百万Token只要1块钱,代码生成场景的表现也非常出色。如果你做的产品对成本敏感,DeepSeek是首选。
- 通义千问中文最强: 在中文本土化理解上,通义千问目前是国产模型里综合表现最好的,长文本处理能力也领先。
- 免费方案兜底: GLM-4-Flash免费且质量不差,可以作为开发阶段的主力模型。
- 线上必备降级: 所有云服务都可能挂。一个遍历式降级策略(主→备→备备)能让你在单个模型宕机时毫发无伤。
国产模型的进步速度远超预期。2023年它们还追在GPT-3.5后面,2025年已经在很多中文场景和GPT-4打平了。学会统一调用它们,是你做国内AI产品的第一块基石。
结尾
各位小伙伴,本文的内容到这里就全部结束了,源码骑士在这里再次感谢您的阅读!
源码骑士 --- Android Framework & 全栈开发
👀 关注:跟博主一起从源码视角深耕底层原理,见证每一次成长
❤️ 点赞:让优质内容被更多人看见,让知识传递更有力量
⭐ 收藏:把MultiModelClient的代码存好,下次新项目直接复用
💬 评论:你现在用哪个国产模型?和GPT比感觉怎么样?
🔄 一键四连:不要忘记给博主"一键四连"哦!今日多模型打通!
🗡️ 寄语:技术选型不是比谁参数多,是比谁更匹配你的场景。
结语:现在打开终端,装一个openai库,把文中的MultiModelClient拷过去,填上你的API Key。一行代码切换四个模型的感觉,试试就知道了。不要忘记给博主"一键四连"哦!