[智能体设计模式] 第 1 章:提示链(Prompt Chaining)

本系列内容知识来源于《智能体设计模式》一书,仅做知识分享。

目录

提示链模式概述

单一提示的局限性

通过顺序拆解提升可靠性

结构化输出的重要性

实践应用与场景

[1. 信息处理流程](#1. 信息处理流程)

[2. 复杂问答](#2. 复杂问答)

[3. 数据提取与转换](#3. 数据提取与转换)

[4. 内容生成流程](#4. 内容生成流程)

[5. 有状态对话智能体](#5. 有状态对话智能体)

[6. 代码生成与优化](#6. 代码生成与优化)

[7. 多模态与多步推理](#7. 多模态与多步推理)

实战代码示例

前置准备

完整代码

上下文工程与提示工程

核心定义

与传统提示工程的区别

上下文的核心组成

实际应用价值

优化工具

[补充 langchain的基本用法](#补充 langchain的基本用法)

[一、LangChain 核心概念(必懂 3 个)](#一、LangChain 核心概念(必懂 3 个))

[1. 模型(Models):大模型的 "接口包装"](#1. 模型(Models):大模型的 “接口包装”)

[2. 提示模板(Prompts):给大模型的 "标准化指令"](#2. 提示模板(Prompts):给大模型的 “标准化指令”)

[3. 链(Chains):步骤的 "串联器"](#3. 链(Chains):步骤的 “串联器”)

[4. 解析器(OutputParsers):模型输出的 "格式化工具"](#4. 解析器(OutputParsers):模型输出的 “格式化工具”)

[二、LangChain 基本使用流程(4 步走)](#二、LangChain 基本使用流程(4 步走))

[1. 安装依赖](#1. 安装依赖)

[2. 初始化核心组件](#2. 初始化核心组件)

[3. 构建链(Chain)](#3. 构建链(Chain))

[4. 运行链,获取结果](#4. 运行链,获取结果)

三、进阶:复杂链(多步骤串联)


提示链模式概述

提示链模式,是在使用大型语言模型时主张采用分而治之策略,将原本棘手的问题拆解为一系列更小、更易管理的子问题。每个子问题通过专门设计的提示单独处理,并将前一步的输出作为下一步的输入,形成链式依赖。

此外,提示链不仅仅是拆解问题,还能集成外部知识和工具。每一步都可以指示 LLM 与外部系统、API 或数据库交互,扩展其知识和能力。这极大提升了 LLM 的潜力,使其不仅是孤立模型,更是智能系统的核心组件。

单一提示的局限性

对于多层次任务,单一复杂提示往往效率低下,模型容易出现以下问题:

  • 忽略部分指令
  • 丢失上下文
  • 错误累积
  • 上下文窗口不足
  • 出现幻觉

示例:要求分析市场调研报告、总结发现、提取数据点并撰写邮件,模型可能只完成部分任务,遗漏关键环节。

通过顺序拆解提升可靠性

提示链通过将复杂任务拆解为聚焦的顺序流程,显著提升可靠性和可控性。以上述市场报告处理为例,链式流程如下:

  1. 初始提示(摘要)
    "请总结以下市场调研报告的主要发现:[文本]"
    模型专注于摘要,准确性更高。
  2. 第二步(趋势识别)
    "根据摘要,识别三大新兴趋势并提取支持数据点:[第 1 步输出]"
    提示更聚焦,建立在已验证结果之上。
  3. 第三步(邮件撰写)
    "请为市场团队撰写一封简明邮件,概述上述趋势及数据支持:[第 2 步输出]"

为确保每步任务准确,可为模型分配不同角色,如"市场分析师""贸易分析师""文档专家"等。

结构化输出的重要性

提示链的可靠性高度依赖于各步骤间数据的完整性。若某步输出模糊或格式不规范,后续提示可能因输入错误而失败。为此,建议指定结构化输出格式(如 JSON 或 XML)。

JSON 示例

复制代码
{
  "trends": [
    {
      "trend_name": "AI 驱动个性化",
      "supporting_data": "73% 消费者更愿意与使用个人信息提升购物体验的品牌合作。"
    },
    {
      "trend_name": "可持续与口碑",
      "supporting_data": "带 ESG 标签产品销量五年增长 28%,无 ESG 标签产品增长 20%。"
    }
  ]
}

实践应用与场景

提示链是一种通用模式,核心价值在于将复杂问题拆解为顺序、可管理的步骤。常见应用包括以下 7 类场景:

1. 信息处理流程

许多任务需对原始信息多次转换(如文档摘要、实体提取、数据库查询、报告生成)。
提示链流程

  • 提示 1:从指定 URL 或文档提取文本内容。
  • 提示 2:摘要清洗后的文本。
  • 提示 3:从摘要或原文中提取实体(如姓名、日期、地点)。
  • 提示 4:用实体查询内部知识库。
  • 提示 5:生成包含摘要、实体和查询结果的最终报告。

适用领域:自动化内容分析、AI 助理开发、复杂报告生成等。

2. 复杂问答

回答需多步推理或信息检索的问题(如"1929 年股市崩盘的主要原因及政府政策应对?")。
提示链流程

  • 提示 1:识别用户问题的核心子问题(崩盘原因、政府应对)。
  • 提示 2:检索 1929 崩盘原因相关信息。
  • 提示 3:检索政府政策应对相关信息。
  • 提示 4:综合第 2、3 步信息,形成完整答案。

核心价值:多步推理与信息整合型 AI 系统的基础。

3. 数据提取与转换

将非结构化文本转为结构化格式,需多步迭代修正以提升准确性和完整性。
提示链流程

  • 提示 1:尝试从发票文档中提取指定字段(如姓名、地址、金额)。
  • 处理:检查字段是否齐全且格式正确。
  • 提示 2(条件):若字段缺失或格式错误,重新提示模型查找缺失/错误信息,并提供失败上下文。
  • 处理:再次验证结果,必要时重复。
  • 输出:提取并验证的结构化数据。

4. 内容生成流程

复杂内容创作分为主题构思、结构大纲、分段撰写、修订优化等阶段。
提示链流程

  • 提示 1:根据用户兴趣生成 5 个主题创意。
  • 处理:用户选择或自动选定一个主题。
  • 提示 2:基于选定主题生成详细大纲。
  • 提示 3:根据大纲第一点撰写草稿。
  • 提示 4:根据第二点撰写草稿,并提供前一段上下文,依次完成所有大纲点。
  • 提示 5:整体审阅并优化草稿的连贯性、语气和语法。

适用场景:自动化创意写作、技术文档等结构化文本生成。

5. 有状态对话智能体

为对话连续性提供基础机制,每轮对话整合前序信息或实体,维护上下文。
提示链流程

  • 提示 1:处理用户第 1 轮发言,识别意图和实体。
  • 处理:更新对话状态。
  • 提示 2:基于当前状态生成回复或识别下一步所需信息。
  • 后续轮次:重复上述流程,利用累积的对话历史(状态)。

核心价值:对话智能体开发的基础,支持跨多轮对话保持上下文连贯性。

6. 代码生成与优化

功能代码生成需拆解为逻辑操作,逐步执行。
提示链流程

  • 提示 1:理解用户代码需求,生成伪代码或大纲。
  • 提示 2:根据大纲撰写初稿代码。
  • 提示 3:识别代码潜在错误或改进点(可用静态分析工具或再次调用 LLM)。
  • 提示 4:根据问题重写或优化代码。
  • 提示 5:补充文档或测试用例。

7. 多模态与多步推理

处理多模态数据集(如含文本、标签、表格的图片),需拆解为多个提示任务。
提示链流程

  • 提示 1:从图片请求中提取并理解文本。
  • 提示 2:将提取的文本与标签关联。
  • 提示 3:结合表格信息解释并输出所需结果。

实战代码示例

提示链实现方式包括脚本中的顺序函数调用,或使用专门框架(如 LangChain、LangGraph)管理流程、状态和组件集成。以下示例聚焦基础线性序列,实现"非结构化文本提取 → 结构化 JSON 转换"的两步提示链。

前置准备

  1. 安装所需库:

    pip install langchain langchain-community langchain-openai langgraph

如需更换模型供应商,可替换 langchain-openai(如 langchain-anthropic 等)。

  1. 配置 API 密钥:
  • 推荐使用 .env 文件加载(需安装 python-dotenv);
  • 或直接在代码中传入 api_key 参数。

完整代码

复制代码
import os
import json  # 用于 JSON 格式化输出(可选)
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser

# (可选)使用 .env 文件加载环境变量
# from dotenv import load_dotenv
# load_dotenv()  # 确保 .env 文件中有 OPENAI_API_KEY=your_key

# 初始化语言模型(ChatOpenAI)
llm = ChatOpenAI(
    temperature=0,  # 温度为 0,输出更确定
    model="gpt-3.5-turbo"  # 明确指定模型(可选,默认有 fallback)
    # api_key="your_openai_key"  # 未使用 .env 时手动传入
)

# ---------------------- 提示模板定义 ----------------------
# 提示 1:技术规格提取(CPU、内存、存储)
prompt_extract = ChatPromptTemplate.from_template(
    """请从以下文本中准确提取处理器(CPU)、内存(Memory)和存储(Storage)相关的技术规格,
只保留关键信息,不要额外描述:
{text_input}"""
)

# 提示 2:规格转 JSON 格式(严格遵循要求)
prompt_transform = ChatPromptTemplate.from_template(
    """请将以下技术规格严格按照要求转换为 JSON 格式:
1. 必须包含且仅包含三个键:cpu、memory、storage
2. 值为纯文本描述,不要额外修饰
3. 确保 JSON 格式正确可解析,不要有多余字符
技术规格:
{specifications}"""
)

# ---------------------- 链构建(LCEL 语法) ----------------------
# 提取链:文本输入 → 提取提示 → LLM → 字符串输出
extraction_chain = prompt_extract | llm | StrOutputParser()

# 全链:文本输入 → 提取规格 → 转换为 JSON → 字符串输出
full_chain = (
    {"specifications": extraction_chain}  # 提取链的输出作为 specifications 变量
    | prompt_transform
    | llm
    | StrOutputParser()
)

# ---------------------- 运行链并输出结果 ----------------------
if __name__ == "__main__":
    # 输入文本(非结构化技术描述)
    input_text = "新款笔记本配备 3.5GHz 八核处理器、16GB 内存和 1TB NVMe SSD。"
    
    # 执行链
    final_result = full_chain.invoke({"text_input": input_text})
    
    # 美化输出
    print("=== 输入文本 ===")
    print(input_text)
    print("\n=== 最终 JSON 结果 ===")
    try:
        # 格式化 JSON 输出(增强可读性)
        formatted_json = json.dumps(json.loads(final_result), ensure_ascii=False, indent=2)
        print(formatted_json)
    except:
        # 若 JSON 解析失败,输出原始结果
        print(final_result)

上下文工程与提示工程

核心定义

上下文工程(见图 1)是一种系统性方法,旨在于 AI 生成前为模型构建完整的信息环境。该方法认为,模型输出质量更多取决于所提供的丰富上下文,而非模型架构本身。

与传统提示工程的区别

|------|--------------|---------------------------|
| 维度 | 传统提示工程 | 上下文工程 |
| 优化范围 | 仅优化用户即时问题的表达 | 扩展至多层信息(系统提示、外部数据、隐性信息等) |
| 核心目标 | 让模型理解单个问题 | 为智能体构建完整操作视图 |
| 数据来源 | 仅用户输入 | 系统提示、外部工具、检索文档、历史交互、用户身份等 |

上下文的核心组成

  1. 系统提示:定义模型角色与行为(如"你是技术写手,语气需正式且精确");
  2. 外部数据:检索文档(知识库)、工具输出(API 查询结果、日程数据等);
  3. 隐性数据:用户身份、历史交互记录、环境状态等;
  4. 用户输入:原始问题或需求。

实际应用价值

经过上下文工程的智能体,在回复前会整合多源信息(如用户日程、邮件收件人关系、会议记录),生成高度相关、个性化、实用的输出。

优化工具

实际应用中,可使用专门调优系统自动提升上下文质量(无需手动重写提示),例如:

  • Google Vertex AI 提示优化器
  • 核心逻辑:提供样例输入、系统指令和模板,通过评估指标系统性优化模型响应,实现闭环反馈。

补充 langchain的基本用法

LangChain 是一个 大模型应用开发框架 ,核心目标是让开发者快速拼接「大模型 + 外部工具 / 数据」,构建复杂的 AI 应用(比如问答机器人、数据处理链、智能代理等)。它的核心思想是 "模块化""链(Chain)"------ 把大模型的调用、数据处理、工具交互等步骤拆成独立组件,再像搭积木一样串起来。

下面用最通俗的方式介绍其 核心概念基本使用流程,结合你之前的代码案例理解:

一、LangChain 核心概念(必懂 3 个)

1. 模型(Models):大模型的 "接口包装"

LangChain 封装了主流大模型的调用(OpenAI、Anthropic、本地化模型等),统一了调用接口,不用关心不同厂商的 API 差异。

常用类型:

  • ChatOpenAI:对话类模型(如 GPT-3.5/4)
  • OpenAI:文本补全类模
  • 其他:ChatAnthropic(Claude)、LlamaCpp(本地化 Llama 模型)
  • 核心作用:接收指令(Prompt),返回模型输出。
2. 提示模板(Prompts):给大模型的 "标准化指令"

把需要传给大模型的指令、变量(比如用户输入、外部数据)封装成模板,避免重复写固定文本,让指令更规范。

  • 常用类:ChatPromptTemplate(对话式提示)、PromptTemplate(普通文本提示)

  • 核心作用:将 "固定指令 + 动态变量" 拼接成完整的 Prompt,传给模型。

3. 链(Chains):步骤的 "串联器"

单独用模型只能做 "一次输入 → 一次输出",Chain 能把多个组件(提示模板、模型、解析器、工具)串起来,实现 "多步流程自动化"。

  • 核心思想:前一个组件的输出,作为后一个组件的输入(比如你之前的 "提取规格 → 转 JSON")
  • 实现方式:用 | 符号(LCEL 语法)拼接组件,简洁直观。
4. 解析器(OutputParsers):模型输出的 "格式化工具"

大模型返回的是原始文本 / 消息对象,解析器能把它转换成你需要的格式(字符串、JSON、列表等)。

  • 常用:StrOutputParser(转字符串)、JsonOutputParser(转 JSON)

二、LangChain 基本使用流程(4 步走)

不管是简单的数据处理,还是复杂的智能代理,核心流程都离不开这 4 步:

1. 安装依赖

首先安装 LangChain 和对应模型的依赖(以 OpenAI 为例):

复制代码
pip install langchain langchain-openai  # langchain核心 + OpenAI适配
2. 初始化核心组件
  • 模型(Models):配置大模型(API Key、参数)

  • 提示模板(Prompts):定义标准化指令

  • 解析器(OutputParsers):指定输出格式

    from langchain_openai import ChatOpenAI
    from langchain_core.prompts import ChatPromptTemplate
    from langchain_core.output_parsers import StrOutputParser

    1. 初始化模型(配置API Key、温度等参数)

    llm = ChatOpenAI(
    api_key="你的OpenAI密钥", # 也可以通过.env文件加载
    temperature=0, # 0=输出确定,1=输出随机
    model="gpt-3.5-turbo"
    )

    2. 定义提示模板(包含动态变量{user_input})

    prompt = ChatPromptTemplate.from_template(
    "请总结以下文本的核心内容,不超过50字:\n{user_input}"
    )

    3. 初始化解析器(把模型输出转成字符串)

    parser = StrOutputParser()

3. 构建链(Chain)

| 把组件串起来,形成 "输入 → 处理 → 输出" 的流程:

复制代码
# 简单链:提示模板 → 模型 → 解析器
summary_chain = prompt | llm | parser
4. 运行链,获取结果

invoke() 传入输入数据,执行整个流程:

复制代码
# 输入文本
user_input = "LangChain 是一个大模型应用开发框架,支持模块化拼接组件,能快速构建复杂AI应用,比如问答机器人、数据处理工具等。"

# 执行链
result = summary_chain.invoke({"user_input": user_input})

# 输出结果
print("总结结果:", result)

三、进阶:复杂链(多步骤串联)

像你之前的代码那样,实现 "多步流程"(提取 → 转换),核心是用 "键值对" 传递中间结果

复制代码
# 第一步:提取技术规格(组件1)
extract_prompt = ChatPromptTemplate.from_template("提取文本中的CPU、内存、存储信息:{text}")
extract_chain = extract_prompt | llm | parser

# 第二步:转换为JSON(组件2)
json_prompt = ChatPromptTemplate.from_template("把以下规格转JSON(含cpu、memory、storage键):{spec}")
json_chain = json_prompt | llm | parser

# 串联成全链:用{"spec": extract_chain}传递中间结果
full_chain = {"spec": extract_chain} | json_chain

# 运行
input_text = "新款笔记本配备 3.5GHz 八核处理器、16GB 内存和 1TB NVMe SSD。"
result = full_chain.invoke({"text": input_text})
print(result)  # 输出JSON格式结果
相关推荐
cxr8281 小时前
深度解析顶级 Doc Agent System Prompt 的架构与实践
网络·人工智能·架构·prompt·ai智能体·ai赋能·上下文工程
TGITCIC1 小时前
User Prompt 与 System Prompt:大模型沟通的“双引擎”机制深度拆解
人工智能·大模型·prompt·提示词·ai大模型·大模型ai·上下文工程
昨天的猫3 小时前
《拒绝重复代码!模板模式教你优雅复用算法骨架》
后端·设计模式
L.EscaRC3 小时前
ArkTS分布式设计模式浅析
分布式·设计模式·arkts
Arva .4 小时前
责任链设计模式->规则树
设计模式
WKP94184 小时前
命令设计模式
设计模式
lapiii3588 小时前
[智能体设计模式] 第4章:反思(Reflection)
人工智能·python·设计模式
人工干智能17 小时前
科普:LLM领域中的“样本(sample)”、“指令(instruction)”和“提示词(prompt)”
llm·prompt
hongjianMa17 小时前
【论文阅读】Hypercomplex Prompt-aware Multimodal Recommendation
论文阅读·python·深度学习·机器学习·prompt·推荐系统