“扣子”开发之三:反复尝试之后只能决定暂时放弃!

上一篇文章 在简单体验了通过“扣子”平台开发AI应用之后,感觉还是有很多不成熟或者理解不清楚的地方,开发遇到了比较大的障碍。但是AI应用开发本身是当前的热门话题和时代趋势,不能就此打住啊。所以,虽然晦涩,还是得继续钻研;虽然不成熟,还是得跟随。希望能一起成长吧!

这一篇就是继续深入体验过程中的一些心得,以摘抄官方文档,并附加部分我个人的理解和评注的形式呈现(双引号内的摘录自官方文档,破折号之后的是我的评注)。

“插件是可以独立开发和部署的线上服务,由一个或多个工具组成。”
——这里明确了插件是线上服务,是在服务端执行的。

“对话流是基于对话场景的特殊工作流,专门用于处理对话类请求。”
“每个对话流都绑定了一个会话,运行时可以从此会话中读取历史消息,同时将本次运行对话流产生的消息记录在这个会话中,相当于一个拥有了记忆的工作流。”
“会话指的是用户与模型之间基于同一主题的一系列连续的对话交互,会话中存储用户输入的消息和模型回复的消息。”
——对话流与普通工作流的主要区别是对话流要绑定一个会话,会话中会记录用户提出的问题和大模型的回答,并将这些记录作为上下文在下一轮对话中传递给大模型。

“扣子平台的变量类似编程中的全局变量概念,以 key-value 形式存储动态变化的信息。”
“扣子应用的变量对应用全局生效,开发者为应用定义变量之后,可以通过工作流的变量节点为变量赋值或者读取已设置的变量值,其他节点也可以基于变量节点设置并读取到的变量值进行下一步的逻辑判断。”
“虽然应用中的变量对全局生效,但你必须使用变量节点才能将应用的变量引入到工作流中。添加变量节点并设置为获取变量值,其他下游节点才能引用变量节点的输出参数,并根据变量值进行后续的逻辑判断。”
“每个变量节点只能读取一个变量的值。”
“在变量节点中,选择获取变量值,并在输入中变量值区域填写要从应用中读取的变量名称,在输出区域填写要这个应用变量在工作流中的参数名,相当于通过变量节点做了一层变量名称的替换。”
——为什么一定要搞个变量节点呢?在其他节点中直接使用变量(读取或者设置)不行吗?特别是每个变量节点还要再搞一个输入参数和一个输出参数,真的是感觉画蛇添足,晦涩难懂!仔细思考后我发现平台的设计逻辑里面是把所有的节点、工作流都、插件都当作了函数,它对作用域的定义太原始了,没有设计出多层次的作用域,导致很多重复的定义(每个实体都要重新定义输入输出)!

“在代码中引用输入参数时,直接通过 params[‘input’] 取值即可。”
——也即是说,输入参数从参数实体变成了参数名;所有的输入参数被编入了一个字典。
“不支持编写多个函数。”
——这比我在上一篇文章中总结的限制还严格,代码节点不仅不能定义模块,不能引入其他的库,还只能定义一个默认的函数,基本上就只能做一下输入输出数据的形式变换了。
“通过return一个对象来输出处理结果。”
——代码节点的输出参数也是以字典的形式表示的。

‘目前聚合策略仅支持设置为“返回每个分组中第一个非空的值”,你可以拖动变量、调整变量位置。’
——关于聚合变量的用法,目前限制很严格,功能很简单,实际就是一个类似switch…case的语句,依次判定一组参数中的哪个参数不为空就返回这个参数的值,注意这里是有判断顺序的。实际使用时,我试了很多次,它怎么都不返回非空值!看下面的例子。为啥呢?它这个“空”和“非空”是咋个判断的呢? 是空对象,还是空字符串呢?!根据实际测试结果推测,它是根据是否为空对象来判定,遇到第一个非空对象它就返回。这里要特别注意:判定结果实际上受到执行路径的直接影响!它聚合的多个路径,可能只有一个路径会执行,其他路径根本没有执行,未执行的路径就假定返回空对象了,所以它是返回实际执行的那条路径上返回的非空对象,实际执行路径上返回的空字符串并不认为是“空”!
在这里插入图片描述
“例如选择器或意图识别节点会将工作流拆分为多路分支,每次执行时,工作流会根据选择器条件或用户意图决定运行其中某一个分支,此时未执行的其他分支输出变量为空。”
——有了实际的经验,才能更好理解这句话!这里有个很微妙的地方,如果未执行的那条分支上你映射了一个已经存在的对象作为返回值,那它就不会被判定为空哦,这个时候就出乎你的意料了啊!设计的时候聚合的每条路径最好返回路径内定义的新对象,这样它未执行所以只好假定是返回空对象。(严格说,这个语义不是很清晰,很容易导致混淆!)

“引用变量是一种动态设置内容参数的方法,可以根据运行时的数据动态更新组件内容,适用于需要与其他组件或数据源交互的场景。引用变量的基本语法是在变量名前加上双大括号 {{}}。”
“目前,支持引用工作流的返回数据、组件的 content、URL 参数和局部上下文。”
——界面组件只能引用工作流的返回数据。然而对话流的返回数据却只能采用返回文本的形式,不能采用返回变量的形式,如果返回变量,对话栏中的答复内容就会很难看。要返回变量并能在界面组件中引用,只能设计普通工作流。注意,工作流的中间节点中定义的数据是不可见的,只能引用最后的返回数据!另外,这里“局部上下文”是什么意思呢?

“变量作用域:确保引用的变量在当前组件或页面的作用域内是可访问的。”
——各种变量的作用域又分别是怎样的呢?组件和页面的作用域具体是怎样定义的?
——目前界面组件和流程中的节点都不支持复制粘贴功能,更不要说按组复制多个组件或节点了,每个组件和节点都必须单独设置,这个很费事。

“数据库节点的输出参数是 SQL 执行后的输出内容,固定为以下两项:
outputList:SQL 执行后数据表中的字段和数据。你可以按需新增子项,注意变量名需与 SQL 中定义的字段名一致、数据类型需要和数据表中定义的数据类型一致。
rowNum:返回的行数或者受影响的行数。”
——查询数据库时,outputList是输出结果的列表,其中每一行要输出的字段,就是SQL语句中select的字段名,必须在outputList添加对应的子项才能输出数据(我理解为绑定关系声明),select了哪些字段,就可以相应添加对应的子项,否则后面就没法引用对应的数据。另外特别注意,查询数据库时rowNum返回是0(我认为这是个错误),要得到查询返回的记录条数,得用len(outputList)函数获取,只有写入数据库时,rowNum才会返回影响到的实际行数。

最后,我在调试中反复尝试删除数据库中的记录,但是始终无效!也许是我没摸着门路吧,离上次发布记录文章已经过去一周多了,这一周我都在扣子平台上尝试开发一个简单的AI应用,尝试各种节点的用法,界面组件绑定数据的方式,界面组件之间的调用关系等等,我的耐心被消耗完了!我只能说这个平台还太不完善,还只是官方的一个尝试性的工作,想通过这个平台来简化和加快AI应用的开发,至少我的希望是破灭了,此路不通!我不想在这个上面浪费太多时间了,否则它会大大拖延我跟AI行业发展步伐之间的差距。

我只能决定暂时地告别扣子平台,另寻它途了!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值