1.核心区别

from langchain_openai import OpenAI 和 from langchain_openai import ChatOpenAI 的核心区别在于:

  • OpenAI 调用的是传统的文本补全模型(已过时)
  • ChatOpenAI 调用的是现代的对话模型,是当前所有新项目的首选 。

区别对比表:

方面 OpenAI ChatOpenAI
核心用途 调用OpenAI的文本补全模型 (Legacy)  调用OpenAI的对话模型 
API 端点 /v1/completions  /v1/chat/completions 
输入格式 简单的字符串 (文本提示)  消息列表 (如 SystemMessageHumanMessage),支持角色区分 
输出格式 字符串 (生成的文本)  AIMessage 对象,包含结构化的内容和元数据 
适用模型 仅用于已废弃的文本模型 (如 text-davinci-003) 或嵌入模型  所有现代模型 (如 gpt-4gpt-3.5-turbogpt-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}'))]

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐