【LangChain】 OpenAI 和 ChatOpenAI 的区别
在 LangChain 中,langchain_openai 模块提供了 OpenAI 和 ChatOpenAI 两个类,用于与 OpenAI 的语言模型交互。尽管两者都用于调用 OpenAI 的 API,但它们针对的模型类型和使用场景不同。OpenAI:针对文本补全模型(如嵌入模型),输入/输出为字符串,功能有限,不支持对话、工具调用或 JSON 模式,适合嵌入生成或旧代码兼容,不推荐新项目。C
在 LangChain 中,langchain_openai 模块提供了 OpenAI 和 ChatOpenAI 两个类,用于与 OpenAI 的语言模型交互。尽管两者都用于调用 OpenAI 的 API,但它们针对的模型类型和使用场景不同。本文基于 LangChain 0.3.x,详细比较 OpenAI 和 ChatOpenAI 的区别,包括功能、适用场景和代码示例。
OpenAI 和 ChatOpenAI 的区别
1. 模型类型
-
OpenAI:
- 模型:针对 OpenAI 的文本补全模型(Text Completion Models),如
text-davinci-003(已废弃)或其他非聊天模型。 - 接口:使用文本补全 API(
/completions),输入和输出都是纯文本字符串。 - 特点:适合处理单一的文本生成任务,输出格式较为自由,但缺乏对话上下文管理。
- 当前状态:由于 OpenAI 已停止支持旧的文本补全模型(如
text-davinci-003),OpenAI类主要用于兼容旧代码或特定嵌入模型(如text-embedding-ada-002)。
- 模型:针对 OpenAI 的文本补全模型(Text Completion Models),如
-
ChatOpenAI:
- 模型:针对 OpenAI 的聊天模型(Chat Completion Models),如
gpt-3.5-turbo、gpt-4o、gpt-4o-mini。 - 接口:使用聊天补全 API(
/chat/completions),输入为消息列表(SystemMessage、HumanMessage等),输出为结构化的AIMessage对象。 - 特点:专为对话场景设计,支持多轮对话、工具调用和结构化输出,适合现代 LLM 应用。
- 当前状态:是 LangChain 中与 OpenAI 模型交互的首选类,兼容最新模型和功能。
- 模型:针对 OpenAI 的聊天模型(Chat Completion Models),如
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-mini、gpt-4o),性能更强,延迟更低。 - 成本:
gpt-4o-mini等模型性价比高,适合大规模部署。 - 状态:推荐用于所有新项目。
- 性能:支持最新模型(如
5. 兼容性和生态
- OpenAI:
- 兼容性:与 LangChain 的旧链(如
LLMChain)兼容,但不适配 LCEL(LangChain Expression Language)的高级功能。 - 生态:功能有限,难以与现代工具(如
RunnableWithMessageHistory、LangGraph)集成。
- 兼容性:与 LangChain 的旧链(如
- ChatOpenAI:
- 兼容性:完全支持 LCEL,适合
prompt | llm等现代链。 - 生态:与 LangChain 0.3.x 的代理、工具调用、内存管理和 LangGraph 无缝集成。
- 兼容性:完全支持 LCEL,适合
代码示例
以下是使用 OpenAI 和 ChatOpenAI 的对比示例,展示两者的使用方式和输出差异。
使用 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-mini、gpt-4o)和现代功能(如工具调用、JSON 模式)。 - 与 LangChain 0.3.x 的 LCEL、LangGraph 等生态无缝集成。
注意事项
- API 密钥安全:
- 避免硬编码密钥,推荐使用
.env文件和python-dotenv:from dotenv import load_dotenv load_dotenv() # 加载 .env 文件中的 OPENAI_API_KEY - 确保密钥支持指定模型(如
gpt-4o-mini或嵌入模型)。
- 避免硬编码密钥,推荐使用
- 模型选择:
ChatOpenAI支持gpt-3.5-turbo、gpt-4o、gpt-4o-mini等,推荐gpt-4o-mini(高性价比)。OpenAI仅限嵌入模型或旧模型,功能受限。
- 输入输出兼容性:
ChatOpenAI适合消息格式,OpenAI适合纯文本。- 使用
ChatPromptTemplate搭配ChatOpenAI更自然。
- 工具调用:
- 只有
ChatOpenAI支持工具调用(bind_tools),OpenAI不支持。
- 只有
- 性能:
ChatOpenAI因支持新模型和流式处理,性能更优。OpenAI因依赖旧模型,性能较低。
常见问题
Q1:可以用 OpenAI 实现对话吗?
A:可以,但需手动拼接上下文,效率低且不支持工具调用。推荐使用 ChatOpenAI。
Q2:ChatOpenAI 支持哪些模型?
A:支持所有 OpenAI 聊天模型(如 gpt-3.5-turbo、gpt-4o、gpt-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 集成良好。
- 针对聊天模型(如
更多推荐
所有评论(0)