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

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

目录

提示链模式概述

单一提示的局限性

通过顺序拆解提升可靠性

结构化输出的重要性

实践应用与场景

1. 信息处理流程

2. 复杂问答

3. 数据提取与转换

4. 内容生成流程

5. 有状态对话智能体

6. 代码生成与优化

7. 多模态与多步推理

实战代码示例

前置准备

完整代码

上下文工程与提示工程

核心定义

与传统提示工程的区别

上下文的核心组成

实际应用价值

优化工具

补充 langchain的基本用法

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

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

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

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

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

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

1. 安装依赖

2. 初始化核心组件

3. 构建链(Chain)

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格式结果


 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值