【零基础入门 LLM 开发 · Day 11】:ChatOpenAI vs init_chat_model——一行换供应商 【零基础入门 LLM 开发 · Day 11】ChatOpenAI vs init_chat_model——一行换供应商场景Day 10 起我们的代码都是这么开头的fromlangchain_openaiimportChatOpenAI llmChatOpenAI(model...,api_key...,base_url...)直接实例化直观明了。但它有个隐形约束类名焊死了供应商——ChatOpenAI只会说OpenAI 协议这一种话。哪天想试 Claude、Gemini 或本地模型每个文件都要改 import 和构造代码。最近的练习文件换成了另一种写法init_chat_model。这篇讲清两者区别顺便把常见供应商的接入写法一次备齐。姿势一ChatOpenAI 直连fromlangchain_openaiimportChatOpenAI llmChatOpenAI(modelos.getenv(YUMC_MODEL_NAME),api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),# 指向任何 OpenAI 兼容端点temperature0.7,)优点类型明确IDE 补全参数一个不落装的包也最少langchain-openai一个就够局限只会 OpenAI 协议。对兼容端点来说这恰恰不是缺点见下文但要接原生 Anthropic / Google 接口就得换类、换包。姿势二init_chat_model 工厂fromlangchain.chat_modelsimportinit_chat_model modelinit_chat_model(modelos.getenv(YUMC_MODEL_NAME),model_provideropenai,# 决定实际造出哪个类temperature0,api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)model_provider是工厂的图纸openai→ 内部实例化ChatOpenAIanthropic→ChatAnthropic……其余参数原样透传给对应的类。换供应商 改一个字符串。验证一下工厂没骗你modelinit_chat_model(modelgpt-4o-mini,model_provideropenai)print(type(model))# class langchain_openai.chat_models.base.ChatOpenAIChatOpenAI 直连init_chat_model 工厂本质具体类按字符串选类的工厂函数换供应商改 import 构造代码只改model_provider或配置IDE 补全好一般返回类型是动态的依赖只需对应一家的包用哪家就得装哪家的包适用教学/demo、只用一家多模型切换、通用工具不同供应商的写法速查表路线 A官方集成包——每家一个model_provider值 一个要单独安装的包供应商model_provider需要安装model 示例OpenAIopenailangchain-openaigpt-4o-miniAnthropicanthropiclangchain-anthropicclaude-sonnet-4-5Googlegoogle_genailangchain-google-genaigemini-2.0-flashDeepSeekdeepseeklangchain-deepseekdeepseek-chatOllama本地ollamalangchain-ollamaqwen2.5本地已 pull 的模型名modelinit_chat_model(claude-sonnet-4-5,model_provideranthropic)# api_key 从环境变量 ANTHROPIC_API_KEY 自动读取也可以显式传路线 BOpenAI 兼容协议——很多国产服务不提供官方集成包但都提供OpenAI 兼容接口统统走model_provideropenai 自家base_url服务base_url智谱 GLMhttps://open.bigmodel.cn/api/paas/v4Kimi月之暗面https://api.moonshot.cn/v1通义千问兼容模式https://dashscope.aliyuncs.com/compatible-mode/v1DeepSeek 官方https://api.deepseek.com你自己的 .envYUMC_MODEL_BASE_URL本系列一直在用的就是这种modelinit_chat_model(modelglm-5.3-flash,model_provideropenai,# 协议是 OpenAI 的base_urlhttps://open.bigmodel.cn/api/paas/v4,# 但地址是智谱的api_keyos.getenv(ZHIPU_API_KEY),)本系列的.envYUMC_MODEL_*就是路线 B协议标准、地址自选。所以代码从 Day 1 到今天几乎没变过。小技巧新版还支持冒号简写一行连供应商带模型名一起写modelinit_chat_model(openai:gpt-4o-mini)怎么选教学阶段 / 确定只用 OpenAI 系ChatOpenAI直连——直观、补全友好想随时切换模型对比效果 / 做通用工具init_chat_model——把供应商选择变成一行配置两者可以混用核心代码面向 LangChain 的统一消息/工具接口编程初始化交给工厂。今日踩坑点没装对应的集成包init_chat_model(model_provideranthropic)但没装langchain-anthropic报ModuleNotFoundError——工厂是按需导入的图纸认了、零件没货。兼容端点漏了base_url以为传了api_key就行请求直奔官方api.openai.com拿着智谱的 key 报 401。路线 B 的base_url是命根子。参数拼写错误被透传init_chat_model(..., temperatre0)不报参数不存在而是把未知参数转发给底层类最后在 API 调用时才炸TypeError: unexpected keyword argument temperatre——报错位置离案发现场很远Day 14 的methond同款坑。参数拼错先查构造处。换了供应商 ≠ 行为一致bind_tools、with_structured_output各家支持度不同Day 14 的json_schema假装支持问题就是典型。切了供应商这些能力要重新验证。今日小练习必做把 Day 10 的ChatOpenAI换成init_chat_model跑通同样的对话print(type(model))亲眼看看工厂造出了什么。进阶写一个load_model()函数——供应商、模型名、密钥全部从.env读取实现不改一行代码换供应商。思考把base_url改成一个不存在的地址和直接删掉base_url分别报什么错为什么报错不一样明日预告Day 12LangChain 流式输出——比 Day 5 手动拼 delta 简单得多一行for搞定。附录完整练习代码langchainTest4-tools2.py的初始化段tools 系列练习文件统一用这种写法importosfromdotenvimportload_dotenvfromlangchain.chat_modelsimportinit_chat_model load_dotenv()modelinit_chat_model(modelos.getenv(YUMC_MODEL_NAME),model_provideropenai,temperature0,api_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)换供应商实战只动.env代码零修改importosfromdotenvimportload_dotenvfromlangchain.chat_modelsimportinit_chat_model load_dotenv()# .env 里配什么就用什么# YUMC_MODEL_NAMEglm-5.3-flash# YUMC_MODEL_API_KEY你的密钥# YUMC_MODEL_BASE_URLhttps://open.bigmodel.cn/api/paas/v4# 想换 Kimi改这三行配置即可下面的代码原封不动。modelinit_chat_model(modelos.getenv(YUMC_MODEL_NAME),model_provideropenai,# 兼容协议走 openaiapi_keyos.getenv(YUMC_MODEL_API_KEY),base_urlos.getenv(YUMC_MODEL_BASE_URL),)responsemodel.invoke(用一句话介绍你自己)print(response.content)