在今年,AI应用层的技术已经从workflow全面转向自主性agent。前者的典型代表是n8n、dify,后者的典型代表是OpenClaw、Hermes、CoWork。但是,未来的新技术肯定不是对旧技术的全盘否定或全盘肯定,而是有克制的「扬弃」。
我在上一篇介绍我们的新技术栈AmphiLoop的时候,引入了一种新的程序架构,称为「amphiflow」。Amphiflow是一种全新的、也是世界上第一个「决策与执行解耦」的架构,它同时具备workflow和agent两种运行模式,而且能够在两种模式之间自动切换。
今天借周末的时间,我们一起剖析一下这种架构背后的实现原理,并分析一下它如何能同时发挥两种模式的优势。
完成任何一个任务,都需要确定目标和路径两个因素。举个简单的例子:
在上面的网格中,假设S点有一个机器人,它的任务目标是从S点走到D点。再假设这个机器人只能水平或垂直移动。
按照workflow模式(也是传统软件的思路),一般来说,我们需要在编程时指定具体的路径,机器人才能知道如何行动。如下:
当然,从S到D不止一条路径。但我们的workflow只需要指出一条路径就行。
而按照自主agent模式,我们就没有必要提前指定一条路径。我们只需要指定任务的目标(也就是到达D点),然后LLM会自动找到路径。这也是当今AI Agent技术与传统软件的本质区别。更详细的讨论参见《AI Agent时代的软件开发范式》中提到的“编程范式的转变:从面向step到面向goal”。
现在假设机器人在沿着既定路径的移动过程中,碰到了一个预料之外的“障碍”(如下图红色挡板)。
如果机器人是由workflow模式驱动,并且这个红色障碍是workflow编程时无法预期的,那么这时候就只有一个结果:任务失败。
但是,如果机器人在遇到障碍时转换成了agent模式,那么它可能会绕过去继续前进。如下图:
如果障碍实在远超预期,导致原来的路径已经完全不可用,agent模式还可能干脆重新规划一条路径。如下图:
以上这个例子虽然只是一个比喻,但已经说明了amphiflow最基础的工作原理:
在使用AmphiLoop进行构建的时候,在Project Mode这一步选择2,就能生成amphiflow架构的程序。如下:
当然,上面的介绍中忽略了一些细节。Workflow模式也并非在编程时一定要指定具体的路径,它也可以包含一个动态的算法来动态计算出一条路径。但这里的关键在于:对于workflow模式来说,如果执行路径中出现的障碍是它非预期的,它就无法解决。但是,agent模式却可以处理非预期的障碍或情况。
Amphiflow可以同时具备workflow和agent两种模式的优势:
正是因为这一新架构同时具备workflow和agent模式的特征,所以才被称为amphiflow (amphibious flow)。
要讲清楚amphiflow的实现原理,有两个方面需要解释:
其中问题1,又需要涉及到两个概念:
这里涉及到的核心实现代码,基本都在bridgic-amphibious模块的_amphibious_automa.py文件中。地址:
https://github.com/bitsky-tech/bridgic/blob/main/packages/bridgic-amphibious/bridgic/amphibious/_amphibious_automa.py
agent模式看做一个循环,这通常是好理解的:
agent模式的这个「观察 - 思考 - 行动」循环,实现代码在_run_once方法中:
在AmphiLoop的架构中,比较独特的一点是,workflow也实现成了一个「观察 - 思考 - 行动」循环。如何做的呢?首先,观察和行动,是跟agent模式一样的,代码在_run_workflow方法中:
注意上面代码中只有观察和行动这两步,其中有个很关键的decision变量,它不再由LLM产生,而是由workflow产生。代码如下:
以上这段代码调用on_workflow产生一个generator,然后在一个循环中调用__anext__和asend原语从generator中每次拿到一个item(里面包含了item.decision)。这个循环就形成了workflow模式的「观察 - 思考 - 行动」循环。
前面我们看到了workflow模式的「观察 - 思考 - 行动」循环。其中的「思考」过程由workflow的代码隐式地表达。我们看一下on_workflow的一个具体实现例子:
这段代码并非AmphiLoop框架里面的代码,而是每次由AmphiLoop根据具体任务描述(TASK.md)引导生成的代码。因此,on_workflow描述了具体任务的执行步骤。
这里使用了python的yield语法,表示on_workflow方法执行的时候并不代表任务的真正执行。真正的执行延迟到了前面的_run_workflow方法中由_action方法执行。借助这种技术手段,workflow的执行也表现为一个「观察 - 思考 - 行动」循环。每次循环产生一个decision(封装在ActionCall中)。
还需要注意的是,这段代码中不仅仅是ActionCall动作序列,它还可以包含动态逻辑(分支和循环),比如上面代码中的for循环。这表明AmphiLoop的workflow不同于简单的录制重放,而是真正的动态程序。
基于前面的「观察 - 思考 - 行动」循环以及决策与执行解耦的架构,workflow模式得以在出错时能够自动切换到agent模式。
以上代码中,self.snapshot和self._run是小降级,相当于在独立的上下文中执行一个agent。其目标是:修复出错的那一步的错误,然后执行它(这里的decision.step_content来自前面的ActionCall的description参数)。这样在修复后还可以切换回workflow模式继续执行。
self.on_agent(ctx)是大降级,相当于启动一个agent,其目标即是原始任务目标,且与原来的workflow共享上下文。
AmphiLoop及其引入的amphiflow架构,是基于agent的自主性优势和传统软件的确定性优势推演出来的未来架构。它瞄准的是当今AI技术不可控、不稳定、极耗token的核心问题,理论上有利于推动AI技术在更广、更加纵深的场景中被采用。
(1)我们新建了一个Discord社区,请访问如下地址参与讨论:
由于微信群维护不方便,也请原来在群里的同学移步Discord。
(2)新的X (Twitter) 账号(后面是发布版本更新动态的主阵地):
(正文完)
其它精选文章: