精细化控制大模型输出:LangChain PromptTemplate 与 ChatPromptTemplate 全解
摘要
提示词(Prompt)是调控大模型输出效果最直接的手段。原生字符串拼接难以维护、不利于项目迭代,LangChain 提供一套标准化提示模板组件实现提示词工程化管理。本文基于 LangChain1.0,详解PromptTemplate、ChatPromptTemplate核心差异与用法,深入讲解MessagesPlaceholder实现多轮对话上下文,附带商品文案、学习计划、智能客服三大可直接运行业务案例,带你掌握工业级提示词编写规范,搭建可复用、易维护的 AI 应用提示体系。
LangChain 1.0 提示词工程实战:Prompt 模板、多轮对话与业务场景落地
前言
在前两章节,我们已经完成基础环境搭建,掌握使用init_chat_model对接 DeepSeek 大模型、构建基础对话、保存简单对话历史。 在正式搭建业务 AI 应用前,我们必须攻克提示词(Prompt)工程。 很多新手直接使用 f-string 拼接字符串传递指令,在小型 Demo 尚可使用,但进入正式项目会暴露出大量维护难题。LangChain 提供标准化提示模板组件,实现固定指令与动态变量解耦,是开发企业级 AI 应用必备技能。
本章学习目标
学完本章内容,你将具备以下能力:
- 理解 Prompt 在大模型应用中的核心作用
- 区分普通字符串 Prompt 与模板化 Prompt 的优劣
- 熟练使用
PromptTemplate构建纯文本提示词 - 掌握
ChatPromptTemplate结构化消息模板(生产首选) - 实现模板动态变量注入
- 遵循规范编写适配业务场景的高质量提示词
- 掌握
MessagesPlaceholder,实现多轮对话历史注入 - 完成三大实战案例:商品文案生成、学习计划生成、智能客服回复
一、什么是 Prompt
Prompt 就是交给大模型的指令、上下文与输入信息,直接决定大模型输出的风格、格式、内容质量。
简单示例(极简 Prompt):
请用一句话介绍 LangChain。
业务场景下的复杂 Prompt:
你是一名电商运营专家。 请根据商品名称、商品卖点、目标用户,生成一段适合详情页展示的商品文案。 要求:
- 语气自然
- 不超过 150 字
- 突出用户利益
核心结论:Prompt 质量,直接决定大模型输出质量。
二、为什么需要 Prompt 模板
很多初学者习惯直接使用字符串插值拼接 Prompt,示例如下:
python
运行
prompt = f"请为商品 {product_name} 写一段文案,卖点是 {selling_points}"
这种写法存在诸多痛点:
- 提示文本过长时,代码可读性极差
- 多处业务复用相同指令,大量重复代码
- 字符串拼接极易产生语法、格式错误
- 后期修改提示规则,需要到处改动,维护成本高
解决方案:使用 LangChain 提示模板,将固定指令与动态变量彻底分离。
三、PromptTemplate 基础使用
PromptTemplate面向纯文本场景,用于构建无角色区分的单行 / 段落式提示词模板。 语法使用{变量名}作为占位符,调用时传入字典完成变量填充。
基础示例
python
运行
from langchain_core.prompts import PromptTemplate
# 定义模板
prompt_template = PromptTemplate.from_template(
"请为商品 {product_name} 写一句广告语,突出卖点:{selling_points}"
)
# 注入变量
prompt = prompt_template.invoke(
{
"product_name": "无线鼠标",
"selling_points": "静音、续航长、轻便",
}
)
print(prompt.text)
模板内{product_name}、{selling_points}会被传入数据自动替换,最终生成完整文本字符串。
四、ChatPromptTemplate 基础使用【生产环境优先推荐】
现代对话大模型(DeepSeek、GPT、通义千问等)原生支持结构化消息:
- System:系统指令(角色、约束、规则)
- Human:用户提问
- AI:模型历史回答
ChatPromptTemplate专门用来构建结构化消息列表,原生支持角色划分,模型更容易区分指令与用户输入,输出稳定性更强。
基础示例
python
运行
from langchain_core.prompts import ChatPromptTemplate
prompt_template = ChatPromptTemplate.from_messages(
[
("system", "你是一名电商运营专家,回答要简洁、有吸引力。"),
("human", "请为商品 {product_name} 写一段文案,卖点是:{selling_points}"),
]
)
prompt = prompt_template.invoke(
{
"product_name": "无线鼠标",
"selling_points": "静音、续航长、轻便",
}
)
print(prompt)
PromptTemplate VS ChatPromptTemplate 核心差异
表格
| 组件 | 结构 | 适用场景 | 优点 |
|---|---|---|---|
| PromptTemplate | 生成一段纯文本字符串 | 简单文本生成、非对话任务 | 使用简单 |
| ChatPromptTemplate | 结构化消息列表 [SystemMessage,HumanMessage] | 对话模型、智能体、多轮对话 | 支持角色划分,输出更稳定,主流项目首选 |
重要提醒:传给聊天大模型时,优先使用
ChatPromptTemplate。 不要把系统提示词、用户提问全部揉在一段文本中,极易造成模型混淆指令边界。
随堂完整演示代码
python
运行
from langchain_core.prompts import PromptTemplate
# 纯文本模板
prompt_template=PromptTemplate.from_template("请为商品 {product_name} 写一句广告语,突出卖点:{selling_points}")
prompt=prompt_template.invoke(
{
"product_name":"logi鼠标",
"selling_points":"特别安静,灵敏,速度快,无延迟"
}
)
print(prompt.text)
from langchain_core.prompts import ChatPromptTemplate
# 结构化对话模板
chat_template=ChatPromptTemplate.from_messages(
[
("system","你是一名电商运营专家,回答要简洁、有吸引力。"),
("human","请为商品 {product_name} 写一段文案,卖点是:{selling_points}")
]
)
prompt=chat_template.invoke(
{
"product_name":"logi鼠标",
"selling_points":"特别安静,灵敏,速度快,无延迟"
}
)
print(prompt)
# 获取用户消息内容
print(prompt.messages[1].content)
五、高质量 Prompt 通用编写规范
设计提示词遵循四大要素,可以显著提升输出可控性:
- 明确角色:定义模型身份,决定回答风格
示例:你是一名电商运营专家
- 明确任务:清晰告知需要完成什么工作
示例:根据商品名称和卖点生成一段详情页文案
- 明确约束条件:字数、格式、语气、禁止行为
示例:不超过 150 字,禁止夸张宣传
- 规范输入字段:清晰定义每一项变量含义
商品名称:{product_name};商品卖点:{selling_points}
六、三大业务实战案例
先进行工程优化:模型初始化重复代码抽取为工具类,避免每个 Demo 重复编写环境与模型配置。 新建 utils/model_factory.py
python
运行
# model_factory.py
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
def get_deepSeek_model(temperature:float=0.7):
load_dotenv()
model = init_chat_model(
model="deepseek-v4-flash",
model_provider="openai",
base_url=os.getenv("DEEPSEEK_BASE_URL"),
api_key=os.getenv("DEEPSEEK_API_KEY"),
temperature=temperature
)
return model
案例一:商品文案生成器
文件名:01_product_copywriter.py
python
运行
import os
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model
load_dotenv()
model=get_deepSeek_model(temperature=0.5)
prompt_str="""
请根据下面信息生成一段商品详情页文案。
商品名称:{product_name}
商品卖点:{selling_points}
目标用户:{target_user}
要求:
1. 不超过 150 字
2. 突出用户能获得的好处
3. 不要使用虚假夸张表达
"""
chat_promt_template=ChatPromptTemplate.from_messages([
("system","你是一名电商运营专家,擅长写自然、有吸引力但不过度夸张的商品文案"),
("human",prompt_str)
])
prompt=chat_promt_template.invoke({
"product_name":"无线静音鼠标",
"selling_points":"静音按键、蓝牙连接、续航 30 天、轻便便携",
"target_user":"经常在办公室和图书馆使用电脑的人",
})
response=model.invoke(prompt)
print(response.content)
案例二:学习计划生成器
文件名:02_study_plan.py
python
运行
from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model
model=get_deepSeek_model(0.5)
prompt_str="""
请为我制定一个学习计划。
学习主题:{topic}
学习时长:{days} 天
每天可学习时间:{hours_per_day} 小时
当前基础:{level}
要求:
1. 按天列出学习内容
2. 每天给出练习任务
3. 内容要适合当前基础
"""
chat_promt_template=ChatPromptTemplate.from_messages([
("system","你是一名编程课程规划老师,擅长为初学者制定可执行的学习计划。"),
("human",prompt_str)
])
prompt=chat_promt_template.invoke({
"topic":"langchain",
"days":"3",
"hours_per_day":"1",
"level":"会python基础"
})
response=model.invoke(prompt)
print(response.content)
案例三:智能客服回复生成器
文件名:03_customer_reply.py
python
运行
from langchain_core.prompts import ChatPromptTemplate
from utils.model_factory import get_deepSeek_model
model = get_deepSeek_model(0.7)
prompt_str = """
请根据用户问题和订单状态,生成一段客服回复。
用户问题:{user_question}
订单状态:{order_status}
物流信息:{shipping_info}
要求:
1. 先安抚用户
2. 再说明当前情况
3. 最后给出下一步建议
4. 不超过 120 字
"""
chat_promt_template = ChatPromptTemplate.from_messages([
("system", "你是一名电商客服,回复要礼貌、明确,不推卸责任。"),
("human", prompt_str)
])
prompt = chat_promt_template.invoke({
"user_question": "我的快递三天没更新了,是不是丢了?",
"order_status": "已发货",
"shipping_info": "物流显示包裹已到达上海转运中心,暂未更新下一站信息"
})
response = model.invoke(prompt)
print(response.content)
七、MessagesPlaceholder 实现多轮对话上下文
7.1 组件作用
普通变量{question}仅能传入一段文本; MessagesPlaceholder可以一次性传入多条消息列表,多用于:
- 注入多轮聊天历史
- 注入 Agent 工具中间步骤消息
- 批量插入一组预先构造好的对话消息
核心参数说明
python
运行
MessagesPlaceholder(
variable_name="history", # 变量名称,invoke时对应key
optional=True, # 是否允许不传该变量
n_messages=6, # 最多保留最近N条消息,控制上下文长度
)
完整示例代码
python
运行
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from utils.model_factory import get_deepSeek_model
model=get_deepSeek_model(temperature=0.7)
chat_prompt=ChatPromptTemplate.from_messages(
[
("system","你是一个很棒的问答助手"),
MessagesPlaceholder(variable_name="history",optional=True,n_messages=4),
("human","{question}")
]
)
prompt=chat_prompt.invoke({
"history":[
("human", "My name is Alice."),
("ai", "Nice to meet you, Alice."),
("human", "I like Python."),
("ai", "Great choice."),
("human", "I also use LangChain."),
("ai", "LangChain is useful for LLM apps."),
],
"question":"我叫什么名字?"
})
resp=model.invoke(prompt)
print(resp.content)
注意要点:
- history 必须是列表,不能直接传入字符串;
optional=False(默认)时,调用必须传入 history,否则报错;n_messages自动截断历史消息,防止上下文超限。
简写方式(等价写法,无法配置 n_messages):
python
运行
("placeholder", "{history}")
八、本章重点总结
- Prompt 是传递给大模型的任务指令,直接影响输出效果;
- 标准 Prompt 结构:角色定义 + 任务描述 + 输入信息 + 约束规则;
PromptTemplate:纯文本模板;ChatPromptTemplate:结构化消息模板,业务开发优先选用;- 模板通过
{变量名}实现动态内容注入,实现指令与数据解耦; MessagesPlaceholder用于批量插入消息列表,是实现多轮对话历史的核心组件;- 项目开发中将模型初始化封装为工具函数,消除重复代码。
九、常见问题答疑
Q1:Prompt 写得越长效果越好吗?
A:不是。指令尽量清晰简洁,堆砌大量无关约束,会让模型难以兼顾所有要求,更容易输出偏离预期的结果。
Q2:模型经常没有严格遵守 Prompt 约束怎么办?
A:大模型具备概率特性,无法 100% 严格服从指令。如果业务对输出格式要求极高,后续需要结合输出解析器做结果校验与格式化处理,下一章节讲解。
Q3:如何选择 PromptTemplate 和 ChatPromptTemplate?
- 简单纯文本生成任务:可使用 PromptTemplate
- 所有对话模型、智能体、多轮交互场景:强制优先 ChatPromptTemplate
更多推荐

所有评论(0)