Skip to content

模型切换与对比

讲了 OpenAI、Anthropic、通义千问、智谱 GLM、Ollama 五家模型,到底该选哪个?本章给个对比总览,并演示怎么用 init_chat_model 实现"一行切换模型"的通用智能体。

一、五大模型横向对比

维度OpenAI GPT-4oAnthropic Claude通义千问 Qwen智谱 GLMOllama 本地
综合能力★★★★★★★★★★★★★★☆★★★★☆★★★☆☆(看模型)
工具调用稳定性★★★★★★★★★★★★★★☆★★★★☆★★★☆☆(需选对模型)
中文能力★★★★☆★★★★☆★★★★★★★★★★★★★★☆(Qwen/DeepSeek)
上下文长度128K200K128K(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-longClaude
高并发低成本通义 qwen-turbo智谱 glm-4-air

2.2 给 Python 新手的建议

  1. 入门阶段:用 Ollama qwen2.5:7b,免费、本地、随装随用,先把 LangGraph 流程跑通。
  2. 做点真东西:上通义千问 qwen-plus,国内直连、人民币结算、工具调用稳。
  3. 要极致效果:再考虑 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=0
python
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 速查

模型环境变量获取地址
OpenAIOPENAI_API_KEY (+ OPENAI_BASE_URL 配代理)platform.openai.com
AnthropicANTHROPIC_API_KEYconsole.anthropic.com
通义千问DASHSCOPE_API_KEYdashscope.console.aliyun.com
智谱 GLMZHIPUAI_API_KEYopen.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 + 环境变量实现一行切换,代码与模型解耦。
  • 切换后务必回归测试,注意接口差异、代理串扰、工具调用支持。

至此模型集成模块结束。下一模块我们进入实战,把前面学的状态图、工具、智能体、模型组合起来做真实项目。