第1章:提示链

智能体设计模式:构建智能系统的实战指南 阅读 103 次

第1章:提示链

提示链模式概述

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

这种顺序处理技术本身将模块化和清晰度引入了与LLMs的交互中。通过分解复杂任务,每个单独步骤的理解和调试变得更加容易,从而使整个过程更加稳健和可解释。链中的每个步骤都可以精心设计和优化,以专注于更大问题的一个特定方面,从而产生更准确和专注的输出。

每一步的输出作为下一步的输入至关重要。这种信息的传递建立了一个依赖链,因此得名,其中先前操作的内容和结果指导后续处理。这允许LLM在其先前工作的基础上进行构建,细化其理解,并逐步接近期望的解决方案。

此外,提示链并不仅仅是将问题分解;它还使得外部知识和工具的整合成为可能。在每一步中,LLM都可以被指导与外部系统、API或数据库进行交互,从而丰富其知识并扩展其能力,超越了其内部训练数据。这种能力显著扩大了LLM的潜力,使它们不仅能够作为独立的模型运行,还能够成为更广泛、更智能系统的核心组成部分。

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

单一提示的限制: 对于多方面任务,使用一个复杂且单一的提示对LLM来说可能效率低下,可能导致模型在约束和指令面前挣扎,甚至可能发生以下情况:提示忽视(即忽略提示中的部分内容)、上下文漂移(即模型失去初始上下文的追踪)、错误传播(即早期错误被放大)、需要更长的上下文窗口的提示(即模型获取的信息不足以进行回应)以及幻觉(即认知负荷增加,增加了错误信息出现的可能性)。例如,一个要求分析市场研究报告、总结发现、用数据点识别趋势并撰写电子邮件的查询存在失败的风险,因为模型可能总结得很好,但可能无法正确提取数据或撰写电子邮件。

通过顺序分解提高可靠性: 提示链通过将复杂任务分解为专注的、顺序的工作流程来应对这些挑战,从而显著提高可靠性和控制性。以上述示例为例,可以将管道或链式方法描述如下:

  1. 初始提示(摘要):"总结以下市场研究报告的关键发现:[文本]"。该模型的唯一目标是进行摘要,从而提高这一初始步骤的准确性。
  2. 第二个提示(趋势识别):"根据摘要,确定前三大新兴趋势,并提取支持每个趋势的具体数据点:[步骤1的输出]"。这个提示现在更加受限,并且直接建立在验证过的输出之上。
  3. 第三提示(邮件撰写):“撰写一封简洁的邮件给营销团队,概述以下趋势及其支持数据:[第二步的输出结果]。”

这种分解使得对过程有更细致的控制。每个步骤都更简单、更明确,这降低了模型上的认知负荷,并导致最终输出更准确、更可靠。这种模块化类似于计算管道,其中每个函数在将结果传递给下一个函数之前执行特定的操作。为确保对每个特定任务都能给出准确的响应,模型可以在每个阶段分配一个不同的角色。例如,在给定场景中,初始提示可以指定为“市场分析师”,后续提示指定为“交易分析师”,第三个提示指定为“专家文档撰写者”,依此类推。

结构化输出的作用: 提示链的可靠性高度依赖于步骤间传递数据的完整性。如果一个提示的输出模糊不清或格式不佳,后续的提示可能会因为错误的输入而失败。为了减轻这一问题,指定结构化输出格式,如JSON或XML,至关重要。

例如,趋势识别步骤的输出可以格式化为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表格,通过分解的多步骤方法处理更为有效。

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

4. 内容生成工作流程: 复杂内容的创作是一个通常分解为不同阶段的程序性任务,包括初步构思、结构概述、起草和后续修订。

  • 提示1:根据用户的兴趣生成5个主题想法。 处理:允许用户选择一个想法或自动选择最佳方案。
  • 提示2:根据所选主题,生成一个详细的大纲。
  • 提示3:根据提纲中的第一点撰写一个草案部分。
  • 提示 4:根据提纲中的第二点撰写一个草案部分,提供前一个部分作为背景。依次对提纲中的所有要点进行操作。
  • 提示5:审查并完善完整草稿,确保其连贯性、语气和语法正确。

该方法适用于多种自然语言生成任务,包括自动创作创意叙事、技术文档以及其他形式的结构化文本内容。

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

  • 提示1:处理用户语句1,识别意图和关键实体。 处理:使用意图和实体更新对话状态。
  • 提示2:根据当前状态,生成响应或识别下一个所需的信息片段。 重复以上步骤,对于后续的回合,每个新的用户输入将启动一个利用累积的对话历史(状态)的链式反应。

这一原则对于对话智能体的开发至关重要,它使得智能体能够在长篇、多轮对话中保持上下文和连贯性。通过保留对话历史,系统可以理解并适当地响应依赖于先前交换信息的用户输入。

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

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

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

7. 多模态和多步骤推理: 分析具有多种模态的数据集需要将问题分解为更小的基于提示的任务。例如,解释包含嵌入文本的图片、突出显示特定文本段落的标签以及解释每个标签的表格数据的图像,就需要采取这种做法。

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

动手代码示例

实现提示链(prompt chaining)的范围从脚本中的直接、顺序函数调用,到使用专门框架来管理控制流、状态和组件集成。例如,LangChain、LangGraph、Crew AI以及谷歌智能体开发工具包(ADK)等框架,为构建和执行这些多步骤过程提供了结构化环境,这对于复杂架构尤其有利。

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

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

为了复制此过程,必须首先安装所需的库。这可以通过以下命令完成:

pip install langchain langchain-community langchain-openai langgraph

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

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)是在生成令牌之前,系统地设计、构建和交付完整信息环境给AI模型的学科。这种方法认为,模型输出的质量更多地取决于提供上下文的丰富性,而不是模型架构本身。

image1

图1:上下文工程是构建一个丰富、全面的情报环境以供AI使用的学科,因为该上下文的质量是实现高级智能体性能的关键因素。

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

因此,这种做法将任务的重构从仅仅回答问题转变为为智能体构建一个全面的操作图景。例如,一个经过上下文工程化的智能体不仅会响应查询,首先会整合用户的日程安排(工具输出)、与电子邮件收件人的专业关系(隐含数据)以及之前会议的笔记(检索到的文档)。这使得模型能够生成高度相关、个性化且具有实际应用价值的输出。其中的“工程”部分包括创建健壮的管道在运行时获取和转换这些数据,并建立反馈循环以持续提升上下文质量。

为了实现这一点,可以使用专门的调优系统来自动化大规模的改进过程。例如,像谷歌的Vertex AI提示优化器这样的工具可以通过系统地评估响应与一组样本输入和预定义的评估指标,来提升模型性能。这种方法对于适应不同模型中的提示和系统指令非常有效,而无需进行大量的手动重写。通过向这样的优化器提供样本提示、系统指令和模板,它可以程序化地细化上下文输入,为实施复杂上下文工程所需的反馈循环提供一种结构化方法。

这种结构化方法是将基础AI工具与更复杂、更具情境感知的系统区分开来的关键。它将情境本身视为一个主要组成部分,高度重视智能体知道什么、何时知道以及如何使用这些信息。这种做法确保模型对用户的意图、历史和当前环境有全面的理解。最终,情境工程是将无状态聊天机器人提升为高度能干、情境感知系统的关键方法。

概览

内容: 复杂任务往往在单一提示下使大型语言模型(LLM)感到力不从心,导致性能问题显著。模型上的认知负载增加了出现错误的可能性,例如忽略指令、失去上下文和生成错误信息。单一的提示难以有效管理多个约束和顺序推理步骤。这导致输出不可靠且不准确,因为LLM未能处理多方面请求的所有方面。

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

经验法则:当一项任务过于复杂,无法通过单个提示完成,涉及多个不同的处理阶段,需要在步骤之间与外部工具进行交互,或者构建需要执行多步推理并保持状态的智能体系统时,请使用此模式。

视觉摘要

image2

图2:提示链模式:智能体从用户那里接收一系列提示,每个智能体的输出作为下一个智能体链中的输入。

关键要点

以下是关键要点:

提示链将复杂任务分解为一系列更小、更专注的步骤。这有时也被称为管道模式。 链中的每一步都涉及一个LLM调用或处理逻辑,使用前一步的输出作为输入。 此模式提高了与语言模型进行复杂交互的可靠性和可管理性。 像LangChain/LangGraph这样的框架,以及Google ADK(应用程序开发工具包),提供了强大的工具来定义、管理和执行这些多步骤序列。

结论

通过将复杂问题分解为一系列更简单、更易管理的子任务,提示链提供了一种强大的框架来引导大型语言模型。这种“分而治之”的策略通过将模型集中在一次特定操作上,显著提高了输出的可靠性和控制性。作为一个基础模式,它使得开发能够进行多步推理、工具集成和状态管理的复杂智能体成为可能。最终,掌握提示链对于构建强大、具有情境感知能力的系统至关重要,这些系统能够执行远超单个提示能力的复杂工作流程。

参考文献

  1. LangChain关于LCEL的文档
  2. LangGraph 文档
  3. 提示工程指南 - 提示链式操作
  4. OpenAI API 文档(通用提示概念)
  5. CrewAI文档(任务与流程)
  6. Google AI for Developers(开发者AI)(提示指南)
  7. Vertex提示优化器