1. 引言
在使用 LangChain 构建大模型应用时,提示词(Prompt)是与模型交互的核心桥梁。LangChain 提供了两大基础提示词模板:PromptTemplate 和 ChatPromptTemplate。它们分别面向普通 LLM 与 Chat 对话模型,是后续所有高级提示词技巧的基石。本文将深入剖析这两个模板的定义、用法,并从「普通 LLM」与「Chat 对话模型」两个角度对比分析它们的适用场景与设计差异。
2. 什么是 PromptTemplate
PromptTemplate 是 LangChain 中最基础的提示词模板,用于将用户输入的变量动态填充到一段固定的文本模板中,最终生成一个完整的字符串提示词。
2.1 基本用法
python
from langchain.prompts import PromptTemplate
# 定义模板,使用 {变量名} 占位
template = "请用{language}写一段关于{topic}的介绍。"
# 创建 PromptTemplate 实例
prompt = PromptTemplate(
input_variables=["language", "topic"],
template=template,
)
# 填充变量,生成最终提示词
final_prompt = prompt.format(language="Python", topic="装饰器")
print(final_prompt)
输出结果:
text
请用Python写一段关于装饰器的介绍。
2.2 核心特点
- 单一字符串输出 :
PromptTemplate最终产出的是一段纯文本字符串,没有角色(role)概念。 - 变量占位符 :通过
{变量名}在模板中预留位置,运行时用format()方法填充。 - 简单直接:适用于输入输出都是纯文本的场景,如文本生成、文本分类、关键词提取等。
3. 什么是 ChatPromptTemplate
ChatPromptTemplate 是面向 Chat 对话模型的提示词模板。它不再是一段孤立的文本,而是由多条「消息」(Message)组成的对话结构,每条消息都带有角色标识(如系统、人类、AI)。
3.1 基本用法
python
from langchain.prompts import ChatPromptTemplate
# 定义对话模板,使用元组 (角色, 内容) 列表
template = ChatPromptTemplate.from_messages([
("system", "你是一位精通{language}的资深技术专家。"),
("human", "请用通俗易懂的方式解释{topic}。"),
])
# 填充变量,生成消息列表
messages = template.format_messages(
language="Python",
topic="闭包",
)
print(messages)
输出结果:
text
[
SystemMessage(content="你是一位精通Python的资深技术专家。"),
HumanMessage(content="请用通俗易懂的方式解释闭包。"),
]
3.2 核心特点
- 多消息结构:由系统消息、人类消息、AI 消息等组成,模拟真实对话上下文。
- 角色区分:每条消息都有明确的角色,帮助模型理解对话语境与任务边界。
- 支持消息模板 :除了
from_messages,还支持MessagePromptTemplate等更细粒度的组合方式。
4. 从「普通 LLM」角度分析
普通 LLM(如早期的 GPT-3、文本补全类模型)接收的输入是一段连续的文本,没有对话历史与角色概念。此时 PromptTemplate 是最合适的选择。
4.1 适用场景
- 单轮文本生成任务,如写文章、翻译、摘要。
- 输入输出均为纯文本,无需维护多轮对话状态。
- 调用的是
llm.predict()或llm.invoke()这类文本补全接口。
4.2 示例:使用 PromptTemplate 调用普通 LLM
python
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
llm = OpenAI(model="text-davinci-003")
prompt = PromptTemplate(
input_variables=["product"],
template="为以下产品写一句吸引人的广告语:{product}",
)
# 生成提示词并调用模型
text = prompt.format(product="智能保温杯")
response = llm.invoke(text)
print(response)
4.3 局限性
- 无法表达「系统指令」与「用户输入」的层次关系。
- 多轮对话时需要手动拼接历史消息,维护成本高。
- 对需要角色扮演或复杂指令约束的任务,表达能力有限。
5. 从「Chat 对话模型」角度分析
Chat 对话模型(如 GPT-4、ChatGLM、通义千问等)原生支持多消息对话结构,能区分系统指令、用户输入与历史回复。此时 ChatPromptTemplate 能充分发挥模型能力。
5.1 适用场景
- 多轮对话机器人、客服系统、AI 助手。
- 需要系统角色设定(如「你是资深律师」「你是幽默的导游」)的任务。
- 调用的是
chat_model.invoke()或chat_model.predict_messages()这类对话接口。
5.2 示例:使用 ChatPromptTemplate 调用 Chat 模型
python
from langchain.chat_models import ChatOpenAI
from langchain.prompts import ChatPromptTemplate
chat_model = ChatOpenAI(model="gpt-4")
template = ChatPromptTemplate.from_messages([
("system", "你是一位耐心的数学老师,擅长用生活例子讲解概念。"),
("human", "请解释什么是{concept}?"),
])
# 生成消息列表并调用模型
messages = template.format_messages(concept="微积分")
response = chat_model.invoke(messages)
print(response.content)
5.3 核心优势
- 系统消息设定角色:在对话开始前明确模型的身份与行为准则。
- 天然支持多轮上下文:消息列表可不断追加历史对话,模型能理解完整语境。
- 更精细的控制:可分别构造系统、用户、助手消息,实现复杂对话流程。
6. 两大模板对比总结
| 对比维度 | PromptTemplate | ChatPromptTemplate |
|---|---|---|
| 输出形式 | 单一字符串 | 消息列表(含角色) |
| 角色概念 | 无 | 有(system / human / ai) |
| 适用模型 | 普通 LLM(文本补全) | Chat 对话模型 |
| 多轮对话 | 需手动拼接 | 原生支持 |
| 调用接口 | llm.invoke(text) |
chat_model.invoke(messages) |
| 典型场景 | 文本生成、翻译、摘要 | 聊天机器人、AI 助手 |
| 复杂度 | 低 | 中 |
7. 如何选择
- 如果你的模型是普通文本补全模型 ,且任务为单轮文本处理,优先使用
PromptTemplate。 - 如果你的模型是Chat 对话模型 ,或需要系统角色设定、多轮上下文,优先使用
ChatPromptTemplate。 - 在实际项目中,两者可以结合使用:先用
PromptTemplate处理文本,再用ChatPromptTemplate组织对话流程。
8. 总结
PromptTemplate 与 ChatPromptTemplate 是 LangChain 提示词体系的两大基石。前者面向普通 LLM,以简单字符串完成单轮文本任务;后者面向 Chat 对话模型,以多消息结构实现复杂对话与角色控制。理解两者的差异,能帮助你在不同模型与场景下做出正确选择,为构建更强大的 LLM 应用打下坚实基础。