【LangChain】langchain.chat_models.ChatOpenAI 迁移至 langchain_openai.ChatOpenAI
代码中使用了 langchain.chat_models.ChatOpenAI(即 ChatOpenAI 类),会触发 LangChainDeprecationWarning,提示该类在 LangChain 0.0.10 中已被废弃,并将在 1.0 中移除。官方推荐使用 langchain_openai.ChatOpenAI 替代。本回答将基于 LangChain 0.3.x,详细解释如何将 Ch
代码中使用了 langchain.chat_models.ChatOpenAI(即 ChatOpenAI 类),会触发 LangChainDeprecationWarning,提示该类在 LangChain 0.0.10 中已被废弃,并将在 1.0 中移除。官方推荐使用 langchain_openai.ChatOpenAI 替代。本回答将基于 LangChain 0.3.x,详细解释如何将 ChatOpenAI 迁移到 langchain_openai.ChatOpenAI,并提供代码示例。
代码废弃告警:
LangChainDeprecationWarning: The classChatOpenAIwas deprecated in LangChain 0.0.10 and will be removed in 1.0. An updated version of the class exists in the :class:~langchain-openai package and should be used instead. To use it runpip install -U :class:~langchain-openaiand import asfrom :class:~langchain_openai import ChatOpenAI``.
llm = ChatOpenAI(temperature=0)
为什么需要迁移?
langchain.chat_models.ChatOpenAI 是 LangChain 早期用于调用 OpenAI 聊天模型的类,但存在以下问题:
- 功能过时:未完全适配 OpenAI 最新 API(如高级工具调用、流式输出优化)。
- 包分离:OpenAI 相关功能已移至独立的
langchain-openai包,以提高模块化和维护性。 - 生态兼容性:不完全适配 LangChain 0.3.x 的新架构(如 LCEL 和现代内存管理)。
langchain_openai.ChatOpenAI 是推荐的替代类,优势包括:
- 现代化支持:与最新 OpenAI API 兼容,支持工具调用、流式输出那么,
langchain_openai.ChatOpenAI支持 JSON 模式等。 - 一致性:接口与
langchain_openai.OpenAI(非聊天模型)一致,便于切换。 - 长期支持:在 LangChain 0.3.x 及未来版本中得到官方维护。
迁移步骤
以下是将 langchain.chat_models.ChatOpenAI 迁移到 langchain_openai.ChatOpenAI 的详细步骤,包含代码示例。
1. 理解旧代码
假设你的代码如下,使用了废弃的 ChatOpenAI:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain.chat_models import ChatOpenAI
# 初始化 LLM
llm = ChatOpenAI(temperature=0)
# 示例调用
response = llm.invoke("Hello, how can I assist you?")
print(response.content)
输出示例:
Hi! I'm here to help with any questions or tasks you have. What's on your mind?
2. 安装必要依赖
确保安装了 LangChain 0.3.x 和 langchain-openai 包:
pip install --upgrade langchain langchain-openai
3. 迁移到 langchain_openai.ChatOpenAI
以下是迁移后的代码,替换 ChatOpenAI 为 langchain_openai.ChatOpenAI:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")
# 示例调用
response = llm.invoke("Hello, how can I assist you?")
print(response.content)
输出示例:
Hi! I'm here to help with any questions or tasks you have. What's on your mind?
代码说明
- API 密钥:
- 通过
os.environ["OPENAI_API_KEY"]设置,确保 OpenAI API 调用正常。 - 替换
"Your OpenAI API Key"为你的实际密钥。
- 通过
- LLM 替换:
- 将
langchain.chat_models.ChatOpenAI替换为langchain_openai.ChatOpenAI。 - 参数(如
temperature=0)保持不变。 - 显式指定
model="gpt-4o-mini",因为新类要求明确模型名称(旧类可能使用默认模型,如gpt-3.5-turbo)。
- 将
- 调用:
invoke方法保持不变,输入可以是字符串或消息对象(如HumanMessage)。- 输出为
AIMessage对象,response.content获取文本内容。
4. 高级用法(可选)
如果需要将 ChatOpenAI 集成到对话历史管理中,可以结合 RunnableWithMessageHistory(LangChain 0.3.x 推荐的内存管理方式)。以下是完整示例:
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables.history import RunnableWithMessageHistory
from langchain_community.chat_message_histories import ChatMessageHistory
# 初始化 LLM
llm = ChatOpenAI(temperature=0, model="gpt-4o-mini")
# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
("system", "You are a helpful assistant. Answer all questions to the best of your ability."),
MessagesPlaceholder(variable_name="history"),
("human", "{input}")
])
# 创建 Runnable
runnable = prompt | llm
# 初始化消息历史存储
store = {} # 内存存储,key 为 session_id
def get_session_history(session_id: str) -> ChatMessageHistory:
if session_id not in store:
store[session_id] = ChatMessageHistory()
return store[session_id]
# 创建 RunnableWithMessageHistory
conversation = RunnableWithMessageHistory(
runnable,
get_session_history,
input_messages_key="input",
history_messages_key="history"
)
# 调用对话
session_id = "user1"
response = conversation.invoke(
{"input": "My name is Bob"},
config={"configurable": {"session_id": session_id}}
)
print(response.content)
response = conversation.invoke(
{"input": "What is my name?"},
config={"configurable": {"session_id": session_id}}
)
print(response.content)
输出示例:
Hi Bob, nice to meet you! How can I assist you today?
Your name is Bob.
说明:
- 使用
ChatPromptTemplate定义提示模板,支持对话历史。 RunnableWithMessageHistory管理对话历史,ChatMessageHistory存储消息。session_id区分不同会话,确保历史隔离。
5. 持久化存储(可选)
若需将对话历史保存到数据库,使用 SQLChatMessageHistory:
from langchain_community.chat_message_histories import SQLChatMessageHistory
def get_session_history(session_id: str) -> SQLChatMessageHistory:
return SQLChatMessageHistory(
session_id=session_id,
connection_string="sqlite:///conversation_history.db"
)
替换 get_session_history 函数,历史将持久化到 SQLite 数据库。
6. 测试和验证
- 运行迁移后的代码,验证 LLM 是否正常响应。
- 如果使用对话历史,测试多轮对话,确保历史正确保存。
- 确认 API 密钥有效,避免
AuthenticationError。 - 检查模型输出是否与旧代码一致。
注意事项
- API 密钥安全:
- 避免硬编码密钥,推荐使用
.env文件和python-dotenv:from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的 OPENAI_API_KEY - 确保密钥有权限访问指定模型(如
gpt-4o-mini)。
- 避免硬编码密钥,推荐使用
- 模型选择:
langchain_openai.ChatOpenAI支持 OpenAI 聊天模型,如gpt-3.5-turbo、gpt-4o-mini、gpt-4o。- 检查 OpenAI 文档确认可用模型和定价。
- 参数兼容性:
- 大多数参数(如
temperature、max_tokens)在新类中保持一致。 - 如果使用高级功能(如工具调用),参考
llm.bind_tools()。
- 大多数参数(如
- 性能:
langchain_openai.ChatOpenAI性能与旧类相当,因优化可能略有提升。- 数据库存储可能增加少量延迟。
- 依赖管理:
- 确保
langchain-openai版本与 LangChain 0.3.x 兼容。 - 若遇到依赖冲突,尝试更新所有包或使用虚拟环境。
- 确保
常见问题
Q1:能否继续使用 langchain.chat_models.ChatOpenAI?
A:可以,但不推荐。它将在 LangChain 1.0 中移除,且不支持新功能。迁移到 langchain_openai.ChatOpenAI 更安全。
Q2:如何选择模型?
A:推荐 gpt-4o-mini(性价比高)或 gpt-4o(性能更强)。gpt-3.5-turbo 适合低成本场景。检查 OpenAI 定价和可用性。
Q3:如何处理工具调用?
A:使用 llm.bind_tools([Tool]) 绑定工具,ChatOpenAI 支持结构化输出和工具调用。
Q4:迁移后需要更改其他代码吗?
A:通常只需替换导入和初始化 LLM 的代码。提示模板、内存管理等逻辑可保持不变。
总结
迁移 langchain.chat_models.ChatOpenAI 到 langchain_openai.ChatOpenAI 涉及以下步骤:
- 安装
langchain-openai包。 - 替换导入语句,使用
langchain_openai.ChatOpenAI。 - 显式指定模型名称(如
gpt-4o-mini)。 - 确保设置
OPENAI_API_KEY。 - 可选:结合
RunnableWithMessageHistory和ChatMessageHistory实现对话历史管理。
更多推荐

所有评论(0)