LangChain PromptTemplate 提示词模板能力详解
在 LangChain 框架中,PromptTemplate 是最基础也最常用的组件之一,它的核心作用是把提示词从硬编码变成可配置的"模板" ,让开发者可以像填表一样动态生成给大模型的输入。以下从两个示例代码中梳理出它的主要能力。
一、基本用法:占位符 + 填充
最直观的用法是定义一个包含 {变量名} 占位符的字符串,然后用 PromptTemplate.from_template() 快速构造模板对象:
template = "你是一个{role}专家,请用{style}的风格解释{topic}"
prompt = PromptTemplate.from_template(template)
res = prompt.format(role="人工智能", style="幽默通俗", topic="神经网络")
调用 format() 时传入具体值,占位符就被替换成实际文本。这种方式适合变量少、逻辑简单的场景,一行代码即可完成模板定义。
模板对象还会自动识别所有占位符,通过 prompt.input_variables 可以查看需要填充哪些变量,方便调试和校验。
二、构造器写法:更精细的控制
当需求复杂一些时,可以使用 PromptTemplate() 构造器,显式声明各项参数:
prompt = PromptTemplate(
template="请把中文翻译成{lang}\n原文:{text}\n译文:",
input_variables=['text', 'lang'],
template_format="f-string",
validate_template=True
)
这里涉及几个关键参数:
template:模板字符串本体,定义输出格式。input_variables:手动声明需要外部传入的变量列表,确保模板和参数一一对应。template_format:模板解析格式,默认f-string(Python 花括号语法),也支持jinja2等更强大的模板引擎。validate_template:是否校验模板中的占位符与input_variables一致。开启后,如果模板里有变量未在列表中声明,会直接报错,帮助在开发阶段提前发现拼写错误。
三、输出格式的灵活转换
PromptTemplate 提供多种输出方式,适配不同调用场景:
res = prompt.format_prompt(text="人工智能", lang="法语")
res.to_string() # 输出纯文本字符串
res.to_message() # 输出 LangChain 的 Message 对象(可直接传给模型)
format()→ 返回纯字符串,适合直接拼接。format_prompt()→ 返回StringPromptValue对象,是更结构化的中间表示,可以进一步调用.to_string()或.to_message()做格式转换。.to_message()特别适合在 Chain 中把提示词直接作为模型输入传递,省去手动包装角色的步骤。
四、partial_variables:预设固定变量
09template.py 展示了 partial_variables 这一进阶能力——预先绑定部分变量的值,调用时只需传入动态部分:
prompt = PromptTemplate(
template="系统:{sys_prompt},用户:{user_input}",
input_variables=['user_input'],
partial_variables={
'sys_prompt': "你是一个严谨的技术文档助手,回答问题必须带代码示例"
}
)
res = prompt.format(user_input='解释一下什么是GIL')
效果是:sys_prompt 在模板定义时就固定写死了,每次调用只需传入 user_input,模板自动把两部分拼接完整。
这个能力的典型应用场景是:系统角色设定是固定的,用户输入每次不同。通过 partial_variables 把"不变的部分"和"变化的部分"分离,调用接口更简洁,也减少了出错的可能。此时 prompt.input_variables 只会返回 ['user_input'],已绑定的变量不再出现在待填列表中。
五、总结
| 能力 | 说明 |
|---|---|
| 占位符填充 | 用 {var} 定义模板,format() 填入具体值 |
| 自动识别变量 | input_variables 属性自动检测模板中所有占位符 |
| 构造器精细控制 | 手动指定变量列表、模板格式、校验开关 |
| 多格式输出 | format() 返回字符串,format_prompt() 返回对象并支持转 Message |
| 预设固定变量 | partial_variables 绑定不变的部分,简化调用 |
PromptTemplate 的本质价值是把提示词工程从"写死一段话"升级为"管理一组可复用的结构化输入" ,为后续构建 Chain、Agent 等复杂链路打好基础。