完整教程:langchain-PipelinePromptTemplate

这是一个 LangChain 中相对高级但非常强大的概念,它允许你将多个提示模板像管道一样串联起来,将一个模板的输出作为下一个模板的输入,最终组合成一个复杂的、结构化的最终提示。

核心概念

想象一下工厂的​​装配线(Pipeline)​​:

  1. 第一个工位安装底盘。

  2. 第二个工位接收带有底盘的半成品,并安装发动机。

  3. 第三个工位接收前两步的半成品,并安装车身。

  4. 最终,一台完整的汽车下线。

PipelinePromptTemplate的工作方式与此类似。它让你可以定义一系列提示模板步骤,并将它们组合成一个整体,而不是手动地、一步步地调用和拼接多个模板。

为什么要使用它?

在没有 PipelinePromptTemplate时,如果你要构建一个包含多个部分(如系统指令、一些示例、用户查询、上下文信息)的复杂提示,你可能需要:

  1. 单独格式化每个模板。

  2. 手动将它们拼接成一个巨大的字符串。

  3. 管理它们之间的依赖关系和输入变量。

这种方式非常繁琐且容易出错。PipelinePromptTemplate通过​​自动化这个拼接过程​​并​​明确管理依赖关系​​来解决这个问题。

核心组成部分

一个 PipelinePromptTemplate主要由两部分组成:

  1. ​最终提示模板(Final Prompt Template)​​:

    • 这是最终生成的、将要发送给大语言模型(LLM)的提示模板。

    • 它定义了最终提示的结构,并包含对所有可用变量的引用(这些变量来自前面的管道步骤)。

  2. ​管道提示模板(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将会是一个完美组合好的字符串:

你是一位专业的厨师。请用风趣幽默的风格来回答用户问题。
以下是一个示例:
输入:如何做西红柿炒蛋?
输出:第一步,先让西红柿和鸡蛋交个朋友...
请回答用户的问题:
如何做红烧肉?

优势总结

  1. ​模块化(Modularity)​​:你可以将复杂的提示分解成小的、可重用的模块。例如,可以单独维护一个“系统指令模板库”和一个“示例模板库”。

  2. ​可维护性(Maintainability)​​:修改其中一个部分(例如,更改系统指令的风格)不会影响其他部分。

  3. ​清晰性(Clarity)​​:清晰地定义了提示的每个部分是如何生成的,以及它们之间的依赖关系。

  4. ​减少错误​​:自动化拼接过程,避免了手动拼接可能出现的错误和疏忽。

何时使用?

当你发现自己在反复拼接多个提示字符串时,或者当你需要构建非常长且结构复杂的提示时,PipelinePromptTemplate是一个非常好的工具。它特别适用于构建高级的​​智能代理(Agents)​​、​​复杂链(Chains)​​ 以及​​需要动态注入少量示例(few-shot)​​ 的场景。

posted @ 2025-09-26 22:31  yxysuanfa  阅读(23)  评论(0)    收藏  举报