本系列内容知识来源于《智能体设计模式》一书,仅做知识分享。
目录
[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 步输出]"
为确保每步任务准确,可为模型分配不同角色,如"市场分析师""贸易分析师""文档专家"等。
结构化输出的重要性
提示链的可靠性高度依赖于各步骤间数据的完整性。若某步输出模糊或格式不规范,后续提示可能因输入错误而失败。为此,建议指定结构化输出格式(如 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 转换"的两步提示链。
前置准备
-
安装所需库:
pip install langchain langchain-community langchain-openai langgraph
如需更换模型供应商,可替换 langchain-openai(如 langchain-anthropic 等)。
- 配置 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 生成前为模型构建完整的信息环境。该方法认为,模型输出质量更多取决于所提供的丰富上下文,而非模型架构本身。
与传统提示工程的区别
|------|--------------|---------------------------|
| 维度 | 传统提示工程 | 上下文工程 |
| 优化范围 | 仅优化用户即时问题的表达 | 扩展至多层信息(系统提示、外部数据、隐性信息等) |
| 核心目标 | 让模型理解单个问题 | 为智能体构建完整操作视图 |
| 数据来源 | 仅用户输入 | 系统提示、外部工具、检索文档、历史交互、用户身份等 |
上下文的核心组成
- 系统提示:定义模型角色与行为(如"你是技术写手,语气需正式且精确");
- 外部数据:检索文档(知识库)、工具输出(API 查询结果、日程数据等);
- 隐性数据:用户身份、历史交互记录、环境状态等;
- 用户输入:原始问题或需求。
实际应用价值
经过上下文工程的智能体,在回复前会整合多源信息(如用户日程、邮件收件人关系、会议记录),生成高度相关、个性化、实用的输出。
优化工具
实际应用中,可使用专门调优系统自动提升上下文质量(无需手动重写提示),例如:
- 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 StrOutputParser1. 初始化模型(配置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格式结果