在 LangChain 中,langchain_openai 模块提供了 OpenAIChatOpenAI 两个类,用于与 OpenAI 的语言模型交互。尽管两者都用于调用 OpenAI 的 API,但它们针对的模型类型和使用场景不同。本文基于 LangChain 0.3.x,详细比较 OpenAIChatOpenAI 的区别,包括功能、适用场景和代码示例。


OpenAIChatOpenAI 的区别

1. 模型类型
  • OpenAI

    • 模型:针对 OpenAI 的文本补全模型(Text Completion Models),如 text-davinci-003(已废弃)或其他非聊天模型。
    • 接口:使用文本补全 API(/completions),输入和输出都是纯文本字符串。
    • 特点:适合处理单一的文本生成任务,输出格式较为自由,但缺乏对话上下文管理。
    • 当前状态:由于 OpenAI 已停止支持旧的文本补全模型(如 text-davinci-003),OpenAI 类主要用于兼容旧代码或特定嵌入模型(如 text-embedding-ada-002)。
  • ChatOpenAI

    • 模型:针对 OpenAI 的聊天模型(Chat Completion Models),如 gpt-3.5-turbogpt-4ogpt-4o-mini
    • 接口:使用聊天补全 API(/chat/completions),输入为消息列表(SystemMessageHumanMessage 等),输出为结构化的 AIMessage 对象。
    • 特点:专为对话场景设计,支持多轮对话、工具调用和结构化输出,适合现代 LLM 应用。
    • 当前状态:是 LangChain 中与 OpenAI 模型交互的首选类,兼容最新模型和功能。
2. 输入和输出格式
  • OpenAI

    • 输入:单一字符串(提示文本)。
    • 输出:字符串(生成的文本)。
    • 示例
      response = openai_model.invoke("什么是人工智能?")
      # 输出:字符串,如 "人工智能是..."
      
    • 局限:不支持消息格式,无法区分系统指令、用户输入或对话历史。
  • ChatOpenAI

    • 输入:消息列表(如 [SystemMessage, HumanMessage])或字符串(自动转换为 HumanMessage)。
    • 输出AIMessage 对象,包含 content(文本内容)、tool_calls(工具调用)等字段。
    • 示例
      response = chat_model.invoke([{"role": "user", "content": "什么是人工智能?"}])
      # 输出:AIMessage 对象,response.content 为 "人工智能是..."
      
    • 优势:支持结构化消息,适合对话、工具调用和 JSON 模式。
3. 功能支持
  • OpenAI

    • 功能:基础文本生成,适合简单任务(如文本补全、翻译、总结)。
    • 限制
      • 不支持工具调用(Tool Calling)。
      • 不支持 JSON 模式输出。
      • 不适合多轮对话(需手动拼接上下文)。
    • 适用场景:早期 LLM 应用、嵌入生成(如 text-embedding-ada-002)。
  • ChatOpenAI

    • 功能
      • 支持多轮对话,结合 RunnableWithMessageHistory 管理上下文。
      • 支持工具调用(通过 bind_tools)。
      • 支持 JSON 模式(结构化输出)。
      • 支持流式输出(stream 方法)和异步调用(ainvoke)。
    • 适用场景:现代对话机器人、代理(Agent)、复杂工作流(如 LangGraph)。
4. 性能和成本
  • OpenAI

    • 性能:依赖旧模型,性能较低(如 text-davinci-003 已废弃)。
    • 成本:旧模型通常较贵,且不再更新。
    • 状态:不推荐用于新项目。
  • ChatOpenAI

    • 性能:支持最新模型(如 gpt-4o-minigpt-4o),性能更强,延迟更低。
    • 成本gpt-4o-mini 等模型性价比高,适合大规模部署。
    • 状态:推荐用于所有新项目。
5. 兼容性和生态
  • OpenAI
    • 兼容性:与 LangChain 的旧链(如 LLMChain)兼容,但不适配 LCEL(LangChain Expression Language)的高级功能。
    • 生态:功能有限,难以与现代工具(如 RunnableWithMessageHistory、LangGraph)集成。
  • ChatOpenAI
    • 兼容性:完全支持 LCEL,适合 prompt | llm 等现代链。
    • 生态:与 LangChain 0.3.x 的代理、工具调用、内存管理和 LangGraph 无缝集成。

代码示例

以下是使用 OpenAIChatOpenAI 的对比示例,展示两者的使用方式和输出差异。

使用 OpenAI
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"

from langchain_openai import OpenAI

# 初始化 OpenAI 模型
openai_model = OpenAI(temperature=0, model="text-embedding-ada-002")  # 注意:仅限嵌入模型

# 调用模型
response = openai_model.invoke("什么是人工智能?")
print(response)

输出示例

人工智能是计算机科学的一个分支,旨在创建能够模拟人类智能的系统,包括学习、推理和决策等能力。

说明

  • 输入为字符串,输出为字符串。
  • 仅限嵌入模型(如 text-embedding-ada-002),文本补全模型已废弃。
  • 适合简单文本生成或嵌入生成。
使用 ChatOpenAI
import os
os.environ["OPENAI_API_KEY"] = "Your OpenAI API Key"

from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# 初始化 ChatOpenAI 模型
chat_model = ChatOpenAI(temperature=0, model="gpt-4o-mini")

# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手,请准确回答问题。"),
    ("human", "{question}")
])

# 创建 LCEL 链
chain = prompt | chat_model

# 调用链
response = chain.invoke({"question": "什么是人工智能?"})
print(response.content)

输出示例

人工智能(AI)是计算机科学的一个分支,旨在创建能够执行需要人类智能的任务的系统,例如学习、推理、问题解决和决策。AI 包括机器学习、自然语言处理等技术。

说明

  • 输入为消息列表(通过 ChatPromptTemplate),输出为 AIMessage
  • 支持对话上下文、工具调用和结构化输出。
  • 适合现代对话和复杂工作流。
结合对话历史的 ChatOpenAI
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

# 初始化 ChatOpenAI 模型
chat_model = ChatOpenAI(temperature=0, model="gpt-4o-mini")

# 定义提示模板
prompt = ChatPromptTemplate.from_messages([
    ("system", "你是一个助手,请根据对话历史回答问题。"),
    MessagesPlaceholder(variable_name="history"),
    ("human", "{input}")
])

# 创建 LCEL 链
runnable = prompt | chat_model

# 初始化消息历史存储
store = {}
def get_session_history(session_id: str) -> ChatMessageHistory:
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]

# 创建带历史的链
chain = RunnableWithMessageHistory(
    runnable,
    get_session_history,
    input_messages_key="input",
    history_messages_key="history"
)

# 调用链
session_id = "user1"
response = chain.invoke(
    {"input": "我叫鲍勃"},
    config={"configurable": {"session_id": session_id}}
)
print(response.content)

response = chain.invoke(
    {"input": "我的名字是什么?"},
    config={"configurable": {"session_id": session_id}}
)
print(response.content)

输出示例

你好,鲍勃!很高兴认识你!有什么可以帮助你的?
你的名字是鲍勃。

说明

  • ChatOpenAI 支持对话历史管理,OpenAI 无法实现此功能。
  • 使用 LCEL 和 RunnableWithMessageHistory 构建现代工作流。

选择 OpenAI 还是 ChatOpenAI

  • 使用 OpenAI
    • 仅在需要兼容旧代码或处理嵌入模型(如 text-embedding-ada-002)时使用。
    • 不适合新项目或对话场景。
  • 使用 ChatOpenAI
    • 推荐用于所有新项目,特别是对话、代理、工具调用或复杂工作流。
    • 支持最新模型(gpt-4o-minigpt-4o)和现代功能(如工具调用、JSON 模式)。
    • 与 LangChain 0.3.x 的 LCEL、LangGraph 等生态无缝集成。

注意事项

  1. API 密钥安全
    • 避免硬编码密钥,推荐使用 .env 文件和 python-dotenv
      from dotenv import load_dotenv
      load_dotenv()  # 加载 .env 文件中的 OPENAI_API_KEY
      
    • 确保密钥支持指定模型(如 gpt-4o-mini 或嵌入模型)。
  2. 模型选择
    • ChatOpenAI 支持 gpt-3.5-turbogpt-4ogpt-4o-mini 等,推荐 gpt-4o-mini(高性价比)。
    • OpenAI 仅限嵌入模型或旧模型,功能受限。
  3. 输入输出兼容性
    • ChatOpenAI 适合消息格式,OpenAI 适合纯文本。
    • 使用 ChatPromptTemplate 搭配 ChatOpenAI 更自然。
  4. 工具调用
    • 只有 ChatOpenAI 支持工具调用(bind_tools),OpenAI 不支持。
  5. 性能
    • ChatOpenAI 因支持新模型和流式处理,性能更优。
    • OpenAI 因依赖旧模型,性能较低。

常见问题

Q1:可以用 OpenAI 实现对话吗?
A:可以,但需手动拼接上下文,效率低且不支持工具调用。推荐使用 ChatOpenAI

Q2:ChatOpenAI 支持哪些模型?
A:支持所有 OpenAI 聊天模型(如 gpt-3.5-turbogpt-4ogpt-4o-mini),参考 OpenAI 模型文档

Q3:如何选择模型?
A:gpt-4o-mini 性价比高,适合大多数场景;gpt-4o 性能更强,适合复杂任务;OpenAI 仅用于嵌入或旧代码。

Q4:OpenAI 还有用吗?
A:仅在处理嵌入模型(如 text-embedding-ada-002)或迁移旧代码时有用,新项目应使用 ChatOpenAI


总结

  • OpenAI
    • 针对文本补全模型(如嵌入模型),输入/输出为字符串。
    • 功能有限,不支持对话、工具调用或 JSON 模式。
    • 适合嵌入生成或旧代码兼容,不推荐新项目。
  • ChatOpenAI
    • 针对聊天模型(如 gpt-4o-mini),输入为消息列表,输出为 AIMessage
    • 支持对话、工具调用、JSON 模式、流式输出等现代功能。
    • 推荐用于所有新项目,与 LCEL 和 LangGraph 集成良好。
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐