目的
为避免一学就会、一用就废,这里做下笔记
内容
在 langchain-openai 库中,OpenAI 和 ChatOpenAI 是两个完全不同 的类,它们的核心区别在于针对的模型类型 和输入输出格式 。简单来说:OpenAI 是"古典派",ChatOpenAI 是"现代派"。
📊 核心区别对比
| 对比维度 | OpenAI | ChatOpenAI |
|---|---|---|
| API 端点 | /v1/completions (文本补全接口) |
/v1/chat/completions (聊天补全接口) |
| 模型类型 | 文本补全模型 (旧版),如 text-davinci-003、gpt-3.5-turbo-instruct |
聊天模型 (现代),如 gpt-3.5-turbo、gpt-4、gpt-4o |
| 输入格式 | 纯文本字符串 | 消息列表 (SystemMessage, HumanMessage, AIMessage 等) |
| 输出格式 | 字符串 | AIMessage 对象 (包含 content、tool_calls 等字段) |
| 功能支持 | 基础文本生成 | 支持多轮对话、工具调用、JSON模式、流式输出 |
| 当前状态 | 仅用于兼容旧代码或嵌入模型 | 所有新项目首选,与LangChain生态无缝集成 |
🔍 为什么会有两个类?
这个区别的根源在于 OpenAI API 的演进历史:
- 早期阶段 :OpenAI 提供
/v1/completions接口,模型只是对输入的 prompt 进行"续写" - 现代阶段 :OpenAI 推出
/v1/chat/completions接口,模型能够理解消息角色(system/user/assistant),支持真正的对话 - 现状 :OpenAI 已将
/v1/completions接口标记为 Legacy(遗留),不再为新模型提供
📝 代码示例对比
使用 OpenAI(旧版文本补全)
python
from langchain_openai import OpenAI
# 仅支持特定的 instruct 模型
llm = OpenAI(model_name="gpt-3.5-turbo-instruct")
# 输入是纯文本,输出是字符串
response = llm.invoke("你好啊,AI小助手")
print(response) # 字符串
print(type(response)) # <class 'str'>
使用 ChatOpenAI(现代聊天模型)
python
from langchain_openai import ChatOpenAI
from langchain.schema import HumanMessage, SystemMessage
# 支持所有现代聊天模型
chat = ChatOpenAI(model_name="gpt-3.5-turbo")
# 输入是消息列表,输出是 AIMessage 对象
messages = [
SystemMessage(content="你是一个知识渊博的助手"),
HumanMessage(content="你好啊,AI小助手")
]
response = chat.invoke(messages)
print(response.content) # 获取文本内容
print(type(response)) # <class 'langchain_core.messages.ai.AIMessage'>
💡 如何选择?
-
使用
ChatOpenAI如果你:- 使用现代模型(GPT-3.5-turbo、GPT-4、GPT-4o 等)
- 构建对话应用或智能体(Agent)
- 需要工具调用、结构化输出等高级功能
- 推荐用于所有新项目
-
使用
OpenAI仅当:- 需要兼容遗留的文本补全模型
- 使用嵌入模型(如
text-embedding-ada-002) - 不推荐用于新项目的对话场景