上一篇文章:“扣子”开发之一:“扣子”初体验 初步尝试了在扣子平台进行智能体的开发,几个直观感受吧:
一、智能体开发基本上就是为大语言模型定制输入提示词,通过提示词来指导和限定大模型的输出,从而让智能体表现出某个专门方向的特点和风格。虽然有插件的加持,但基本都是辅助,因此智能体开发中真正可以“开发”的东西其实并不是很多;
二、正是由于智能体的开发基本是依赖于对输入提示词的定制,这种模式就存在几个方面的限制:
1)首先是定义不准确。因为提示词就是自然语言,没有严格的语法,缺乏精确的控制,要达到一种控制功能,可能一千个人有一千个说法,而大模型本身又受随机参数的控制,同一句话它不一定给你同样的输出,所以很难有个统一的标准,输入与输出的关系是不确定的。
2)其次是提示词冗长。也正是由于缺乏统一标准,缺乏精确控制,为了达到设计目标,一般就需要在提示词中做很多的提示和限制,这就是其“人设和回复逻辑”中要提供那么多模板,而每个模板又都包括了角色、目标、技能、输出格式要求、限制等多个段落,每个段落那么多字句,都会作为每次对话的前置词输送给大模型,注意是每次对话,也就是跟大模型的每一次对话的前面都会加上一大堆重复的“废话”,并不只是你刚刚说的那一句!
3)再者,智能体开发很难做出复杂的上规模的功能。你想想,每句话都要那么长的提示词来限定,而且是很不精确的限定,一两个逻辑步骤就够你受的,稍微多几个步骤你就没得搞了,提示词不仅是逻辑不清,而且还会迅速膨胀,导致你根本没法控制复杂的步骤。
三、技能部分的扩展插件功能很有限。也许是因为我的了解还不全面吧,但我在尝试的过程中,发现现有的插件基本只能做“文本”类的工作,我尝试着用插件市场中的音乐插件和视频插件,它们都只能给出搜索列表或者网络链接,并不能直接播放音乐和视频。几乎查看了所有的音视频插件都是这样,接入豆包音频大模型都不行,可以生成音乐,但是不能直接播放。对比了下豆包app(豆包本身就算是智能体),豆包是可以放音乐的,它播放音乐用的是“汽水音乐”插件,这个插件也是字节跳动开发的,但并不在插件市场开放,是豆包专用的吗?经过几天的反复琢磨,终于搞懂了,播放音乐和视频都是客户端本地的行为,是由app去实现的,通过扣子的插件是做不了的。
顺便说一句,前面我在体验智能体开发的过程中,遇到反复修改提示词但都无效的问题,包括角色、目标、输出格式、限制等各个段落(对于大模型来说,这几个段落的作用其实是一样的,都是提示词而已)都改过,都未能及时看出效果。当时我还求助了社区微信群,也发了邮件,都没有回复。后来我自己摸索,终于搞懂了,是因为在智能体对话过程中,会把前后多轮的对话内容作为上下文,又输入给大模型。所以啊,虽然我修改了提示词,但还会有上下文记录也同时输入给了大模型啊,之前的限定词还在,它就乖乖的还照着前面限定的要求做呗!你看,这也是一个弊端。解决的办法是,每次修改之后,重开一个对话,清空上下文,就可以立见效果了。
虽然扣子平台官方也提出了“工作流模式”和“多Agent模式”,但是底层原理是一样的,无非是分割成几个对话而已,避免不了“自然语言提示词”这一根本特征的缺陷。所以说,智能体开发模式面向的就不是专业开发人员,它是为那些没有编程基础,不懂计算机程序开发的普通人准备的——无代码开发——在这一点上说它是有积极意义的。但是面对真正的AI开发需求,智能体开发模式只是玩玩而已,要进行实际的业务逻辑编程,还得是AI应用开发模式。那扣子平台的AI应用开发模式到底怎么样呢?接下来体验下吧!
学习AI应用的开发
严格按照 官方指南:快速搭建一个AI应用 执行了第一个测试程序(翻译软件)的设计过程,对于这个教程我没有什么补充的,说明很清晰,照着做就是。总体感觉是体验很好,操作方便,可视化的流程配置,拖拉式的界面设计,选择式的变量绑定,还可以随手测试运行,甚至可以把测试动作加入到测试用例集,为后面的单元回归测试和集成测试打下基础。真的太便捷了,效率倍增啊,点赞!
关于架构的迷雾
但是轮到我自己来自主设计AI应用的时候,问题就来了。先说个题外话,本来这篇文章是准备在上一篇之后一两天就完成的,文章本身只是个记录理解的过程,但是我在理解扣子平台的逻辑上遇到了障碍,没能那么快理清楚。现在还是不甚清楚,所以下面只能谈些粗浅的看法。
我花了一周的时间来理解一些基本概念(当然这一周我还要正常上班),但是感觉还是不太明白,特别是扣子架构里面的各个功能模块的定位,感觉很模糊。可以大概摸索出:一个AI应用(包括智能体)至少包括了客户端、服务端和大模型三个部分,另外还有插件、API/SDK等,最晦涩的是端插件。客户端和豆包/微信/抖音等apps是个什么关系? 哪部分功能是客户端完成的,哪部分是它的容器(即豆包/微信/抖音等)完成的?哪部分是在客户端设备(如手机/平板/电脑)上完成的,哪部分是在服务器上完成的,哪部分又是由大模型来完成的?它们相互之间是如何衔接沟通的,它们在接口上的边界在哪里? 这些都非常不清晰!在关于端插件的文档里面,我找到了下面这张图:
但这张图是混淆的,里面显然缺失了“服务端”这个关键环节!而且这里面出现了两个“扣子智能体”环节,还把大模型放在扣子智能体里面。它不仅没有解释清楚,反而搞得更模糊了。这个文档显然不是架构师写的,要么架构师自己都是昏的?!
官方文档还有下面这张图:
这张图详细一点,但它的问题是把设备等同于客户端了,但实际上客户端还包括好几个部分,有设备端的硬件和驱动(我们且叫“硬件功能模块”吧),有客户端(智能体的软件功能部分),有容器(如豆包/微信/抖音等app实体),这三部分是怎么个关系,它们怎么接口的?另外,这张图把Coze OpenAPI放到了业务服务端的后面,从服务端抽取出来了,那它到底又是在哪里呢? 这种抽取属于概念标准不统一啊。总之,官方文档在这里是混淆模糊的,如果不是文档作者水平不高,就是架构确实不清晰,导致他们自己人都搞不清楚!
就目前来说,我可以这样理解:
AI应用是由工作流串起来的,工作流就是把AI应用的逻辑分成几个步骤,每个步骤称为一个节点。也可以将定义的其他工作流作为一个节点,实现工作流的嵌套,这符合功能分解的逻辑。
每个工作流都有一个开始节点和一个结束节点,这两个节点不能删除,必须要有。开始节点的作用就是定义输入参数(有哪几个输入参数,分别是什么类型,起什么作用),以便后续节点引用;结束节点则定义输出参数(有哪几个输出参数,分别是什么类型,是什么意思);其他的节点就是处理过程,完成设计的功能(即参数变换,从输入变到输出)。所以实际上一个工作流完全可以看成是一个函数,开始节点定义输入参数,结束节点定义输出参数,中间节点完成函数功能。
工作流的实质就是数据流(如果直接把开始节点和结束节点连接起来,它就啥都没干,但是数据还是流过了它)。这里隐含的意思也就是,工作流除了处理数据,其实做不了其他的什么。那么我们要在终端上做的控制动作怎么进行呢?比如播放音乐、视频,读取传感器状态、控制外部设备等,怎么办?从我的了解来看,扣子平台是做不了的。它提供了“端插件”这么个功能,但是端插件的本质只是定义一个接口,接口本身的实现在扣子平台之外,那是app的事,或者,必须是通过API/SDK来实现的,通过其他开发模式(比如app的开发)来完成的,扣子平台本身实现不了!这一点我是反复琢磨后才悟到的,官网文档并没有明确说明。
现阶段,利用扣子平台做开发,功能只能限定在数据处理方面,或者说,仅能作为大语言模型的前端,实现对话,修饰对话的形式,限定对话的内容。
特别说一点,可以定义代码节点,也就是直接写代码来实现功能。开始我还大喜,这才是程序员真正需要的,可以实现最大的自由度。但令人失望的是,代码节点里面只能引入numpy和requests_async两个外部库,连Coze SDK中的CozePy库都无法引入(代码节点支持 JavaScript 和 Python 两种语言,两种语言的限制类似),那还能干些什么呢? 而且,代码节点只相当于一个文件,没法组织更多的文件,也就是说在代码节点中连模块都定义不了,只能做一些简单的数据处理。或许可以多创建几个代码节点,把代码节点当作模块来看待,但整个代码节点的输入输出是定义好的,也就是说,它其实只相当于一个函数,想想实际的限制会有多大吧!
界面设计的不足
扣子平台对用户界面的开发进行了支持,可以很容易地进行组件布局和变量绑定,很方便,我的初步印象是这样的。但是当我自己进行自主设计的时候,也发现了明显的不足。
首先,组件的种类还是比较少,不够灵活。只能说已经有些典型的代表性组件,但想做更丰富一点的界面元素就不是很容易了。比如想做个纵向的列表,它就只有3个组元,想删除一组,或者想添加一组,找了半天都找不到怎么做,而且每一组的格式都是一样的,你想调整其中一组,其他两组都跟着变,很不灵活。再比如想做个富文本显示区,但是没有可用组件,只有一个简单的文本组件和一个Markdown组件,显示格式比较单调。
其次,组件都必须提前静态布局好,没法动态创建;比如想根据元组的个数自动添加列表单元,不知道怎么能做到;另外,也只能静态绑定变量,没法动态绑定,至少我目前没有找到动态操作的办法。
其三,一个很简单很低级的问题——组件都没法重命名。只能看到Div1,Div2,Text1,List1等这样的组件名称,没法改,稍微多几个组件,你就不知道想要的变量是跟哪个组件绑定的,找半天,更别说在代码里面去找对应关系了。
往前看
从以上初步了解的情况来看,想用扣子平台开发真正有用的稍微复杂点的功能应用,还是不容易。平台还不是很成熟,表现在架构的清晰度上、功能扩展方式上、组件的动态处理上,以及组件的丰富程度上,等等。但是呢,毕竟AI应用和AI开发平台都是新事物,字节跳动能够这么快地推出这个平台,初见雏形,为大众开发者提供了便利,这件事还是值得肯定的。也许我们需要多一些包容,当然市场上面也会存在其他厂家的竞争,希望国内的AI大厂能够加快步伐,不断推出更好的更成熟的AI开发平台吧!我还是会继续熟悉和试用扣子平台,既是我自身学习的需要,同时也算是对行业的支持吧。