Langchain 之 ChatPromptTemplate.from_template和from_messages 的区别
若你需要创建简单的单轮对话提示,且角色较少(如只有系统消息+用户消息),语法更简洁。若你需要处理多轮对话动态插入历史消息,或涉及复杂角色(如函数调用、消息占位符),是更优选择,因其结构清晰、灵活性更高。实际开发中,因灵活性强,更适合大多数场景,尤其是需要扩展为多轮对话或工具调用的场景。
·
ChatPromptTemplate.from_template 和 ChatPromptTemplate.from_messages 是 LangChain 中创建聊天提示模板的两种常用方法,核心区别在于消息结构的灵活性和适用场景,具体差异如下:
1. 核心功能与语法差异
(1)ChatPromptTemplate.from_template
- 功能:通过单字符串模板创建提示,模板中需包含角色标识(如
system:、user:)来区分消息角色。 - 语法:接收一个字符串模板,通过
{角色名}:前缀指定消息角色,变量用{}包裹。 - 示例:
from langchain_core.prompts import ChatPromptTemplate # 单字符串模板,用 "system:" "user:" 区分角色 template = """ system: You are a helpful assistant. user: Tell me a joke about {topic}. """ prompt_template = ChatPromptTemplate.from_template(template) # 传入变量生成提示 result = prompt_template.invoke({"topic": "cats"}) print(result.messages) # 输出包含 SystemMessage 和 HumanMessage 的列表
(2)ChatPromptTemplate.from_messages
- 功能:通过消息列表创建提示,每条消息显式指定角色和内容,无需依赖字符串前缀。
- 语法:接收一个列表,列表元素可以是
(角色, 内容)元组或消息对象(如SystemMessage、HumanMessage),变量用{}包裹。 - 示例:
from langchain_core.prompts import ChatPromptTemplate # 消息列表,显式指定每条消息的角色 messages = [ ("system", "You are a helpful assistant."), ("user", "Tell me a joke about {topic}.") ] prompt_template = ChatPromptTemplate.from_messages(messages) # 传入变量生成提示 result = prompt_template.invoke({"topic": "cats"}) print(result.messages) # 输出与 from_template 相同的消息列表
2. 关键区别对比
| 对比维度 | from_template |
from_messages |
|---|---|---|
| 消息角色指定方式 | 依赖字符串前缀(如 system:、user:) |
显式通过元组 (角色, 内容) 或消息对象指定 |
| 灵活性 | 较低:模板是单字符串,复杂结构易混乱 | 较高:列表形式支持任意数量、任意角色的消息 |
| 支持的消息类型 | 仅支持 system、user、assistant 基础角色 |
支持所有消息类型(包括 MessagesPlaceholder 占位符、FunctionMessage 等) |
| 适用场景 | 简单单轮对话,消息结构固定且角色少 | 多轮对话、需要动态插入消息(如历史记录)、复杂角色组合的场景 |
| 可读性 | 简单场景清晰,复杂场景易出错(如长文本中角色前缀易遗漏) | 结构清晰,消息角色和内容一目了然 |
3. 特殊场景适配性
-
当需要动态插入多轮历史消息时:
from_messages支持MessagesPlaceholder(消息占位符),可灵活插入多条历史消息(如用户与AI的多轮对话),而from_template难以处理这种动态列表结构。
示例(from_messages配合占位符):from langchain_core.prompts import MessagesPlaceholder messages = [ ("system", "You are a helpful assistant."), MessagesPlaceholder("chat_history"), # 动态插入多轮历史消息 ("user", "Tell me more about {topic}.") ] prompt_template = ChatPromptTemplate.from_messages(messages) -
当需要使用函数调用消息(
FunctionMessage)时:from_messages可直接传入FunctionMessage对象,而from_template无法通过字符串前缀表示这种特殊角色消息。
4. 总结
- 若你需要创建简单的单轮对话提示,且角色较少(如只有系统消息+用户消息),
from_template语法更简洁。 - 若你需要处理多轮对话、动态插入历史消息,或涉及复杂角色(如函数调用、消息占位符),
from_messages是更优选择,因其结构清晰、灵活性更高。
实际开发中,from_messages 因灵活性强,更适合大多数场景,尤其是需要扩展为多轮对话或工具调用的场景。
更多推荐


所有评论(0)