智能体设计模式-CH01:提示链(Prompt Chaining)

英文原地址:Chapter 1: Prompt Chaining

概览

提示链(有时也称为 Pipeline 模式)是在利用大型语言模型(LLMs)处理复杂任务时的一种强大范式。与其期望一个 LLM 在单一、整体的一步中解决复杂问题,提示链提倡一种分而治之的策略。其核心思想是将原本令人生畏的问题拆解为一系列更小、更易管理的子问题。每个子问题都通过专门设计的提示单独处理,而一个提示生成的输出会被有策略地作为输入,传递给链中的下一个提示。

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

让上一阶段的输出作为下一阶段的输入至关重要。信息的传递建立了一个依赖链,因此得名,其中先前操作的上下文与结果会引导后续处理。这样一来,LLM 就能在其先前工作基础上构建、细化其理解,并逐步接近期望的解决方案。

此外,提示链并不仅仅是将问题拆解;它还使外部知识与工具的整合成为可能。在每一步中,可以指示 LLM 与外部系统、API 或数据库交互,将其知识与能力扩展到其内部训练数据之外。此能力极大地拓展了 LLMs 的潜力,使其不仅能作为孤立的模型发挥作用,还能成为更广泛、更智能系统的关键组成部分。

提示链的重要性不仅限于简单的问题求解。它是构建复杂 AI 代理的基础性技术。这些代理可以利用提示链在动态环境中自主规划、推理和行动。通过有策略地构建提示序列,代理可以参与需要多步推理、规划和决策的任务。此类代理工作流程能够更贴近人类的思维过程,从而在复杂领域和系统中实现更自然且更高效的交互。

单一提示的局限性: 对于多层面的任务,向 LLM 提交一个单一且复杂的提示可能效率低下,会让模型在约束与指令间挣扎,进而导致以下问题:指令忽视(提示的部分内容被忽略)、语境漂移(模型逐渐丢失初始语境)、错误传播(早期错误被放大)、需要更长上下文窗口的提示(模型得到的信息不足以生成回应),以及幻觉(认知负荷增加导致错误信息的概率上升)。例如,一个要求分析市场研究报告、总结发现、结合数据点识别趋势并起草电子邮件的查询,可能在执行时失败:模型也许能很好地总结,但无法正确提取数据或妥善起草邮件。

通过顺序分解提升可靠性: 提示链通过将复杂任务拆解为聚焦且有序的工作流来应对上述挑战,从而显著提升可靠性与可控性。结合上述示例,可以将流程或链式方法描述如下:

  • 初始提示(摘要):"请总结以下市场研究报告的关键发现:[text]。"模型的唯一重点是摘要,从而提高初始步骤的准确性。
  • 第二个提示(趋势识别):"基于摘要,识别前三个新兴趋势,并提取支撑每个趋势的具体数据点:[output from step 1]。"该提示更加受限,并直接建立在经过验证的输出之上。
  • 第三个提示(邮件撰写):"撰写一封简洁的邮件给市场团队,概述以下趋势及其支撑数据:[output from step 2]。"

这种分解方式使得对流程的控制更加细粒度。每一步都更简单、更不含糊,从而降低模型的认知负担,带来更准确、更可靠的最终输出。这种模块化类似于计算管线,其中每个函数在将结果传递给下一个函数之前执行特定的操作。为确保每个具体任务的准确响应,可以在每个阶段为模型分配一个独立的角色。例如,在给定场景中,初始提示可被指定为"Market Analyst",随后提示为"Trade Analyst",第三个提示为"Expert Documentation Writer",依此类推。

结构化输出的作用: 提示链的可靠性高度依赖于步骤之间传递数据的完整性。如果某一步的输出含糊不清或格式不佳,后续提示可能会因错误输入而失败。为减轻这一问题,指定结构化输出格式(例如 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."
   }
 ]
}

这种结构化格式确保数据是机器可读的,并且可以被精确解析并无歧义地插入到下一个提示中。此做法最大限度减少了由自然语言解释带来的错误,并且是构建稳健的、多步骤的基于 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 表单)时,通过分解的多步骤方法会更为有效。

最初,使用大型语言模型来对文档图像进行主要的文本提取。随后,模型对原始输出进行处理以规范化数据,在这个步骤中,它可能会将诸如"one thousand and fifty"之类的数字文本转换为其数值等价形式 1050。LLMs 的一个重大挑战是执行精确的数学计算。因此,在后续步骤中,系统可以将任何所需的算术运算委托给外部计算器工具。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 将这些能力扩展到支持有状态和循环计算,这对于实现更复杂的智能体行为是必要的。此示例将聚焦于一个基本的线性序列。

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

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

sh 复制代码
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 库处理文本。它利用了两个独立的提示:一个用于从输入字符串中提取技术规格,另一个用于将这些规格格式化为 JSON 对象。ChatOpenAI 模型用于语言模型交互,StrOutputParser 确保输出为可用的字符串格式。LangChain 表达式语言(LCEL)被用于优雅地串联这些提示和语言模型。第一个链 extraction_chain 用于提取规格。full_chain 则将提取的输出作为转换提示的输入。提供了一个描述笔记本电脑的示例输入文本。使用该文本调用 full_chain,通过两个步骤进行处理。最终结果是一个包含提取和格式化规格的 JSON 字符串,然后被打印出来。

上下文工程与提示工程

上下文工程(见图 1)是一门在生成 token 之前,为 AI 模型设计、构建并交付完整信息环境的系统化学科。该方法论主张,模型输出的质量与其架构本身的关系较小,更取决于所提供上下文的丰富程度。

图 1:上下文工程是一门为 AI 构建丰富而全面的信息环境的学科,因为该上下文的质量是实现高级 Agentic 性能的主要因素。

它代表着从传统提示工程的一次重要演进。传统提示工程主要聚焦于优化用户即时查询的措辞,而上下文工程将范围扩展为包含多层信息。例如系统提示,它是一组奠定 AI 运行参数的基础指令------比如,"You are a technical writer; your tone must be formal and precise." 上下文还通过外部数据得到进一步丰富。这包括检索到的文档,即 AI 主动从知识库中获取信息以支撑其回答,例如提取项目的技术规格。它还纳入工具输出,即 AI 调用外部 API 以获取实时数据的结果,比如查询日历以确定用户的可用时间。这些显性数据会与关键的隐性数据结合,如用户身份、交互历史和环境状态。核心原则是,即便是先进的模型,在获得的运行环境视角有限或构造不当时也会表现不佳。

因此,这种实践将任务从单纯回答问题,重塑为为智能体构建一幅全面的运作图景。举例来说,一个经过上下文工程的智能体不会仅仅对查询作出回应,而是会先整合用户的日程可用时间(工具输出)、与邮件收件人的职业关系(隐性数据)以及之前会议的笔记(检索到的文档)。这使模型能够生成高度相关、个性化且切实有用的输出。"工程"部分涉及在运行时创建稳健的管道来获取并转换这些数据,并建立反馈回路以持续改进上下文质量。

要实现这一点,可以使用专门的调优系统在大规模上自动化改进过程。例如,Google 的 Vertex AI 提示优化器等工具可以通过针对一组示例输入和预定义评估指标系统性地评估响应,从而提升模型性能。这种方法能够在不同模型之间调整提示词和系统指令,而无需大量的手动重写。通过向此类优化器提供示例提示词、系统指令和模板,它可以以编程方式优化上下文输入,为实现复杂上下文工程所需的反馈回路提供一种结构化的方法。

这种结构化的方法是区分初级 AI 工具与更复杂、具备上下文意识系统的关键。它将上下文本身视为核心组成部分,极其重视智能体知道什么、何时知道以及如何使用这些信息。这样的实践确保模型能够全面理解用户的意图、历史和当前环境。归根结底,Context Engineering 是将无状态聊天机器人推进为高能力、具备情境感知系统的重要方法论。

回顾

是什么(What)

在单一提示内处理复杂任务常常会使 LLMs 不堪重负,导致显著的性能问题。模型的认知负荷增加,会更容易出现忽视指令、丢失上下文、生成错误信息等问题。单块式提示难以有效管理多个约束条件和顺序推理步骤。结果就是输出不可靠且不准确,因为 LLM 未能覆盖该多层面请求的所有方面。

为什么(Why)

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

经验法则(Rule of Thumb)

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

提示链模式:Agents 从用户接收一系列提示,每个 Agent 的输出作为链中下一个 Agent 的输入。

关键点

  • 提示链将复杂任务分解为一系列更小、更聚焦的步骤。这有时也被称为 Pipeline 模式。
  • 链中的每一步都涉及一次 LLM 调用或处理逻辑,并使用上一步的输出作为输入。
  • 这种模式提升了与语言模型进行复杂交互时的可靠性和可管理性。
  • 像 LangChain/LangGraph 和 Google ADK 这样的框架提供了强大的工具来定义、管理和执行这些多步骤序列。

总结

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

参考资料

  1. LangChain Documentation on LCEL: python.langchain.com/v0.2/docs/c...
  2. LangGraph Documentation: langchain-ai.github.io/langgraph/
  3. Prompt Engineering Guide - Chaining Prompts: www.promptingguide.ai/techniques/...
  4. OpenAI API Documentation (General Prompting Concepts):platform.openai.com/docs/guides...
  5. Crew AI Documentation (Tasks and Processes): docs.crewai.com/
  6. Google AI for Developers (Prompting Guides): cloud.google.com/discover/wh...
  7. Vertex Prompt Optimizer: cloud.google.com/vertex-ai/g...
相关推荐
杯莫停丶11 小时前
设计模式之:简单工厂模式
java·设计模式·简单工厂模式
kyle~11 小时前
设计模式---观察者模式
服务器·观察者模式·设计模式
Query*17 小时前
Java 设计模式——适配器模式进阶:原理深挖、框架应用与实战扩展
java·设计模式·适配器模式
Meteors.17 小时前
23种设计模式——中介者模式 (Mediator Pattern)详解
java·设计模式·中介者模式
Query*18 小时前
Java 设计模式——适配器模式:从原理到3种实战的完整指南
java·设计模式·适配器模式
Meteors.18 小时前
23种设计模式——状态模式(State Pattern)
java·设计模式·状态模式
星星点点洲21 小时前
PostgreSQL 15二进制文件
开发语言·设计模式·golang
让我上个超影吧1 天前
设计模式【工厂模式和策略模式】
java·设计模式·策略模式
Query*1 天前
Java 设计模式——建造者模式:从原理到实战的极简指南
java·设计模式·建造者模式
Tiny_React1 天前
智能体设计模式-CH05:工具使用(Tool Use)
设计模式