第一章:提示链(Prompt Chaining)

返回目录 | 下一章:路由 →


第一章:提示链(Prompt Chaining)

提示链模式概述

提示链(Prompt Chaining),有时也被称为流水线模式(Pipeline pattern),代表了一种强大的范式,用于利用大型语言模型(LLM)处理复杂的任务。提示链反对期望LLM在一个单一、庞大的步骤中解决复杂的难题,而是倡导一种“分而治之”的策略。其核心思想是将原始的、艰巨的问题分解成一系列更小、更易于管理的子问题。每个子问题都通过一个专门设计的提示(prompt)单独解决,并且由前一个提示生成的输出被策略性地作为输入馈送给链中的后续提示。

这种顺序处理技术自然地为与LLM的交互引入了模块化清晰度。通过分解复杂任务,可以更容易地理解和调试每一步,从而使整个过程更加健壮可解释。链中的每一步都可以经过精心设计和优化,专注于更大问题的一个特定方面,从而带来更准确有重点的输出。

一步的输出作为下一步的输入至关重要。这种信息传递建立了一个依赖链(因此得名),其中先前操作的上下文和结果指导着后续的处理。这使得LLM能够在其先前工作的基础上继续发展,精炼其理解,并逐步接近预期的解决方案。

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

提示链的意义超越了简单的解决问题。它是一种构建复杂AI代理(AI agents)的基础技术。这些代理可以利用提示链来自主规划、推理和行动于动态环境中。通过策略性地构建提示的序列,代理可以参与需要多步骤推理、规划和决策的任务。此类代理工作流可以更紧密地模仿人类的思维过程,从而实现与复杂领域和系统更自然、更有效的交互。

单一提示的局限性

对于多方面任务,使用一个单一、复杂的提示对LLM来说效率低下,可能导致模型难以应对约束和指令,从而可能引发以下问题:指令忽略(instruction neglect)(提示的某些部分被忽略)、上下文漂移(contextual drift)(模型偏离最初的上下文)、错误传播(error propagation)(早期的错误被放大)、需要更长上下文窗口(longer context window)的提示(模型获得的信息不足以响应),以及幻觉(hallucination)(认知负荷增加导致错误信息出现的几率)。例如,一个要求“分析一份市场研究报告、总结发现、识别包含数据点的趋势并起草一封电子邮件”的查询,就有失败的风险,因为模型可能总结得很好,但却未能提取数据或正确地起草邮件。

通过顺序分解增强可靠性

提示链通过将复杂的任务分解为有重点的、顺序的工作流来解决这些挑战,从而显著提高了可靠性和控制力。针对上述示例,流水线或链式方法可以描述如下:

  • 初始提示(总结):“总结以下市场研究报告的关键发现:[文本]。”模型的唯一重点是总结,从而提高了这一初始步骤的准确性。
  • 第二个提示(趋势识别):“利用摘要,识别三大新兴趋势,并提取支持每种趋势的具体数据点:[第 1 步的输出]。”这个提示现在受到了更多的约束,并直接建立在一个经过验证的输出之上。
  • 第三个提示(邮件撰写):“起草一封简洁的电子邮件给市场团队,概述以下趋势及其支持数据:[第 2 步的输出]。”

这种分解允许对过程进行更精细的控制。每一步都更简单、更不含糊,这降低了模型的认知负荷,并带来了更准确、更可靠的最终输出。这种模块化类似于一个计算流水线,其中每个函数在将其结果传递给下一个函数之前执行特定的操作。为了确保对每个特定任务的准确响应,可以在每个阶段为模型分配一个独特的角色。例如,在给定的场景中,初始提示可以被指定为“市场分析师(Market Analyst)”,后续提示为“交易分析师(Trade Analyst)”,第三个提示为“专家文档撰写人(Expert Documentation Writer)”,以此类推。

结构化输出的作用

提示链的可靠性高度依赖于步骤之间传递数据的完整性。如果一个提示的输出是模糊的或格式不佳的,后续的提示可能会因为输入错误而失败。为了缓解这种情况,指定结构化的输出格式,例如 JSON 或 XML,至关重要。

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
 "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."
   }
 ]
}

这种结构化格式确保了数据是机器可读的,并且可以被精确解析并插入到下一个提示中,而不会产生歧义。这种做法最大限度地减少了因解释自然语言而可能产生的错误,并且是构建健壮的、基于 LLM 的多步系统的关键组成部分。

实际应用与用例

提示链是一种通用模式,适用于构建代理系统中的各种场景。其核心功用在于将复杂问题分解为顺序的、可管理的步骤。以下是几个实际应用和用例:

1. 信息处理工作流

许多任务涉及通过多种转换来处理原始信息。例如,总结一份文档,提取关键实体,然后利用这些实体查询数据库或生成报告。一个提示链可能如下所示:

  • 提示 1: 从给定 URL 或文档中提取文本内容。
  • 提示 2: 总结清理后的文本。
  • 提示 3: 从摘要或原始文本中提取特定实体(例如,名称、日期、位置)。
  • 提示 4: 利用实体搜索内部知识库。
  • 提示 5: 生成一份最终报告,整合摘要、实体和搜索结果。

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

2. 复杂查询解答

回答需要多步骤推理或信息检索的复杂问题是一个主要用例。例如:“1929 年股市崩盘的主要原因是什么?政府政策是如何应对的?”

  • 提示 1: 识别用户查询中的核心子问题(崩盘原因、政府应对)。
  • 提示 2: 专门研究或检索有关 1929 年崩盘原因的信息。
  • 提示 3: 专门研究或检索有关政府对 1929 年股市崩盘政策应对的信息。
  • 提示 4: 将第 2 步和第 3 步的信息综合成一个连贯的答案,以回答原始查询。

这种顺序处理方法论是开发能够进行多步推理和信息综合的 AI 系统的核心。当一个查询不能仅凭单一数据点回答,而需要一系列逻辑步骤或整合来自不同来源的信息时,就需要此类系统。

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

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

3. 数据提取与转换

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

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

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

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

4. 内容生成工作流

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

  • 提示 1: 基于用户的笼统兴趣生成 5 个主题构思。
  • 处理: 允许用户选择一个构思或自动选择最佳构思。
  • 提示 2: 基于选定的主题,生成详细的大纲。
  • 提示 3: 基于大纲中的第一个要点撰写一个草稿部分。
  • 提示 4: 基于大纲中的第二个要点撰写一个草稿部分,提供前一部分作为上下文。对所有大纲要点重复此操作。
  • 提示 5: 审阅和精炼完整的草稿,以确保连贯性、语调和语法。

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

5. 带有状态的对话代理

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

  • 提示 1: 处理用户话语 1,识别意图和关键实体。
  • 处理: 使用意图和实体更新对话状态。
  • 提示 2: 根据当前状态,生成响应和/或识别所需的下一条信息。

对后续回合重复此操作,每个新的用户话语都会启动一个利用累积对话历史(状态)的链。

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

6. 代码生成与精炼

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

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

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

7. 多模态和多步推理

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

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

动手实践代码示例

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

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

以下代码实现了一个两步提示链,它作为一个数据处理流水线。初始阶段旨在解析非结构化文本并提取特定信息。随后的阶段接收此提取的输出并将其转换为结构化数据格式

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

1
pip install langchain langchain-community langchain-openai langgraph

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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
  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 库处理文本。它利用了两个独立的提示:一个从输入字符串中提取技术规格,另一个将这些规格格式化为 JSON 对象ChatOpenAI 模型用于语言模型交互,而 StrOutputParser 确保输出为可用的字符串格式。LangChain 表达式语言 (LCEL) 用于优雅地将这些提示和语言模型链接在一起。第一个链 extraction_chain 提取规格。然后,full_chain 获取提取的输出,并将其作为转换提示的输入。代码提供了一个描述笔记本电脑的示例输入文本。full_chain 被调用并使用此文本执行,使其通过这两个步骤进行处理。最终结果(包含已提取和格式化规格的 JSON 字符串)随后被打印出来。

上下文工程与提示工程

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

图片

**图 1:**上下文工程是为 AI 构建一个丰富、全面的信息环境的学科,因为这种上下文的质量是促成高级代理性能的首要因素。

它代表了传统提示工程的一个重大演进,传统提示工程主要关注优化用户即时查询的措辞。上下文工程将这一范围扩展到包括多个信息层,例如系统提示(system prompt),这是一组定义 AI 操作参数的基础指令——例如,“你是一名技术作家;你的语调必须正式且精确。”上下文通过外部数据进一步丰富。这包括检索到的文档,其中 AI 主动从知识库中获取信息来告知其响应,例如拉取项目的技术规格。它还整合了工具输出(tool outputs),这是 AI 使用外部 API 获取实时数据的结果,例如查询日历以确定用户的可用性。这种显性数据与关键的隐性数据相结合,例如用户身份、交互历史和环境状态。核心原则是,即使是高级模型,在提供有限或结构不良的操作环境视图时,也会表现不佳。

因此,这种实践将任务从仅仅回答一个问题重新定义为为代理构建一个全面的操作图景。例如,一个经过上下文工程的代理不会仅仅回应一个查询,而是会首先整合用户的日历可用性(一个工具输出)、与电子邮件收件人的专业关系(隐性数据),以及先前会议的笔记(检索到的文档)。这使得模型能够生成高度相关、个性化和实用的输出。其中的“工程”部分涉及创建健壮的流水线,以便在运行时获取和转换这些数据,并建立反馈回路以持续改进上下文质量。

要实现这一点,可以使用专门的调优系统来在大规模上自动化改进过程。例如,像 Google 的 Vertex AI 提示优化器这样的工具可以通过系统地评估针对一组样本输入和预定义评估指标的响应来增强模型性能。这种方法对于跨不同模型调整提示和系统指令是有效的,而无需大量的手动重写。通过向此类优化器提供样本提示、系统指令和一个模板,它可以程序化地精炼上下文输入,为实现复杂的上下文工程所需的反馈回路提供了一个结构化的方法。

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

概要

是什么 (What)

复杂的任务在单个提示内处理时经常使 LLM 不堪重负,导致严重的性能问题。模型的认知负荷增加,导致忽略指令、失去上下文生成不正确信息等错误的几率增加。一个庞大的提示难以有效地管理多个约束和顺序推理步骤。这导致不可靠和不准确的输出,因为 LLM 未能处理多方面请求的所有层面。


为什么 (Why)

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


经验法则 (Rule of thumb)

当一个任务对于单个提示来说过于复杂、涉及多个不同的处理阶段、需要在步骤之间与外部工具交互,或者在构建需要执行多步推理并维护状态的代理系统时,请使用此模式。

视觉摘要

图片

**图 2:**提示链模式:代理接收来自用户的一系列提示,每个代理的输出都作为链中下一个代理的输入。

核心要点

以下是一些核心要点:

  • 提示链将复杂任务分解为一系列更小、有重点的步骤。这有时被称为流水线模式(Pipeline pattern)
  • 链中的每一步都涉及一次 LLM 调用或处理逻辑,使用前一步的输出作为输入。
  • 此模式提高了与语言模型进行复杂交互的可靠性和可管理性
  • 诸如 LangChain/LangGraphGoogle ADK 等框架提供了健壮的工具来定义、管理和执行这些多步序列。

结论

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

参考资料

LangChain 关于 LCEL 的文档:https://python.langchain.com/v0.2/docs/core_modules/expression_language/

LangGraph 文档:https://langchain-ai.github.io/langgraph/

提示工程指南 - 链接提示:https://www.promptingguide.ai/techniques/chaining

OpenAI API 文档(通用提示概念):https://platform.openai.com/docs/guides/gpt/prompting

Crew AI 文档(任务和过程):https://docs.crewai.com/

Google AI for Developers(提示指南):https://cloud.google.com/discover/what-is-prompt-engineering?hl=en

Vertex 提示优化器:https://cloud.google.com/vertex-ai/generative-ai/docs/learn/prompts/prompt-optimizer