模块1:Agentic AI简介「Andrew Ng:Agentic AI」
1.0 简介
欢迎来到这门关于 Agentic AI 的课程。当我创造 “agentic” 这个词来描述我所看到的一种重要且快速增长的、人们构建基础应用的方式时,我没有意识到的是,一群营销人员会抓住这个词,把它当成一个标签,贴在几乎所有能看到的东西上。这导致了对 Agentic AI 的炒作急剧升温。不过,好消息是,抛开炒作不谈,使用 Agentic AI 构建的真正有价值和有用的应用数量也增长得非常迅速,即使没有炒作那么快。在本课程中,我想向您展示构建 Agentic AI 应用的最佳实践。这将在您现在可以构建什么方面,为您开启许多新的机会。
如今,agentic 工作流正被用于构建客户支持代理等应用,或进行深度研究以帮助撰写富有洞察力的研究报告,或处理棘手的法律文件,或查看患者输入信息并提出可能的医学诊断。在我带的许多团队中,我们构建的很多项目如果没有 agentic 工作流是根本不可能完成的。因此,知道如何用它们来构建应用是当今 AI 领域最重要和最有价值的技能之一。
我发现,真正懂得如何构建 agentic 工作流的人与那些效率较低的人之间,最大的区别之一是能否推动一个规范的开发流程,特别是专注于评估和错误分析的流程。在本课程中,我将告诉您这意味着什么,并向您展示如何才能真正擅长构建这些 agentic 工作流。能够做到这一点是当今 AI 领域最重要的技能之一,它将为您开启更多的机会,无论是工作机会,还是亲手打造出色软件的机会。
那么,让我们进入下一个视频,更深入地探讨什么是 agentic 工作流。
1.1 什么是 Agentic AI
那么,什么是 Agentic AI?为什么 Agentic AI 工作流如此强大?让我们来看一看。
如今,我们许多人使用大型语言模型(LLM)的方式是提示它,比如说,为我们写一篇关于某个主题 X 的文章。我认为这类似于去找一个人,或者在这种情况下,去找一个 AI,请它为我打出一篇文章,要求它从第一个词写到最后一个词,一气呵成,并且永远不能使用退格键。事实证明,我们人类并不能通过这种被迫以完全线性顺序写作的方式来完成我们最好的作品,AI 模型也是如此。但尽管受到这种写作方式的限制,我们的大语言模型表现得出奇地好。
相比之下,使用 agentic 工作流,过程可能是这样的:你可能会让它首先写一个关于某个主题的文章大纲,然后问它是否需要进行任何网络研究。在进行了一些网络研究并可能下载了一些网页之后,再让它撰写初稿,然后阅读初稿,看看哪些部分需要修改或做更多研究,接着修改草稿,如此循环。这种工作流更类似于先进行一些思考和研究,然后进行一些修改,再进行更多的思考,等等。通过这种迭代过程,事实证明,agentic 工作流可能需要更长的时间,但它能交付出质量好得多的工作成果。
所以,一个 Agentic AI 工作流是一个基于 LLM 的应用执行多个步骤来完成一项任务的过程。在这个例子中,你可能会使用一个 LLM 来撰写文章大纲,然后你可能会使用一个 LLM 来决定在网络搜索引擎中输入什么搜索词,或者说,用什么搜索词来调用网络搜索 API,以获取相关的网页。基于此,你可以将下载的网页输入到一个 LLM 中,让它撰写初稿,然后可能使用另一个 LLM 进行反思,并决定哪些地方需要更多修改。根据你设计这个工作流的方式,也许你甚至可以加入一个“人类在环”的步骤,让 LLM 可以选择请求人类审查某些关键事实。在此基础上,它可能会修改草稿,这个过程会产生一个好得多的工作输出。
你在本课程中学到的关键技能之一,就是如何将像写文章这样的复杂任务分解成更小的步骤,让 agentic 工作流一次执行一步,从而获得你想要的工作输出。事实证明,知道如何将任务分解为步骤,以及如何构建组件来很好地执行单个步骤,是一项棘手但重要的技能,它将决定你为各种激动人心的应用构建 agentic 工作流的能力。
在本课程中,我们将使用一个贯穿始终的例子,也是你将与我一起构建的东西——一个研究代理(research agent)。下面是它看起来的样子。你可以输入一个研究主题,比如“我如何建立一个新的火箭公司来与 SpaceX 竞争”。我个人不想与 SpaceX 竞争,但如果你想,你可以试着让研究代理帮助你做背景研究。
这个代理首先会规划要使用哪些研究方法,包括调用网络搜索引擎下载一些网页,然后综合和排序研究发现,起草大纲,让一个“编辑代理”审查其连贯性,最后生成一份全面的 Markdown 报告。它在这里已经完成了,报告标题是“建立一个新的火箭公司来与 SpaceX 竞争”,内容包括引言、背景、发现等等。我认为它恰当地指出,这将是一个很难创建的初创公司,所以我个人不打算这么做。但如果你想处理这样的事情,也许像这样的研究代理可以帮助你做一些初步研究。通过查找和下载多个来源并深入思考,这实际上最终会得到一份比仅仅提示一个 LLM 为你写一篇文章要深思熟虑得多的报告。
我对此感到兴奋的原因之一是,在我的工作中,我最终构建了不少专门的研究代理,无论是在法律文件领域用于冲突法合规性,还是在一些医疗健康领域,或是一些商业产品研究领域。因此,我希望通过这个例子,你不仅能学会如何为许多其他应用构建 agentic 工作流,而且在构建研究代理时的一些想法,在你将来需要自己构建一个定制的研究代理时,能对你直接有用。
现在,关于 AI 代理经常被讨论的领域之一是它们的自主性有多高?你刚才看到的是一个相对复杂、高度自主的 Agentic AI 工作流,但也有其他更简单的工作流,它们同样非常有价值。让我们在下一个视频中讨论 agentic 工作流可以达到何种程度的自主性,并为你提供一个框架来思考你可能如何构建不同的应用,以及它们的难易程度。我们在下一个视频见。
1.2 自主程度
代理(Agent)可以在不同程度上实现自主。几年前,我注意到在 AI 社区内部,关于什么是“代理”的争议日益激烈。有些人写论文说他们构建了一个代理,而另一些人则会说,不,那并不是一个真正的代理。我觉得这场辩论没有必要,所以我开始使用 “agentic” 这个词。因为我认为,如果我们把它当作一个形容词,而不是一个二元概念——要么是代理,要么不是——那么我们就必须承认系统可以在不同程度上是 agentic 的。让我们就都称之为 agentic,然后继续我们构建这些系统的实际工作,而不是去辩论“这个系统是否足够自主以至于能被称为代理”。
我记得当我准备一个关于 agentic 推理的演讲时,我的一个团队成员实际上来找我说:“嘿,Andrew,我们不需要再来一个新词了。我们已经有 agent 了,你为什么要造另一个词 agentic 呢?” 但我还是决定使用它。后来,我在一份名为 The Batch 的时事通讯中写了一篇文章,也在社交媒体上发帖说,与其争论哪个词应该被包含或排除为真正的代理,不如让我们承认系统可以有不同程度的 agentic 特性。我认为这帮助我们超越了关于什么是真正代理的辩论,让我们能够专注于实际地构建它们。
不同程度的自主性
有些代理可以不那么自主。以写一篇关于黑洞的文章为例,你可以有一个相对简单的代理来提出几个网络搜索词条或查询。然后你可以硬编码,让它调用网络搜索引擎,获取一些网页,然后用这些信息来写文章。这是一个自主性较低的代理的例子,它有一套完全确定的步骤序列。这样做效果还不错。
在整个课程中,我会用红色表示用户输入,比如这里的用户查询,或者在后面的例子中,可能是输入到 agentic 工作流的文档。灰色的框表示对 LLM 的调用,而绿色的框,比如你在这里看到的网络搜索和网页获取框,表示使用其他软件执行操作的步骤,比如调用网络搜索 API 或执行代码来获取网站内容。
然后,一个代理可以更加自主。当收到写一篇关于黑洞的文章的请求时,也许你可以让 LLM 自行决定,是想进行网络搜索,还是搜索最近的新闻源,或者是在网站 archive 上搜索最新的研究论文。基于此,也许在这个例子中,是 LLM 而不是人类工程师,选择了调用网络搜索引擎。之后,你可能会让 LLM 决定它想获取多少个网页,或者如果它获取了 PDF,是否需要调用一个函数或工具将 PDF 转换为文本。在这种情况下,也许它获取了前几个网页,然后它可以写一篇文章,决定是否要反思和改进,甚至可能返回去获取更多的网页,然后最终产生一个输出。
因此,即使是对于研究代理这个例子,我们也可以看到一些代理可以不那么自主,其执行的步骤是线性的,由程序员确定;而另一些则可以更自主,你信任 LLM 做出更多的决定,甚至确切的步骤顺序也可能由 LLM 决定,而不是由程序员预先设定。
自主性谱系
- 自主性较低的系统:通常所有步骤都是预先确定的。它调用的任何函数,比如网络搜索(我们称之为“工具使用”),可能是由人类工程师(你或我)硬编码的。大部分的自主性体现在 LLM 生成的文本内容上。
- 高度自主的代理:在谱系的另一端,代理会自主地做出许多决定,包括例如决定执行什么步骤序列来写文章。有些高度自主的代理甚至可以编写新的函数,或创建新的工具供自己执行。
- 半自主代理:介于两者之间,它可以做出一些决定,选择工具,但这些工具通常是预先定义好的。
当你在本课程中看到不同的例子时,你将学会如何在这个从低自主到高自主的谱系中的任何位置构建应用。你会发现,在谱系的低自主端,有大量非常有价值的应用正在为无数企业构建。同时,在谱系的高自主端,也有应用正在开发中,但那些通常更难控制,有点更不可预测,并且也有大量的活跃研究在探索如何构建这些更高度自主的代理。
那么,让我们进入下一个视频,更深入地探讨这个话题,并听听使用代理的一些好处,以及为什么它们让我们能做到一些用前几代基础应用无法实现的事情。
1.3 Agentic 工作流的好处
我认为 agentic 工作流最大的一个好处是,它能让你有效地完成许多以前根本不可能完成的任务。但除此之外,还有其他好处,包括并行化,让你能非常快地完成某些事情,以及模块化,让你能将来自许多不同地方的最佳组件组合起来,构建一个高效的工作流。让我们来看一看。
性能提升
我的团队收集了一些关于一个编码基准测试的数据,该测试旨在检验不同 LLM 编写代码以执行特定任务的能力。这个基准测试叫做 Human Eval。结果显示,GPT-3.5(首个公开发布的 ChatGPT 版本所基于的模型),如果被要求直接编写代码,即一次性输出整个计算机程序,在这个基准测试上的正确率为 40%。而 GPT-4 是一个好得多的模型,它在使用同样的非 agentic 工作流时,性能跃升至 67%。
但事实证明,从 GPT-3.5 到 GPT-4 的提升虽然巨大,但与将 GPT-3.5 包装在一个 agentic 工作流中所能实现的提升相比,就相形见绌了。通过使用不同的 agentic 技术(你将在本课程后面学到),你可以提示 GPT-3.5 编写代码,然后或许让它反思代码并找出改进之处。使用这样的技术,你实际上可以让 GPT-3.5 达到高得多的性能水平。同样,在 agentic 工作流的背景下使用 GPT-4,其表现也会好得多。因此,即使是使用当今最好的 LLM,agentic 工作流也能让你获得更好的性能。实际上,我们在这个例子中看到,从一代模型到下一代模型的提升虽然巨大,但仍然不如在上一代模型上实施 agentic 工作流所带来的差异大。
并行化与效率
使用 agentic 工作流的另一个好处是它们可以并行化一些任务,从而比人类更快地完成某些事情。例如,如果你让一个 agentic 工作流写一篇关于黑洞的文章,你可能可以并行运行三个 LLM 来为搜索引擎生成搜索词的创意。基于第一次网络搜索,它可能会识别出,比如说,三个排名最靠前的结果来获取。基于第二次网络搜索,它可能会识别出第二组要获取的网页,以此类推。事实证明,如果一个人类来做这项研究,他将不得不按顺序或一次一个地阅读这九个网页。而当你使用 agentic 工作流时,你实际上可以并行化所有九个网页的下载,然后最终将所有这些信息输入一个 LLM 来撰写文章。所以,尽管 agentic 工作流确实比真正的非 agentic 工作流(即通过单次提示直接生成)花费更长的时间,但如果你将这种 agentic 工作流与人类完成任务的方式相比,其并行下载大量网页的能力实际上能让它比单一的人类以非并行的顺序方式处理这些数据要快得多。
模块化与灵活性
在这个例子的基础上,我经常在构建 agentic 工作流时做的一件事,就是审视像 LLM 这样的单个组件,并添加或替换组件。例如,我可能会审视我在这里使用的网络搜索引擎,然后决定换一个新的。在构建 agentic 工作流时,实际上有多个网络搜索引擎可供选择,包括可以通过服务器访问的 Google,以及像 Bing、DuckDuckGo、Tavily、you.com 等其他引擎。实际上,为 LLM 设计的网络搜索引擎有很多选择。或者,也许不仅仅是做三次网络搜索,我们可以在这一步换上一个新的新闻搜索引擎,这样我们就能找到关于黑洞科学最新突破的消息。最后,我通常会尝试不同的 LLM,而不是在所有不同步骤都使用同一个,我可能会尝试不同的 LLM 提供商,看看哪个能在系统的不同步骤中给出最好的结果。
总结一下,我使用 agentic 工作流的主要原因就是它在许多不同应用上都能提供更好的性能。但此外,它还可以并行处理一些人类必须按顺序完成的任务。而且,许多 agentic 工作流的模块化设计也让我们能够添加或更新工具,有时还能更换模型。我们已经谈了很多关于构建 agentic 工作流的关键组件。现在让我们来看一系列 Agentic AI 的应用,让你了解人们已经在构建什么样的东西,以及你将要亲手构建什么样的东西。让我们进入下一个视频。
1.4 Agentic AI 应用
让我们来看一些 Agentic AI 应用的例子。
示例一:发票处理(流程清晰)
许多企业都会执行的一项任务是发票处理。给定这样一张发票,你可能想编写软件来提取最重要的字段,对于这个应用来说,假设这些字段是:开票方(即 Tech Flow Solutions)、开票方地址、应付金额(3000美元)以及到期日(看起来是2025年8月20日)。在许多财务部门,可能是一个人查看发票并识别出最重要的字段——我们需要在何时向谁付款——然后将这些信息记录在数据库中,以确保按时付款。
如果你用 agentic 工作流来实现这个功能,你可能会这样做:输入一张发票,然后调用一个 PDF 到文本的转换 API,将 PDF 转换成可能是格式化的文本,比如 Markdown 文本,供 LLM 读取。然后 LLM 会查看 PDF 内容并判断这到底是不是一张发票,还是其他应该忽略的文档类型。如果是一张发票,它就会提取所需的字段,并使用一个 API 或工具来更新数据库,将最重要的字段保存在数据库记录中。这个 agentic 工作流的一个方面是,它有一个清晰的流程可以遵循:识别所需字段并在数据库中记录。像这样有清晰流程的任务,对于 agentic 工作流来说往往更容易执行,因为它导向了一种相对按部就班、可靠地执行任务的方式。
示例二:基础客户订单查询(流程清晰)
这里是另一个例子,可能稍微难一点。如果你想构建一个代理来回应基本的客户订单查询,那么步骤可能是:首先提取关键信息,弄清楚客户到底订购了什么,客户的名字是什么;然后查找相关的客户记录;最后起草一份回复,供人工审查,之后再将邮件发送给客户。
这里同样有一个清晰的流程,我们会按部就班地实现它:接收邮件,将其交给一个 LLM 来验证或提取订单详情。假设客户邮件是关于一个订单的,LLM 可能会选择调用订单数据库来调取信息。这些信息随后会交给 LLM,由它起草一封电子邮件回复。LLM 可能会选择使用一个“请求审查”的工具,比如将这封由 LLM 起草的邮件放入一个队列中供人工审查,以便在人工审查并批准后发送出去。像这样的客户订单查询代理如今正在许多企业中被构建和部署。
示例三:通用客户服务(更具挑战性)
来看一个更具挑战性的例子。如果你想构建一个客户服务代理,不仅能回答关于他们下的订单的问题,还能回应更广泛的问题,即客户可能问的任何事情。也许客户会问:“你们有黑色的牛仔裤或蓝色的牛仔裤吗?” 要回答这个问题,你可能需要多次调用你的数据库 API,先检查黑色牛仔裤的库存,再检查蓝色牛仔裤的库存,然后再回复客户。这是一个更具挑战性的查询的例子,给定一个用户输入,你实际上必须规划出一系列数据库查询的顺序来检查库存。
或者,如果一个用户问:“我想退回我买的沙滩巾。” 要回答这个问题,我们可能需要验证客户是否真的购买了沙滩巾,然后再次核对退货政策。也许我们的退货政策是购买后30天内且毛巾未使用过才可退货。如果允许退货,那么就让代理生成一个退货标签,并同时将数据库记录设置为“退货处理中”。在这个例子中,如果处理客户请求所需的步骤不是预先知道的,那么它就会导致一个更具挑战性的过程,基于 LLM 的应用必须自己决定需要这三个步骤才能对这个任务做出适当的回应。但你也会学到一些关于如何处理这类问题的最新方法。
示例四:计算机使用(前沿但困难)
最后一个例子,可能是一种特别难以构建的代理类型。有很多关于代理使用计算机的研究,在这种研究中,代理会尝试使用网络浏览器并阅读网页,以找出如何执行一项复杂的任务。
在这个例子中,我要求一个代理检查从旧金山到华盛顿特区(DCA机场)的两个特定美联航航班上是否有座位。该代理可以访问一个网络浏览器来执行此任务。在视频中,你可以看到它独立地浏览美联航网站,点击页面元素并填写页面上的文本字段,以执行我请求的搜索。在工作时,代理会推理页面内容,以确定完成任务需要采取的行动以及下一步该做什么。在这种情况下,它在美联航网站上检查航班时遇到了一些麻烦,于是决定转到谷歌航班网站搜索可用航班。在谷歌航班上,你看到它找到了几个符合用户查询的航班选项,然后代理选择了一个,并被带回到美联航网站,看起来它现在在正确的网页上了,因此能够确定我所询问的航班上确实有座位。
计算机使用是目前一个激动人心的前沿研究领域,许多公司都在努力让计算机使用代理能够正常工作。虽然你在这里看到的代理最终找到了答案,但我经常看到代理在使用网络浏览器时遇到困难。例如,如果一个网页加载缓慢,代理可能无法理解发生了什么,而且许多网页仍然超出了代理准确解析或阅读的能力范围。但我认为,计算机使用代理,尽管今天还不够可靠,无法用于关键任务应用,但它们是未来发展的一个激动人心且重要的领域。
难易度总结
所以,当我在考虑构建 Agentic AI 工作流时:
- 较容易的任务:往往是那些有清晰、按部就班流程的任务。如果一个企业已经有了标准的作业程序,那么将这个程序编码成一个 AI 代理虽然可能需要很多工作,但通常实现起来更容易。如果只使用纯文本资产,也会更容易,因为 LLM 就是在处理文本中成长起来的。
- 较困难的任务:如果执行任务所需的步骤不是预先知道的,就像你看到的更高级的客户服务代理那样,那么代理可能需要边做边规划或解决问题,这往往更难、更不可预测、可靠性也更低。而且如前所述,如果需要接受丰富的多模态输入,如声音、视觉、音频,也往往比只处理文本更不可靠。
希望这能让你对可能用 agentic 工作流构建的应用类型有所了解。当你自己实现这些东西时,最重要的技能之一是审视一个复杂的工作流,并找出其中的各个步骤,以便你可以实现一个 agentic 工作流来一步步执行这些步骤。在下一个视频中,我们将讨论任务分解,也就是说,给定一个你想做的复杂事情,比如写一份研究报告或者让客户代理回复客户,你如何将其分解成离散的步骤来尝试实现一个 agentic 工作流。让我们在下一个视频中看看这个。
1.5 任务分解:识别工作流中的步骤
人和企业做很多事情。你如何将我们做的这些有用的事情分解成离散的步骤,供 agentic 工作流遵循呢?让我们来看一看。
以构建一个研究代理为例。如果你想让一个 AI 系统写一篇关于主题 X 的文章,一种方法是直接提示一个 LLM 让它生成输出。但如果你对想要深入研究的主题这样做,你可能会发现 LLM 的输出只涵盖了表面层次的观点,或者可能只涵盖了显而易见的事实,但没有像你希望的那样深入探讨主题。在这种情况下,你可能会反思一下,作为一个人,你会如何写一篇关于某个主题的文章。你会直接坐下来就开始写,还是会采取多个步骤,比如先写一个文章大纲,然后搜索网络,再根据网络搜索的输入来写文章。
当我将一个任务分解成步骤时,我总是在问自己一个问题:看看这第一、第二和第三个步骤,它们中的每一个是否都可以由一个 LLM,或者一小段代码,或者一个函数调用,或者一个工具来完成。在这种情况下,我认为一个 LLM 可以在很多我希望它帮助我思考的主题上写出一个不错的大纲。所以,第一步大概没问题。然后我知道如何使用一个 LLM 来生成搜索词以搜索网络。所以,我认为第二步也是可行的。然后基于网络搜索,我认为一个 LLM 可以输入网络搜索结果并写一篇文章。因此,这对于编写一篇比直接生成更深入的文章来说,会是一个合理的 agentic 工作流的初次尝试。
但是,如果我实现了这个 agentic 工作流并查看结果,也许我发现结果仍然不够好,它还不够深思熟虑,也许文章感觉有点脱节。这实际上发生在我身上过。我曾经用这个工作流构建了一个研究代理,但当我读输出时,感觉有点不连贯,文章的开头和中间部分感觉不完全一致,和结尾部分也不完全一致。
在这种情况下,你可能会反思,如果你作为一个人发现文章有点脱节,你会如何改变工作流。一种做法是,将第三步“写文章”进一步分解成额外的步骤。所以,你可能不会让它一次性写完文章,而是让它先写初稿,然后思考哪些部分需要修改,接着再修改草稿。这就像我作为一个人可能会做的那样,不是第一次尝试就写出最终的文章,而是先写初稿,然后再通读一遍——这是 LLM 相当擅长的另一步。然后基于我自己对我文章的批判,我会修改草稿。
回顾一下,我从直接生成开始,只有一个步骤,觉得不够好,所以把它分解成了三个步骤。然后可能觉得还是不够好,于是把其中一个步骤进一步分解成了三个更小的步骤,最终得到了这个更复杂、更丰富的文章生成过程。根据你对这个过程结果的满意度,你甚至可以选择进一步修改这个文章生成过程。
让我们看第二个关于如何将复杂任务分解成更小步骤的例子。以回应基本的客户订单查询为例。一个人类客户专员可能执行的第一步是先提取关键信息,比如这封邮件是谁发的,他们订了什么,订单号是多少。这些事情一个 LLM 都能做。所以我可以说,让一个 LLM 来做这件事。第二步是找到相关的客户记录。也就是编写并生成相关的数据库查询,来调取客户订购了什么、我什么时候发货等订单信息。我认为一个能够调用函数查询订单数据库的 LLM 应该能做到这一点。最后,调出客户记录或客户订单记录后,我可能会写一封回信发给客户。我认为有了我们调取的信息,如果我给它调用 API 发送邮件的选项,这第三步用 LLM 也是可行的。所以,这是另一个将回应客户邮件的任务分解成三个独立步骤的例子,我可以审视每个步骤然后说,是的,我认为一个 LLM,或者一个能调用函数查询数据库或发送邮件的 LLM,应该能做到。
最后一个例子,关于发票处理。在 PDF 发票被转换成文本后,第一步是提取所需信息:开票方名称、地址、到期日、应付金额等等。LLM 应该能做到。然后,如果我想检查信息是否被提取并将其保存在一个新的数据库条目中,那么我认为一个 LLM 应该能帮助我调用一个函数来更新数据库记录。所以要实现这个功能,我们实现一个 agentic 工作流来基本上执行这两个步骤。
在构建 agentic 工作流时,我把自己想象成拥有一些构建模块。一个重要的构建模块是大型语言模型,或者如果我想处理图像或音频,可能是大型多模态模型。LLM 擅长生成文本、决定调用什么、提取信息等。对于一些高度专业的任务,我也可能使用其他一些 AI 模型,比如用于将 PDF 转换为文本的模型,或用于文本转语音、图像分析的模型。
除了 AI 模型,我还可以使用一些软件工具,包括我可以调用的各种 API,用来进行语音搜索、获取实时天气数据、发送邮件、检查日历等等。我也可能有用于信息检索的工具,从数据库中提取数据,或者实现 RAG(检索增强生成),即我可以查询一个大型文本数据库并找到最相关的文本。或者我也可能有执行代码的工具,这个工具能让 LLM 编写代码,然后在你的计算机上运行这些代码,从而完成各种各样的事情。
如果这些工具对你来说有些陌生,别担心。我们会在后面的模块中更详细地介绍最重要的工具。但我认为,当我构建一个 agentic 工作流时,我的大部分工作就是观察一个人或一个企业正在做的事情,然后试图弄清楚,用这些构建模块,我如何将它们按顺序组合在一起,以执行我希望我的系统执行的任务。这就是为什么对有哪些可用的构建模块有一个很好的理解(我希望在本课程结束时你会有更好的了解)会让你能更好地构想出通过组合这些构建模块可以构建出什么样的 agentic 工作流。
总结一下,构建 agentic 工作流的关键技能之一,是审视一堆可能由某人完成的事情,并识别出可以用技术实现的离散步骤。当我看待单个离散步骤时,我总是在问自己一个问题:这个步骤能用一个 LLM,或者用我能接触到的一个工具(如 API 或函数调用)来实现吗?如果答案是否定的,我通常会问自己,我作为一个人会怎么做这一步?有没有可能把它进一步分解成更小的步骤,从而可能更容易用 LLM 或我拥有的某个软件工具来实现。
希望这能让你对如何思考任务分解有一个大致的了解。如果你觉得还没有完全掌握,别担心。我们将在本课程中讲解更多的例子,到课程结束时你会有更好的理解。但事实证明,当你构建 agentic 工作流时,你常常会先构建一个初步的任务分解和 agentic 工作流,然后你需要不断地迭代和改进它好几次,直到它达到你想要的性能水平。而要推动这个改进过程(我发现这对许多项目都很重要),关键技能之一就是知道如何评估你的 agentic 工作流。所以在下一个视频中,我们将讨论评估(evals)及其关键组成部分,以及你如何能够构建并持续改进你的工作流,以获得你想要的性能。让我们在下一个视频中讨论评估。
1.6 Agentic 评估 (Evals)
我曾与许多不同的团队合作构建 agentic 工作流,我发现,预测一个人能否做得非常好与效率较低的最大因素之一,就是他们是否能够推动一个非常规范的评估流程。所以,你为你的 agentic 工作流推动评估的能力,对你有效构建它们的能力有着巨大的影响。
在这个视频中,我们将快速概述如何构建评估,这个主题我们实际上会在本课程后面的一个模块中进行更深入的探讨。那么,让我们来看一看。
在构建了像这个用于回应客户订单查询的 agentic 工作流之后,事实证明,很难预先知道可能会出什么问题。因此,我建议不要试图预先构建评估,而是直接查看输出,并手动寻找你希望它做得更好的地方。
例如,也许你阅读了大量输出后发现,它出乎意料地提到了你的竞争对手,而且次数比应有的要多。许多企业不希望他们的代理提及竞争对手,因为这只会造成尴尬的局面。如果你读了其中一些输出,也许你会发现它有时会说:“很高兴您与我们购物,我们比我们的竞争对手 ComproCo 好得多。” 或者有时它会说:“当然,退货应该很有趣。不像 RivalCo,我们让退货变得简单。” 你看到这些可能会想,天啊,我真的不希望它提及竞争对手。
这是一个在构建此 agentic 工作流之前很难预见到的问题的例子。因此,最佳实践是先构建它,然后检查它以找出它还不令人满意的地方,接着找到评估以及改进系统的方法,以消除那些仍然不令人满意的地方。
假设你的企业认为以这种方式提及竞争对手是一个错误,那么当你努力消除这些提及竞争对手的言论时,一种跟踪进展的方法是添加一个评估(eval),来追踪这个错误发生的频率。所以,如果你有一个明确的竞争对手名单,比如 ComproCo、RivalCo、the other co,你实际上可以编写代码,在你的输出中搜索它多久会按名称提及这些竞争对手,并统计出一个数字,作为总回复数的一个比例,看它错误地提及竞争对手的频率是多少。
关于提及竞争对手这个问题,一个好处是它是一个客观的指标,意味着要么提到了竞争对手,要么没有。对于客观标准,你可以编写代码来检查这种特定错误发生的频率。
但因为 LLM 输出的是自由文本,你想要评估这个输出的标准中,也总会有一些更主观的,很难仅仅通过编写代码来输出一个非黑即白的分数。在这种情况下,使用 LLM 作为评判者(LLM as a judge)是一种评估输出的常用技术。
例如,如果你正在构建一个研究代理来对不同主题进行研究,那么你可以使用另一个 LLM,并提示它,比如说:“请为以下文章评定一个1到5分的质量分数,其中1分最差,5分最好。” 这里,我用一个 Python 表达式来表示把生成的文章复制粘贴到这里。所以,你可以提示 LLM 阅读文章并给它评定一个质量分数。然后我会让研究代理写几篇不同的研究报告,例如,关于黑洞科学的最新发展,或者用机器人收割水果。在这个例子中,也许评判 LLM 给关于黑洞的文章评了3分,给关于机器人收割的文章评了4分。随着你努力改进你的研究代理,希望你能看到这些分数随着时间的推移而上升。
顺便说一下,事实证明 LLM 实际上并不那么擅长这种1到5分的评级。你可以试一试,但我个人倾向于不怎么使用这种技术。但在后面的模块中,你会学到一些更好的技术,让 LLM 输出比要求它在1到5分制上输出分数更准确的分数,尽管有些人会这样做,可能作为一种初步的“LLM 作为评判者”类型的评估。
为了预告一下你将在本课程后面学到的一些 Agentic AI 评估方法:你已经听我谈过如何编写代码来评估客观标准,比如是否提到了竞争对手;或者使用 LLM 作为评判者来评估更主观的标准,比如一篇文章的质量。但之后,你会学到两种主要的评估类型:一种是端到端评估,你衡量整个代理的输出质量;以及组件级评估,你可能衡量 agentic 工作流中单个步骤的输出质量。事实证明,这些对于推动你开发过程的不同部分都很有用。
我经常做的另一件事是,检查中间输出,有时我们称之为 LLM 的“轨迹”(traces),以了解它在哪些方面没有达到我的期望。我们称之为错误分析,即我们通读每一步的中间输出,试图发现改进的机会。事实证明,能够进行评估和错误分析是一项非常关键的技能。所以我们将在本课程的第四个模块中对此有更多的阐述。
我们即将结束第一个模块。在继续之前,我只想与你分享我认为构建 agentic 工作流最重要的设计模式。让我们在下一个视频中看看它们。
1.7 Agentic 设计模式
我们通过将构建模块组合在一起,以序列化这些复杂的工作流来构建 agentic 工作流。在这个视频中,我想与你分享一些关键的设计模式,这些模式是关于你如何思考将这些构建模块组合成更复杂工作流的方法。让我们来看一看。
我认为构建 agentic 工作流的四个关键设计模式是:反思(reflection)、工具使用(tool-use)、规划(planning)和多代理协作(multi-agent collaboration)。让我简要介绍一下它们的含义,然后我们实际上会在课程的后面深入探讨其中的大部分内容。
1. 反思 (Reflection)
第一个主要的设计模式是反思。我可能会让一个 LLM 代理编写代码,结果 LLM 可能会生成像这样的代码。它在这里定义了一个 Python 函数来执行某个任务。然后我可以构建一个这样的提示:“这里是为某个任务编写的代码”,然后把 LLM 刚刚输出的内容复制粘贴到这个提示中。接着我让它“仔细检查代码的正确性、风格和效率,并给出建设性的批评”。事实证明,用这种方式提示的同一个 LLM 模型可能能够指出代码中的一些问题。如果我再把这个批评反馈给模型说:“看起来这里有个 bug,你能修改代码来修复它吗?” 那么它实际上可能会给出一个更好版本的代码。
预告一下工具使用,如果你能运行代码并看到代码在哪里失败,那么将这个信息反馈给 LLM 也能促使它迭代并生成一个好得多的,比如说,v3(第三版)的代码。所以,反思是一种常见的设计模式,你可以让 LLM 检查它自己的输出,或者可能引入一些外部信息源,比如运行代码看看是否会产生任何错误信息,并以此作为反馈再次迭代,从而得出其输出的一个更好版本。这种设计模式并非魔术,它不会导致所有事情百分之百成功,但有时它能很好地提升你系统的性能。
现在,我把它画得好像是我在提示单个 LLM,但为了预示多代理工作流,你也可以想象不是让同一个模型自我批评,而是可以有一个“批评家代理”。它就是一个被提示了类似指令的 LLM:“你的角色是批评代码,这里是为某个任务准备的代码,请仔细检查代码等等。” 第二个批评家代理可能会指出错误或运行单元测试。通过让两个模拟的代理(每个代理都只是一个被提示扮演特定角色的 LLM)来回交互,你可以让它们进行迭代,从而得到更好的输出。
2. 工具使用 (Tool Use)
除了反思模式,第二个重要的设计模式是工具使用。如今,LLM 可以被赋予工具,即它们可以调用的函数,以便完成工作。例如,如果你问一个 LLM:“根据评论者的说法,最好的咖啡机是什么?” 并给它一个网络搜索工具,那么它实际上可以搜索互联网来找到好得多的答案。或者一个代码执行工具,如果你问一个数学问题,比如:“如果我投资100美元并获得复利,最后我会有多少钱?” 那么它可以编写并执行代码来计算答案。
如今,不同的开发者已经给了 LLM 许多不同的工具,涵盖了从数学或数据分析,到通过从网络或各种数据库获取信息来收集信息,再到与生产力应用(如电子邮件、日历等)交互,以及处理图像等等。LLM 能够决定使用什么工具(即调用什么函数),这让模型能够完成更多的工作。
3. 规划 (Planning)
四个设计模式中的第三个是规划。这是一个来自一篇名为 Hugging GPT 的论文的例子。在这个例子中,如果你要求一个系统:“请生成一张图片,一个女孩在读书,姿势和一个男孩在图片中的姿势相同,然后请用你的声音描述新图片。” 那么一个模型可以自动决定,要执行这个任务,它首先需要找到一个姿态确定模型来弄清楚男孩的姿态;然后进行姿态到图像的转换,生成一个女孩的图片;接着是图像到文本的转换;最后是文本到语音的转换。
所以在规划中,LLM 决定了它需要采取的行动序列。在这种情况下,它是一个 API 调用的序列,以便它能够按正确的顺序执行正确的步骤序列,从而完成任务。所以,不是由开发者预先硬编码步骤序列,而是让 LLM 自己决定要采取哪些步骤。今天能够进行规划的代理更难控制,也更具实验性,但有时它们能给出非常令人惊喜的结果。
4. 多代理工作流 (Multi-agent Workflows)
最后是多代理工作流。就像一个人类经理可能会雇佣一些人来共同完成一个复杂的项目一样,在某些情况下,你可能会考虑雇佣一组多个代理,每个代理可能专注于不同的角色,并让它们共同协作来完成一个复杂的任务。
你在这里左边看到的图片来自一个名为 ChatDev 的项目,这是一个由钱晨(Chen Qian)及其合作者创建的软件框架。在 ChatDev 中,多个具有不同角色的代理,如首席执行官、程序员、测试员、设计师等,像一个虚拟软件公司一样协同工作,可以协作完成一系列软件开发任务。
让我们考虑另一个例子。如果你想写一本营销手册,你可能会考虑雇佣一个三人团队,比如一个研究员做在线研究,一个营销人员撰写营销文案,最后是一个编辑来编辑和润色文本。所以,类似地,你可能会考虑构建一个多代理工作流,其中你有一个模拟的研究代理,一个模拟的营销代理,和一个模拟的编辑代理,它们共同来为你执行这个任务。多代理工作流更难控制,因为你并不总能提前知道代理们会做什么,但研究表明,对于许多复杂的任务,包括像写传记或决定在棋局中下哪一步棋这样的事情,它们可以带来更好的结果。你也会在本课程的后面学到更多关于多代理工作流的内容。
那么,希望你现在对 agentic 工作流能做什么,以及找到构建模块并将它们(或许通过这些设计模式)组合在一起以实现 agentic 工作流所面临的关键挑战,有了一个概念。当然,还有开发评估方法,这样你就能看到你的系统表现如何,并不断改进它。
在下一个模块中,我想与你深入探讨这些设计模式中的第一个,即反思。你会发现,这是一种实现起来可能出乎意料地简单,但有时能给你的系统性能带来非常好的提升的技术。那么,让我们进入下一个模块,学习反思设计模式。