代码中使用了 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 class ChatOpenAI was 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 run pip install -U :class:~langchain-openai and import as from :class:~langchain_openai import ChatOpenAI``.
llm = ChatOpenAI(temperature=0)


为什么需要迁移?

langchain.chat_models.ChatOpenAI 是 LangChain 早期用于调用 OpenAI 聊天模型的类,但存在以下问题:

  1. 功能过时:未完全适配 OpenAI 最新 API(如高级工具调用、流式输出优化)。
  2. 包分离:OpenAI 相关功能已移至独立的 langchain-openai 包,以提高模块化和维护性。
  3. 生态兼容性:不完全适配 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

以下是迁移后的代码,替换 ChatOpenAIlangchain_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?
代码说明
  1. API 密钥
    • 通过 os.environ["OPENAI_API_KEY"] 设置,确保 OpenAI API 调用正常。
    • 替换 "Your OpenAI API Key" 为你的实际密钥。
  2. LLM 替换
    • langchain.chat_models.ChatOpenAI 替换为 langchain_openai.ChatOpenAI
    • 参数(如 temperature=0)保持不变。
    • 显式指定 model="gpt-4o-mini",因为新类要求明确模型名称(旧类可能使用默认模型,如 gpt-3.5-turbo)。
  3. 调用
    • 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
  • 检查模型输出是否与旧代码一致。

注意事项

  1. API 密钥安全
    • 避免硬编码密钥,推荐使用 .env 文件和 python-dotenv
      from dotenv import load_dotenv
      load_dotenv()  # 加载 .env 文件中的 OPENAI_API_KEY
      
    • 确保密钥有权限访问指定模型(如 gpt-4o-mini)。
  2. 模型选择
    • langchain_openai.ChatOpenAI 支持 OpenAI 聊天模型,如 gpt-3.5-turbogpt-4o-minigpt-4o
    • 检查 OpenAI 文档确认可用模型和定价。
  3. 参数兼容性
    • 大多数参数(如 temperaturemax_tokens)在新类中保持一致。
    • 如果使用高级功能(如工具调用),参考 llm.bind_tools()
  4. 性能
    • langchain_openai.ChatOpenAI 性能与旧类相当,因优化可能略有提升。
    • 数据库存储可能增加少量延迟。
  5. 依赖管理
    • 确保 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.ChatOpenAIlangchain_openai.ChatOpenAI 涉及以下步骤:

  1. 安装 langchain-openai 包。
  2. 替换导入语句,使用 langchain_openai.ChatOpenAI
  3. 显式指定模型名称(如 gpt-4o-mini)。
  4. 确保设置 OPENAI_API_KEY
  5. 可选:结合 RunnableWithMessageHistoryChatMessageHistory 实现对话历史管理。
Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐