【LLM】公认的 agent 开发必学课程(三)
这份合集是吴恩达 DeepLearning.AI「Agentic AI」系列课程的精华笔记,帮你快速掌握 Agent 开发的核心逻辑。
学习建议:
- 重思维,轻代码: 这套课公认必学,核心价值在于传授“工程落地”的设计模式与迭代方向,这比单纯学写代码更重要。
- 先扫盲,再精读: 建议先了解我之前写的《Agent = LLM + 四大组件:一个公式讲清楚 AI Agent》,不必死磕基础,直接上手学构建方法。
- 搭配食用: 边看视频边对照本合集,吸收效率翻倍。
注:文中引用块内容为笔者个人学习观点,仅供参考;其余均为原课程干货梳理。
[Module 2] 反思设计模式
2.1 用反思提升任务输出
这节课讲的是怎么让AI像人写作文一样,先写初稿,然后自己回头看,挑毛病再改,反复几轮就能写出更好的东西。我个人观点这一节的核心就是这种"生成-检查-改进"的循环不是什么高深技术,但确实管用,最有效的还是结合外部真实反馈的那种。
将这一过程比作人类写作:我们写完初稿后,会回头阅读、发现问题(如模糊不清、拼写错误、遗漏署名),然后进行修改,最终得到一份更完善的文稿。
核心类比:人类反思 → AI 反思。这不仅是模仿,更是赋予 AI 一种自我优化的能力。
案例1:以写邮件为例

人类反思流程:从初稿到定稿
以 Ng 自己写给 Tommy 的邮件为例:
- 初稿:问题1——模糊性,“next month” 不够具体;问题2——拼写错误,“fre” 应为 “free”;问题3——不完整,邮件没有署名
- 反思与改进:改进点——明确了日期范围,修正了拼写错误,并添加了署名
AI反思流程:硬编码的"提示-反思"工作流
- 第一阶段:生成初稿,向 LLM 发送一个初始提示,LLM 根据提示生成第一个版本的输出
- 第二阶段:反思与改进,将第一版输出作为新的输入,再次发送给 LLM(可以是同一个模型,也可以是另一个专门用于推理的模型),这次的提示语会不同,要求其反思并写出改进版
关键点:这个流程是"硬编码"的,即工程师预先设计好整个步骤,而不是让模型自主决定何时反思。这是一种可靠且易于实现的工程化方法。
案例2:代码编写

基础版:模型自省
- 提示 LLM 编写一段代码(code V1)
- 将 code V1 再次输入给 LLM,提示其"检查代码中的错误并写出改进版"
- 结果:得到修复了潜在 bug 的 code V2
进阶版:利用"思考模型"去检查
不同的 LLM 有不同的专长。可以使用一个擅长快速生成的模型来写初稿,再用一个"思考模型"、更擅长逻辑推理和错误排查的模型来进行反思和改进。这种组合能发挥各自的优势,达到"1+1>2"的效果。
终极形态:结合外部反馈的反思
反思最强大的形式是结合外部反馈。仅仅让模型"内省"是有限的,而引入来自模型之外的新信息,则能带来质的飞跃。
以上面的代码为例做结合外部反馈的反思:
- 生成初稿:LLM 生成 code V1
- 执行代码:在安全的沙盒环境中运行 code V1
- 获取外部反馈:系统捕获代码的实际输出和任何错误信息,例如 SyntaxError: unterminated string literal
- 反思与改进:将 code V1、Output 和 Errors 一起作为输入,交给 LLM 进行反思,要求其根据这些具体的、客观的反馈来重写代码
- 获得终稿:LLM 基于真实的执行结果,修正错误,生成功能正确的 code V2

总结:
- 反思不是魔法,而是工程实践:它不能保证模型每次都100%正确,但能带来"适度的性能提升",是性价比极高的优化手段
- 外部反馈是关键:反思的力量在于能否获取并利用外部信息。如果能运行代码、查询数据库或调用 API,将这些结果作为反馈输入,就能让模型进行更深层次的反思,从而产出更优的结果
- 设计哲学:当你有机会获取额外信息时,请务必将其融入反思流程。这是提升系统鲁棒性和输出质量的核心策略
2.2 为何不只用迭代
这节课回答了一个很实际的问题:直接让AI一次性干活和让它先干再检查再改,到底差在哪儿?我个人观点这一节的核心就是数据不会骗人,反思在所有任务上都能带来提升,哪怕是最强模型加了反思也更强,而且编写提示词时要用明确动词,别含糊地说"改进"。
核心观点:反思不是为了增加复杂度,而是为了在质量上获得"质的飞跃"。
什么是"直接生成"?

“直接生成"是 AI 最基础、最直观的工作方式,也常被称为"零样本提示”(Zero-shot Prompting)。
特点:简单、快速、一步到位。它不提供任何中间反馈或修正的机会。
术语解释:"零样本提示"中的"零样本"指的是在提示中没有提供任何输入-输出示例。
- 零样本:写一个关于黑洞的文章(无示例)
- 单样本:写一个关于黑洞的文章 + 示例1
- 少样本:写一个关于黑洞的文章 + 多个示例
反思在性能上全面碾压直接生成

论文《Self-refine: Iterative refinement with self-feedback》的关键图表展示了7种不同任务在零样本提示与反思模式下的性能对比,包括情感反转、对话响应、代码优化、数学推理等。
在所有7个任务、所有4个被测试的模型(GPT-3.5, ChatGPT, GPT-4, Claude)中,加入反思步骤后,性能无一例外地高于对应的直接生成!
结论:反思模式在各种任务上都能稳定地提升性能。即使是最强大的 GPT-4,在加入反思后,其表现也能得到进一步增强。这说明反思是一个普适且有效的优化策略。
反思模式更适用的任务场景

反思模式在以下类型的复杂任务中尤其有效:
| 示例 | 问题 | 反思提示 |
|---|---|---|
| 生成HTML表格 | 格式错误,如缺少 </tr> 标签 | “验证HTML代码。” |
| 泡一杯完美的茶 | 步骤缺失或顺序错误 | “检查说明的连贯性和完整性。” |
| 生成域名 | 名称可能有负面含义或难以发音 | “域名是否有负面含义?是否难发音?” |
如何编写高效的反思提示语

编写反思提示的两大黄金法则:
- 明确指示反思动作:不要含糊地说"请改进",而要说"请审查"、“请检查”、“请验证”
- 具体指定检查标准:不要只说"让它更好",而要列出具体的评判标准
提升写 prompt 的一个方法,就是多阅读他人的提示词。
2.3 图表生成工作流
这节课用一个咖啡销量图表的例子,展示了多模态AI如何"看"懂图表,然后自己挑毛病改代码。我个人观点这一节的核心就是多模态模型能真正"看见"生成的图表,给出视觉层面的专业反馈,这个比单靠文本描述要强得多。

通过一个咖啡销售数据的实战案例,生动展示了 AI 如何像人类专家一样"审视"和"改进"自己的工作成果。
直接生成
- 向 LLM 发送提示:“Create a plot comparing Q1 coffee sales in 2024 and 2025 using coffee_sales.csv.”
- LLM 生成第一版 Python 代码(V1 code),用于读取CSV文件并绘制图表
- 执行与结果:运行 V1 代码,生成了一张名为 plot.png 的图表
- 问题显现:这是一张堆叠柱状图(Stacked Bar Plot)。虽然它完成了数据展示的基本功能,但存在两大缺陷:
- ◦ 堆叠柱状图对于比较不同年份同一饮品的销量不够直观
- ◦ 图表整体观感不佳,缺乏专业性
引入反思——多模态模型的视觉推理

将生成的图像作为输入,交由一个多模态语言模型(Multi-modal LLM)进行反思。
- 输入准备:将 V1 版本的代码和它生成的图表一同打包,作为新的输入
- 反思指令:提示多模态 LLM 扮演"专家数据分析师"的角色,对图表进行批判性评估
- 视觉推理:多模态模型能够"真正地看"这张图,分析其可读性、清晰度和完整性,并提出具体的改进建议
- 生成新代码:根据反思反馈,模型更新代码,生成第二版(V2 code)
- 最终成果:运行 V2 代码,生成了 plot_v2.png
使用不同的模型进行分工协作

- LLM(初始生成):负责根据用户提示生成第一版代码
- LLM 2(反思阶段):负责接收第一版代码、生成的图表以及对话历史,扮演"专家分析师"的角色,提供建设性反馈并指导代码改进
反思提示语示例:您是一位专业的数据分析师,能够为可视化提供建设性反馈。步骤1:评估所附图表的可读性、清晰度和完整性。步骤2:编写新代码来实现您的改进。
总结
反思机制并非万能,其效果因应用场景而异。在某些任务上提升显著,在另一些任务上则可能微乎其微。
因此,了解反思机制对你特定应用的影响至关重要。它能为你提供优化方向,无论是调整初始生成提示,还是优化反思提示,都能帮助你获得更好的性能。
2.4 评估反思的影响
这节课教你怎么用数据说话,别光凭感觉说反思有没有用,要用测试集和评估指标来衡量。我个人观点这一节的核心就是客观任务用"真实答案"数据集,主观任务用"评分量表",让LLM打分而不是直接比较,这样结果才可靠。
客观评估——数据查询任务

反思工作流
问题:“哪种颜色的产品总销量最高?”
基础流程:
- LLM 根据问题生成 SQL 查询语句(V1)
- 执行 V1 查询,获取结果
- LLM 根据结果回答问题
反思增强流程:
- LLM 生成初始 SQL 查询(V1)
- 新增反思步骤:另一个 LLM 对 V1 查询进行审视,并生成改进版的 SQL 查询(V2)
- 执行 V2 查询,获取结果
- LLM 根据结果回答问题
构建评估数据集
为了评估反思的效果,需要创建一个包含"提示词"和"真实答案"的数据集。
| PROMPTS (提示词) | GROUND TRUTH ANSWER (真实答案) |
|---|---|
| 2025年5月售出了多少商品? | 1201 |
| 库存中最贵的商品是什么? | Airflow sneaker |
| 我的店铺中有多少款式? | 14 |
通过运行两个版本的工作流并比较结果,可以得出客观的性能指标。
| PROMPTS (提示词) / 问题 | GROUND TRUTH ANSWER (真实答案) | NO REFLECTION (无反思) | WITH REFLECTION (有反思) |
|---|---|---|---|
| 2025年5月售出了多少商品? | |||
| Number of items sold in May 2025? | 1201 | 980 | 1201 |
| 库存中最贵的商品是什么? | |||
| Most expensive item? | Airflow sneaker | Airflow sneaker | Airflow sneaker |
| 我的店铺中有多少款式? | |||
| How many styles carried? | 14 | 14 | 14 |
结论:反思显著提升了数据库查询的质量和最终答案的准确率。虽然增加了计算开销,但其带来的性能提升是"有意义的",值得保留。
迭代优化:调整提示词
一旦建立了评估机制,开发者就可以快速迭代:
- 修改"反思提示词",例如要求模型让查询"更快"或"更清晰"
- 或者修改"初始生成提示词"
- 每次修改后重新运行评估,测量正确率的变化,从而选择最适合应用的提示词
主观评估——可视化图表任务

任务:根据 coffee_sales.csv 数据生成 Q1 咖啡销售对比图。 问题:如何判断"反思后"的图表比"反思前"的图表更好? 难点:评估标准是主观的(如美观度、清晰度),而非黑白分明的客观标准。
直接让LLM做裁判的弊端
直观的想法是让 LLM 直接比较两张图并给出"哪个更好"。 已知问题:
- 答案不可靠:LLM 的评判结果往往不稳定
- 位置偏见:许多模型倾向于选择第一个输入的选项(A),无论其质量如何

使用评分表(Rubric)
更好的方法是为 LLM 提供一套结构化的评分标准(Rubric),让它对每个维度进行打分,而不是直接比较。
示例评分量表:
- 是否有清晰的标题?
- 坐标轴是否有标签?
- 图表类型是否合适?
- 坐标轴的数值范围是否恰当?
同样,可以构建一个包含多个用户查询的数据集,对"有反思"和"无反思"生成的图表分别打分。

评估反思的核心方法论
**客观评估:**构建带"真实答案"的数据集,用代码自动计算正确率。简单、易管理、结果客观。适用于有明确答案的任务(如数据库查询)。
**主观评估:**使用 LLM 作为裁判,但需提供详细的评分量表(Rubric)。需要更多调优,但能处理复杂的主观标准(如图表美观度)。
总结
- 反思的价值:它是一种强大的工具,能显著提升输出质量,但需付出一定的性能代价
- 评估是关键:不能凭感觉决定是否保留反思步骤,必须通过客观或结构化的主观评估来衡量其收益
- 客观任务:用"真实答案"数据集 + 代码自动化评估
- 主观任务:用"评分量表"引导 LLM 进行结构化打分,避免直接比较
- 迭代优化:建立评估体系后,可以快速尝试不同的提示词,找到最优解
- 未来方向:结合外部信息,是进一步提升反思效果的下一个前沿
2.5 使用外部反馈
这节课讲的是单纯的自我反思总有上限,真正的突破是引入外部信息,让模型跳出自己的知识库。我个人观点这一节的核心就是外部反馈打破了模型的信息孤岛,它能获得实时数据、精确事实、字数统计这些模型自己做不到的东西,这才是质的飞跃。
提示词工程的收益递减规律

- 横轴:投入在提示词工程上的时间
- 纵轴:系统性能
- 红色曲线(无反思):初期,通过调整提示词,性能会快速提升。但很快,性能增长会放缓并趋于平缓,进入"平台期"。此时,即使再花费大量时间微调提示词,也很难获得显著的性能提升
- 蓝色曲线(有反思):在某个时间点加入反思机制后,性能曲线会再次上扬,达到一个比"无反思"更高的平台。这表明,反思能为系统带来一次"性能跃迁",突破原有的瓶颈
- 黄色曲线(有反思 + 外部反馈):在引入反思的基础上,如果能接入外部反馈,性能将再次跃升,达到一个远超前两者的更高平台。外部反馈为系统注入了"新信息",使其不再局限于模型自身的知识库和推理能力
外部反馈的案例

1、避免提及竞争对手
模型有时会在文案中不必要地提及竞争对手的名字(如"Our company’s shoes are better than RivalCo")。
- 外部反馈工具:编写一个代码工具,使用正则表达式对模型的输出进行模式匹配,自动检测是否包含竞争对手名称
- 反思流程:
-
- 模型生成初稿
-
- 工具扫描文本,发现"RivalCo"
-
- 将"检测到竞争对手名称"的反馈信息传回给模型
-
- 模型基于此反馈,重新撰写一份不提及竞争对手的新版本
-
2、事实核查
模型生成的历史内容可能存在不准确之处(如"The Taj Mahal was built in 1648")。
- 外部反馈工具:调用网络搜索 API,查询关于泰姬陵建造时间的权威资料
- 反思流程:
-
- 模型生成初稿
-
- 工具发起网络搜索,返回结果:“泰姬陵于1631年下令建造,1648年完工”
-
- 将搜索结果作为额外输入,提供给反思模型
-
- 模型基于更精确的历史事实,重写文本,使其更准确
-
3、遵守字数限制
模型生成的博客文章或摘要常常超出预设的字数上限。
- 外部反馈工具:开发一个简单的字数统计工具
- 反思流程:
-
模型生成初稿
-
工具统计字数,发现"超过字数限制"
-
将"当前字数"和"字数限制"等信息作为反馈,传回给模型
-
模型基于此反馈,压缩或精简内容,重新生成符合字数要求的版本

-
总结:外部反馈的核心价值
- 打破信息孤岛:外部反馈让模型能够接触到其训练数据之外的新鲜、实时、客观的信息
- 解决模型固有缺陷:对于模型不擅长的任务(如精确计数、事实核查),外部工具可以完美弥补
- 实现闭环优化:形成"生成 -> 执行/检查 -> 获取反馈 -> 反思改进"的自动化闭环,大幅提升工作效率和输出质量
- 学习系统化地让模型调用外部工具,是构建强大智能体应用的关键
更多推荐

所有评论(0)