Skip to main content
章节21 min read

第1章:Prompt Chaining

第1章:Prompt Chaining Prompt Chaining 模式概述 Prompt chaining(有时也称为 Pipeline 模式)是一种强大的范式,用于处理利用大语言模型(LLM)时的复杂任务。与其期望 LLM 在单个单一的步骤中解决复杂问题,prompt chaining 倡导一种分而治之的策略。...

第1章:Prompt Chaining

Prompt Chaining 模式概述

Prompt chaining(有时也称为 Pipeline 模式)是一种强大的范式,用于处理利用大语言模型(LLM)时的复杂任务。与其期望 LLM 在单个单一的步骤中解决复杂问题,prompt chaining 倡导一种分而治之的策略。其核心思想是将原始的、令人生畏的问题分解为一系列更小、更易管理的子问题。每个子问题通过一个专门设计的 prompt 来单独处理,而一个 prompt 生成的输出则被策略性地作为链中下一个 prompt 的输入。

这种顺序处理技术天然地为与 LLM 的交互引入了模块化和清晰性。通过分解复杂任务,理解与调试每个单独步骤变得更加容易,使整个流程更加健壮和可解释。链中的每个步骤都可以被精心设计和优化,专注于更大问题的某个特定方面,从而产生更准确、更聚焦的输出。

一个步骤的输出作为下一个步骤的输入,这一点至关重要。这种信息的传递建立了一个依赖链(因此得名),其中先前操作的上下文和结果指导着后续的处理。这允许 LLM 基于其之前的工作进行构建,完善其理解,并逐步接近期望的解决方案。

此外,prompt chaining 不仅仅是关于分解问题;它还支持整合外部知识和工具。在每个步骤中,LLM 可以被指示与外部系统、API 或数据库进行交互,从而丰富其知识和能力,超越其内部训练数据。这种能力极大地扩展了 LLM 的潜力,使它们不仅能够作为孤立的模型运行,还能作为更广泛、更智能系统的重要组成部分。

prompt chaining 的重要性超越了简单的问题解决。它是构建复杂 AI Agent 的基础技术。这些 Agent 可以利用 prompt chains 在动态环境中自主规划、推理和行动。通过策略性地构建 prompt 序列,Agent 可以参与需要多步推理、规划和决策的任务。这类 Agent 工作流可以更贴近地模拟人类的思维过程,从而实现与复杂领域和系统更自然、更有效的交互。

单一 Prompt 的局限性

对于多方面的任务,使用单一的复杂 prompt 对 LLM 来说可能效率低下,导致模型难以处理约束和指令,可能引发以下问题:指令忽略(prompt 的某些部分被忽视)、上下文漂移(模型失去对初始上下文的跟踪)、错误传播(早期错误被放大)、需要更长上下文窗口的 prompt 导致模型信息不足而作出回应,以及幻觉(认知负荷增加导致产生不正确的信息)。例如,一个要求分析市场研究报告、总结发现、用数据点识别趋势并草拟电子邮件的查询,很可能失败,因为模型可能总结得不错,但无法正确提取数据或草拟邮件。

通过顺序分解增强可靠性

Prompt chaining 通过将复杂任务分解为聚焦的顺序工作流来应对这些挑战,这显著提高了可靠性和控制力。以上述示例为例,pipeline 或 chained 方法可以描述如下:

  1. 初始 Prompt(摘要):"Summarize the key findings of the following market research report: [text]." 模型唯一的关注点是摘要,这提高了初始步骤的准确性。
  2. 第二个 Prompt(趋势识别):"Using the summary, identify the top three emerging trends and extract the specific data points that support each trend: [output from step 1]." 这个 prompt 现在更加受限,并直接建立在已验证的输出之上。
  3. 第三个 Prompt(邮件撰写):"Draft a concise email to the marketing team that outlines the following trends and their supporting data: [output from step 2]."

这种分解允许对流程进行更细粒度的控制。每个步骤都更简单、歧义更少,这降低了模型的认知负荷,并导致更准确、更可靠的最终输出。这种模块化类似于计算 pipeline,其中每个函数在执行特定操作后将其结果传递给下一个。为了确保每个特定任务的准确响应,可以在每个阶段为模型分配不同的角色。例如,在上述场景中,初始 prompt 可以指定为"市场分析师",随后的 prompt 指定为"行业分析师",第三个 prompt 指定为"专业文档撰写者",依此类推。

结构化输出的作用

prompt chain 的可靠性高度依赖于步骤间传递数据的完整性。如果一个 prompt 的输出模糊或格式不佳,后续 prompt 可能因为错误的输入而失败。为缓解此问题,指定结构化的输出格式(如 JSON 或 XML)至关重要。

例如,趋势识别步骤的输出可以格式化为 JSON 对象:

json
{ "trends": [ { "trend_name": "AI-Powered Personalization", "supporting_data": "73% of consumers prefer to do business with brands that use personal information to make their shopping experiences more relevant." }, { "trend_name": "Sustainable and Ethical Brands", "supporting_data": "Sales of products with ESG-related claims grew 28% over the last five years, compared to 20% for products without." } ] }

这种结构化格式确保数据是机器可读的,并且可以被精确解析并无歧义地插入到下一个 prompt 中。这种做法最小化了从自然语言解释中可能出现的错误,是构建健壮的多步 LLM 系统的关键组成部分。

实际应用与用例

Prompt chaining 是一种通用模式,适用于构建 Agent 系统时的广泛场景。其核心价值在于将复杂问题分解为顺序的、可管理的步骤。以下是几个实际应用和用例:

1. 信息处理工作流

许多任务涉及通过多次转换处理原始信息。例如,对文档进行摘要、提取关键实体,然后使用这些实体查询数据库或生成报告。prompt chain 可能如下:

  • Prompt 1:从给定的 URL 或文档中提取文本内容。
  • Prompt 2:对清洗后的文本进行摘要。
  • Prompt 3:从摘要或原始文本中提取特定实体(如姓名、日期、地点)。
  • Prompt 4:使用实体搜索内部知识库。
  • Prompt 5:生成包含摘要、实体和搜索结果的最终报告。

该方法论应用于自动内容分析、AI 驱动的研究助手开发以及复杂报告生成等领域。

2. 复杂查询回答

回答需要多步推理或信息检索的复杂问题是 prompt chaining 的主要用例。例如,"What were the main causes of the stock market crash in 1929, and how did government policy respond?"(1929 年股市崩盘的主要原因是什么,政府政策是如何应对的?)

  • Prompt 1:识别用户查询中的核心子问题(崩盘原因、政府应对)。
  • Prompt 2:研究或检索关于 1929 年崩盘原因的特定信息。
  • Prompt 3:研究或检索关于政府对 1929 年股市崩盘政策应对的特定信息。
  • Prompt 4:将步骤 2 和步骤 3 的信息综合成对原始查询的连贯回答。

这种顺序处理方法对于开发能够进行多步推理和信息综合的 AI 系统至关重要。当查询无法从单一数据点回答,而是需要一系列逻辑步骤或多来源信息整合时,就需要这类系统。

例如,一个旨在生成特定主题综合报告的自动化研究 Agent 执行混合计算工作流。首先,系统检索大量相关文章。随后从每篇文章中提取关键信息的任务可以针对每个来源并发执行。这一阶段非常适合并行处理,其中独立的子任务同时运行以最大化效率。

然而,一旦各个提取任务完成,流程就变成固有的顺序性。系统必须首先整理提取的数据,然后将其综合为连贯的草稿,最后审阅和精炼该草稿以生成最终报告。每个后续阶段在逻辑上都依赖于前一个阶段的成功完成。这就是应用 prompt chaining 的地方:整理后的数据作为综合 prompt 的输入,生成的综合文本成为最终审阅 prompt 的输入。因此,复杂操作通常将用于独立数据收集的并行处理与用于综合和精炼等依赖步骤的 prompt chaining 相结合。

3. 数据提取与转换

将非结构化文本转换为结构化格式通常通过迭代过程实现,需要对输出进行顺序修改以提高准确性和完整性。

  • Prompt 1:尝试从发票文档中提取特定字段(如姓名、地址、金额)。
  • 处理:检查所有必需字段是否已提取以及是否符合格式要求。
  • Prompt 2(条件性):如果有字段缺失或格式错误,设计一个新的 prompt,要求模型专门查找缺失/格式错误的信息,可能需要提供之前失败尝试的上下文。
  • 处理:再次验证结果。如有必要重复。
  • 输出:提供提取的、已验证的结构化数据。

这种顺序处理方法特别适用于从非结构化来源(如表单、发票或电子邮件)进行数据提取和分析。例如,解决复杂的光学字符识别(OCR)问题,如处理 PDF 表单,通过分解的多步方法可以更有效地处理。

首先,使用大语言模型从文档图像中执行主要的文本提取。随后,模型处理原始输出以规范化数据,在这一步中,它可能将数字文本(如"one thousand and fifty")转换为其数字等效值 1050。LLM 面临的一个重大挑战是执行精确的数学计算。因此,在后续步骤中,系统可以将任何所需的算术运算委托给外部计算器工具。LLM 识别所需的计算,将规范化后的数字输入工具,然后融入精确的结果。这种文本提取、数据规范化和外部工具使用的链式序列实现了最终准确的结果,这通常难以从单一的 LLM 查询中可靠获得。

4. 内容生成工作流

复杂内容的撰写是一个程序性任务,通常被分解为不同的阶段,包括初始构思、结构大纲、起草和后续修订。

  • Prompt 1:基于用户的总体兴趣生成 5 个主题想法。
  • 处理:让用户选择一个想法或自动选择最佳的一个。
  • Prompt 2:基于所选主题,生成详细的大纲。
  • Prompt 3:基于大纲的第一个要点撰写草稿部分。
  • Prompt 4:基于大纲的第二个要点撰写草稿部分,提供前一部分作为上下文。对所有大纲要点继续此操作。
  • Prompt 5:审阅并精炼完整草稿的连贯性、语气和语法。

该方法论应用于一系列自然语言生成任务,包括创意叙事的自动化撰写、技术文档以及其他形式的结构化文本内容。

5. 带状态的对话 Agent

尽管全面的状态管理架构采用比简单顺序链接更复杂的方法,但 prompt chaining 为保持对话连续性提供了基础机制。这种技术通过将每个对话回合构建为一个新的 prompt,系统地纳入之前交互中的信息或提取的实体,来维护上下文。

  • Prompt 1:处理用户话语 1,识别意图和关键实体。
  • 处理:用意图和实体更新对话状态。
  • Prompt 2:基于当前状态,生成响应和/或识别下一个所需的信息。
  • 对后续轮次重复,每次新的用户话语启动一个利用累积对话历史(状态)的链。

这一原理是开发对话 Agent 的基础,使它们能够在扩展的多轮对话中维持上下文和连贯性。通过保留对话历史,系统可以理解并适当地响应依赖于之前交换信息的用户输入。

6. 代码生成与精炼

功能性代码的生成通常是一个多阶段过程,需要将问题分解为一系列逐步执行的离散逻辑操作。

  • Prompt 1:理解用户对代码函数的请求。生成伪代码或大纲。
  • Prompt 2:基于大纲编写初始代码草稿。
  • Prompt 3:识别代码中的潜在错误或需要改进的地方(可能使用静态分析工具或另一个 LLM 调用)。
  • Prompt 4:基于已识别的问题重写或精炼代码。
  • Prompt 5:添加文档或测试用例。

在 AI 辅助软件开发等应用中,prompt chaining 的效用在于其将复杂编码任务分解为一系列可管理的子问题的能力。这种模块化结构降低了每一步中大语言模型的操作复杂性。至关重要的是,这种方法还允许在模型调用之间插入确定性逻辑,从而在工作流中实现中间数据处理、输出验证和条件分支。通过这种方法,一个可能导致不可靠或不完整结果的单一多面请求被转换为由底层执行框架管理的一系列结构化操作。

7. 多模态与多步推理

分析具有多样模态的数据集需要将问题分解为更小的、基于 prompt 的任务。例如,解释一张包含嵌入文字的图片、突出显示特定文本片段的标签以及解释每个标签的表格数据,就需要这种方法。

  • Prompt 1:从用户的图片请求中提取并理解文本。
  • Prompt 2:将提取的图片文本与其对应的标签关联起来。
  • Prompt 3:使用表格解释收集到的信息,以确定所需的输出。

实操代码示例

实现 prompt chaining 的范围从脚本中的直接顺序函数调用,到利用专门设计用于管理控制流、状态和组件集成的框架。诸如 LangChain、LangGraph、Crew AI 和 Google Agent Development Kit (ADK) 等框架为构建和执行这些多步流程提供了结构化环境,这对复杂架构尤为有利。

出于演示目的,LangChain 和 LangGraph 是合适的选择,因为它们的核心 API 明确设计用于组合操作链和图。LangChain 为线性序列提供基础抽象,而 LangGraph 将这些能力扩展到支持有状态和循环计算,这是实现更复杂的 Agent 行为所必需的。此示例将聚焦于一个基本的线性序列。

以下代码实现了一个两步 prompt chain,其功能相当于数据处理 pipeline。初始阶段旨在解析非结构化文本并提取特定信息。随后阶段接收此提取的输出并将其转换为结构化数据格式。

要复制此流程,首先需要安装所需的库。可以使用以下命令完成:

bash
pip install langchain langchain-community langchain-openai langgraph

注意,langchain-openai 可以替换为适用于不同模型提供商的相应包。随后,必须为所选语言模型提供商(如 OpenAI、Google Gemini 或 Anthropic)配置执行环境必要的 API 凭据。

python
import os from langchain_openai import ChatOpenAI from langchain_core.prompts import ChatPromptTemplate from langchain_core.output_parsers import StrOutputParser # For better security, load environment variables from a .env file # from dotenv import load_dotenv # load_dotenv() # Make sure your OPENAI_API_KEY is set in the .env file # Initialize the Language Model (using ChatOpenAI is recommended) llm = ChatOpenAI(temperature=0) # --- Prompt 1: Extract Information --- prompt_extract = ChatPromptTemplate.from_template( "Extract the technical specifications from the following text:\n\n{text_input}" ) # --- Prompt 2: Transform to JSON --- prompt_transform = ChatPromptTemplate.from_template( "Transform the following specifications into a JSON object with 'cpu', 'memory', and 'storage' as keys:\n\n{specifications}" ) # --- Build the Chain using LCEL --- # The StrOutputParser() converts the LLM's message output to a simple string. extraction_chain = prompt_extract | llm | StrOutputParser() # The full chain passes the output of the extraction chain into the 'specifications' # variable for the transformation prompt. full_chain = ( {"specifications": extraction_chain} | prompt_transform | llm | StrOutputParser() ) # --- Run the Chain --- input_text = "The new laptop model features a 3.5 GHz octa-core processor, 16GB of RAM, and a 1TB NVMe SSD." # Execute the chain with the input text dictionary. final_result = full_chain.invoke({"text_input": input_text}) print("\n--- Final JSON Output ---") print(final_result)

这段 Python 代码演示了如何使用 LangChain 库处理文本。它使用两个独立的 prompt:一个用于从输入字符串中提取技术规格,另一个用于将这些规格格式化为 JSON 对象。ChatOpenAI 模型用于语言模型交互,StrOutputParser 确保输出为可用的字符串格式。LangChain Expression Language (LCEL) 用于优雅地将这些 prompt 和语言模型链接在一起。第一个链 extraction_chain 提取规格信息。full_chain 然后将提取的输出作为输入传递给转换 prompt。提供了一段描述笔记本电脑的示例输入文本。full_chain 被调用处理此文本,通过两个步骤进行处理。最终结果(包含提取和格式化规格的 JSON 字符串)被打印出来。

Context Engineering 与 Prompt Engineering

Context Engineering(上下文工程,见图1)是一种系统性的学科,涉及在 token 生成之前,为 AI 模型设计、构建和交付一个完整的信息环境。这种方法论认为,模型输出的质量较少依赖于模型本身的架构,而更多依赖于所提供上下文的丰富程度。

图1:Context Engineering 是为 AI 构建丰富、全面的信息环境的学科,因为上下文的质量是实现高级 Agent 性能的主要因素。

它代表了从传统 prompt engineering 的一次重大演进,后者主要关注优化用户即时查询的措辞。Context Engineering 将这一范围扩展到包含多层信息,例如系统 prompt(system prompt),即定义 AI 操作参数的基础指令集——例如,"你是一位技术文档撰写者;你的语气必须正式且精确。"上下文进一步通过外部数据得到丰富。这包括检索的文档(retrieved documents),AI 主动从知识库中获取信息来为其响应提供依据,例如拉取项目的技术规格。它还包括工具输出(tool outputs),即 AI 使用外部 API 获取实时数据的结果,例如查询日历以确定用户的可用性。这些显式数据与关键的隐式数据(如用户身份、交互历史和环境状态)相结合。其核心原则是,即使是先进模型,当被提供一个有限或构建不当的运行环境视图时,也会表现不佳。

因此,这种实践将任务从仅仅回答问题重新框定为为 Agent 构建全面的运行图景。例如,一个经过 context engineering 的 Agent 不仅仅响应查询,而是首先整合用户的日历可用性(工具输出)、与邮件收件人的专业关系(隐式数据)以及之前会议的笔记(检索的文档)。这使得模型能够生成高度相关、个性化和具有实际用途的输出。"工程"部分涉及创建健壮的 pipeline 以在运行时获取和转换这些数据,并建立反馈循环以持续改进上下文质量。

为实现这一目标,可以使用专门的调优系统来自动化大规模改进过程。例如,Google 的 Vertex AI prompt optimizer 等工具可以通过系统性地根据一组示例输入和预定义的评估指标来评估响应,从而增强模型性能。这种方法可以有效地在不同模型之间调整 prompts 和系统指令,而无需大量手动重写。通过为此类优化器提供示例 prompts、系统指令和模板,它可以以编程方式精炼上下文输入,为实现复杂 Context Engineering 所需的反馈循环提供结构化方法。

这种结构化方法是将一个初级 AI 工具与一个更复杂、具有上下文感知能力的系统区分开来的关键。它将上下文本身视为主要组件,高度重视 Agent 知道什么、何时知道以及如何使用该信息。该实践确保模型对用户的意图、历史和当前环境有全面的理解。最终,Context Engineering 是将无状态聊天机器人推进为高度有能力、具有情境感知能力的系统的关键方法论。

概览

是什么:复杂任务在单个 prompt 中处理时往往会使 LLM 不堪重负,导致严重的性能问题。模型认知负荷的增加提升了出现错误(如忽视指令、丢失上下文和生成错误信息)的可能性。单一的 prompt 难以有效地管理多个约束和顺序推理步骤。这导致输出不可靠且不准确,因为 LLM 无法满足多方面请求的所有方面。

为什么:Prompt chaining 通过将复杂问题分解为一系列较小的、相互关联的子任务,提供了一个标准化的解决方案。链中的每个步骤使用一个聚焦的 prompt 执行特定操作,显著提高了可靠性和控制力。一个 prompt 的输出作为下一个 prompt 的输入传递,创建一个逐步构建最终解决方案的逻辑工作流。这种模块化的分而治之策略使流程更易管理、更易调试,并允许在步骤之间集成外部工具或结构化数据格式。该模式是开发能够规划、推理和执行复杂工作流的复杂多步 Agent 系统的基础。

经验法则:当任务对单个 prompt 来说过于复杂、涉及多个不同的处理阶段、需要在步骤之间与外部工具交互,或构建需要执行多步推理和维护状态的 Agent 系统时,使用此模式。

可视化总结

图2:Prompt Chaining 模式:Agent 接收来自用户的一系列 prompts,每个 Agent 的输出作为链中下一个 Agent 的输入。

关键要点

以下是几个关键要点:

  • Prompt Chaining 将复杂任务分解为一系列较小、聚焦的步骤。这有时也称为 Pipeline 模式。
  • 链中的每个步骤涉及一个 LLM 调用或处理逻辑,使用前一步骤的输出作为输入。
  • 此模式提高了与语言模型进行复杂交互的可靠性和可管理性。
  • 诸如 LangChain/LangGraph 和 Google ADK 等框架提供了定义、管理和执行这些多步序列的健壮工具。

结论

通过将复杂问题解构为一系列更简单、更易管理的子任务,prompt chaining 为指导大语言模型提供了一个健壮的框架。这种"分而治之"的策略通过让模型一次专注于一个特定操作,显著增强了输出的可靠性和控制力。作为一种基础模式,它使开发能够进行多步推理、工具集成和状态管理的复杂 AI Agent 成为可能。最终,掌握 prompt chaining 对于构建能够执行远超单一 prompt 能力的复杂工作流的健壮、上下文感知系统至关重要。

参考文献

  1. LangChain Documentation on LCEL: https://python.langchain.com/v0.2/docs/core_modules/expression_language/
  2. LangGraph Documentation: https://langchain-ai.github.io/langgraph/
  3. Prompt Engineering Guide - Chaining Prompts: https://www.promptingguide.ai/techniques/chaining
  4. OpenAI API Documentation (General Prompting Concepts): https://platform.openai.com/docs/guides/gpt/prompting
  5. Crew AI Documentation (Tasks and Processes): https://docs.crewai.com/
  6. Google AI for Developers (Prompting Guides): https://cloud.google.com/discover/what-is-prompt-engineering?hl=en
  7. Vertex Prompt Optimizer: https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/prompt-optimizer