做 AI 应用这一年多,我有一个越来越强烈的感受:同样一个模型,用“问一句答一句”的方式调用,和用一套精心设计的 Agent 工作流去调用,产出的质量差距可以非常大。
很多人把 Agent 理解为“更聪明的聊天机器人”,这其实是个误解。Agent 不是一个新的模型,而是一套新的任务组织方式。它把一个复杂目标拆成多个环节,每个环节交给大模型执行、检查、修正,必要时再调用外部工具获取真实数据。这种模式下,模型本身可能没有变强,但最终交付结果却稳定得多。
吴恩达(Andrew Ng)在 DeepLearning.AI 的系列课程里,把这件事讲得非常系统。他甚至在不同场合反复表达过一个判断:Agentic AI 是他目前最看好的方向之一。这套课程没有停留在概念层面,而是把 Agent 拆成可以逐个动手练习的模块:工作流、反射、工具调用、MCP、多智能体协作。对国内开发者来说,这几乎是目前能找到的最完整的 Agent 入门到进阶路线之一。
这篇文章就顺着这套课程的核心思路,帮你梳理一份可落地的 Agent 知识框架,并给出能直接运行的代码示例和避坑清单。不管你最终选择 LangGraph、crewAI、Dify,还是自己手写一套流程,这些底层设计思想都是通用的。
1. 这篇文章真正要解决的问题:Agent 学习路线为什么值得跟
很多开发者现在处于一个尴尬阶段:知道 Agent 火,也知道 MCP、多智能体这些词,但真要动手做一个 Agent 时,脑子里没有清晰的架构图。
最常见的困惑是:
- 单次调用大模型时,输出不稳定,换一个 Prompt 结果就漂移,怎么让它稳定干活?
- 想让 AI 自动完成“查数据 → 写报告 → 发邮件”这种多步骤任务,应该从哪里入手?
- 听说 Function Calling、MCP 能让模型调用工具,但两者的边界在哪里?
- 多智能体协作听起来很美好,实际项目里会不会只是把简单问题复杂化?
吴恩达这套课程的价值,恰好就在于回答了这些问题。它把 Agentic AI 的常见工作流抽象成了几个核心模式:反射(Reflection)、工具使用(Tool Use)、规划(Planning)、多智能体协作(Multi-Agent Collaboration)。这几个模式不是停留在理论上的分类,而是可以直接对应到代码结构和系统设计里。
学完这套思路后,你得到的不是一个“只能跑 Demo 的玩具”,而是一套能在真实项目中复用的方法论。比如你会理解为什么反思循环能提升输出质量、什么时候需要引入工具调用、为什么有些任务拆给多个 Agent 反而更高效,以及为什么说 MCP 解决了工具接入标准化的真问题。
这篇文章的核心目标,就是把这套方法论拆开讲透,配合代码让你能照着落地,同时把新手最容易踩的坑提前指出来。
2. Agent、Agentic AI 与工作流:先把概念讲透
在进入实操之前,有几个基础概念必须先对齐。
2.1 Agent 不是模型,而是系统
单次调用大模型时,整个流程是线性的:
用户输入 → Prompt 直接发给模型 → 模型返回一次回答 → 结束。
这种模式适合问答、翻译、总结等一次性任务。但遇到“帮我调研一下某个技术方向,整理成报告”“按照需求写一个模块,然后自我检查并修复”这类多步骤任务,单次调用就撑不住了。
Agent 的本质,是把大模型放到一个循环中:模型产出结果后,系统可以继续观察结果、反馈问题、让模型重新生成,甚至调用外部工具获取更多信息。吴恩达在课程里反复强调的一个观点是:不要只把大模型当作“对话引擎”,要把它当作一个可以反复调用、逐步推进任务的“推理引擎”。
一个典型的 Agent 工作流大概是:
用户目标 → Agent 规划任务 → 调用模型生成中间结果 → 检查结果是否达标 → 不达标则反馈并重新生成 → 需要数据则调用工具获取 → 汇总结果 → 输出最终答案这套循环就是 Agentic AI 和传统 LLM 应用最大的区别。
2.2 Agentic AI 的四种核心工作流模式
这套课程把 Agentic AI 的常见设计模式归纳为四类,整个学习路线也是围绕它们展开的:
| 模式 | 一句话理解 | 解决什么问题 |
|---|---|---|
| Reflection(反射) | 模型自己检查自己的输出,发现问题后修订 | 单次生成质量不稳定、错误多 |
| Tool Use(工具使用) | 让模型调用外部 API、数据库、代码解释器等 | 模型无法获取实时数据、无法执行动作 |
| Planning(规划) | 把大任务拆解成子任务,按顺序执行 | 复杂任务一次性难以完成 |
| Multi-Agent Collaboration(多智能体协作) | 多个不同角色的 Agent 分工配合 | 任务需要不同视角、不同领域知识 |
这四种模式不是互斥的,实际项目里经常组合使用。比如一个写代码 Agent,内部可以先用 Planning 拆解需求,再用 Tool Use 调用代码解释器执行代码,最后用 Reflection 让另一个模型做代码评审。
2.3 什么是 Agent 工作流
工作流(Workflow)这个词在 Agent 语境里,指的是任务从开始到结束所经过的完整流程定义。它通常包含几个要素:
- 状态:当前任务进展到哪一步
- 节点:每一步调用什么能力(模型、工具、条件判断)
- 数据传递:上一步的输出如何成为下一步的输入
- 终止条件:什么情况下认为任务完成
理解了这几个概念组合后,就可以正式进入代码层面了。
3. 反射模式 Reflection:让 Agent 学会自我修订
反射模式是这套课程里第一个值得动手实现的模式,因为它足够简单,而且效果立竿见影。
3.1 为什么模型需要“反思”
大模型单次生成的错误,往往是“盲目自信”的。让它直接写一段代码,它可能忽略边界条件;让它写一段文案,它可能不够契合主题。传统解法是不断改 Prompt,但存在两个问题:一是 Prompt 越写越长,二是模型输出的不确定性依然存在。
反射模式的思路是:不追求一次生成完美结果,而是把“生成”和“评估”分开,让两组指令交替工作。
它的工作流程可以概括为:
- 生成模型(Generator)完成任务,产出一个初版结果。
- 评审模型(Critic)用另一个视角检查初版结果,指出问题。
- 生成模型根据评审意见修改输出。
- 重复 2 和 3,直到评审通过或达到最大迭代次数。
3.2 一个极简反射 Demo
下面用 OpenAI 兼容接口做一个最小可运行的反射示例,核心不是某个具体 API,而是完整的生成-评审-修正循环。
# reflection_demo.py # 最小反射示例:生成 -> 评审 -> 修正 from openai import OpenAI client = OpenAI() # 也可以配置为使用其他兼容 OpenAI 接口的模型服务 def call_llm(prompt: str) -> str: resp = client.chat.completions.create( model="gpt-4o-mini", messages=[{"role": "user", "content": prompt}], temperature=0.7, ) return resp.choices[0].message.content task = "请写出一个 Python 函数,判断一个整数是否为质数。" # 第一轮:生成 answer = call_llm(task) print("=== 初版结果 ===") print(answer) # 第二轮:评审 critic_prompt = f""" 你是一个严格的代码评审专家。请检查下面的代码: 1. 边界条件是否处理正确 2. 是否存在性能问题 3. 风格是否清晰 如果发现问题,只输出问题列表;如果没有问题,只输出“代码合格”。 代码: {answer} """ review = call_llm(critic_prompt) print("=== 评审意见 ===") print(review) # 第三轮:如果评审不通过,则要求修改 if "代码合格" not in review: fix_prompt = f""" 请根据评审意见修改下面的代码,输出修改后的完整版本。 原代码: {answer} 评审意见: {review} """ final_answer = call_llm(fix_prompt) print("=== 修正版 ===") print(final_answer) else: final_answer = answer print("=== 初版已合格 ===")运行这段代码后,你会发现一个很直观的现象:初版结果可能漏掉对n <= 1的处理,评审模型会明确指出来,修正版则会把这类边界条件补上。
3.3 反射模式的关键细节
反射模式实现简单,但有几个设计决策会直接影响效果:
评审视角要和生成视角区分。如果评审 Prompt 只是简单改成“你再检查一下”,模型很可能还是站在写代码的人视角,看不出问题。更好的做法是让评审模型扮演一个“挑刺的测试工程师”“看到代码就想到极端输入的专家”,视角差异越大,发现问题越准。
要设定最大迭代次数。如果不加限制,生成和评审可能来回拉锯,Token 消耗不可控。通常 1 到 3 轮就足够了,超过 3 轮还没收敛,问题往往出在任务描述或评审标准上,而不是模型能力。
评审的标准要可判断。“请检查代码是否有问题”太宽泛;“请检查 n 为负数、0、1、2 时函数是否正确”就具体得多。给评审模型一个检查清单,会让评审结果稳定性大幅提升。
实际工程项目中,反射模式还经常和自动化测试结合:评审模型输出修改意见,然后让代码解释器执行单测,把失败信息喂给生成模型继续修改,直到测试通过。这种“模型评审 + 真实执行校验”的组合,效果比纯文本评审可靠得多。
4. 工具使用与 MCP:把 LLM 从“聊天框”里解放出来
反射模式让模型“想得更周全”,但如果模型只能基于训练时的知识回答问题,它依然拿不到实时数据,也无法执行真实动作。工具使用模式,就是为了解决这个问题。
4.1 工具调用:让模型决定什么时候查什么
工具使用的核心是 Function Calling。开发者预定义一批函数,每个函数有名称、描述和参数结构;模型在生成过程中判断需要用到哪个工具,输出结构化的调用请求;应用层执行函数并把结果返回给模型,模型再基于结果继续生成。
这种方式不是让模型“记住”工具,而是让模型理解“有哪些工具可用、各自适合什么场景”。比如:
- 查天气:模型判断用户问题需要实时天气,于是调用
get_weather(city)。 - 算数学:模型调用计算器工具,而不是自己心算。
- 查订单:模型调用订单查询 API,获取真实数据后再回答。
4.2 MCP 到底是什么
如果每个工具都要单独写一套接入逻辑,Agent 的可复用性会非常差。MCP(Model Context Protocol)解决的就是这个问题。
MCP 可以把 MCP 理解为“模型上下文协议”,它定义了一套标准化的通信方式,让大模型应用能够统一地连接外部工具、数据源和文件系统。工具提供方只需要实现一个 MCP Server,任何支持 MCP 的客户端应用就能直接使用这些工具,不需要为每个应用单独写对接代码。
这套课程把 MCP 放在工具使用模块里讲,思路很清晰:先用 Function Calling 理解工具调用的本质,再通过 MCP 学习如何把工具接口标准化,最终落实到自己的 Agent 项目里。
4.3 一个 MCP Server 结构示例
下面用 MCP 官方 Python SDK 中较常见的 FastMCP 高层封装,写一个简单工具服务。
# mcp_server.py # MCP Server 基础结构示例(SDK 版本不同时 API 可能略有差异) from mcp.server.fastmcp import FastMCP mcp = FastMCP("DemoAgentTools") @mcp.tool() def get_weather(city: str) -> str: """查询指定城市的天气信息""" # 实际项目中这里可以替换为真实天气 API 调用 return f"{city} 当前天气:晴,25 摄氏度" @mcp.tool() def add(a: float, b: float) -> float: """计算两个数字之和""" return a + b if __name__ == "__main__": mcp.run()这个示例的核心价值在于:工具本身只是普通函数,MCP 负责把它们暴露成标准的工具服务。任何理解 MCP 协议的客户端,都可以通过协议发现get_weather和add这两个工具,并按照统一格式调用。
当你在 Cursor、Claude Desktop 等支持 MCP 的应用里配置了本地或远程 MCP Server 后,Agent 就能把这些工具当作自己的“双手”来使用。
4.4 工具设计要遵循单一职责
工具调用设计得好不好,直接影响 Agent 的实际表现。实际项目中更推荐遵守几个原则:
- 工具粒度要小:一个工具只做一件事,
get_weather和send_email不要合成一个函数。 - 参数名要自解释:模型是根据描述理解参数的,
city、start_date比arg1可靠得多。 - 返回结果要结构化:JSON 比纯文本更利于模型解析,比如
{"city": "北京", "temp": 25}。 - 要做输入校验:工具是 Agent 的外接能力,不能盲信模型生成的参数,生产环境必须对参数做合法性校验。
5. 规划与多智能体协作:从单兵作战到团队配合
前两种模式解决的是“单个 Agent 如何干好一件事”。但当任务本身非常复杂时,单个 Agent 容易在上下文里迷失。这时需要规划模式和多智能体协作。
5.1 规划:把大目标拆成小步骤
规划模式的思路很朴素:让模型在动手之前先形成一份任务清单,再逐步执行。
对比一下:
- 没有规划:用户说“帮我做一个用户画像系统”,模型尝试一次生成整个系统代码,结果质量和一致性都很差。
- 有规划:模型先拆解成“需求分析 → 数据表设计 → 后端接口 → 前端页面 → 联调测试”,然后逐个步骤执行,每步完成后再进入下一步。
规划模式的关键在于:拆解出来的每个步骤都要“可执行”,并且步骤之间的输入输出要能衔接。很多新手把规划做成一个大 Prompt 甩给模型,模型依然无从下手。更合理的做法是:用代码结构维护任务清单,每一步单独调用模型,而不是让模型在一个超长对话里自由发挥。
5.2 多智能体:不同角色,不同职责
多智能体协作更进一步,把不同角色的职责拆给多个 Agent。比如写技术文章,可以让一个 Agent 负责调研,一个 Agent 负责写初稿,一个 Agent 负责校对。每个 Agent 拥有独立的角色设定、背景知识和输出规范。
为什么要拆?因为单个模型在一个 Prompt 里同时扮演调研员、写手、校对的角色,很容易出现角色冲突。拆开之后,每个 Agent 只需要守好自己的职责边界,输出质量会更稳定。
下面是一个基于 crewAI 的多智能体协作示例结构:
# crew_demo.py # crewAI 多智能体协作示意(框架版本以你安装的官方版本为准) from crewai import Agent, Task, Crew, Process researcher = Agent( role="行业研究员", goal="搜集并归纳 MCP 协议在 Agent 开发中的主要用途", backstory="你是一名经验丰富的 AI 应用研究员,擅长快速定位关键信息。", ) writer = Agent( role="技术编辑", goal="把调研结果改写成一篇面向开发者的技术文章初稿", backstory="你是一名长期写技术博客的编辑,讲清楚原理比堆砌术语更重要。", ) research_task = Task( description="整理 MCP 协议在 Agent 开发中的主要用途,输出要点列表", expected_output="一份包含 5 个要点的调研摘要", agent=researcher, ) write_task = Task( description="基于调研摘要撰写一篇技术文章的开头部分,要求 300 字左右", expected_output="技术文章开头", agent=writer, ) crew = Crew( agents=[researcher, writer], tasks=[research_task, write_task], process=Process.sequential, # 顺序执行:先调研,后写作 ) result = crew.kickoff() print(result)运行之后,你会看到两个 Agent 按顺序执行:研究员先产出摘要,技术编辑再基于摘要写文章开头。每个 Agent 的输出边界清晰,整个流程也容易定位是哪一步出了问题。
5.3 多智能体不是越多越好
这是多智能体协作里最容易踩的坑。很多初学者看到多智能体的 Demo 很炫,就试图把一个简单任务拆给五六个 Agent,结果:
- Token 消耗翻了好几倍
- 对话链路变长,延迟明显增加
- Agent 之间传递信息时出现偏差,错误被不断放大
合理的选择是:能用一个 Agent 加规划解决的任务,不要用两个;能用两个解决的任务,不要用三个。多智能体的价值在于解决“需要不同视角或不同专业领域”的任务,而不是简单地把同一个任务切碎。
6. 吴恩达 Agent 教程学习路线:从入门到进阶怎么走
理解了四个核心模式之后,再回头看这套课程的学习路线,思路就会清晰很多。
6.1 课程模块与学习顺序
从公开资料和课程结构来看,这套 Agent 教程的学习路径大致按“工作流 → 反射 → 工具/MCP → 多智能体”推进:
| 学习阶段 | 核心内容 | 需要掌握的技能 |
|---|---|---|
| 第一阶段 | Agent 工作流基础 | 理解 Agent 与普通模型调用的区别,能搭起一个最小 Agent 循环 |
| 第二阶段 | 反射模式 | 写出生成-评审-修正流程,掌握多轮迭代控制 |
| 第三阶段 | 工具使用与 MCP | 掌握 Function Calling,能编写和接入 MCP 工具 |
| 第四阶段 | 规划模式 | 学会把复杂任务拆解成可执行的子任务 |
| 第五阶段 | 多智能体协作 | 掌握多 Agent 的角色设计、任务编排、结果聚合 |
这个顺序设计得很合理,因为每一层都建立在前一层基础上。反射模式不需要工具调用,工具调用不需要规划,规划又是多智能体协作的前置条件。跟着这个顺序学,不会出现在概念上“空中楼阁”的问题。
6.2 如何高效利用课件代码
这类课程通常会提供配套的 Notebook 课件和代码示例。使用代码材料时,建议不要直接“读完所有代码再动手”,而是:
- 先看代码结构,猜每一步的作用。
- 把代码跑通,记录输出结果。
- 修改关键参数,比如换任务、调迭代轮数、换模型。
- 总结哪些变量会影响最终效果。
课件代码是“标准答案”,但只有当你自己改过之后,才知道哪一步对结果的影响最大,也才能真正内化成自己的方法。
6.3 学完课程之后往哪个方向深入
如果只想做一个简单的业务工具,学完工作流、反射、工具使用就基本够用了。如果要做更复杂的产品级 Agent,建议继续深入研究:
- LangGraph:更细粒度的状态机控制,适合编排复杂流程。
- Dify / Coze / n8n:可视化工作流平台,适合快速搭建业务自动化。
- 向量数据库与 RAG:让 Agent 能访问私有知识库。
- 可观测性与评测:给 Agent 加日志、Trace 和评价体系。
7. 常见问题与排查思路
在实践 Agent 开发时,下面的问题出现频率极高,整理成排查表方便对照。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 反射循环一直不收敛 | 评审标准不具体,生成端反复修改但没改到点上 | 打印每轮评审意见与修改内容,检查定位是否一致 | 在评审 Prompt 中给出明确检查清单,并限制最大迭代轮数 |
| 模型没有调用工具 | 工具描述不清晰,或模型不支持 Function Calling | 查看模型请求日志,确认工具列表是否传给了模型 | 优化工具描述,明确“什么场景下使用该工具”;换支持工具调用的模型 |
| MCP Server 连接失败 | 服务没有启动,或协议版本不兼容 | 先单独运行 MCP Server,确认端口和日志正常 | 检查 SDK 版本,统一客户端与服务端的 MCP 版本 |
| 多智能体协作结果跑偏 | 角色职责界定不清,任务描述含糊 | 检查每个 Task 的描述和输出要求 | 为每个 Agent 定义明确的 Goal 和 Backstory,任务描述中给出输出示例 |
| Agent 输出很长但没完成核心任务 | 任务目标不清晰,Agent 在无效环节花费太多上下文 | 查看完整对话链路,定位哪一步开始偏离 | 把大目标拆成子任务,并在每步开始时重申当前目标 |
| Token 消耗过高 | 反思轮数过多、工具返回结果过大 | 统计各环节 Token 占比 | 限制反思轮数、精简工具返回字段、规划时过滤无关步骤 |
8. Agent 项目落地最佳实践
课程里讲清楚了“怎么实现”,但生产环境落地还需要额外注意一些工程问题。
8.1 先跑通最小闭环,再扩展功能
很多 Agent 项目失败,不是因为技术选型不对,而是还没有把最小闭环跑通就开始堆功能。接一个真实业务场景时,先用最简单的不带工具、不带多智能体的流程把任务跑通,再逐步引入工具调用和反思循环。每一步都要验证“这一步真的有帮助”,而不是为了用 Agent 而用 Agent。
8.2 把反思和工具设计成独立模块
反射循环和工具调用不要和业务逻辑耦合在一起。推荐的做法是:
workflow/ ├── agent/ │ ├── generator.py # 生成模块 │ ├── critic.py # 评审模块 │ ├── planner.py # 规划模块 │ └── runner.py # 主循环 ├── tools/ │ ├── registry.py # 工具注册 │ ├── weather.py │ └── database.py └── config.py # 模型参数、迭代轮数这样后续换模型、加工具、调整反思策略,都只需要改动局部模块。
8.3 日志和 Trace 必须从第一天就做
Agent 应用的调试比传统应用难得多,因为每一步都有模型参与,输出不固定。强烈建议从项目第一天就给每一次模型调用打日志:
- 输入 Prompt
- 输出结果
- 消耗 Token
- 耗时
- 中间状态
当 Agent 行为异常时,这些日志就是“黑匣子”。有条件的话,可以接入 LangSmith、Langfuse 这类可观测性平台,或者直接在业务系统里做一套简化的 Trace 记录。
8.4 对 Agent 的输出做边界校验
Agent 调用了工具,就相当于把一部分系统控制权交给了模型。工具在接收参数时必须做校验,重要操作必须增加确认机制,涉及数据变更的操作要遵循最小权限原则,并保留回滚能力。不要因为结果是模型生成的,就跳过人工审核或系统校验。
8.5 控制成本与延迟
Agent 工作流的 Token 消耗通常远高于单次模型调用。一个带反思和工具调用的任务,Token 消耗可能是普通问答的 5 到 20 倍。在设计阶段就要想清楚:
- 是否每个步骤都需要最贵的模型,还是一些步骤可以用轻量模型完成。
- 工具返回结果是否做了裁剪。
- 多智能体协作时,是否复用上下文,避免重复传递大量文本。
9. 总结与后续学习方向
从吴恩达这套 Agent 教程里,最值得带走的不只是“Agent 是什么”,而是那四种核心工作流模式:反射、工具使用、规划和多智能体协作。它们分别解决了“输出质量不稳定”“拿不到实时数据”“复杂任务无法一次完成”“单角色视角受限”这几个 Agent 落地中最实际的问题。
动手实践的优先级也很明确:先实现一个最简单的生成-评审-修正循环,体验反思模式的价值;然后接入一两个工具,理解 Function Calling 和 MCP 的用法;再尝试用规划拆解一个复杂任务;最后才是多智能体协作。如果连最小闭环都没有跑通,不要急着把架构铺得很大,否则只会增加排查难度。
如果你已经能熟练使用 LangGraph、crewAI 或 Dify 搭建 Agent 流程,下一步值得深入的方向是 Agent 的评测体系——不是看某一个 Demo 是否成功,而是如何在不同任务集上稳定评估 Agent 的表现并持续优化。Agent 开发到现在已经不再是“会不会调用 API”的问题,而是“如何设计一套可靠、可观测、可维护的智能体系统”的工程问题。
这套课程能帮你完成从 0 到 1 的认知搭建,但真正让技术变成能力的,是回到自己的业务场景里,把一个具体的任务交给 Agent 反复调试。建议把文中的几个代码示例存下来,作为你的第一个 Agent 练习起点。