Appearance
模型切换与对比
讲了 OpenAI、Anthropic、通义千问、智谱 GLM、Ollama 五家模型,到底该选哪个?本章给个对比总览,并演示怎么用 init_chat_model 实现"一行切换模型"的通用智能体。
一、五大模型横向对比
| 维度 | OpenAI GPT-4o | Anthropic Claude | 通义千问 Qwen | 智谱 GLM | Ollama 本地 |
|---|---|---|---|---|---|
| 综合能力 | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★☆☆(看模型) |
| 工具调用稳定性 | ★★★★★ | ★★★★★ | ★★★★☆ | ★★★★☆ | ★★★☆☆(需选对模型) |
| 中文能力 | ★★★★☆ | ★★★★☆ | ★★★★★ | ★★★★★ | ★★★★☆(Qwen/DeepSeek) |
| 上下文长度 | 128K | 200K | 128K(qwen-long 千万级) | 128K | 看模型,4K-128K |
| 价格(输入/百万token) | ~$2.5(4o) | ~$3(Sonnet) | ¥0.8(plus) | ¥0.5(plus) | 免费 |
| 国内可用性 | 需代理 | 需代理 | ✅ 直连 | ✅ 直连 | ✅ 本地 |
| 隐私 | 数据出境 | 数据出境 | 数据出境(阿里云) | 数据出境 | ✅ 不出本机 |
| 离线可用 | ❌ | ❌ | ❌ | ❌ | ✅ |
| 适合新手练手 | ⚠️ 要配代理 | ⚠️ 要配代理 | ✅ | ✅(flash 免费) | ✅ |
价格随时间变化,上表为大致量级,以官网为准。
二、选型建议
2.1 按场景
| 场景 | 首选 | 备选 |
|---|---|---|
| 国内生产环境 | 通义千问 qwen-plus | 智谱 glm-4-plus |
| 学习/实验/不想花钱 | Ollama qwen2.5:7b | 智谱 glm-4-flash(免费) |
| 要最强能力 | GPT-4o / Claude 3.5 Sonnet | 通义 qwen-max |
| 隐私敏感(医疗/金融) | Ollama 本地 | 私有化部署的开源模型 |
| 内网/断网部署 | Ollama | — |
| 长文档分析 | 通义 qwen-long | Claude |
| 高并发低成本 | 通义 qwen-turbo | 智谱 glm-4-air |
2.2 给 Python 新手的建议
- 入门阶段:用 Ollama
qwen2.5:7b,免费、本地、随装随用,先把 LangGraph 流程跑通。 - 做点真东西:上通义千问
qwen-plus,国内直连、人民币结算、工具调用稳。 - 要极致效果:再考虑 GPT-4o 或 Claude,配代理。
别一上来就 GPT-4o 烧钱,先把概念和流程用便宜模型搞懂。
三、一行切换模型
init_chat_model 的价值在这里体现:改一个字符串就换模型。
python
from langchain.chat_models import init_chat_model
# 想用哪个改这一行
llm = init_chat_model(
model="qwen-plus",
model_provider="tongyi",
temperature=0,
)
# 换 GPT
# llm = init_chat_model(model="gpt-4o-mini", model_provider="openai", temperature=0)
# 换 Claude
# llm = init_chat_model(model="claude-3-5-sonnet-20241022", model_provider="anthropic", temperature=0)
# 换智谱
# llm = init_chat_model(model="glm-4-plus", model_provider="zhipu", temperature=0)
# 换本地
# llm = init_chat_model(model="qwen2.5:7b", model_provider="ollama", temperature=0)四、环境变量驱动切换
更工程化的做法:模型配置全放环境变量,代码不写死。
text
# .env
MODEL_NAME=qwen-plus
MODEL_PROVIDER=tongyi
TEMPERATURE=0python
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
load_dotenv()
llm = init_chat_model(
model=os.getenv("MODEL_NAME"),
model_provider=os.getenv("MODEL_PROVIDER"),
temperature=float(os.getenv("TEMPERATURE", "0")),
)切换模型只改 .env,不动代码、不重新打包、不用改 git。生产灰度发布常用这招。
五、通用多模型 Agent 示例
下面这个智能体能通过环境变量在五家模型间切换,工具和图代码完全不变:
python
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.tools import tool
from langchain_core.messages import HumanMessage
from langgraph.prebuilt import create_react_agent
load_dotenv()
# 工具:和模型无关
@tool
def add(a: float, b: float) -> float:
"""两数相加。"""
return a + b
@tool
def multiply(a: float, b: float) -> float:
"""两数相乘。"""
return a * b
@tool
def get_weather(city: str) -> str:
"""查城市天气,支持北京/上海/广州。"""
data = {"北京": "晴 25°C", "上海": "多云 28°C", "广州": "雨 31°C"}
return data.get(city, f"{city} 未知")
# 模型:环境变量驱动
llm = init_chat_model(
model=os.getenv("MODEL_NAME", "qwen-plus"),
model_provider=os.getenv("MODEL_PROVIDER", "tongyi"),
temperature=float(os.getenv("TEMPERATURE", "0")),
)
# 智能体:和具体模型无关
agent = create_react_agent(
model=llm,
tools=[add, multiply, get_weather],
prompt="你是中文助手,按需调工具,简体中文回答。",
)
# 跑!
result = agent.invoke({
"messages": [HumanMessage(content="查广州天气,再算 25 乘以 4,最后总结一下")]
})
print("模型:", os.getenv("MODEL_NAME"), "/", os.getenv("MODEL_PROVIDER"))
print("回答:", result["messages"][-1].content)跑不同模型只需改 .env 后重跑:
bash
# 用通义
setx MODEL_NAME qwen-plus
setx MODEL_PROVIDER tongyi
# 用智谱
setx MODEL_NAME glm-4-plus
setx MODEL_PROVIDER zhipu
# 用本地
setx MODEL_NAME qwen2.5:7b
setx MODEL_PROVIDER ollama(macOS/Linux 把 setx X Y 换成 export X=Y,并 source 一下)
六、各家 API Key 速查
| 模型 | 环境变量 | 获取地址 |
|---|---|---|
| OpenAI | OPENAI_API_KEY (+ OPENAI_BASE_URL 配代理) | platform.openai.com |
| Anthropic | ANTHROPIC_API_KEY | console.anthropic.com |
| 通义千问 | DASHSCOPE_API_KEY | dashscope.console.aliyun.com |
| 智谱 GLM | ZHIPUAI_API_KEY | open.bigmodel.cn |
| Ollama | 无需 key | 本地服务 |
把所有 key 集中到 .env 文件管理:
text
OPENAI_API_KEY=sk-xxx
OPENAI_BASE_URL=https://api.中转.com/v1
ANTHROPIC_API_KEY=sk-ant-xxx
DASHSCOPE_API_KEY=sk-xxx
ZHIPUAI_API_KEY=xxx.yyy
MODEL_NAME=qwen-plus
MODEL_PROVIDER=tongyi
TEMPERATURE=0记得 .gitignore 加 .env。
七、常见踩坑
1. 接口差异导致切换后报错
虽然 init_chat_model 抹平了大部分差异,但仍有边缘 case:
max_tokens参数名和默认值各家不同。with_structured_output不是所有模型都支持(Ollama 部分模型不行)。- 流式行为略有差异。
切换后务必回归测试一遍核心功能。
2. 工具调用支持参差
云端大模型工具调用都很稳,但本地 Ollama 要选对模型(qwen2.5)。换模型后先跑个工具调用测试:
python
r = llm.bind_tools([add]).invoke("3+5=?")
assert r.tool_calls, "该模型不支持工具调用或未触发"3. 模型名带版本号会过期
gpt-4o-mini 这类别名相对稳定;claude-3-5-sonnet-20241022 带日期,过段时间会有新版。生产环境把模型名也放配置,方便随时升级。
4. 代理环境变量串扰
配了 http_proxy 给 OpenAI 用,结果通义/智谱的请求也被代理绕出去,慢且易断。国产模型用之前清掉代理:
bash
# 临时清掉
set HTTP_PROXY=
set HTTPS_PROXY=或在代码里只对 OpenAI 请求设代理。
5. token 计费口径不同
各家对"1 token 等于多少字符"定义略有不同,中文场景尤其差异大。预算估算时别直接套用一个公式,以各家后台实际计量为准。
八、小结
- 五家模型各有定位:云端强(GPT/Claude)、国产稳(Qwen/GLM)、本地私(Ollama)。
- 国内生产首选通义/智谱;实验首选 Ollama;要最强用 GPT/Claude。
- 用
init_chat_model+ 环境变量实现一行切换,代码与模型解耦。 - 切换后务必回归测试,注意接口差异、代理串扰、工具调用支持。
至此模型集成模块结束。下一模块我们进入实战,把前面学的状态图、工具、智能体、模型组合起来做真实项目。