OpenAI与ChatOpenAI区别
1.核心区别
from langchain_openai import OpenAI 和 from langchain_openai import ChatOpenAI 的核心区别在于:
OpenAI调用的是传统的文本补全模型(已过时)ChatOpenAI调用的是现代的对话模型,是当前所有新项目的首选 。
区别对比表:
| 方面 | OpenAI |
ChatOpenAI |
|---|---|---|
| 核心用途 | 调用OpenAI的文本补全模型 (Legacy) | 调用OpenAI的对话模型 |
| API 端点 | /v1/completions |
/v1/chat/completions |
| 输入格式 | 简单的字符串 (文本提示) | 消息列表 (如 SystemMessage, HumanMessage),支持角色区分 |
| 输出格式 | 字符串 (生成的文本) | AIMessage 对象,包含结构化的内容和元数据 |
| 适用模型 | 仅用于已废弃的文本模型 (如 text-davinci-003) 或嵌入模型 |
所有现代模型 (如 gpt-4, gpt-3.5-turbo, gpt-4o-mini等) |
| 功能支持 | 仅基础文本生成,不支持工具调用、多轮对话等高级功能 | 支持工具调用 (Tool Calling)、结构化输出 (JSON mode)、多轮对话、流式输出等现代LLM特性 |
| 当前状态 | 已过时,仅用于兼容旧代码 | 首选,用于所有新项目和现代开发 |
2. 两者使用方式
使用openAI
from langchain_openai import OpenAI
# 初始化一个已过时的文本模型
llm = OpenAI(model="text-davinci-003")
# 传入简单的字符串
response = llm.invoke("什么是人工智能?")
print(response) # 输出一个字符串
使用 ChatOpenAI
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage, SystemMessage
# 初始化一个现代对话模型
chat_model = ChatOpenAI(model="gpt-4o-mini")
# 传入结构化的消息列表
messages = [
SystemMessage(content="你是一个乐于助人的助手。"),
HumanMessage(content="什么是人工智能?")
]
response = chat_model.invoke(messages)
print(response.content) # 从AIMessage对象中获取文本内容
3.使用ChatOpenAI输出一个字符串
3.1 直接获取 content 属性
from langchain_openai import ChatOpenAI
from langchain_core.messages import HumanMessage
chat_model = ChatOpenAI(model="gpt-4o-mini")
messages = [HumanMessage(content="什么是人工智能?")]
response = chat_model.invoke(messages)
# 直接获取content属性,这就是字符串
output_string = response.content
print(output_string) # 输出:字符串
print(type(output_string)) # <class 'str'>
3.2 使用 invoke 直接返回字符串
from langchain_openai import ChatOpenAI
chat_model = ChatOpenAI(model="gpt-4o-mini")
output_string = chat_model.invoke("什么是人工智能?").content
# 注意:.invoke这种方式返回的是AIMessage
# 需要提取content
print(output_string) # 字符串
3.3 使用 | 操作符配合 StrOutputParser(LCEL风格)
from langchain_openai import ChatOpenAI
from langchain_core.output_parsers import StrOutputParser
# 创建chain
chain = ChatOpenAI(model="gpt-4o-mini") | StrOutputParser()
# 直接得到字符串
output_string = chain.invoke("什么是人工智能?")
print(output_string) # 纯字符串,不是AIMessage
print(type(output_string)) # <class 'str'>
4. PromptTemplate和 ChatPromptTemplate
4.1 定义
- PromptTemplate:通用文本提示词的"动态构建工具",继承自StringPromptTemplate,生成单轮文本提示。
- ChatPromptTemplate:对话场景专属模板,基于"角色-消息"结构设计,继承自BaseChatPromptTemplate,用于构建多轮对话消息。
4.2 对比
| 方面 | PromptTemplate |
ChatPromptTemplate |
|---|---|---|
| 输出格式 | 生成单一的字符串 | 生成消息列表 (List of messages) |
| 适用模型 | 主要用于 OpenAI 类(文本补全模型) |
主要用于 ChatOpenAI 类(对话模型) |
| 消息结构 | 单一的提示文本 | 支持多种角色:System, Human, AI, Tool 等 |
| 典型用途 | 简单的文本生成任务 | 复杂对话、角色设定、多轮交互、工具调用 |
| 变量插入 | 支持变量插值 | 支持变量插值,且可在不同消息中分别插入 |
4.3 代码示例对比
使用 PromptTemplate (生成字符串)
from langchain_core.prompts import PromptTemplate
# 定义模板
prompt_template = PromptTemplate.from_template(
"请用{language}写一段关于{topic}的代码。"
)
# 格式化后得到字符串
prompt_string = prompt_template.format(language="Python", topic="快速排序")
print(prompt_string)
# 输出: "请用Python写一段关于快速排序的代码。"
使用 ChatPromptTemplate (生成消息列表)
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
# 定义包含多个角色的对话模板
chat_template = ChatPromptTemplate.from_messages([
("system", "你是一个{role},请用{language}回答用户问题。"),
("human", "{question}"),
# 也可以添加示例对话
("ai", "好的,我明白了。"),
("human", "请开始吧")
])
# 格式化后得到消息列表
messages = chat_template.format_messages(
role="编程专家",
language="中文",
question="如何实现快速排序?"
)
print(messages)
# 输出: [
# SystemMessage(content="你是一个编程专家,请用中文回答用户问题。"),
# HumanMessage(content="如何实现快速排序?"),
# AIMessage(content="好的,我明白了。"),
# HumanMessage(content="请开始吧")
# ]
注意:!!!!!
format()返回字符串,format_messages()返回消息列表
使用建议:
-
用
PromptTemplate
✅ 简单场景,只需要一个提示字符串
prompt = PromptTemplate.from_template("翻译以下内容为{target_lang}:{text}")
✅ 兼容旧代码或旧模型
-
用
ChatPromptTemplate
✅ 现代对话模型(99%的情况)
chat_prompt = ChatPromptTemplate.from_messages([
("system", "你是一个{persona}"),
("human", "{input}")
])
✅ 需要角色设定
✅ 需要多轮对话
✅ 需要工具调用或结构化输出
✅ 需要插入对话历史
4.4 from_template()
from_template()是一个类方法,存在于多个 Prompt 类中,用于从字符串模板创建 Prompt 对象。
PromptTemplate.from_template()- 基础文本模板
from langchain_core.prompts import PromptTemplate
# 基本用法
prompt = PromptTemplate.from_template("翻译以下内容为{target_lang}:{text}")
print(prompt.format(target_lang="英语", text="你好"))
# 输出:翻译以下内容为英语:你好
# 带多个变量
prompt = PromptTemplate.from_template(
"你是一名{role},请用{style}的风格回答关于{topic}的问题。"
)
print(prompt.format(role="医生", style="专业", topic="感冒"))
# 输出:你是一名医生,请用专业的风格回答关于感冒的问题。
-
ChatPromptTemplate.from_template()- 单轮对话模板
from langchain_core.prompts import ChatPromptTemplate
# 基本用法 - 自动包装为 HumanMessage(单字符串模板 -> 自动变为 Human 消息)
chat_prompt = ChatPromptTemplate.from_template("请解释:{concept}")
# format() 返回拼接后的字符串
print(chat_prompt.format(concept="量子计算"))
# 输出:Human: 请解释:量子计算
# format_messages() 返回消息列表
messages = chat_prompt.format_messages(concept="量子计算")
print(messages)
# 输出:[HumanMessage(content="请解释:量子计算")]
print(messages.content)
# 输出:请解释:量子计算
# 查看内部结构
print(chat_prompt.messages)
# 输出:[HumanMessagePromptTemplate(prompt=PromptTemplate(input_variables=['concept'], template='请解释:{concept}'))]
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐



所有评论(0)