langchain-PipelinePromptTemplate
这是一个 LangChain 中相对高级但非常强大的概念,它允许你将多个提示模板像管道一样串联起来,将一个模板的输出作为下一个模板的输入,最终组合成一个复杂的、结构化的最终提示。
核心概念
想象一下工厂的装配线(Pipeline):
第一个工位安装底盘。
第二个工位接收带有底盘的半成品,并安装发动机。
第三个工位接收前两步的半成品,并安装车身。
最终,一台完整的汽车下线。
PipelinePromptTemplate
的工作方式与此类似。它让你可以定义一系列提示模板步骤,并将它们组合成一个整体,而不是手动地、一步步地调用和拼接多个模板。
为什么要使用它?
在没有 PipelinePromptTemplate
时,如果你要构建一个包含多个部分(如系统指令、一些示例、用户查询、上下文信息)的复杂提示,你可能需要:
单独格式化每个模板。
手动将它们拼接成一个巨大的字符串。
管理它们之间的依赖关系和输入变量。
这种方式非常繁琐且容易出错。PipelinePromptTemplate
通过自动化这个拼接过程并明确管理依赖关系来解决这个问题。
核心组成部分
一个 PipelinePromptTemplate
主要由两部分组成:
最终提示模板(Final Prompt Template):
这是最终生成的、将要发送给大语言模型(LLM)的提示模板。
它定义了最终提示的结构,并包含对所有可用变量的引用(这些变量来自前面的管道步骤)。
管道提示模板(Pipeline Prompt Templates):
这是一个由多个中间提示模板组成的列表。
每个中间模板执行一项特定的任务(例如,生成系统消息、格式化示例等)。
每个模板的输出将成为下一个模板的输入变量之一。
工作原理图解
下图直观地展示了 PipelinePromptTemplate
的工作流程,它将多个提示模板的串联过程自动化:
如图所示,前一个模板的输出会成为后一个模板的输入,最终所有内容被整合到最终模板中。
代码示例
下面是一个具体的代码示例,展示了如何创建和使用 PipelinePromptTemplate
:
from langchain.prompts.pipeline import PipelinePromptTemplate
from langchain.prompts.prompt import PromptTemplate# 1. 定义多个独立的提示模板
# 模板1:生成系统指令
system_template = PromptTemplate.from_template("你是一位专业的{role}。请用{style}的风格来回答用户问题。"
)
# 模板2:格式化示例
example_template = PromptTemplate.from_template("以下是一个示例:\n输入:{example_input}\n输出:{example_output}"
)
# 模板3:最终提示(它将整合所有部分)
final_template = PromptTemplate.from_template("""
{system_message}{formatted_examples}请回答用户的问题:
{user_input}
""")# 2. 将模板组合成管道
# 每个元素是一个元组:(变量名, 模板)
pipeline_prompts = [("system_message", system_template), # system_template的输出会赋给最终模板的system_message变量("formatted_examples", example_template) # example_template的输出会赋给formatted_examples变量
]
# 创建管道提示模板
pipeline = PipelinePromptTemplate(final_prompt=final_template,pipeline_prompts=pipeline_prompts
)# 3. 准备输入变量(包含所有模板需要的所有变量)
input_variables = {"role": "厨师","style": "风趣幽默","example_input": "如何做西红柿炒蛋?","example_output": "第一步,先让西红柿和鸡蛋交个朋友...","user_input": "如何做红烧肉?" # 最终模板需要的变量
}# 4. 格式化提示!PipelinePromptTemplate会自动处理所有的拼接工作。
formatted_prompt = pipeline.format(**input_variables)
print(formatted_prompt)
输出结果
运行上述代码,formatted_prompt
将会是一个完美组合好的字符串:
你是一位专业的厨师。请用风趣幽默的风格来回答用户问题。以下是一个示例:
输入:如何做西红柿炒蛋?
输出:第一步,先让西红柿和鸡蛋交个朋友...请回答用户的问题:
如何做红烧肉?
优势总结
模块化(Modularity):你可以将复杂的提示分解成小的、可重用的模块。例如,可以单独维护一个“系统指令模板库”和一个“示例模板库”。
可维护性(Maintainability):修改其中一个部分(例如,更改系统指令的风格)不会影响其他部分。
清晰性(Clarity):清晰地定义了提示的每个部分是如何生成的,以及它们之间的依赖关系。
减少错误:自动化拼接过程,避免了手动拼接可能出现的错误和疏忽。
何时使用?
当你发现自己在反复拼接多个提示字符串时,或者当你需要构建非常长且结构复杂的提示时,PipelinePromptTemplate
是一个非常好的工具。它特别适用于构建高级的智能代理(Agents)、复杂链(Chains) 以及需要动态注入少量示例(few-shot) 的场景。