14 如何设计Autonomous Agent应用?(上)
你好,我是李锟。
这节课是我们这门课程“进阶篇”的第一课。在前面“入门篇”的课程中,我们已经掌握了四种 LLM 开发框架(三种 Autonomous Agent 开发框架 + 一种自动提示词工程开发框架)的使用方法。在 01 课中我说过,没有足够的“术”的积累,很难真正地领悟“道”。既然我们现在已经掌握了足够的“术”,此时有必要做一下提炼,把这些“术”提炼为一些“道”,也就是更为抽象、通用的知识。
我们学习这门课的目标是开发真正独立自主、具有高度智能的 Autonomous Agent 应用(以下称为“自主型智能体”),那么我们所提炼的“道”自然也是围绕这个目标来开展。而且应该采用一种“自顶向下,逐步求精”的方法,这个方法就是结构化程序设计(structured programming),如果你学过数据结构课程的话应该对这个方法很熟悉。
自主型智能体的主要特点
现在业界太多的人喜欢把“智能体”作为时髦挂在嘴边,为了避免人云亦云夸夸其谈,首先我们需要深入理解自主型智能体的特点。第一点要厘清的就是自主型智能体与传统应用的区别。
自主型智能体与传统应用的区别
在 01 课中,我曾经将 Autonomous Agent 与 ChatBot 做了一些对比,它们之间的两个主要区别是自动化和自主性的程度。虽然自动化是自主型智能体的一个重要特点,然而自动化并非自主型智能体与传统应用的本质区别,因为传统应用也可以高度自动化。自主型智能体与传统应用的本质区别在于高度的自主性。
- 自主型智能体:系统是柔性的,由 AI 算法驱动。应用编码完成后,仍然可以持续接收反馈,有能力做自动调优。
- 传统应用:系统是刚性的,通过硬编码实现,无 AI 算法。应用编码完成后,流程无法改变,没有能力做自动调优。
现代 AI 技术(以深度强化学习 DRL 为代表,包括 LLM 在内)的伟大之处,在于能够利用这些技术编写新型的算法,这些算法能够根据外界反馈来调整和改变应用的行为。
自主型智能体是由 AI 驱动的自动化应用系统,可以通过实时感知外界信号(通过传感器或用户输入)并做出响应,来优化应用的处理和工作流程。传统的自动化应用可能很脆弱,需要人类不断地监督和干预。而自主型智能体以可解释的方式提供了更接近人类的决策能力,同时还可以帮助人类获得重要的工业技能。
自主型智能体区别于传统自动化应用的一个独特特性是,它能够从“所见所闻”中学习,并制定管理决策。此外,成功地构建自主型智能体,应该是团队行为,不可单打独斗。
构建自主型智能体需要团队协作
只有极少数的 AI 专家能够独自从零开始构建自主型智能体。设计强大的自主型智能体,需要 AI 专家(熟悉 AI 算法)、应用开发专家(熟悉编程和领域模型设计)、领域专家(熟悉业务流程)的通力协作,三者缺一不可。
设计构建自主型智能体的过程是一个不断探索和学习的过程,可能会充满艰辛。AI 技术的专家不等于特定领域解决方案的专家,开发者需要对超出自身专业知识范围的系统和流程拥有极大的好奇心,保持“空杯心态”非常重要。
自主型智能体运行环境分析
在 01 课中我还说过,脱离具体的业务需求和运行环境,大谈特谈某种技术或架构的优势,其实就是在耍流氓。我们需要设计开发的是复杂的自主型智能体,因此我们需要深入理解这一类应用会运行在怎样苛刻的环境之中。
在入门篇中我们开发的 24 点游戏智能体,是一个简单的自主型智能体,通过开发这个应用,可以帮助我们快速掌握各种开发框架的使用方法。不过这个应用是很简单的,自动化程度很有限。真正有客户愿意付钱请我们开发的自主型智能体都是很复杂的,在自动化、可用性、安全性等方面的要求会很高。自主型智能体的复杂性很大一部分在于其苛刻的运行环境。
边缘云运行环境分析
自主型智能体最复杂的运行环境是那些苛刻的工业场景,这些场景往往都与复杂的边缘计算(Edge Computing)系统有关。在这样的边缘计算场景中,整个系统可划分为中心云-边缘云-终端设备三部分。
终端设备可能数量庞大,资源(CPU、内存、外存、带宽)极为有限,现阶段并不适合运行自主型智能体。而将自主型智能体运行于中心云,响应速度缓慢,容易因高并发造成性能瓶颈,还需要将大量数据上传到中心云(可能会泄漏企业机密)。因此在边缘计算场景中,最适合运行自主型智能体的位置就是边缘云。
边缘云这个运行环境具有以下特点:
- 需要高度的实时性:应用能够实时处理终端设备上报的消息,控制终端设备的处理。
- 必须支持高可用性:应用需要确保 4个9 以上的高可用性。
- 需要持续改进:应用需要根据搜集的运行数据,持续更新进步。
- 安全性要求高:边缘云机房的安全防护远低于中心云,更容易遭受黑客攻击。
- 与中心云相比,系统资源有限:硬件配置远低于中心云,无法运行大规模 K8s 集群。
- 与中心云的网络连接能力有限:并非 24x7 的稳定高速宽带连接。
- 供电可能不稳定:存在偶尔断电的风险。
因为需要高度的实时性,所以边缘云服务器需要使用轻量级集群(比 K8s 集群更为轻量级)等技术来确保在流量高峰期间具有足够的处理能力。运行于边缘云服务器上的自主型智能体作为一个服务,应该做到完全无状态,也就是在服务器端完全不保存客户端的会话状态(session state)。做到无状态是确保服务可伸缩性的基础,这样服务才能做到线性的水平扩展(scale out)。
因为必须支持高可用性,自主型智能体必须有很强的容错和故障恢复能力,确保在各种极端情况下应用都不会宕机崩溃,最糟糕的情况下也可以远程重启。而且需要做好各种备份,确保即使在最糟糕的重启情况下,也能够做到断点恢复。另外还应确保与中心云有多种网络连接手段,包括有线宽带网络、无线蜂窝网络、卫星通信网络。在一种网络连接手段完全失效时,可切换到价格较高的另一种网络连接手段。
因为需要持续改进,确保可靠的应用联机升级能力至关重要。此外,自主型智能体即使在没有升级的情况下,也应该有能力根据运行状态和搜集的运行数据来开展一些度量,根据度量数据来做自我调优。
因为安全性要求高,访问自主型智能体需要严格的身份认证和授权管理。安全性方面的工作包括:
- 操作系统本身的访问控制。
- 通过网络端口访问自主型智能体的访问控制。
- 网络传输通道的加密(使用 HTTPS 或更轻量级的 CoAP、MQTT 协议)。
- 对于自主型智能体所使用的数据库(SQL、NoSQL、向量数据库)的访问控制。
- 数据库中敏感数据的加密。
- 在服务器部署可靠的入侵检测系统,及时检测到黑客入侵行为。
因为与中心云的网络连接能力有限,自主型智能体无法随时访问云端的 LLM。另外因为系统资源有限,也无法在本地部署使用尺寸较大的 LM,部署使用小尺寸的开源 LM 是唯一可行的选择。目前业界对于何谓大语言模型、何谓小语言模型并没有固定标准。在我看来,14b 以下的 LM 就可以划入小语言模型。以我们熟悉的 qwen2.5 来举例,使用 ollama 部署的 qwen2.5:7b 版本文件尺寸是 4.7GB,qwen2.5:14b 版本文件尺寸是 9.0GB。
对于供电不稳定的情况,除了边缘云机房应改善供电环境外,从自主型智能体本身来说,需要做好各种备份。确保即使在最恶劣的长时间断电情况下,在供电恢复后可以做到断点恢复。
企业私有云/局域网运行环境分析
第二个自主型智能体的典型运行环境是位于企业私有云或局域网中的服务器。这个运行环境具有以下特点:
- 需要高度的实时性:应用能够实时处理终端设备上报的消息,控制终端设备的工作。
- 需要持续改进:应用需要根据搜集的运行数据,持续更新进步。
- 与中心云相比,系统资源有限:硬件配置远低于中心云,无法运行大规模 K8s 集群。
- 与中心云的网络连接能力有限:并非 24x7 的稳定高速宽带连接。
我们可以把这个运行环境看作是条件更好的边缘云环境,因此上述对于边缘云环境的讨论同样适用。
客户端设备运行环境分析
第三个自主型智能体的典型运行环境是性能较强的客户端设备,包括 PC 机和高端智能手机。这个运行环境具有以下特点:
- 需要持续改进:应用需要根据搜集的运行数据,持续更新进步。
- 安全性要求高:比边缘云更容易遭受黑客攻击,还有各种木马和病毒的攻击。
- 系统资源有限:硬件配置远低于中心云和边缘云
除了安全性的要求与边缘云环境不同外,上述对于边缘云环境的讨论同样适用。
从安全性和应用升级成本两个角度来考虑,我通常不建议把复杂的自主型智能体开发为纯客户端应用。只有那些简单的自主型智能体才适合开发为纯客户端应用。不过谁会买单呢?
除了上述这些资源受限的环境外,自主型智能体当然也可以运行在配置豪华的中心云环境,甚至只包括中心云,不包括边缘云。例如很多 AI 驱动的 DevOps 系统,也属于自主型智能体的范畴,下节课中我们还会看到。这一类运行在中心云的自主型智能体,基本上不存在资源限制,安全性也有保障,开发者只需要专注处理好复杂的业务需求即可。
通过机器教学构建自主型智能体
在 01 课中,我强烈推荐过 Kence Anderson 的著作《自主 AI 设计》。作者在这本书中提出了一套设计自主型 AI 应用(Autonomous AI)的完整方法论。这套方法论大部分也适用于设计复杂的自主型智能体,因为我们可以把由 LLM 驱动的自主型智能体看作是自主型 AI 应用的子集。
机器教学——成功构建自主型智能体的关键
成功构建自主型智能体的关键在于,除了必须承担应用开发者的职责之外,我们还需要完成向合格的 AI 教师角色的转变,能够胜任机器教学的任务。
机器教学是人类专家利用教学技巧帮助机器能够快速、可靠、合理地执行有效任务的过程。机器教学的过程需要将任务分解成各项技能,编排这些技能之间的相互关系,并同时为自主型智能体安排这些技能的练习顺序。
我们应该把自主型智能体看作是一位需要持续学习的学生,我们作为教师,需要持续训练这位学生,不断提高他的能力。我们需要构建的是可持续改进的基础架构和有学习能力的应用。在《自主 AI 设计》中,作者用一个棒球队教练作为例子,机器教学的教师就像一个棒球队的教练。
如图所示,随着机器教学的深入,自主型智能体的能力会不断增强。这个过程可以划分为以下几个阶段:
- 初学者阶段:练习专家规则。
- 高级初学者阶段:通过识别规则中的例外来发展模糊匹配技能。
- 胜任者阶段:将行动抽象为策略,并学会权衡策略。
- 精通者阶段:练习编写策略、掌握策略并随机应变。
- 专家阶段:将专业知识转为直觉,抽象为独特的“风格”并撰写新的范式。
构建自主型智能体的步骤
我们可以按照以下三个步骤构建自主型智能体:
-
确定想要教授给自主型智能体的技能。
-
可以将自主型智能体中的每个模块命名并标记为技能,无论这些技能是执行感知(例如视觉或分类)、行动、监控(例如使用选择器)、手工选择甚至是手工组装。
- 需要注意的是,我们明确教给自主型智能体完成任务所需的技能越多,自主型智能体学习成功的速度就越快(有时会以指数级增长)。我们可以通过将技能作为模块包含在自主型智能体设计中来明确地教授技能。
- 为了确保技能清单的完整性,最好约见一名领域专家进行面谈,这能确保我们的确理解了如何执行这些任务。在自主型智能体中包含的任务所需的技能越少,自主型智能体学习成功所需的时间就会成倍增加。
-
精心设计这些技能如何协同工作。
-
在确定了想要教授的技能和策略之后,我们需要为它们创建关联,确定技能之间的关系,并在自主型智能体设计中记录这种关系。
- 自主型智能体设计的这个阶段可以被称为“连连看”,因为从使用可视化语言绘制自主型智能体设计图的角度来看,这些线条描述了技能之间是如何协同工作的。
-
选择合适的技术来执行每项技能。
-
在机器教学的这一阶段,我们将自主型智能体中的技能映射到最佳的决策技术上,以做出该决策。在这一阶段,我们要充分利用我们对 LLM 交互、机器学习、数学、决策表和其他决策技术优缺点的理解,以便做出最佳的选择。
前面我们在设计实现 24 点游戏智能体时,大致就是遵照这三个步骤。具体来说,MetaGPT 中的每个 Action,或者 AutoGPT 中的每个 Block,都可以看做是一个技能。后面在设计实现更为复杂的企业员工 AI 助理时,我们仍然会遵照这三个步骤。
搭建机器教学平台和模拟器
许多工具和平台都是为了训练功能单一的 AI 技能而设计的。将多个 AI 技能连接在一起,尤其是其中包含不止一个智能体时,具有很大的挑战性。为了促进迭代式开发和持续改进,我们需要搭建一套能够将多种 AI 技能连接成模块的机器教学平台。这个平台可以协助我们将自主型智能体的各个部分连接起来。否则,我们需要开发大量的软件才能将各个部分组合在一起。
在这个机器教学平台中,需要提供一些模拟器来方便迭代开发和测试。每一个自主型智能体都需要一个能进行练习并获得反馈的地方。模拟器就像自主型智能体的虚拟练习室,可以在模拟器中反复练习自主型智能体包含的 AI 功能。
在模拟器的虚拟环境中练习有以下这些好处:
- 首先,它使练习变得安全。因为对于某些任务来说,试错非常危险而且成本很高。
- 模拟器可以通过在虚拟环境中加速时间来显著加快练习速度。在模拟环境,可以在几个小时内模拟几个月甚至几年发生的事件。
- 自主型智能体还可以在云端同时控制多个模拟环境,以便提高开发和测试效率。
前面我们学习过 AutoGPT Platform 中的 Agent Builder,它可以帮助我们以图形化的方式方便地开展一些实验。Agent Builder 可以看作一个机器教学平台的雏形,虽然这个工具目前还很稚嫩。
总结时刻
在这一课中,我们首先分析了自主型智能体的主要特点和几种典型运行环境。然后介绍了机器教学的概念和通过机器教学构建自主型智能体的步骤,还强调了搭建机器教学平台和模拟器的重要性。不过设计构建自主型智能体的“道”当然不止这些了,这是一个很大的话题,一节课的篇幅肯定无法讲完。下节课,我会继续讲解这个话题。
思考题
- 思考具体的运行环境对于设计自主型智能体来说,为何很重要?
- 构建自主型智能体的步骤是什么?
欢迎你把你的想法分享到留言区,和我一起交流,如果你觉得这节课的内容对你有帮助的话,也欢迎你分享给需要的朋友,我们下节课再见!