LangChain提示词模板实操指南:从Zero-Shot到多轮对话全解锁
在大模型应用开发中,提示词(Prompt)是连接开发者需求与模型输出的核心桥梁——一段规范、精准的提示词,能让通用大模型输出贴合业务、格式统一的结果;反之,零散、杂乱的提示词,不仅会导致输出偏离预期,还会增加开发调试成本。
手动拼接提示词看似简单,却在大型工程中暴露诸多问题:重复编写冗余代码、变量注入易出错、格式难以标准化、无法适配复杂场景(如少样本学习、多轮对话)。而LangChain提供的提示词模板体系,恰好解决了这些痛点,通过PromptTemplate、FewShotPromptTemplate、ChatPromptTemplate三大核心类,实现提示词的可复用、标准化、动态化,让提示词工程更高效、更规范。
本文将从基础到进阶,手把手拆解这三大模板的核心用法、参数细节与原创实操代码,帮你彻底掌握LangChain提示词模板的使用技巧,轻松应对各类开发场景。
一、基础入门:PromptTemplate(Zero-Shot场景首选)
1. 核心定位与价值
PromptTemplate是LangChain中最基础、最常用的提示词模板类,专为Zero-Shot(零样本)场景设计——无需提供任何示例,仅通过“固定模板+动态变量”的组合,就能快速生成规范的提示词。
很多开发者会疑惑:“用PromptTemplate还不如手动拼接字符串?” 其实在小型demo中,两者差异不大,但在大型工程中,模板化的优势尤为明显:一是便于标准化管理,修改模板后所有调用处同步生效;二是支持LangChain的链式调用(Runnable接口),可与模型、解析器等组件无缝衔接,大幅提升开发效率。
2. 核心用法与原创代码实操
PromptTemplate的核心是“模板定义+变量注入”,最常用的创建方式是from_template(),支持两种调用写法:标准写法(先生成提示词再调用模型)和链式写法(模板与模型直接串联)。
示例场景:生成产品宣传文案(零样本,动态注入产品名称和核心卖点)
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
# 1. 定义提示词模板(固定文本+动态变量,变量用{变量名}表示)
prompt_template = PromptTemplate.from_template(
"请为{product_name}撰写3句宣传文案,突出{core_sell}卖点,语言简洁有力,适合社交媒体传播,每句不超过15字。"
)
# 2. 标准写法:先注入变量生成提示词,再调用模型
# 变量注入(format方法传入键值对)
prompt_text = prompt_template.format(product_name="智能手环", core_sell="超长续航+心率监测")
# 初始化模型
llm = Tongyi(model="qwen-max")
# 调用模型获取结果(一次性输出)
res = llm.invoke(input=prompt_text)
print("标准写法输出:\n", res)
链式写法更简洁,无需单独生成提示词,直接将模板与模型串联,通过invoke传入变量即可:
from langchain_core.prompts import PromptTemplate
from langchain_community.llms.tongyi import Tongyi
# 1. 定义提示词模板(与上面一致)
prompt_template = PromptTemplate.from_template(
"请为{product_name}撰写3句宣传文案,突出{core_sell}卖点,语言简洁有力,适合社交媒体传播,每句不超过15字。"
)
# 2. 链式写法:模板与模型串联(| 是LangChain链式调用的核心符号)
llm = Tongyi(model="qwen-max")
chain = prompt_template | llm
# 传入变量,调用链获取结果
res = chain.invoke(input={"product_name": "无线耳机", "core_sell": "降噪+低延迟"})
print("\n链式写法输出:\n", res)
3. 关键注意点
- 变量名需与format/invoke传入的键名完全一致,否则会报错;
- 模板中的固定文本的可根据业务需求灵活调整,无需修改代码结构;
- PromptTemplate仅适用于零样本场景,若需要给模型提供示例引导,需使用FewShotPromptTemplate。
二、进阶提升:FewShotPromptTemplate(少样本场景必备)
1. 核心定位与适用场景
当零样本提示无法满足需求(如模型无法理解任务模式、输出格式混乱)时,就需要用到FewShotPromptTemplate——它通过在提示词中注入示例数据,引导模型按照示例的格式和逻辑输出结果,适用于分类、翻译、文本生成等需要明确任务模式的场景。
FewShotPromptTemplate的核心是“示例驱动”,构建时需要5个核心参数,缺一不可,掌握这些参数就能灵活适配各类少样本场景。
2. 核心参数解析
- examples:示例数据,格式为列表,列表内嵌套字典,每个字典对应一组示例的键值对;
- example_prompt:示例数据的提示词模板,用于格式化每一组示例;
- prefix:提示词前缀,用于说明任务要求,位于示例数据之前;
- suffix:提示词后缀,用于传入用户的实际查询,位于示例数据之后;
- input_variables:需要注入的变量列表,与suffix中的变量名对应。
3. 原创代码实操(示例场景:给APP功能起简洁别名)
from langchain_core.prompts import FewShotPromptTemplate, PromptTemplate
from langchain_community.chat_models.tongyi import ChatTongyi
# 1. 定义示例数据的提示词模板(格式化单组示例)
example_template = PromptTemplate(
input_variables=['function', 'alias'],
template="功能:{function},别名:{alias}"
)
# 2. 准备示例数据(list内套字典,每组示例对应一个功能和别名)
example_data = [
{"function": "文件备份", "alias": "文件守护"},
{"function": "病毒扫描", "alias": "安全卫士"},
{"function": "内存清理", "alias": "内存优化"}
]
# 3. 构建FewShotPromptTemplate对象(传入5个核心参数)
few_shot_prompt = FewShotPromptTemplate(
examples=example_data,
example_prompt=example_template,
prefix="请为APP功能起简洁易懂的别名,要求2-4字,贴合功能含义,参考如下示例:",
suffix="基于示例,为功能:{target_function} 起一个合适的别名。",
input_variables=['target_function']
)
# 4. 注入变量,生成最终提示词
prompt_text = few_shot_prompt.invoke(input={"target_function": "流量监控"}).to_string()
print("生成的提示词:\n", prompt_text)
# 5. 调用Chat模型,流式输出结果
model = ChatTongyi(model="qwen3-max")
print("\n模型输出:")
for chunk in model.stream(input=prompt_text):
print(chunk.content, end="", flush=True)
4. 关键注意点
- 示例数据的格式需与example_prompt的变量完全匹配,否则示例无法正常格式化;
- prefix和suffix的文本需简洁明了,明确任务要求,避免模型误解;
- 示例数量无需过多,3-5组即可,过多会增加提示词长度,影响模型响应速度。
三、高阶应用:ChatPromptTemplate(多轮对话场景)
1. 核心定位与优势
PromptTemplate仅能处理单条提示消息,FewShotPromptTemplate侧重示例引导,而ChatPromptTemplate专为多轮对话场景设计——它支持注入任意数量的历史会话信息,让模型能够记住上下文,实现连贯的多轮交互。
与前两种模板相比,ChatPromptTemplate的核心优势的是:通过from_messages方法接入列表形式的多轮消息,配合MessagesPlaceholder占位符,实现历史会话的动态注入,完美适配智能客服、聊天机器人等场景。
2. 核心用法与原创代码实操
ChatPromptTemplate的核心是“多轮消息模板+动态历史注入”,关键在于使用MessagesPlaceholder作为历史会话的占位符,且必须通过invoke方法注入历史数据(format方法无法实现)。
示例场景:智能客服多轮对话(记住用户历史问题,连贯回答)
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_community.chat_models import ChatTongyi
from langchain_core.output_parsers import StrOutputParser
from langchain_core.messages import HumanMessage, AIMessage
# 1. 构建Chat提示词模板(多轮消息列表,包含system、占位符、human消息)
chat_template = ChatPromptTemplate.from_messages(
[
("system", "你是一款APP的智能客服,回答简洁明了,仅解决用户关于APP会员的问题,无关问题直接拒绝。"),
# MessagesPlaceholder:历史会话占位符,key为history,后续注入历史数据
MessagesPlaceholder("history"),
("human", "{question}")
]
)
# 2. 初始化Chat模型和结果解析器(StrOutputParser用于提取纯文本结果)
model = ChatTongyi(model="qwen3-max")
output_parser = StrOutputParser()
# 3. 构建链(模板+模型+解析器,实现多轮对话连贯输出)
chain = chat_template | model | output_parser
# 场景1:无历史会话,用户首次提问
print("无历史会话输出:")
for chunk in chain.stream(input={"history": [], "question": "会员怎么开通?"}):
print(chunk, end="", flush=True)
# 场景2:有历史会话,用户追问(动态注入历史对话)
print("\n\n有历史会话输出:")
# 历史会话数据(两种写法:HumanMessage/AIMessage类 或 元组简写)
history = [
HumanMessage(content="会员怎么开通?"),
AIMessage(content="开通会员可在APP我的页面,点击「会员中心」选择套餐支付即可。"),
HumanMessage(content="开通后可以取消自动续费吗?")
]
# 元组简写(更简洁,推荐日常开发)
# history = [
# ("human", "会员怎么开通?"),
# ("ai", "开通会员可在APP我的页面,点击「会员中心」选择套餐支付即可。"),
# ("human", "开通后可以取消自动续费吗?")
# ]
# 注入历史会话和新问题,流式输出
for chunk in chain.stream(input={"history": history, "question": "取消自动续费需要找客服吗?"}):
print(chunk, end="", flush=True)
3. 关键注意点
- ChatPromptTemplate必须使用from_messages方法创建,传入列表形式的多轮消息;
- 历史会话的注入必须使用invoke方法,format方法无法识别MessagesPlaceholder占位符;
- 历史会话数据可使用HumanMessage/AIMessage类封装,也可使用(角色,内容)元组简写,两种方式等价。
四、三大模板通用方法:format与invoke详解
PromptTemplate、FewShotPromptTemplate、ChatPromptTemplate三大类,都拥有format和invoke两种核心方法,用于变量注入和提示词生成,但两者的适用场景和功能有明显区别,掌握其差异能避免开发中的常见错误。
1. format方法
核心作用:注入变量,生成纯文本提示词,仅适用于PromptTemplate和FewShotPromptTemplate(ChatPromptTemplate不推荐使用)。
特点:用法简单,直接传入键值对即可生成提示词文本,但无法处理动态历史会话(如ChatPromptTemplate的MessagesPlaceholder),也不支持链式调用的无缝衔接。
2. invoke方法
核心作用:注入变量,生成提示词对象(可直接传入模型调用),适用于三大模板,是LangChain 1.0版本后推荐的通用方法。
特点:支持动态注入复杂数据(如ChatPromptTemplate的历史会话),可直接与模型、链等组件衔接,符合LangChain的Runnable接口规范,是大型工程开发的首选。
五、总结:三大模板选型指南与实战建议
LangChain的提示词模板体系,本质是将提示词工程标准化、组件化,让开发者无需关注底层细节,专注业务场景即可。三大模板的选型的核心是“匹配场景”,总结如下:
- PromptTemplate:零样本、单轮提示场景(如简单文案生成、单轮问答),用法最简单,适合快速开发demo;
- FewShotPromptTemplate:少样本、需要示例引导的场景(如格式统一的文本生成、分类任务),能提升模型输出的准确性;
- ChatPromptTemplate:多轮对话场景(如智能客服、聊天机器人),支持动态注入历史会话,实现上下文连贯。
实战建议:在实际开发中,优先使用invoke方法进行变量注入,配合链式调用(| 符号)将模板与模型、解析器等组件串联,既能提升开发效率,又能保证代码的可维护性。后续我们还会学习提示词模板与向量检索、智能体的结合,解锁更复杂的大模型应用场景。