AI Agent从无到有33: 使用 Partial 实现提示词部分格式化
纲要
- 部分格式化概念:分步填充模板变量,打破“一次性提供所有变量”的限制
PromptTemplate的partial方法:- 静态值部分格式化:先填充已知变量,返回中间模板
- 函数动态生成:通过无参函数在
format时动态生成变量值
- 典型应用场景:异步数据注入、默认参数设置、动态上下文注入
- 完整可运行示例:包含静态与动态两种 Partial 用法(基于
langchain-core) - 版本信息:适用 LangChain
v0.1.0及以上版本
引言
在构建提示词模板时,模板往往需要多个变量,而这些变量的值并非总是同时就绪。例如,一个变量来自用户输入,另一个变量需要从数据库异步查询,甚至需要动态生成当前时间。若直接调用 format 方法,则必须一次性传入所有参数,这会导致代码耦合度高、流程僵化,且难以适应异步编程场景。
LangChain 的 PromptTemplate 提供了 partial 方法,支持对模板进行“部分格式化”。开发者可以先填充已知变量,得到一个仍包含未填充变量的中间模板对象,待剩余变量就绪后再完成最终格式化。这种方式让提示词的构建过程更加灵活,也更契合现代 AI 应用中的异步与动态需求。
核心机制:PromptTemplate.partial
PromptTemplate.partial 方法返回一个新的 PromptTemplate 对象,该对象的 input_variables 列表中已移除被部分填充的变量,同时内部记录了已绑定的静态值或动态函数。在后续调用 format 时,这些预绑定的值会被自动合并,最终生成完整的提示词字符串。
方法签名(基于 langchain-core >= 0.1.0):
PromptTemplate.partial(**kwargs: Any) -> PromptTemplate
- 参数:接受关键字参数,键为模板中的变量名,值可以是静态值(字符串、数字等)或可调用对象(无参函数)。
- 返回值:返回一个新的
PromptTemplate实例,其input_variables属性已移除已部分填充的变量。
部分格式化的两种模式
静态值填充
若模板中的某些变量值可在较早阶段确定,而其余变量需等待运行时数据,可先调用 partial 提前注入已知值。得到的中间模板对象仍保留未填充变量,方便后续在合适的时机完成格式化。此过程不会立即生成字符串,而是保持模板的结构化状态,便于在流程中传递和组合。
函数动态生成
更常见的场景是某些变量需要在每次调用时动态计算,例如当前日期时间、随机 ID 或会话标识。通过将一个无参函数作为部分格式化的值,当最终调用 format 时,该函数会被自动执行,并将返回值填入模板对应位置。这样,每次生成的提示词都能反映最新的动态信息,且调用方无需关心该变量的生成逻辑。
完整可运行示例
以下代码演示了 partial 的两种用法,无需外部 API Key,可直接运行。
环境准备(安装依赖):
pip install langchain-core>=0.1.0
核心代码:
from langchain_core.prompts import PromptTemplate
from datetime import datetime
# 定义一个包含两个变量的模板
template = "foo 的值为:{foo},bar 的值为:{bar}"
# 创建 PromptTemplate 对象
prompt = PromptTemplate.from_template(template)
# ----- 示例1:静态值部分格式化 -----
# 先填充 foo,保留 bar 未填充
partial_prompt = prompt.partial(foo="foo_test")
print("部分格式化后的对象(此时尚未完全格式化):")
print(partial_prompt)
print()
# 稍后获得 bar 的值,完成最终格式化
final_prompt = partial_prompt.format(bar="barzzz")
print("完全格式化后的提示词:")
print(final_prompt)
print()
# ----- 示例2:使用函数动态生成当前时间 -----
# 定义一个返回当前时间的函数
def get_current_time():
return datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# 新的模板:需要 adjective 和 date 两个变量
time_template = "给我讲一个{adjective}的笑话,日期是{date}"
time_prompt = PromptTemplate.from_template(time_template)
# 部分格式化:将 date 绑定到时间函数
time_partial = time_prompt.partial(date=get_current_time)
# 最终格式化时只需传入 adjective,date 会自动调用函数生成
joke_prompt = time_partial.format(adjective="有趣的")
print("带动态时间的提示词:")
print(joke_prompt)
print("再次执行,时间会变化(验证函数动态执行):")
print(time_partial.format(adjective="有趣的"))
运行结果说明:
- 示例1中,
final_prompt输出中foo被替换为foo_test,bar被替换为barzzz。 - 示例2中,两次输出的日期时间字符串会不同,验证了动态函数的实时执行。
API 速览 (API Overview)
| 方法/类 | 所属库 | 说明 | 适用版本 |
|---|---|---|---|
PromptTemplate.from_template |
langchain_core.prompts |
类方法,从字符串模板创建 PromptTemplate 实例 |
>=0.1.0 |
PromptTemplate.partial |
langchain_core.prompts |
部分填充模板变量,返回新的 PromptTemplate 对象 |
>=0.1.0 |
PromptTemplate.format |
langchain_core.prompts |
完成最终格式化,返回填充后的字符串 | >=0.1.0 |
关键类型说明:
PromptTemplate对象包含input_variables属性,列出所有尚未填充的变量名。partial方法的参数值可以是任何可调用对象(callable),但要求该可调用对象不接受参数,并返回一个可字符串化的值。
应用场景扩展
-
异步数据注入
在异步流程中,部分变量来自用户请求,另一部分需要查询外部服务。可先partial填充已获取的请求参数,待异步结果返回后再调用format完成最终提示词组装,避免阻塞主流程。 -
默认参数设置
可为模板的某些变量设定默认生成函数(如获取当前用户 ID、会话 Token),减少在每次调用时重复传递这些参数,简化调用链。 -
动态上下文管理
在基于LangChain的Chain或Runnable流水线中,可将partial与RunnableLambda结合,在运行时动态注入上下文信息,实现更灵活的提示词编排策略。
参考文档
官方文档
参考链接
总结
PromptTemplate.partial 提供了一种优雅的方式,将提示词模板的格式化过程从“一次性全量填充”拆解为多个可组合的步骤。
这不仅使代码更适应异步和数据驱动的场景,还通过函数动态生成机制简化了时间戳、会话信息等动态变量的管理。
该特性在 LangChain v0.1.0 及以上版本中稳定支持,是构建灵活、可维护的提示词工程的核心工具之一。
更多推荐


所有评论(0)