news 2026/4/20 1:15:29

LangChain学习笔记--Model I/O 模块部分 1.5 Prompt Template(提示词模板)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
LangChain学习笔记--Model I/O 模块部分 1.5 Prompt Template(提示词模板)

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# 年龄:18

f-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))

几条常用原则(个人观点):

  1. 赋值时 invoke 多于 format
  2. 创建模板时,from_template() 多于直接向类传值

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/20 1:15:14

TypeScript 元组

TypeScript 元组 引言 TypeScript 作为 JavaScript 的超集,提供了更强大的类型系统,使得开发者能够编写更健壮、更易于维护的代码。在 TypeScript 中,元组(Tuple)是一种特殊的数组类型,它允许开发者定义一个已知元素数量和类型的数组。本文将详细介绍 TypeScript 中的元…

作者头像 李华
网站建设 2026/4/20 1:14:07

Paper 深读 | LLM驱动的多智能体分层决策新范式

**🔑 关键词:**分层决策、LLM规划、Bandit探索、多智能体导航 **🔥 一句话标签:**首创"LLMBandit分布式RL"三层自治体系,显著提升多智能体复杂任务的规划、探索与协作效率 02 一句话核心思想 针对多智能体…

作者头像 李华
网站建设 2026/4/20 1:13:30

Sunshine游戏串流编码器配置全面解析与深度优化指南

Sunshine游戏串流编码器配置全面解析与深度优化指南 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 在家庭局域网环境中,想要将高性能游戏PC的画面流畅传输到客厅电视或…

作者头像 李华
网站建设 2026/4/20 1:05:36

Bootstrap组件无障碍访问 Bootstrap如何提高网站的Accessibility

Bootstrap组件默认支持基础ARIA但需手动完善:确保语义HTML、正确暴露交互状态(如aria-expanded)、补全role与label、保障颜色对比度≥4.5:1、焦点样式可见、动态内容同步更新ARIA属性。Bootstrap默认组件对屏幕阅读器的支持程度bootstrap 4 的…

作者头像 李华