用ComfyUI的思路设计Agent工作流

广告位招租
扫码页面底部二维码联系

过去几周,我一直再思考如何用自然语言来编写Agent工作流。起初我的思路是通过LLM从自然语言中提炼出可用于表达Workflow的DSL,再由DSL来驱动​流程引擎。但是在实现过程中,我发现流程引擎的能力与DSL的匹配度其实很难把握,其中的根源在于DSL本身的设计,往往具有局限性​。在使用了ComfyUI的工作流之后,我有了新想法,这篇文章就来聊一聊​。

什么是ComfyUI​?

在AIGC领域,除了LLM,我想你应该都了解文生图这个领域,而该领域的开源模型Stable Diffusion​则占据了大半江山。由于开源社区的强大,SD的生态非常丰富​。作为其官方公司Stability仅仅发布了底座模型,甚至都没有UI,而社区目前最主流的两大UI(WebUI和ComfyUI)都非官方作品,却​派生了更大的社区空间。(最近新的UI工具forge也涌现出来,开源真的促进​发展。)

WebUI以配置为操作模式,用户通过选、填来完成​模型操作。而ComfyUI则是以工作流为操作模式,用户需要通过配置出一个个的pipeline,通过不同节点和连线来完成​模型操作和内容生成。两者各有优势,但在灵活性和深度上,​ComfyUI更胜一筹。如果WebUI是一次冒险旅行,那么ComfyUI则是一场拉力赛,前者短时间浅尝辄止,后者​有些累人但柳暗花明。如果你还没有用过​,建议你现在就去尝试一下。

Workflow本身就是模型

ComfyUI最吸引人的地方在于它的工作流是可以被分享的,在社区openart.ai上,民间高手们分享着自己的工作流,其他小伙伴可以下载这个工作流,并导入到自己的comfyui中去,再替换自己的prompt,就能用相同的参数,生成该工作流预设的效果的​图片。

注意,我这里说的是,用相同的参数​。

​这不就是模型吗?在comfyui的每一个节点中,我们需要配置好节点参数,在运行工作流时,​这些参数就会生效。以一个workflow作为蓝本,对它节点上的参数做细微的调整,就能在原来的图片效果基础上做​细微变化,这不就是微调吗?目前,在comfyui的生态中已经有近百的插件,也就意味着我们可以构建出非常庞大的workflow,而通过微调workflow,以达到自己最满意的效果之后,在后续的全部工作中,我们就可以再次使用这个workflow,只需要传入不同的初始prompt即可​。

你看,这样的工作模式,不就是模型的工作模式吗​?​而comfyui的workflow导出后,仅仅是一个json文件。

移植可能性​?

基于这种理念,我发现在Agent的工作流搭建中,直接照抄​,是完全可以的。在Stable Diffusion的模型操作中,comfyui插件甚至可以调用第三方模型,只要确保节点的输入输出符合​workflow中的要求即可。

同样的道理​,Agent工作流不也是这样吗?只要确保我们的节点​有符合要求的输入输出即可。于是,我有了移植ComfyUI到​Agent工作流创建中的想法。如果可以在现有的ComfyUI的基础上,加入Agent的工作流搭建能力,不仅可以解决Agent工作流编程问题,还能直接将LLM和生图模型结合在一起,甚至在Stable Diffusion生成视频的能力,构建完全自动化的营销短视频生成、发布​流程,也不是不可能。于是我开始研究ComfyUI的源码​。

然而,结果有点小失望,ComfyUI和Stable Diffusion的绑定比较深,虽然我们可以用它来实现上述的设计,但是当我去尝试封装它的代码时,发现似乎没有什么工作可以做,除非全部重写一遍,把它重构为一个与SD解耦的纯AI模型工作流,但如果是这样的话,可能要做的工作比较多,最终可能就做出一个类似coze一样的平台,成本有点大​,感觉没必要。而ComfyUI之所以​如此流行,还和它的性能有关,或者说它的python部分真的很少,以至于整个仓库没多少代码,运行起来当然是​有不错的性能表现。

工作流技术揭秘

Workflow本质上是流程引擎的应用,只不过世界上的流程引擎各有各的怨念,家家有本难念的经​,看上去所有的流程都差不太多,但是细细一看,又哪哪都不同。

我们从使用的角度,往往会从图出发来设计worflow​。这也是为什么comfyui能流行起来的原因,因为它封闭了流程执行的内部细节,用看得见的流程图来作为直观的操作​入口。和bpmn这样的业务流程图设计差别巨大,以组织软件运行为目标的流程图往往会以“节点”作为容器来运行某个软件或程序,并以“边”来表达节点之间的数据流向。

节点和边各自有多种类型,不同的类型所表达的执行​方式不同。

通常,节点有输入和输出,根据不同的类型,输入输出的数量又不同​。除了输入输出,节点还需要配置属性(或者叫参数)。节点本身意味着它内部会调用某个软件或程序,把输入和参数同时传给这个程序,等待程序返回结果,将这个结果按照规则解析后​,作为输出给到下一个节点。

边有方向,​负责把节点串联起来。

由节点和边构成的网络我们称为图(Graph),很多流程设计都遵循这种模式,例如米家智能家居的配置、nodered的设计、xstate状态图,前几天介绍的langgraph本质上也是参考状态图。图的形状可以有非常多的变化,而不同的变化所带来的效果​完全不同。

我们可以把图作为Workflow的某种可视化的DSL,它以图形语言的方式表达了一个工作流是怎么运作的​。我们执行一个流程图,本质上就是以流程图作为DSL来驱动流程引擎工作执行。

结语

本文介绍了ComfyUI,并希望借鉴ComfyUI设计基于相同的图(Graph)来实现Agent工作流的​想法。在界面交互上,ComfyUI依赖的是一款名为litegraph.js的流程图脚本库,要实现​流程图的创建的交互本身并不复杂。现在的问题是,如何在后端有效的管理、注册、调度、执行Agents​,这或许是我接下来要研究的。​

2024-04-16 2112

为价值买单,打赏一杯咖啡

本文价值21.12RMB