纲要

  • 部分格式化概念:分步填充模板变量,打破“一次性提供所有变量”的限制
  • PromptTemplatepartial 方法
    • 静态值部分格式化:先填充已知变量,返回中间模板
    • 函数动态生成:通过无参函数在 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_testbar 被替换为 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),减少在每次调用时重复传递这些参数,简化调用链。

  • 动态上下文管理
    在基于 LangChainChainRunnable 流水线中,可将 partialRunnableLambda 结合,在运行时动态注入上下文信息,实现更灵活的提示词编排策略。

参考文档

官方文档

参考链接

总结

PromptTemplate.partial 提供了一种优雅的方式,将提示词模板的格式化过程从“一次性全量填充”拆解为多个可组合的步骤。

这不仅使代码更适应异步和数据驱动的场景,还通过函数动态生成机制简化了时间戳、会话信息等动态变量的管理。

该特性在 LangChain v0.1.0 及以上版本中稳定支持,是构建灵活、可维护的提示词工程的核心工具之一。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐