Agentic AI提示工程实战:解锁多任务处理能力的7大核心技术与实践指南
摘要/引言:为什么传统AI在复杂任务中总是“掉链子”?
“请帮我写一份市场调研报告,需要分析3个竞品的优劣势,整理近半年行业数据,最后生成10页PPT。”
当你向AI助手抛出这样的需求时,是否遇到过:它要么只写了报告却忘了做PPT,要么数据整理混乱,甚至把竞品名字都搞错了?这不是AI不够聪明,而是传统提示工程缺乏对“多任务处理逻辑”的系统性设计——而这正是Agentic AI(智能体AI)要解决的核心问题。
从“被动执行”到“主动规划”:Agentic AI的革命性突破
传统AI(如ChatGPT基础对话模式)本质是“输入-输出”的被动响应系统,像个“听话的实习生”,你说一步它做一步,遇到复杂任务就会陷入“上下文过载”或“目标迷失”。而Agentic AI则是“有目标、能规划、会调用工具、可自我修正”的智能体,像个“自主工作的项目经理”:它能理解复杂目标,拆解成子任务,规划执行步骤,调用计算器/爬虫等工具,甚至在出错时自我修复。
提示工程正是激活Agentic AI多任务能力的“神经中枢”。没有精心设计的提示,即使最先进的Agent模型(如GPT-4o、Claude 3 Opus)也会变成“无头苍蝇”。
本文将带你掌握什么?
如果你是AI应用开发者、产品经理或技术决策者,本文将系统拆解Agentic AI多任务处理的7大核心提示工程技术,包括:
- 如何让AI像“项目经理”一样拆解任务?(任务解构与规划技术)
- 如何避免AI“忘事”?(动态上下文管理技术)
- 如何让AI正确调用工具解决问题?(工具集成与调用编排技术)
- 如何让AI从错误中学习?(反馈驱动迭代优化技术)
每个技术都包含底层原理、提示模板、实战案例和代码示例,帮你从零构建能处理复杂多任务的Agentic AI系统。
一、Agentic AI多任务处理基础:为什么提示工程是“灵魂”?
在深入核心技术前,我们先明确两个关键问题:什么是Agentic AI的多任务处理能力? 以及为什么提示工程是决定其性能的关键?
1.1 Agentic AI多任务处理的3个核心特征
与传统AI相比,Agentic AI的多任务处理能力体现在:
(1)目标导向性(Goal-Oriented)
传统AI:“用户让我做什么,我就做什么”(如“写一篇文章”)。
Agentic AI:“用户的最终目标是什么?为了实现目标,我需要完成哪些子任务?”(如“用户要‘写文章’,可能需要先‘确定主题’→‘收集资料’→‘撰写大纲’→‘初稿’→‘修改’”)。
(2)环境交互性(Environment Interaction)
传统AI:依赖用户提供所有信息。
Agentic AI:可主动调用外部工具(API、数据库、爬虫、计算器等)获取信息或执行操作,如“为了整理行业数据,我需要调用爬虫工具爬取竞品官网”。
(3)持续迭代性(Iterative Improvement)
传统AI:单次输出后结束。
Agentic AI:可接收中间结果反馈,修正错误并优化下一步行动,如“用户说数据有误,我需要重新检查数据源并修正图表”。
1.2 提示工程:Agentic AI的“操作系统”
如果把Agentic AI比作“自动驾驶汽车”,那么:
- 大语言模型(LLM)是“发动机”,提供基础算力;
- 外部工具(API、数据库等)是“传感器和执行器”,提供环境交互能力;
- 提示工程则是“操作系统”,负责协调“发动机”和“传感器”,确保汽车按目标行驶(多任务处理)。
没有好的“操作系统”(提示工程),即使“发动机”再强(如GPT-4o),也会出现“闯红灯”(任务遗漏)、“迷路”(目标偏离)或“爆胎”(工具调用错误)。
1.3 多任务处理的4大核心挑战(及提示工程如何解决)
挑战 | 传统AI的痛点 | 提示工程解决方案 |
---|---|---|
任务复杂性 | 无法拆解复杂任务,输出混乱 | 任务解构提示:引导AI按“目标→子任务→步骤”拆解 |
上下文有限 | 长对话中忘记前文信息 | 上下文压缩提示:提取关键信息,动态更新上下文 |
工具调用错误 | 不知道何时/如何调用工具 | 工具选择提示:定义工具能力与调用条件 |
动态优先级 | 多任务冲突时无法排序 | 优先级规则提示:明确排序标准(紧急性/依赖性) |
先决条件:阅读本文前,建议你已掌握基础提示工程概念(如角色提示、少样本提示),并熟悉至少一种LLM API(如OpenAI API)的调用方法。
二、核心技术一:任务解构与规划技术——让AI像项目经理一样拆解目标
2.1 为什么任务解构是多任务处理的“第一块拼图”?
想象你让实习生组织一场“技术沙龙”,如果只说“你去办一下”,他可能只订了会议室却忘了邀请嘉宾;但如果你说“先列清单:1. 确定主题;2. 邀请讲师;3. 预订场地;4. 宣传报名”,他就能有条不紊地执行。
Agentic AI处理多任务时,任务解构就是“列清单”的过程——将复杂目标拆解为“可执行、可验证、有依赖关系”的子任务。没有这一步,AI会陷入“要么漏做,要么重复做”的困境。
2.2 任务解构的底层逻辑:MECE原则与层次化分解
优秀的任务解构需满足MECE原则(Mutually Exclusive, Collectively Exhaustive,即“相互独立,完全穷尽”),并通过层次化分解形成“目标→主任务→子任务→步骤”的树状结构。
例如,目标“生成一份竞品分析报告”的解构过程:
目标:生成竞品分析报告
├─ 主任务1:确定分析对象
│ ├─ 子任务1.1:列出行业Top 5竞品
│ └─ 子任务1.2:筛选3个核心竞品(按市场份额>10%)
├─ 主任务2:收集竞品数据
│ ├─ 子任务2.1:爬取官网产品功能
│ ├─ 子任务2.2:获取近半年用户评价(调用评论API)
│ └─ 子任务2.3:整理财务数据(调用财报数据库)
└─ 主任务3:生成报告
├─ 子任务3.1:撰写功能对比表
├─ 子任务3.2:分析优劣势(SWOT模型)
└─ 子任务3.3:输出PDF报告(调用文档生成工具)
2.3 提示工程实战:3种任务解构提示模板
模板1:目标-子任务分解提示(基础版)
核心逻辑:明确目标,要求AI按“动词+对象+标准”格式拆解子任务。
【角色】你是一位资深项目管理专家,擅长拆解复杂任务。
【目标】帮我拆解目标:“[用户原始目标]”
【要求】
1. 输出格式:
├─ 主任务1:[主任务名称]
│ ├─ 子任务1.1:[动词+对象+完成标准]
│ └─ 子任务1.2:[动词+对象+完成标准]
...(以此类推)
2. 子任务需满足:
- 相互独立(无重叠)
- 完全穷尽(覆盖目标所有方面)
- 可执行(每个子任务有明确的“做什么”和“做到什么程度”)
【示例】
若目标是“策划生日派对”,拆解示例:
├─ 主任务1:确定派对基本信息
│ ├─ 子任务1.1:确认日期(用户可参与的周末,如2024-06-15)
│ └─ 子任务1.2:统计人数(至少10位朋友,通过微信问卷收集)
...
【开始】目标:“生成一份竞品分析报告”
效果:AI会输出结构化的子任务列表,避免遗漏关键环节。
模板2:依赖关系标注提示(进阶版)
核心逻辑:在分解子任务时,标注任务间的依赖关系(如“子任务A必须在子任务B之后执行”)。
【额外要求】在子任务后用“(依赖:[前置任务ID])”标注依赖关系。
例如:
├─ 子任务2.1:爬取官网产品功能(依赖:1.2 确定核心竞品)
└─ 子任务3.1:撰写功能对比表(依赖:2.1 爬取功能数据)
为什么重要:多任务处理中,错误的执行顺序会导致返工(如没确定竞品就开始爬数据)。依赖标注能让AI按正确顺序执行。
模板3:资源约束提示(高级版)
核心逻辑:加入时间/工具/预算等资源约束,让子任务更贴合实际可行性。
【资源约束】
- 时间:总任务需在48小时内完成
- 工具:仅可使用公司内部数据库(无法访问外部爬虫)
- 预算:数据获取成本不超过100元
【要求】子任务需考虑上述约束,例如:
├─ 子任务2.2:获取用户评价(改为“调用公司内部用户反馈系统API”,而非外部爬虫)
2.4 代码实战:用LangChain实现任务解构Agent
下面用Python+LangChain框架,结合OpenAI API实现一个“任务解构Agent”,输入复杂目标后自动输出结构化子任务列表。
步骤1:安装依赖
pip install langchain openai python-dotenv
步骤2:定义提示模板与Agent
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain
from dotenv import load_dotenv
import os
load_dotenv() # 加载环境变量(含OPENAI_API_KEY)
# 定义任务解构提示模板
task_decomposition_template = """
【角色】你是一位资深项目管理专家,擅长拆解复杂任务。
【目标】帮我拆解目标:"{user_goal}"
【资源约束】{resource_constraints}
【要求】
1. 输出格式:
├─ 主任务1:[主任务名称]
│ ├─ 子任务1.1:[动词+对象+完成标准](依赖:[前置任务ID,若无则写无])
│ └─ 子任务1.2:[动词+对象+完成标准](依赖:[前置任务ID,若无则写无])
...
2. 子任务需满足MECE原则,且考虑资源约束。
【开始】
"""
# 创建提示模板对象
prompt = PromptTemplate(
input_variables=["user_goal", "resource_constraints"],
template=task_decomposition_template
)
# 创建LLM链
llm = OpenAI(model_name="gpt-4o", temperature=0.3) # 低temperature确保输出稳定
decomposition_chain = LLMChain(llm=llm, prompt=prompt)
# 输入目标与资源约束,执行拆解
user_goal = "生成一份竞品分析报告"
resource_constraints = "时间:48小时;工具:仅公司内部数据库;预算:100元"
result = decomposition_chain.run(user_goal=user_goal, resource_constraints=resource_constraints)
print("任务拆解结果:\n", result)
输出示例
任务拆解结果:
├─ 主任务1:确定分析对象
│ ├─ 子任务1.1:列出行业Top 5竞品(标准:按2024年Q1市场份额排序)(依赖:无)
│ └─ 子任务1.2:筛选3个核心竞品(标准:市场份额>10%且与本公司业务重叠度高)(依赖:1.1)
├─ 主任务2:收集竞品数据
│ ├─ 子任务2.1:获取产品功能信息(调用公司内部产品数据库API)(依赖:1.2)
│ ├─ 子任务2.2:提取用户评价(调用公司内部用户反馈系统,筛选近3个月数据)(依赖:1.2)
│ └─ 子任务2.3:整理财务数据(调用公司内部行业报告库,预算控制在50元内)(依赖:1.2)
└─ 主任务3:生成分析报告
├─ 子任务3.1:撰写功能对比表(基于2.1数据,包含核心功能评分)(依赖:2.1)
├─ 子任务3.2:分析优劣势(用SWOT模型,结合2.2用户评价)(依赖:2.1, 2.2)
└─ 子任务3.3:输出PDF报告(调用公司内部文档生成工具)(依赖:3.1, 3.2)
2.5 常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
子任务过于笼统 | 提示中“完成标准”不明确 | 加入具体标准,如“子任务需包含可量化指标(如‘收集100条用户评价’而非‘收集用户评价’)” |
依赖关系混乱 | 未强调“前置任务必须先完成” | 在提示中加入示例:“例如‘撰写报告’必须依赖‘收集数据’完成,需标注‘依赖:2.3’” |
忽略资源约束 | 约束描述模糊 | 用“时间:XX小时;工具:仅限XX;预算:XX元”等量化表述 |
小结:任务解构与规划技术是Agentic AI多任务处理的“蓝图设计”,通过MECE原则+依赖标注+资源约束的提示模板,让AI从“盲目执行”变为“目标清晰的规划者”。
三、核心技术二:动态上下文管理技术——如何让AI“记住关键信息”而不“遗忘”?
想象你和AI合作完成一个跨周的项目:周一讨论了任务计划,周三提供了部分数据,周五需要它根据前两周信息生成最终报告。此时,传统AI会因“上下文窗口限制”(如GPT-4o上下文上限为128k tokens,但实际对话中容易超出)忘记周一的计划,导致报告偏离目标。
动态上下文管理技术正是解决这一问题的关键——通过提示工程引导AI“主动筛选、压缩、更新上下文”,像“高效整理桌面的秘书”,只保留关键信息,避免无关内容占用内存。
3.1 上下文管理的3大核心挑战
Agentic AI处理多任务时,上下文管理面临的挑战远超传统对话:
- 长度爆炸:多任务涉及的子任务结果、工具返回、用户反馈可能超过LLM的上下文窗口(如10万字文档);
- 信息冗余:重复的指令、过时的中间结果会稀释关键信息;
- 动态更新:新任务加入或优先级变化时,需快速调整上下文内容。
3.2 动态上下文管理的“3层过滤模型”
优秀的上下文管理提示需实现“3层过滤”:
- 输入过滤:决定“哪些信息需要进入上下文”;
- 存储压缩:如何“精简信息占用的空间”;
- 检索更新:需要时如何“快速提取相关信息”。
3.3 提示工程实战:4种上下文管理提示策略
策略1:关键信息提取提示(输入过滤)
核心逻辑:引导AI从原始信息中提取“对目标有价值的关键信息”,过滤无关内容。
提示模板:
【角色】你是一位信息提炼专家,负责从文本中提取关键信息。
【目标】从以下内容中提取对“{当前任务目标}”有用的关键信息,忽略无关细节。
【关键信息标准】
- 直接影响任务执行的条件(如截止时间、资源限制)
- 必须保留的前置结论(如已确定的子任务列表、工具调用结果)
- 用户明确强调的要求(如“报告需包含数据图表”)
【原始内容】{raw_information}
【输出格式】以“关键词:值”列表输出,例如:
- 截止时间:2024-06-30
- 已完成子任务:确定竞品(A公司、B公司)
- 用户要求:需包含市场份额对比图表
【开始提炼】
示例:当原始内容是“用户说‘报告要在下周五(6月30日)前交,记得包含A和B公司的市场份额对比图表,对了我昨天发的C公司数据可能不准,别用了’”,AI会提取:
- 截止时间:2024-06-30
- 需包含:A公司、B公司市场份额对比图表
- 排除数据:C公司数据(用户反馈不准)
策略2:层次化摘要提示(存储压缩)
核心逻辑:对长文本(如子任务结果、工具返回数据)进行“多层级摘要”,从“全文→章节摘要→关键句”逐步压缩。
提示模板:
【角色】你是一位文本压缩专家,需将长文本压缩为层次化摘要。
【原始文本】{long_text}(如工具返回的1000行数据)
【压缩要求】
1. 第一层:整体摘要(100字内,说明文本核心内容)
2. 第二层:分点摘要(3-5点,每点50字内,说明关键子主题)
3. 第三层:关键数据提取(如数值、日期、名称等不可省略的信息)
【输出格式】
整体摘要:[第一层内容]
分点摘要:
- [分点1]
- [分点2]
关键数据:
- [数据1:值]
- [数据2:值]
【开始压缩】
效果:1000行数据可压缩为200字左右的结构化摘要,大幅节省上下文空间。
策略3:上下文检索提示(检索更新)
核心逻辑:当需要特定信息时,引导AI从历史上下文中“主动检索”相关内容,而非重新生成。
提示模板:
【角色】你是一位信息检索专家,需从历史上下文中找到与“{当前查询}”相关的信息。
【历史上下文】{history_context}(已压缩的摘要)
【检索要求】
1. 若找到相关信息,输出:“找到相关信息:[内容](来源:[子任务X结果])”
2. 若未找到,输出:“未找到相关信息,需执行新子任务:[建议子任务,如‘重新收集XX数据’]”
【当前查询】“A公司的市场份额是多少?”
【开始检索】
示例:历史上下文包含“关键数据:- A公司市场份额:25%(来源:子任务2.3)”,AI会输出:“找到相关信息:A公司市场份额:25%(来源:子任务2.3)”。
策略4:上下文优先级排序提示(动态更新)
核心逻辑:当新信息加入时,引导AI按“与当前任务的相关性”排序上下文,优先级低的信息可被“暂时遗忘”。
提示模板:
【角色】你是上下文管理器,需对以下信息按优先级排序。
【当前任务】{current_task}
【待排序信息列表】
1. [信息A:如“周一的任务计划”]
2. [信息B:如“周三的用户反馈”]
3. [信息C:如“周五的新数据”]
【优先级规则】
- 高优先级:直接影响当前任务执行的信息(如最新数据、用户反馈)
- 中优先级:历史任务计划、已完成子任务结果
- 低优先级:过时信息、无关闲聊
【输出格式】
优先级排序:
1. [信息C](优先级:高,理由:[理由])
2. [信息B](优先级:中,理由:[理由])
3. [信息A](优先级:低,理由:[理由])
可暂时移除的低优先级信息:[信息A]
【开始排序】
3.3 代码实战:动态上下文管理Agent
下面用LangChain的ConversationBufferWindowMemory
结合自定义提示,实现“动态压缩+检索”的上下文管理。
步骤1:定义上下文压缩函数
def compress_context(raw_text):
"""用LLM压缩长文本为层次化摘要"""
compress_prompt = PromptTemplate(
input_variables=["raw_text"],
template="""
【角色】你是文本压缩专家,请按以下要求压缩文本:
【原始文本】{raw_text}
【压缩要求】
1. 整体摘要(100字内)
2. 分点摘要(3-5点,每点50字内)
3. 关键数据(提取数值、日期等)
【输出格式】
整体摘要:...
分点摘要:
- ...
关键数据:
- ...
"""
)
compress_chain = LLMChain(llm=llm,prompt=compress_prompt)
return compress_chain.run(raw_text=raw_text)
步骤2:实现动态上下文管理
from langchain.memory import ConversationBufferWindowMemory
# 初始化带窗口的记忆(仅保留最近N轮压缩后的上下文)
memory = ConversationBufferWindowMemory(k=5) # k=5表示保留最近5条压缩信息
# 模拟多轮对话,动态压缩并添加上下文
def add_to_context(memory, new_information):
# 压缩新信息
compressed_info = compress_context(new_information)
# 添加到记忆
memory.save_context(
inputs={"user": "添加新信息"},
outputs={"assistant": compressed_info}
)
return memory
# 示例:添加1000字的竞品数据
raw_data = """A公司2024年Q1市场份额25%,同比增长5%;B公司市场份额18%,同比下降2%...(此处省略900字)"""
memory = add_to_context(memory, raw_data)
# 检索上下文
def retrieve_context(memory, query):
retrieve_prompt = PromptTemplate(
input_variables=["history_context", "query"],
template="""
【角色】信息检索专家,从历史上下文中找与"{query}"相关内容。
【历史上下文】{history_context}
【输出】找到相关信息:... 或 未找到...
"""
)
history_context = memory.load_memory_variables({})["history"]
retrieve_chain = LLMChain(llm=llm, prompt=retrieve_prompt)
return retrieve_chain.run(history_context=history_context, query=query)
# 查询“A公司市场份额”
result = retrieve_context(memory, "A公司市场份额是多少?")
print(result) # 输出:找到相关信息:A公司2024年Q1市场份额25%(关键数据)
3.4 常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
压缩后丢失关键信息 | 压缩提示中“关键数据”定义不明确 | 在提示中列出必须保留的数据类型:“关键数据需包含:市场份额(%)、同比增长率、公司名称” |
检索不到相关信息 | 历史上下文摘要过于简略 | 调整压缩策略,保留更多“可能有用”的关键词(如公司名称、数据指标) |
上下文窗口仍超限 | 未设置优先级排序,保留了低价值信息 | 加入优先级排序提示,自动移除“已完成且无关当前任务”的子任务结果 |
小结:动态上下文管理技术通过“提取-压缩-检索-排序”的提示策略,让AI在多任务处理中始终“聚焦关键信息”,避免因上下文过载导致的“失忆”问题。
四、核心技术三:工具集成与调用编排技术——让AI“正确使用工具”解决问题
4.1 为什么工具调用是Agentic AI的“超能力”?
Agentic AI与传统AI的核心区别之一是“能调用工具”:当需要计算复杂数值、爬取实时数据、生成图表或控制硬件时,AI可像人类使用计算器/浏览器一样调用外部工具(API、函数、应用程序)。
但工具调用的“坑”远比想象中多:
- 不知道用什么工具:让AI写PPT,它可能不知道有“PPT生成API”;
- 调用参数错误:调用天气API时,把“城市名”写成“经纬度”;
- 工具返回结果不会处理:拿到API返回的JSON数据,却不知道如何提取关键信息。
工具集成与调用编排技术正是通过提示工程解决这些问题,让AI从“知道工具”到“会用工具”,再到“用对工具”。
4.2 工具调用的“生命周期”与提示设计
一个完整的工具调用流程包含5个阶段,每个阶段都需要特定的提示策略:
阶段1:工具需求识别——“我需要工具吗?”
核心逻辑:引导AI判断当前任务是否需要工具,避免“手算复杂数学题”或“凭空捏造数据”。
提示模板:
【角色】工具需求分析师,判断当前任务是否需要调用工具。
【当前任务】{current_task}
【判断标准】
- 需要工具的情况:
1. 涉及实时数据(如“获取今天的天气”)
2. 需复杂计算(如“计算100个数的平均值”)
3. 需特定格式输出(如“生成Excel表格”)
4. 需访问外部系统(如“查询数据库”)
- 无需工具的情况:
1. 仅需文本创作(如“写一段总结”)
2. 基于现有上下文可回答(如“根据已有数据总结趋势”)
【输出】
- 需要工具:是/否
- 理由:[具体说明]
- 建议工具类型:[如“计算器”/“天气API”/“数据库查询工具”](若需要)
【开始判断】
示例:当前任务是“计算A公司和B公司的市场份额总和”,AI会输出:“需要工具:是;理由:需复杂计算;建议工具类型:计算器”。
阶段2:工具选择——“用哪个工具?”
核心逻辑:当存在多个工具时(如多个天气API),引导AI根据“功能匹配度”“调用成本”“可靠性”选择最优工具。
提示模板:
【角色】工具选择专家,从工具库中选择最适合当前任务的工具。
【当前任务】{current_task}
【工具库】
工具1:[名称],功能:[描述],成本:[XX元/次],可靠性:[高/中/低]
工具2:[名称],功能:[描述],成本:[XX元/次],可靠性:[高/中/低]
...
【选择标准】
1. 功能匹配度:工具是否能完成任务核心需求
2. 成本:优先选择低成本工具(若预算有限)
3. 可靠性:优先选择高可靠性工具(若结果重要)
【输出】
推荐工具:[工具名称]
理由:[匹配度+成本+可靠性分析]
【开始选择】
示例:工具库有“计算器API(成本0元/次,可靠性高)”和“自定义计算函数(成本0元/次,可靠性中)”,当前任务是“简单加法”,AI会选“计算器API”,理由:“功能完全匹配,成本相同,可靠性更高”。
阶段3:参数生成——“如何调用工具?”
核心逻辑:引导AI生成工具所需的正确参数(如API的输入格式、函数的参数名称和类型),避免因参数错误导致调用失败。
提示模板:
【角色】参数生成专家,为工具调用生成正确参数。
【目标工具】{tool_name}
【工具参数要求】
- 参数1:[名称],类型:[如string/int],描述:[必填/选填,格式要求]
- 参数2:[名称],类型:[如list/object],描述:[必填/选填,格式要求]
...
【当前任务】{current_task}
【输出格式】JSON格式,仅包含工具所需参数,例如:
{{"参数1": "值1", "参数2": "值2"}}
【开始生成参数】
示例:目标工具是“天气API”,参数要求“城市:string(必填,中文名称);日期:string(选填,格式YYYY-MM-DD)”,当前任务是“查询北京2024-06-20的天气”,AI会输出:{"城市": "北京", "日期": "2024-06-20"}
。
阶段4:调用执行——“执行调用并处理异常”
核心逻辑:引导AI执行工具调用,并处理可能的错误(如网络超时、参数错误、权限不足)。
提示模板:
【角色】工具调用执行者,执行工具调用并处理异常。
【工具名称】{tool_name}
【调用参数】{parameters}(JSON格式)
【执行步骤】
1. 按参数调用工具,获取返回结果。
2. 检查返回结果是否包含错误信息:
- 若成功:提取有用信息,进入“结果处理”阶段。
- 若失败:分析错误类型(参数错误/网络错误/权限错误),并生成修正方案(如“修正参数X为Y”/“重试调用”/“更换工具”)。
【输出】
调用状态:成功/失败
结果/错误信息:[工具返回结果或错误描述]
下一步行动:[提取信息/修正参数重试/更换工具]
【开始执行】
阶段5:结果处理与整合——“如何用工具结果完成任务?”
核心逻辑:引导AI解析工具返回的原始结果(如JSON、CSV),提取关键信息并整合到任务成果中。
提示模板:
【角色】结果处理专家,解析工具返回结果并整合到任务中。
【工具返回结果】{raw_result}(如JSON/文本)
【当前任务需求】{task_requirement}(如“生成包含天气数据的报告段落”)
【处理步骤】
1. 解析原始结果,提取与任务相关的关键信息(如数值、状态描述)。
2. 将关键信息转化为自然语言或所需格式(如表格、图表)。
3. 整合到任务成果中,确保逻辑连贯。
【输出】整合后的任务成果片段:[内容]
【开始处理】
示例:工具返回结果是{"天气": "晴", "温度": 28, "风力": "3级"}
,任务需求是“写一段天气播报”,AI会输出:“今天北京天气晴朗,气温28摄氏度,风力3级,适合户外活动。”
4.3 代码实战:工具调用Agent(以调用天气API为例)
下面用OpenAI的Function Calling功能结合提示模板,实现一个能调用天气API的Agent。
步骤1:定义工具(天气API)和函数描述
import requests
# 模拟天气API(实际项目中替换为真实API)
def get_weather(city: str, date: str) -> dict:
"""
获取指定城市和日期的天气信息。
参数:
city: 城市名称(中文,如“北京”)
date: 日期(格式YYYY-MM-DD,如“2024-06-20”,默认今天)
返回:
dict: 包含天气、温度、风力的字典
"""
# 模拟API返回
return {
"city": city,
"date": date,
"weather": "晴",
"temperature": 28,
"wind": "3级"
}
# 定义工具函数描述(遵循OpenAI Function Calling格式)
tools = [
{
"type": "function",
"function": {
"name": "get_weather",
"description": "获取指定城市和日期的天气信息",
"parameters": {
"type": "object",
"properties": {
"city": {
"type": "string",
"description": "城市名称(中文,如“北京”)"
},
"date": {
"type": "string",
"description": "日期(格式YYYY-MM-DD,如“2024-06-20”,默认今天)"
}
},
"required": ["city"] # city为必填参数,date可选
}
}
}
]
步骤2:实现工具调用流程
from openai import OpenAI
client = OpenAI()
def agent_with_tool(task: str):
# 阶段1:工具需求识别
need_tool_prompt = f"""
【角色】工具需求分析师,判断当前任务是否需要调用工具。
【当前任务】{task}
【判断标准】...(省略,见4.2阶段1模板)
【输出】需要工具:是/否;建议工具类型:...
"""
need_tool_response = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": need_tool_prompt}]
).choices[0].message.content
if "需要工具:是" not in need_tool_response:
return f"无需工具,直接完成任务:{task}"
# 阶段2-5:工具选择、参数生成、调用执行、结果处理(合并为Function Calling流程)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "user", "content": task},
{"role": "system", "content": "你有调用工具的能力,请根据任务需求调用合适的工具。"}
],
tools=tools,
tool_choice="auto" # 自动选择工具
)
# 处理工具调用结果
if response.choices[0].message.tool_calls:
tool_call = response.choices[0].message.tool_calls[0]
function_name = tool_call.function.name
function_args = eval(tool_call.function.arguments) # 解析参数
# 执行工具函数
if function_name == "get_weather":
weather_result = get_weather(**function_args)
# 阶段5:结果处理
process_prompt = f"""
【角色】结果处理专家,将天气数据整合成播报。
【工具返回结果】{weather_result}
【任务需求】{task}
【输出】天气播报文本
"""
final_result = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": process_prompt}]
).choices[0].message.content
return final_result
# 测试:调用Agent获取北京天气
result = agent_with_tool("查询北京2024-06-20的天气,并生成一段天气播报")
print(result)
输出示例
今天北京天气晴朗,气温28摄氏度,风力3级,适合户外活动。紫外线强度中等,请注意防晒。
4.4 常见问题与解决方案
问题 | 原因 | 解决方案 |
---|---|---|
不调用工具而尝试“捏造数据” | 工具需求识别提示中“需要工具的情况”描述不清晰 | 加入具体示例:“例如‘查询天气’必须调用天气API,不可虚构” |
参数格式错误(如日期格式不对) | 参数生成提示未强调格式要求 | 在参数模板中加入“格式示例”,如“日期格式必须为YYYY-MM-DD,例如‘2024-06-20’” |
工具返回错误未处理(如API超时) | 执行阶段未考虑异常情况 | 在提示中加入“异常处理示例”:“若返回‘超时’,则输出‘调用失败,建议重试’” |
小结:工具集成与调用编排技术通过“需求识别-工具选择-参数生成-执行-结果处理”的全流程提示设计,让AI从“知道工具”进化为“熟练使用工具”的“数字助手”,大幅扩展多任务处理能力。
五、核心技术四:反馈驱动的迭代优化技术——让AI“从错误中学习”并持续改进
5.1 为什么“一次做对”对Agentic AI来说很难?
即使是最聪明的Agent,在处理多任务时也难免出错:子任务优先级排错、工具调用参数错误、数据解读偏差……传统AI会“一条道走到黑”,而Agentic AI的关键优势是“能接收反馈并修正”——这就是反馈驱动的迭代优化技术要实现的目标。
反馈可以来自3个方向:
- 用户反馈:用户直接指出错误(如“数据算错了”);
- 工具反馈:工具返回错误信息(如“API参数错误”);
- 自我反馈:AI自查发现问题(如“子任务结果与目标不符”)。
通过提示工程引导AI“接收反馈→分析原因→制定修正方案→重新执行”,形成“执行-反馈-优化”的闭环,让AI像“实习生”一样在错误中成长。
5.2 反馈处理的“3层迭代模型”与提示设计
根据反馈来源和错误严重程度,反馈处理可分为3层迭代,每层对应不同的提示策略:
第1层:即时修正迭代——“立刻改这个错!”
适用场景:明确的、局部的错误(如“数值算错”“错别字”),无需重新规划整体任务。
提示模板:
【角色】即时修正专家,根据用户反馈修正当前结果。
【当前结果】{current_result}
【用户反馈】{user_feedback}(如“温度应该是28度,不是38度”)
【修正要求】
1. 仅修改反馈指出的错误部分,不改变其他内容。
2. 说明修正原因:[原因]
3. 输出修正后的结果。
【输出格式】
修正原因:[原因]
修正后结果:[内容]
【开始修正】
示例:当前结果是“今天气温38度”,用户反馈“温度应该是28度”,AI会输出:“修正原因:用户指出温度数值错误;修正后结果:今天气温28度。”
第2层:子任务重规划迭代——“这个子任务需要重做!”
适用场景:错误源于子任务执行不当(如“数据收集不完整”“工具调用错误”),需要重新执行单个或多个子任务。
提示模板:
【角色】子任务重规划专家,根据反馈重新规划子任务。
【原任务计划】{original_plan}(子任务列表)
【已完成子任务】{completed_tasks}
【错误反馈】{error_feedback}(如“子任务2.1收集的数据不完整,缺少B公司信息”)
【重规划步骤】
1. 确定需要重做的子任务:[子任务ID]
2. 分析错误原因:[如“未明确要求收集所有竞品数据”]
3. 制定修正方案:[如“修改子任务2.1的收集标准,包含所有3个竞品”]
4. 更新子任务计划,标注依赖关系。
【输出格式】
需重做的子任务:[ID]
错误原因:[分析]
修正方案:[方案]
更新后子任务计划:[新的子任务列表]
【开始重规划】
第3层:目标与策略迭代——“方向错了,需要换思路!”
适用场景:根本性错误(如“误解用户目标”“整体方法不可行”),需要重新定义目标或更换策略。
提示模板:
【角色】目标与策略迭代专家,根据反馈调整整体方向。
【原目标】{original_goal}
【原执行策略】{original_strategy}(如“通过爬虫收集数据”)
【反馈信息】{feedback}(如“用户实际需要的是内部数据,不可爬取外部信息”)
【迭代步骤】
1. 重新理解用户真实目标:[新目标]
2. 评估原策略是否可行:[可行/不可行,理由]
3. 制定新策略:[如“调用内部数据库API”]
4. 重新拆解子任务计划。
【输出格式】
新目标:[目标]
新策略:[策略]
新子任务计划:[列表]
【开始迭代】
5.3 自我反馈提示:让AI“自己检查错误”
除了外部反馈,Agentic AI还需具备“自我反馈”能力——在执行每个子任务后,主动检查结果是否符合预期。
自我反馈提示模板:
【角色】自我检查专家,评估子任务结果是否符合要求。
【子任务目标】{subtask_goal}(如“收集3个竞品的市场份额”)
【子任务结果】{subtask_result}
【检查标准】
1. 完整性:是否覆盖目标的所有要求(如“是否包含3个竞品”)
2. 准确性:数据是否合理(如“市场份额是否在0-100%范围内”)
3. 相关性:是否与整体任务相关(如“是否是市场份额而非营收数据”)
【输出】
检查结果:通过/不通过
问题点(若不通过):[1. ... 2. ...]
修正建议:[重新收集XX数据/修正XX数值]
【开始检查】
示例:子任务目标是“收集3个竞品的市场份额”,结果只包含2个,AI会输出:“检查结果:不通过;问题点:1. 完整性不足,仅收集2个竞品;修正建议:重新执行子任务,补充第3个竞品数据。”
5.4 代码实战:反馈驱动迭代Agent
下面实现一个能接收用户反馈并修正结果的迭代Agent。
def feedback_iteration_agent(original_result, user_feedback):
# 第1层:即时修正迭代
if "数值错误" in user_feedback or "错别字" in user_feedback:
correction_prompt = f"""
【角色】即时修正专家,根据用户反馈修正当前结果。
【当前结果】{original_result}
【用户反馈】{user_feedback}
【输出格式】修正原因:...;修正后结果