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 提供了多种不同的提示词模板,下面介绍几种常用的提示词模板:
  • PromptTemplate:文本生成模型提示词模板,用字符串拼接变量生成提示词
  • ChatPromptTemplate:聊天模型提示词模板,适用于如 gpt-3.5-turbogpt-4 等聊天模型
  • HumanMessagePromptTemplate:人类消息提示词模板
  • SystemMessagePromptTemplate:系统消息提示词模板
  • FewShotPromptTemplate:少样本学习提示词模板, 构建一个 Prompt,其中包含多个 示例,可以 自动将这些示例格式化并插入到主 Prompt 中 。
  • PipelinePrompt:管道提示词模板,用于把几个提示词组合在一起使用。

提示词模板类继承关系

分析LangChain源码可以可知,在 LangChain 的类结构中,顶层基类是 BasePromptTemplate,用于定义Prompt 模板系统必须实现的核心方法,而StringPromptTemplateBaseChatPromptTemplate两个子类分别继承。
img
接入聊天模型时需继承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:格式化提示词模板为PromptValue
format:格式化提示词模板为字符串
partial:格式化提示词模板为一个新的提示词模板,可以继续进行格式化

format

format() 方法用法如下,将 question 参数格式化到提示词模板中,返回一个字符串:
执行结果:

partial

partial()方法用法如下,可以格式化部分变量,并且继续返回一个模板,通常在部分提示词模板场景下使用
执行结果:

invoke

invoke() 是 LangChain Expression Language(LCEL 的统一执行入口,用于执行任意可运行对象(Runnable )。返回的是一个 PromptValue 对象,可以用 .to_string().to_messages() 查看内容。
执行结果如下

对话提示词模板

ChatPromptTemplate 是专为聊天模型(如 gpt-3.5-turbogpt-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/AIMessagelangchain 中用于构建不同角色的一个类。它通常用于创建聊天消息的一部分,特别是当你构建一个多轮对话的 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 方式,以增强大模型在特定任务(如分类、问答、翻译等)上的表现。
它通常由以下几部分构成:
  1. examples:少量的人工示例(dict 列表);
  1. example_prompt:如何格式化每个示例(使用 PromptTemplate);
  1. prefix:示例之前的文字说明(可选);
  1. suffix:用户真正的问题模板;
  1. 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 中搜索通用的提示词模板并使用。代码如下:
执行结果如下:
FewShotPromptTemplateprompt常见攻击方式与防御方式
Loading...