基于API的AI代理構(gòu)建模式:打造更智能系統(tǒng),避開框架繁雜流程
照片由 julien Tromeur 的 Unsplash 拍摄
我们与各行各业的数十支团队合作,构建LLM代理程序。最成功的项目采用简单且模块化的模式而不是复杂的框架。—— Erik Schluntz 和 Barry Zhang
让我们面对现实——编程框架就像那些小资、价格过高的咖啡馆。是的,它们很舒适,让你觉得自己很酷,但你真的希望咖啡师为你冲泡咖啡吗?不需要。你可以在家里按自己的喜好调制,不需要额外花费或排队等待。
对于构建AI代理来说也是这样。你并不一定要使用LangChain、Haystack或其他重型拖放库来完成任务。你需要直接调用API,一些创意,再加一杯咖啡提神。
借鉴了Anthropic最新博客文章中关于AI代理模式的讨论(非常感谢他们的团队提供这个思路),我决定自己动手搭建完全自主的系统——没有借用任何现成的框架,也没有多余的层级,完全依赖于API驱动的魔力。你知道吗?这不仅可行,而且非常有力量和赋能。
为什么你应该关心代理模式(Agentic Patterns)?让我们先停一下,在我们详细讨论之前,先解释一下为什么我们需要代理模式。
AI代理真的很棒,但代理模式简直是魔法般的存在。你可以把代理模式想象成蓝图,用于创建可反复使用的智能、自主系统。与其只是创建只能使用一次的单一机器人,你是在设计可以学习和改进、随着时间推移变得更好的工作流程。
例如,考虑一个客服代表解答常见问题,回顾以往案例,寻找投诉模式,并主动提出产品开发的新想法。数据处理专员还可以发现异常情况并预测趋势,这些发现可以转化为无需持续人工干预的实际行动。
代理式架构的力量在于其可扩展性和灵活性。它们让你能够创建随你一起成长,而不受当前框架局限性限制的系统。
为什么不用框架的Go?那么你可能会想:如果有框架可以简化我们的生活,为什么不使用它们呢?
实际上,框架是有帮助的——它们简化了复杂性,提供了现成的模块,并且通常拥有强大的社区支持力量。然而,它们也有妥协之处。框架也会变得臃肿和僵化,有时对于简单的项目来说可能过于庞大。它们增加了额外的开销,隐藏了底层的细节,并且限制了你对系统进行定制的自由。
你可以通过绕过框架并依赖直接的API来完全掌控你的AI代理。你可以优化性能、自定义系统,并轻松调试,而且清楚地了解系统的每一步运作。这就像自己动手磨咖啡而不是依赖星巴克——你可以自由选择咖啡的浓度、口味和冲泡时间,而不需要依赖任何人。
我们必须首先理解使我们理解代理行为模式的基本组成部分。Anthropic的博客文章解释了这些模式,我们将在下面应用这些模式。我们将使用OpenAI SDK和NodeJS直接与大语言模型(LLMs)沟通。
构建模块AI代理——或者我更喜欢称之为工作流代理——的整个目的就是让计算机帮我们做繁重的工作。我们不仅仅希望它们坐在那里给我们指令,而是希望它们卷起袖子自己动手。想象一下有一个私人助理不是给你列个待办事项,而是帮你完成这些事项。这不就是梦想吗?
要做到这一点,我们得退一步想想,作为人类我们是怎么工作的。我们不会突然间变成无所不知的——我们会搜索信息,做事,并从过去的经历中学到东西。如果我们能够为AI助手提供必要的能力——搜索、执行任务、记住之前做的事,我们就成功了一大半。
这是增强LLM的概念发挥作用的地方。大型语言模型本身就很有趣,但它们还不足以称霸世界。它们更像是一个知识丰富但需要指导才能完成任务的聪明的实习生。赋予它们特定的超能力,可以使它们成为能够独立运作的完整代理,从而让我们的生活变得更简单。
扩展一个LLM意味着什么?增强一个大型语言模型不仅仅是让它生成文本,更是让它从一个被动的对话者变成一个积极的问题解决者。
面对这个事实吧——没有人类甚至LLM能做到无所不知。让你的代理上网或查询数据库,这样你的代理就能获取全世界的知识。要查看当前股价吗?需要调出某个客户的购买记录吗?一个具有搜索功能的代理可以几秒钟内搞定这些事情。
一个只会聊天的LLM就像一个只会写菜谱但不会实际下厨的厨师。要让它真正发挥作用,它必须能够做一些事情。这意味着需要添加API和功能,让代理能够执行实际操作——比如发送邮件、更新电子表格,甚至操控智能家居设备中的物联网功能。
除了这些之外,还有纯版LLM最实质性的限制之一是它们没有记忆。它们就像金鱼一样,每分钟都是新的,每次遇到新事物就像初次一样。有了记忆,你的代理就会记住过去的行为并从中学习,并在时间的推移中建立上下文。这对于处理复杂的多步骤工作流程至关重要。
基本的LLM调用说明好的,现在让我们进入最精彩的环节——编码。假设你已经知道如何在这里调用大模型了。但为了快速回顾基础知识,我来给你简单介绍一下。这里没有花哨的东西,只有最必要的内容。
直接调用大模型其实很简单。无论是OpenAI、Hugging Face、Anthropic还是其他供应商,步骤差不多:先认证,提交提示,然后接收回复。
例如,对于 OpenAI,你需要安装你的 API 密钥,创建你的提示,然后发起一个完成请求。Hugging Face 呢?加载一个模型,给它一些文本,让它处理并输出结果甚至更简单。Anthropic 的产品类似,但有一些对其 API 格式的调整。
别误会,用Gemini做LLM时,它有丰富的免费版本,并且适合用来搭建和测试代理。
结构化结果让我们来讨论一个被低估但值得重视的话题:结构化输出。在使用大型语言模型时,并不总是需要得到一大段文字的回复。有时你可能希望得到更整洁、更易预测、更易操作的结果——例如 JSON、XML 或一个简单的旧式列表。这就是结构化输出大显身手的地方。
想想这一点。如果你要构建一个能够做决策、读取信息并与其他计算机交流的AI代理,你不能接受不规范的文本。你需要干净的机器可读格式才能进入流程的下一步。
比如,当你在做天气机器人时,LLM 不只是简单地说“晴天,最高温度75度”,它还可以这样回答:“天气将会是大晴天,最高温度75度。”
{
"天气": "晴",
"温度": "75度",
"单位": "F"
}
这种结构化的结果使其易于解析处理、存储或用于后续任务。无需编写复杂的正则表达或自然语言处理逻辑来提取信息——信息已经为你整理好了。
所有现有的大型语言模型都具有即插即用的结构化输出功能。你可以通过修改提示或使用功能,如函数调用(OpenAI)或自定义模板,让模型以特定格式返回答案。引导模型按照以下格式回答,并提示:“嘿,别只是闲聊——请按这种格式回复。”
这更关键的是优化和创新你的AI代理。优化你的预测输出,你的代理就能更好地完成更复杂任务,更好地与其他系统融合,从而带来更多价值。
使用工具AI记笔记的代理类似于生成文本的AI代理。它们自然是很有帮助的没错,但不会亲自动手干活。也正是借助这些工具,让你的代理不再是被动的观察者,而是变成一个积极参与者。
工具是代理可以调用的外部的动作或API,用来使某些事情发生。需要读取数据库中的数据吗?工具可以完成这个任务。想发送电子邮件或填写电子表格吗?工具也可以做到这些。它们是代理抽象和现实世界的连接。它们是代理功能与现实世界之间的桥梁。
例如,比如你正在构建一个客户支持代理机器人或代理。与其只是提出建议,它不仅可以提出建议,还能解决问题、提供信息等。
- 从API获取客户的购买记录。
- 实时查看库存情况。
- 自动跟进并处理退款。
这里的魔力在于整合。将你的LLM与这些网站连接起来,让它不仅能够思考,还能行动。这就像你从一个只告诉你去哪里的GPS,升级到了一个能为你开车的车(特斯拉的自动驾驶功能)。
当今大多数现代大型语言模型都实现了这种功能。你指定工具以及希望它们完成的任务,你的代理会决定何时以及如何执行这些任务。这不仅仅是写出每一步,而是给你的代理提供创造解决方案的方式。连接必要的工具,剩下的就交给你的代理吧。当你的代理不仅能说话,还能付诸行动时,这才是真正强大的标志。
当我们提到调用工具时,这不仅仅是指调用API或函数。它让代理去查找知识库、数据库或向量数据库。可以把它看作你代理工具箱里的一个额外工具,比如发送邮件或获取数据。
例如,当代理回答客户的问题,比如“我的订单在哪里?”时,它不会去猜测或捏造,而是查询知识库有关用户订单的信息,检索正确的信息并应用于创建准确的回答。这与调用一个函数或使用RAG并没有太大区别。它是在恰当的时刻提供正确的信息。代理需要获取信息;它通过API、数据库或文档获取信息。当你将知识库搜索功能与其它技术集成时,你的代理不仅仅是在回答问题;它在解决问题,做出决策,并不断改进它的学习能力。你正在为你的团队提供更强的记忆力和开启宇宙的钥匙。
工作流程模式 提示链提示链是那种一旦你开始用,它就会成为你唯一合理的选择。你构建一个个小步骤,而不是让LLM一次完成一个大任务。一步步地,每个步骤都让模型更接近你的目标。就像拼图游戏一样,一块一块地拼起来。
例如,如果你正在创建一个帮助客户规划假期的代理,与其给模型一个长指令,比如“计划一个包括机票、住宿和活动的五日日本之旅”,不如分步进行。首先,你可以输入“日本有哪些最好的旅游地点?”在得到这个列表后,你可以输入“去东京的最佳航班是哪些?”接着,输入“帮我查找东京三晚的酒店”,最后,输入“给我东京的一日行程”。
这种方法不仅对模型来说更简单,而且对你来说也是如此。通过将工作分解成更小的部分,你获得了更好的控制。如果你犯了错误,你可以重新设定后续提示或退回并修正最后一步。这就像聊天一样,你可以设置氛围和方向,同时继续进行。
第二个好处是灵活性。添加、删除和重新排列提示链中的步骤非常简单。你可以随时插入预算步骤或重新考虑并调整之前的回答。这是一个非常灵活的过程,能够根据你的需求进行调整。
这是一种简单自然的方法,用来处理复杂任务,也是我们自然而然完成任务的方式——一步步来,过程中留有调整的余地或空间。
门控当你创建一个AI代理时,对它能完成的事情感到兴奋是很容易的——回答问题、提取数据、完成任务。但更重要的是它如何理解该做什么和何时去做。这便是门控机制发挥作用的地方。它是在你的代理工作流程中创建决策点或检查点,以确保不偏离正轨,不会浪费时间和走错路。
想象一下:你在迷宫中的代理。没有门时,它会盲目地前进,转弯,希望一切顺利。有了门后,它会在十字路口停下来观察,决定是继续前进、绕圈,还是放弃。这样很容易让代理的旅程变得更聪明和高效。
例如,在客服代理被询问的情况下。如果问题不容易回答,它会先要求提供更多细节再回答。或者,如果在请求数据库时没有得到任何信息,它可能会崩溃并告诉你,而不是在没有所有信息的情况下继续进行。
门控在复杂的工作流程中很有帮助,因为在这些流程中,一个错误可能会破坏整个工作。想象一下处理发票的工作人员。工作人员可以在每个步骤上设置流程管控,例如错误检查或缺少字段,比如提取、验证并传递给会计。如果有问题,它会进行流程管控并提醒相关人员,而不是继续进行并造成混乱。
门可能只是简单的两个条件检查,也可能复杂到一个决策模块。在必要时创建这样的门是必要的,这样你的代理人才会更智能,而不是尽职尽责。更多考虑它是如何做出决策的,而不是仅仅考虑它会做什么。使用门控可以让你的代理更轻松有效地保持正确的方向。
路由选择好的,我们现在来谈谈路由——因为即使是AI代理也需要一点指导。路由是系统的GPS,悄悄地把任务、查询和信息在适当的时间送到正确的地方。虽然它不显眼,但它能确保你的代理不会陷入困境或迷路。
当一个任务进来时,你的代理并不会盲目地决定该做什么。它会停下来(打个比方)想一想:“我是不是该调用API?还是把这个任务交给另一个代理处理?还是我自己来处理?” 路由会决定这些选择,把每个任务送到该去的地方。
例如,如果你正在创建一个客户支持代表的角色,用户问:“我的账户余额是多少?” 客服代表回答:“计费API已就绪。” 但如果用户问:“有什么不错的面条食谱吗?” 它可能会将这个问题发送到食谱数据库,或者让LLM直接回答。这一切都是关于如何将任务分配到合适的工具或路径中。
路由之所以如此引人入胜,是因为它非常灵活。你的代理不受固定脚本的束缚,可以灵活应对。一个代理可以在一分钟内获取数据,下一分钟生成报告,再下一分钟生成邮件。路由帮助你的代理明白每个任务应该发送到哪里,不论这些任务多么随机。
好消息是,路由并不一定要复杂。它可以简单到一些“if-else”条件判断,LLM调用请求,或者进化成根据过去行为选择最佳路径的机器学习模型。目标是让它足够灵活,让你的代理能够应对各种任务。虽然路由不是台前的明星,但幕后英雄是它让这一切成为可能。它是决策者,问题解决者,是让代理保持一致的粘合剂,确保一切顺利进行。说实话,正是这一点让它如此重要。
并行处理:分段分段处理非常棒,如果你将任务拆分成可以并行运行的子任务,这可以为你的AI代理提供很好的加速效果。这个想法很简单:将一个巨大的任务拆分成微小且独立的部分,并让代理同时处理这些部分。这就像让许多专家一起合作,每人负责一部分任务。
LLM运行得更好,如果每个子任务都有自己的调用。不需要让一个LLM处理多个问题,而是让每个调用专注于一个方面。这提高了准确性,使整个流程更快且更有效。
例如,假设你正在创建一个系统,在该系统中,一个LLM实例处理最终用户的问题,而另一个则负责过滤有害内容或请求的防护措施。这样做比让一个LLM同时处理防护和回答问题要好。通过将工作分配给两个LLM,可以充分发挥每个LLM的优势,从而获得整体高质量的结果。
另一个很好的例子是评估大型语言模型(LLM)的表现。与其进行一次LLM调用来同时测量所有内容,不如通过多次调用来测试模型在给定提示方面的不同方面。一次调用用来测试事实,另一次测试语气,另一次测试相关性。这样并行测试这些方面不仅加快了流程,还能让你获得更细致、更可操作的反馈。
分段不仅仅是把工作分成更小的部分,更重要的是让这些部分并行运作,从而实现最高效的运作。如果运用得当,它能极大提升速度、准确性和表现。
并行投票很多时候,一次完成某项活动是不够的。这时就可以通过投票来解决。这其实只是反复做同样的任务,以获得不同的结果或不同的视角,特别是在你需要更有把握的时候。不妨考虑向专家寻求意见——每个人都有不同的看法,这会给你一个更可靠的答案。
投票对于那些涉及很多因素的复杂问题(如平衡准确性和危险性)很有帮助。比如说,你在检查代码的安全漏洞。你可以多次调用模型,对代码中的各个问题进行逐一分析,每个调用检查一种特定漏洞。如果只有一个调用返回有问题,你就知道这个问题值得进一步调查。
另一个很好的应用场景是判断内容是否不合适。你可以设置几个提示来评估不同的方面——语气、语言或语境,并设置不同的投票门槛来平衡误报和漏报。一个提示用来识别冒犯性的语言,另一个用来识别敏感话题,还有一个用来识别一般性的语境。通过综合它们的结果,你将得到一个更细致和准确的判断。
投票非常强大,因为它为你的AI代理的决策过程增加了深度和可预测性。你不再局限于单一的回复,而是汇集多种回复,减少错误,提高对结果的信心。这就像在做一个艰难决定时向几位朋友寻求建议一样——每个人都会提供一些独特且不同的建议,共同为你提供更广阔的视角。利用投票来获取多样化的结果,比较它们,从而做出更明智的决策。这虽然只是一个简单的想法,但却是开发一个你可以信赖的代理过程中的巨大飞跃。
编排器-工作者考虑这种情况:你有一个杂乱的项目,不知道从哪里开始。这就是编排器和工人的工作流程。你有一个项目经理(编排器),它把杂乱的项目分解成更小、更易管理的部分,并将其分配给一组专家(工人)。有了他们,你可以高效且快速地搞定项目。
那就是编排器LLM大显身手的时候。它没有任何既定目标,只是根据情况做决定。它接手任务,决定如何拆分任务,并将每部分交给一个LLM工作者处理。工作者们就开始行动,而编排器则把它们整合成一个完整的成品。
例如,如果你正在创建一个需要对代码进行复杂编辑的工具,调度器会分解任务,识别需要修改的文件,并分配给每个任务执行者。任务执行者执行各自的任务,调度器整合变更。
搜索任务需要从多个来源获取并审查信息。协调者可能需要找到最合适的资料来源,并将每个来源分配给一个工作者查询和总结,从而形成一个简单的解决方案。
这个工作流非常灵活。与并行化不同,其中任务是预先指定并同时运行,编排器-工人模式能够灵活应对任务。大脑和肌肉协同合作,高效、明智且顺畅地完成任务。
评估师-优化师有时,正在进行的事情还不够充分。你希望它们做得更好一些。这个工作流程就是检查AI代理提供的内容,改进它,让它尽可能完美无缺。感觉就像是有一个编辑在指出不足并帮助你改进一样。
那就是这样运作的:最初,检查者介入。它检查输出,发现错误,并查看输出是否符合任务标准。它们就像质量控制部门,给一切都确定了形状。检查者检查完毕后,优化器接着登场。根据其反馈,它调整、打磨并优化输出。二者合作,把好结果变为出色的结果。
例如,如果您正在开发编写营销文案的AI,审阅者会检查语气、清晰度和相关性等方面。同时,改进者会让语言更有吸引力和说服力。或者如果您正在开发代码助手,审阅者可以发现潜在的错误或低效,而改进者会清理和优化代码。
不采用第一个草稿,你会不断迭代并优化,直到输出尽可能好。系统中有一个反馈回路,因此你的代理会不断改进。构建一个质量至关重要的AI代理——无论是写作、编程还是其他任务——评估和优化的过程就是你的方法所在。重点在于做得好,而不仅仅是完成任务。
我们经历了一段疯狂的旅程,穿过了API优先的AI代理模式领域。我们从提示链和并行处理转向了编排者-工作者模式和评估者-优化器模式。当然,也少不了路由、分段和表决——因为谁不爱多线程处理的AI呢?
坏消息是说,你不需要一个完善的框架来完成这一切。通过直接的API,一些创意和想象力,再加上很多咖啡也许也是必要的,你可以写出像你想象的那样聪明、快速和友好的AI代理。如果你正自动化支持、处理信息或开发重要的编码工具,这些模式能帮助你实现它。
我已经包含了一些代码样本 (感谢 OpenAI SDK 和 Node.js 开发者!) 来帮助你入门,但真正的窍门是将这些想法融入到你的项目中。我们(我和 Anthropic 的作者)所概述的模式就像乐高积木一样——拼装、自定义并创造出你自己的东西。
在我们离开之前,先感谢 Anthropic 博客和团队 的启发。他们的想法是点燃整个项目的火花,让这个项目得以启动。如果你还没看过,不妨去看看他们的文章,真是思想的宝库,非常值得一读。
所以,接下来呢?由你决定。先看看这些模式,打开你的IDE,开始编码吧。无论你是编程老手还是刚开始接触人工智能,现在正是尝试、改进并创造出惊人成果的绝佳时机。
嘿,比如说,如果你完成了了不起的作品或成就,就和全世界分享。因为这一过程最好的部分并不是你创造了什么——你还会激励他人共同进步。所以去创造吧。塑造AI代理的未来就看你的了——真的,这将会非常酷。
参考:共同學(xué)習(xí),寫下你的評(píng)論
評(píng)論加載中...
作者其他優(yōu)質(zhì)文章