LangChain 两大基础提示词模板:PromptTemplate 与 ChatPromptTemplate 详解

1. 引言

在使用 LangChain 构建大模型应用时,提示词(Prompt)是与模型交互的核心桥梁。LangChain 提供了两大基础提示词模板:PromptTemplateChatPromptTemplate。它们分别面向普通 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. 总结

PromptTemplateChatPromptTemplate 是 LangChain 提示词体系的两大基石。前者面向普通 LLM,以简单字符串完成单轮文本任务;后者面向 Chat 对话模型,以多消息结构实现复杂对话与角色控制。理解两者的差异,能帮助你在不同模型与场景下做出正确选择,为构建更强大的 LLM 应用打下坚实基础。

相关推荐
AI绘画哇哒哒5 小时前
【建议收藏!】35岁后端血泪忠告,这3类人别硬转Agent(过来人亲述)
java·人工智能·后端·ai·程序员·大模型·agent
Chengbei115 小时前
DSH渗透测试插件dsh-pentest全新升级!适配DeepSeek Harness,可视化探索链路,一键搭建轻量化AI渗透测试环境。
人工智能·web安全·网络安全·微信·小程序·系统安全·安全架构
QN1幻化引擎5 小时前
DalinX Phi 性能突破:跨层秩保持对齐与意识涌现度量的实证研究
人工智能·ai·架构·agi·asi
NeilCarmack5 小时前
Deepseek-harness增加桌面版端序列:第 1 讲 · 命令解析:`pnpm dsh desktop` 的第一步
人工智能·agent·ai agent
聪明蛋子哟5 小时前
Stagehand v3多语言SDK:Python/Go/Rust/Java下的浏览器自动化统一方案
python·golang·rust
龙兵AI增长破局圈.赵老师讲成交5 小时前
只有把过程管好,结果才会出来。
大数据·人工智能·ai·创业创新
最强小杰6 小时前
gpt-5.6-sol 频繁报 503 怎么办?区分容量熔断和限速 429 的排查方法 + 可复用 retry wrapper
java·人工智能·gpt·ai
天天代码码天天6 小时前
我做了一个只有一个 EXE 的本地 Markdown 编辑器:lw.MD(简墨)
人工智能
AI的探索之旅6 小时前
97 个 OpenCV 实例(七):SIMD 向量化,给像素处理装上涡轮增压
人工智能·opencv·计算机视觉
不可求~6 小时前
用 AI 读论文别只看摘要:建立可追溯的证据链
人工智能·深度学习·机器学习