LangChain学习笔记–Model I/O 模块部分 1.5 Prompt Template(提示词模板)
介绍
Prompt Template 可以理解为一种“提示词模板”。来自langchain_core.prompts中
它的核心是:把固定的提示内容先写好,并预留几个可替换的位置,等实际运行时再把具体内容填进去,生成最终给模型的输入。
它的主要作用有三点:
第一,方便复用。
同一类任务只需要换问题、上下文或主题时,不必每次都重写整段提示词。
第二,让提示更清晰。
可以把“固定指令”和“变化内容”分开,结构更规整,也更容易维护。
第三,便于和 LangChain 的其他组件配合。
比如用户问题、检索到的资料、系统要求,都可以统一填进模板,再交给模型处理。
简要说,Prompt Template的价值就是:
把 prompt 从“临时拼接的文本”变成“可复用、可管理的模板”。
如果你接着学 LangChain,下一个常见问题就是它和ChatPromptTemplate有什么区别。
有哪些常用的模板?
1. PromptTemplate
最基础的文本模板。
适合把一整段提示词写成固定格式,再把变量填进去。
适用场景:
- 单轮问答
- 摘要
- 翻译
- 分类
- 信息抽取
2. ChatPromptTemplate
专门给聊天模型用的模板。
它不是一整块纯文本,而是把 prompt 按角色拆成不同消息,比如:
- system:系统要求
- human:用户输入
- ai:示例回答
这是现在最常用的一类,因为大多数模型都是聊天式接口。
3. MessagesPlaceholder
用于在聊天模板里插入一段“已有消息”。
常见用途:
- 插入聊天历史
- 插入 memory 里的上下文
- 把前面对话接到当前 prompt 中
它本质上不是单独完成任务的模板,而是聊天模板里的一个占位组件。
4. Few-shot Prompt Template
用于在 prompt 里放多个示例,让模型照着示例风格输出。
适用场景:
- 固定输出格式
- 分类任务
- 信息抽取
- 让模型模仿某种回答方式
它的核心思想是:先给几个例子,再给新问题。
PromptTemplate类的使用
PromptTemplate类介绍
fromtypingimportAnyfromlangchain_core.promptsimportPromptTemplate# =============================================================================# PromptTemplate 参数说明# =============================================================================# 标识规则:# [必需] : 定义模板时必须明确的参数# [常用] : 业务开发中高频使用的参数# [可选] : 按具体场景决定是否配置# [扩展] : 用于类型约束、解析、追踪等扩展能力# =============================================================================prompt=PromptTemplate(# -------------------------------------------------------------------------# template: str# -------------------------------------------------------------------------# [必需] [常用]## 作用:# 定义模板正文。## 使用方式:# 在字符串中使用 {变量名} 表示占位符。## 示例:# "请用{style}风格解释:{topic}"#template="请用{style}风格解释:{topic}",# -------------------------------------------------------------------------# input_variables: list[str]# -------------------------------------------------------------------------# [常用]## 作用:# 声明模板渲染时需要提供的输入变量。## 使用方式:# 列表中的变量名必须与 template 中的占位符保持一致。## 注意:# - 少传变量会报错# - 变量名写错会报错## 示例:# template 中有 {style} 和 {topic}# 则 input_variables=["style", "topic"]## 必填变量:# - style# - topic#input_variables=["style","topic"],# -------------------------------------------------------------------------# partial_variables: dict[str, Any]# -------------------------------------------------------------------------# [常用] [可选]## 作用:# 预先绑定部分变量,减少重复传参。## 使用方式:# 将固定变量放入字典中,在渲染时自动参与填充。## 示例:# partial_variables={"role": "Python教师"}## 说明:# 如果 template 中包含 {role},且此处已提供 role,# 则 format() / invoke() 时无需再次传入 role。#partial_variables={},# -------------------------------------------------------------------------# template_format: str# -------------------------------------------------------------------------# [常用] [可选]## 作用:# 指定模板解析格式。## 使用方式:# 根据模板语法选择解析器。## 可选值:# - "f-string"# - "jinja2"# - "mustache"## 示例:# template_format="f-string"#template_format="f-string",# -------------------------------------------------------------------------# validate_template: bool# -------------------------------------------------------------------------# [常用] [可选]## 作用:# 在模板创建阶段校验模板内容与变量定义的一致性。## 使用方式:# 设置为 True 时,会在初始化阶段检查占位符与变量声明。## 示例:# validate_template=True#validate_template=True,# -------------------------------------------------------------------------# optional_variables: list[str]# -------------------------------------------------------------------------# [可选] [扩展]## 作用:# 声明模板中的可选变量。## 使用方式:# 将允许缺省的变量名加入列表。## 示例:# optional_variables=["context"]#optional_variables=[],# -------------------------------------------------------------------------# input_types: dict[str, Any]# -------------------------------------------------------------------------# [可选] [扩展]## 作用:# 描述输入变量的类型信息。## 使用方式:# 以变量名为键、类型为值进行声明。## 示例:# input_types={"age": int, "name": str}#input_types={},# -------------------------------------------------------------------------# output_parser: Any# -------------------------------------------------------------------------# [可选] [扩展]## 作用:# 为模板关联输出解析器。## 使用方式:# 将解析器对象传入该参数,用于后续结果解析。## 示例:# output_parser=some_parser#output_parser=None,# -------------------------------------------------------------------------# metadata: dict[str, Any]# -------------------------------------------------------------------------# [可选] [扩展]## 作用:# 记录模板相关元信息。## 使用方式:# 以键值对形式附加调试、追踪或业务标识信息。## 示例:# metadata={"scene": "tutorial", "version": "v1"}#metadata={},# -------------------------------------------------------------------------# tags: list[str]# -------------------------------------------------------------------------# [可选] [扩展]## 作用:# 为模板添加分类标签。## 使用方式:# 以列表形式添加标签字符串。## 示例:# tags=["tutorial", "prompt_template"]#tags=[],)# =============================================================================# 当前模板变量说明# =============================================================================# template:# "请用{style}风格解释:{topic}"## 输入变量:# style -> [必需] 解释风格# topic -> [必需] 解释主题## 说明:# 由于 partial_variables 未预绑定变量,# 因此 style 和 topic 需要在渲染时显式提供。# =============================================================================result=prompt.format(style="简洁",# [必需] 解释风格topic="PromptTemplate",# [必需] 解释主题)print(result)# 输出:# 请用简洁风格解释:PromptTemplate# =============================================================================# partial_variables 使用示例# =============================================================================# 说明:# role 在模板创建阶段已经预绑定,# 因此渲染时只需要传入 topic。# =============================================================================prompt_with_partial=PromptTemplate(template="你是一名{role},请解释:{topic}",input_variables=["topic"],partial_variables={"role":"Python教师"},template_format="f-string",validate_template=True,)result_with_partial=prompt_with_partial.format(topic="PromptTemplate",# [必需] 解释主题)print(result_with_partial)# 输出:# 你是一名Python教师,请解释:PromptTemplate# =============================================================================# optional_variables 使用示例# =============================================================================# 说明:# context 被声明为可选变量。# 当业务逻辑允许缺省该变量时,可通过预处理逻辑统一补值。# =============================================================================prompt_with_optional=PromptTemplate(template="问题:{question}\n补充信息:{context}",input_variables=["question"],optional_variables=["context"],partial_variables={"context":"无"},validate_template=True,)result_with_optional=prompt_with_optional.format(question="什么是 PromptTemplate?",# [必需] 问题内容)print(result_with_optional)# 输出:# 问题:什么是 PromptTemplate?# 补充信息:无# =============================================================================# input_types / metadata / tags 使用示例# =============================================================================# 说明:# 这些参数不影响模板字符串的渲染结果,# 主要用于类型描述、元信息附加和标签管理。# =============================================================================prompt_with_meta=PromptTemplate(template="姓名:{name}\n年龄:{age}",input_variables=["name","age"],input_types={"name":str,"age":int},metadata={"scene":"user_profile","version":"v1"},tags=["profile","demo"],validate_template=True,)result_with_meta=prompt_with_meta.format(name="Alice",# [必需] 姓名age=18,# [必需] 年龄)print(result_with_meta)# 输出:# 姓名:Alice# 年龄:18f-string 模板
# 输出:# text='请用通俗风格解释:PromptTemplate'# 具体显示形式取决于当前版本返回对象的打印结果# =============================================================================# 花括号转义示例# =============================================================================# 说明:# 在 f-string 模板格式中,普通花括号需要使用双花括号转义。# =============================================================================prompt_with_braces=PromptTemplate(template='请输出 JSON: {{"name": "{name}"}}',input_variables=["name"],template_format="f-string",validate_template=True,)result_with_braces=prompt_with_braces.format(name="Alice",# [必需] 姓名)print(result_with_braces)# 输出:# 请输出 JSON: {"name": "Alice"}调用示例
from_template() 方法
fromlangchain_core.promptsimportPromptTemplate# =============================================================================# PromptTemplate.from_template(...) 参数说明# =============================================================================# 标识规则:# [必需] : 调用该方法时必须提供的参数# [常用] : 实际开发中高频使用的参数# [可选] : 按具体场景决定是否配置# [扩展] : 用于补充模板对象的附加配置## 方法说明:# PromptTemplate.from_template(...) 是类方法。## 作用:# 根据模板字符串直接创建 PromptTemplate 对象。## 返回值:# PromptTemplate# =============================================================================prompt=PromptTemplate.from_template(# -------------------------------------------------------------------------# template: str# -------------------------------------------------------------------------# [必需] [常用]## 作用:# 定义模板正文。## 使用方式:# 在字符串中使用 {变量名} 表示占位符。## 示例:# "请用{style}风格解释:{topic}"#"请用{style}风格解释:{topic}",# -------------------------------------------------------------------------# template_format: str# -------------------------------------------------------------------------# [常用] [可选]## 作用:# 指定模板解析格式。## 使用方式:# 根据模板语法选择解析方式。## 可选值:# - "f-string"# - "jinja2"# - "mustache"## 示例:# template_format="f-string"#template_format="f-string",# -------------------------------------------------------------------------# partial_variables: dict[str, Any]# -------------------------------------------------------------------------# [常用] [可选]## 作用:# 预先绑定部分变量,减少渲染时的重复传参。## 使用方式:# 将固定变量放入字典中,在 format() / invoke() 时自动参与填充。## 示例:# partial_variables={"role": "Python教师"}## 说明:# 如果模板中包含已预绑定变量,则渲染时无需再次提供该变量。#partial_variables={},)partial()方法–等同于partial_variables
""" 功能:部分填充提示模板变量,返回新的模板对象,支持分步传参 接收常用参数: self (BasePromptTemplate):当前提示词模板实例 **kwargs (str | Callable[[], str]):要预先填充的变量,支持固定字符串/无参返回字符串的函数 输出参数: BasePromptTemplate:已预填充部分变量的新提示模板 """fromlangchain_core.promptsimportPromptTemplate#定义多变量模板template1=PromptTemplate(template="请评价{product}的优缺点,包括{aspect1}和{aspect2}。",input_variables=["product"],)# partial()调用完以后,不会对调用者这个模板对象产生影响;而其返回值是一个新的模板template1=template.partial(aspect1="电池续航",aspect2="拍照质量")#上部分等同于(14-20行)template=PromptTemplate(template="请评价{product}的优缺点,包括{aspect1}和{aspect2}。",input_variables=["product","aspect1","aspect2"],).partial(aspect1="电池续航",aspect2="拍照质量")#使用模板生成提示词prompt_1=template1.format(product="智能手机")print("提示词1:",prompt_1)给模板赋值的两种方式 invoke 和 format
format在上述提及,讲invoke
format() : 参数部分:给变量赋值; 返回值:str类型
invoke() : 参数部分:使用的是字典; 返回值:PromptValue类型 —推荐!
invoke()方法
# =============================================================================# invoke() 使用示例# =============================================================================# 说明:# invoke() 以字典形式传入变量,适合 Runnable 风格调用。# =============================================================================fromlangchain_core.promptsimportPromptTemplate#定义多变量模板template=PromptTemplate.from_template(template="请评价{product}的优缺点,包括{aspect1}和{aspect2}。")#使用模板生成提示词prompt_1=template.invoke({'product':'智能手机','aspect1':'电池续航','aspect2':'拍照质量'})print(prompt_1)print(type(prompt_1))几条常用原则(个人观点):
- 赋值时 invoke 多于 format
- 创建模板时,from_template() 多于直接向类传值