type
Post
status
Published
date
Sep 7, 2025
slug
summary
总结几种提示词用法
tags
category
icon
password
提示词模板介绍
为什么需要提示词模板
在与大语言模型交互时,通常不会直接将用户的原始输入直接传递给大模型,而是会先进行一系列包装、组织和格式化操作。这样做的目的是:更清晰地表达用户意图,更好地利用模型能力。
这套结构化的提示词构建方式,就是 LangChain 中的 提示词模板(PromptTemplate)。对于 LLM 应用来说,好的提示词就是成功的一半。更多提示词技巧可参考文档:https://www.cuiliangblog.cn/detail/section/228046450。
LangChain 提示词官方文档参考:https://reference.langchain.com/python/langchain_core/prompts/
提示词模板分类
LangChain 提供了多种不同的提示词模板,下面介绍几种常用的提示词模板:
PromptTemplate:文本生成模型提示词模板,用字符串拼接变量生成提示词
ChatPromptTemplate:聊天模型提示词模板,适用于如gpt-3.5-turbo、gpt-4等聊天模型
HumanMessagePromptTemplate:人类消息提示词模板
SystemMessagePromptTemplate:系统消息提示词模板
FewShotPromptTemplate:少样本学习提示词模板, 构建一个 Prompt,其中包含多个 示例,可以 自动将这些示例格式化并插入到主 Prompt 中 。
PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用。
提示词模板类继承关系
分析LangChain源码可以可知,在 LangChain 的类结构中,顶层基类是
BasePromptTemplate,用于定义Prompt 模板系统必须实现的核心方法,而StringPromptTemplate 和 BaseChatPromptTemplate两个子类分别继承。
接入聊天模型时需继承
BaseChatPromptTemplate;而文本生成模型则继承StringPromptTemplate 。文本提示词模板
PromptTemplate 针对文本生成模型的提示词模板,也是LangChain提供的最基础的模板,通过格式化字符串生成提示词,在执行invoke时将变量格式化到提示词模板中主要参数:
template:定义提示词模板的字符串,其中包含文本和变量占位符(如{name}) ;
input_variables: 列表,指定了模板中使用的变量名称,在调用模板时被替换;
partial_variables:字典,用于定义模板中一些固定的变量名。这些值不需要再每次调用时被替换。
函数介绍:
format():给input_variables变量赋值,并返回提示词。利用format() 进行格式化时就一定要赋值,否则会报错。当在template中未设置input_variables,则会自动忽略。
创建提示词
使用构造方法
执行结果:
调用from_template(常用)
执行结果
部分提示词模板
部分提示词,顾名思义就是允许你预先固定部分变量,而保留其他变量在后续动态填充。例如:先预设系统参数,然后等用户输入后再补齐提示词模板。
执行结果如下:
组合提示词模板
通过将多个子提示(Prompt)按一定逻辑顺序或层级组合起来,形成一个复杂任务的整体 Prompt。例如实现多消息对话、多阶段任务、多输入源组合等场景。
执行结果如下
提示词方法
上述的代码示例中,我们使用了
format方法,除了format方法能够格式化提示词模板,invoke()和partial()方法也可以做到,以下是它们的作用:invoke:格式化提示词模板为PromptValueformat:格式化提示词模板为字符串partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化format
format() 方法用法如下,将
question 参数格式化到提示词模板中,返回一个字符串:执行结果:
partial
partial()方法用法如下,可以格式化部分变量,并且继续返回一个模板,通常在部分提示词模板场景下使用
执行结果:
invoke
invoke() 是 LangChain Expression Language(LCEL 的统一执行入口,用于执行任意可运行对象(Runnable )。返回的是一个 PromptValue 对象,可以用 .to_string() 或 .to_messages() 查看内容。执行结果如下
对话提示词模板
ChatPromptTemplate 是专为聊天模型(如 gpt-3.5-turbo、gpt-4 等)设计的提示词模板,它支持构造多轮对话的消息结构,每条消息可指定角色(如系统、用户、AI)。特点:
- 支持 System / Human / AI 等不同角色的消息模板
- 对话历史维护
参数类型:列表参数格式是tuple类型( role :str content :str 组合最常用)
元组的格式为:(role: str | type, content: str | list[dict] | list[object])
其中 role 是:字符串(如 “system” 、“human” 、“ai” )
创建提示词
使用构造方法
执行结果如下
调用form_message(常用)
代码示例如下,提示词模板中包含两条消息,第一条是系统消息,无需做提示词渲染,第二条是人类消息,在执行invoke时,需要把变量question渲染进去。
执行结果:
提示词方法
除了之前在
PromptTemplate介绍的 format、partial、invoke外,还有 format_messages 和 format_prompt方法。format_messages
作用:将模板变量替换后,直接生成 消息列表(
List[BaseMessage]),一般包含:SystemMessage``HumanMessage``AIMessage常用场景:用于手动查看或调试 Prompt 的最终“消息结构”,或者自己拼接进 Chain。
代码如下
执行结果如下
format_prompt
作用:生成一个
PromptValue 对象,这是一种抽象层次更高的封装。- 对于
PromptTemplate(单纯文本),返回StringPromptValue
- 对于
ChatPromptTemplate(对话模板),返回ChatPromptValue
PromptValue 有两个常用方法:.to_string()→ 转成文本
.to_messages()→ 转成消息列表(同上)
返回值:
PromptValue 对象代码如下
执行结果如下
实例化参数类型
前面讲了ChatPromptTemplate的两种创建方式。我们看到不管使用构造方法,参数类型都是列表类型。参数除了是列表类型,列表的元素可以是字符串、字典、字符串构成的元组、消息类型、提示词模板类型、消息提示词模板类型等
str 类型
列表参数格式是str类型(不推荐),因为默认都是HumanMessage。
代码如下
执行结果如下
dict 类型
列表参数格式是dict类型,代码如下:
执行结果如下
message 类型
System/Human/AIMessage 是 langchain 中用于构建不同角色的一个类。它通常用于创建聊天消息的一部分,特别是当你构建一个多轮对话的 prompt 模板时,区分系统、AI、和人类消息。代码如下
执行结果如下
BaseChatPromptTemplate 类型
使用 BaseChatPromptTemplate,可以理解为ChatPromptTemplate里嵌套了ChatPromptTemplate。
执行结果如下
BaseMessagePromptTemplate 类型
LangChain提供不同类型的MessagePromptTemplate。最常用的是SystemMessagePromptTemplate 、HumanMessagePromptTemplate 和AIMessagePromptTemplate ,分别创建系统消息、人工消息和AI消息,它们是ChatMessagePromptTemplate的特定角色子类。
基本概念:
HumanMessagePromptTemplate,专用于生成用户消息(HumanMessage) 的模板类,是ChatMessagePromptTemplate的特定角色子类。
- 本质:预定义了 role=“human” 的 MessagePromptTemplate,且无需无需手动指定角色
- 模板化:支持使用变量占位符,可以在运行时填充具体值
- 格式化:能够将模板与输入变量结合生成最终的聊天消息
- 输出类型:生成 HumanMessage 对象( content + role=“human” )
- 设计目的 :简化用户输入消息的模板化构造,避免重复定义角色
SystemMessagePromptTemplate、AIMessagePromptTemplate:类似于上面,不再赘述
ChatMessagePromptTemplate,用于构建聊天消息的模板。它允许你创建可重用的消息模板,这些模板可以动态地插入变量值来生成最终的聊天消息
- 角色指定:可以为每条消息指定角色(如 “system”、“human”、“ai”) 等,角色灵活。
- 模板化:支持使用变量占位符,可以在运行时填充具体值
- 格式化:能够将模板与输入变量结合生成最终的聊天消息
示例代码如下
执行结果如下
少量样本提示词模板
FewShotPromptTemplate
FewShotPromptTemplate 用于:- 构建一个 Prompt,其中包含多个 示例(examples);
- 自动将这些示例格式化并插入到主 Prompt 中;
- 实现 Few-Shot Prompting 方式,以增强大模型在特定任务(如分类、问答、翻译等)上的表现。
它通常由以下几部分构成:
examples:少量的人工示例(dict 列表);
example_prompt:如何格式化每个示例(使用PromptTemplate);
prefix:示例之前的文字说明(可选);
suffix:用户真正的问题模板;
input_variables:最终 suffix 中需要传入的变量。
假设开发一个提取语句城市名称的AI:
执行结果
FewShotChatMessagePromptTemplate
除了FewShotPromptTemplate之外,FewShotChatMessagePromptTemplate是专门为 聊天对话场景设计的少样本(few-shot)提示模板,它继承自 FewShotPromptTemplate ,但针对聊天消息的格式进行了优化。
特点:
- 自动将示例格式化为聊天消息( HumanMessage / AIMessage 等)
- 输出结构化聊天消息( List[BaseMessage] )
- 保留对话轮次结构
代码如下
运行结果如下
Example selectors
前面FewShotPromptTemplate的特点是,无论输入什么问题,都会包含全部示例。在实际开发中,我们可以根据当前输入,使用示例选择器,从大量候选示例中选取最相关的示例子集。
使用的好处:避免盲目传递所有示例,减少 token 消耗的同时,还可以提升输出效果。
示例选择策略:语义相似选择、长度选择、最大边际相关示例选择等
- 语义相似选择:通过余弦相似度等度量方式评估语义相关性,选择与输入问题最相似的 k 个示例。
- 长度选择:根据输入文本的长度,从候选示例中筛选出长度最匹配的示例。增强模型对文本结构的理解。比语义相似度计算更轻量,适合对响应速度要求高的场景。
- 最大边际相关示例选择:优先选择与输入问题语义相似的示例;同时,通过惩罚机制避免返回同质化的内容。
代码如下
执行结果如下
消息占位符提示词模板
如果我们不确定消息何时生成,也不确定要插入几条消息,比如在提示词中添加聊天历史记忆这种场景,可以在ChatPromptTemplate添加
MessagesPlaceholder占位符,在调用invoke时,在占位符处插入消息。使用MessagesPlaceholder
执行结果:
隐式使用MessagesPlaceholder
"placeholder" 是 ("placeholder", "{memory}") 的简写语法,等价于 MessagesPlaceholder("memory")。执行结果:
提示词模板仓库
LangChain Hub 是一个公共的 prompt(提示词)仓库,访问地址是https://smith.langchain.com/hub。类似 HuggingFace Hub,但是专门存放 LangChain 的 Prompt、Chains、Tools 等。我们可以在 hub 中搜索通用的提示词模板并使用。代码如下:
执行结果如下:
- Author:guderain
- URL:https://wangguanxi.space/article/2e02b727-a3a3-8041-8b3d-eedf16a97832
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!


.webp?table=collection&id=92be88af-5f71-4631-9d3e-ee3bd53dcced&t=92be88af-5f71-4631-9d3e-ee3bd53dcced&width=1080&cache=v2)