1. 什么是工作流
工作流是可以让用户能够通过直观的方式,灵活地组合插件、大型语言模型和代码模块等元素,构建出既复杂又稳固的业务的流程。 这在执行如旅行规划、报告分析等任务时尤为有效。当面临包含多个步骤的任务场景,并且对输出结果的精确度和格式有着严格标准时,采用工作流配置将是一个理想的选择。
2. 工作流的组成
如图中所示,工作流是由多个节点组合而成的一整套流程。**节点是组成工作流的基本单元。**例如,插件节点、大语言模型 LLM、自定义代码、判断逻辑等节点。
工作流默认包含了开始节点和结束节点。
开始节点是工作流的起始节点,可以包含用户输入信息。
结束节点是工作流的末尾节点,用于返回工作流的运行结果。
3. 节点示例详解
3.1 插件节点
与第三章所讲类似,之前讲的是插件直接放到Bot中,通过Bot直接进行调用。而在这里是作为工作流的一个节点,但他们的功能都是一样的,可以访问实时数据和执行外部操作,例如通过搜索引擎搜索信息、图片、时实翻译等。
下面我们写一个示例,来获取知乎列表的热榜。
因为知乎热榜只有一个limit参数,用来获取条数的。这个数量我们让用户来设置。
点击 试运行 测试:
输入数量
查看运行结果,知乎热榜数据已经调用成功了:)
3.2 大模型节点
可以调用大语言模型,使用变量和提示词来回答用户的问题或对上一个节点的内容进行分析和总结。
下面我们写一个示例,用大语言模型来润色用户的文字。
这里的模型我们可以任意选择,我选择的是是通义千问-Max;然后为输入参数起一个变量名text;
注意提示词那里,要引用输入参数text的时候,需要{{text}}这样写。
我们这里写的是:请润色一下用户的给的文字:{{text}}。这样大模型就能理解我们的指令去润色text文字了。
具体设置如下图所示:
试运行一下,看看结果:
输入"外面的景色真好",点击 运行 按钮。
查看运行结果,可以看到大模型为我们润色的还是不错的:)
3.3 代码节点
代码节点是用来编写代码,处理输入变量来生成返回值
通过以下这个示例,大家可以一目了然的明白代码节点的作用。用最简单的示例解释了代码节点每个参数的作用,请注意绿色线所标注的各变量之间的对应关系。
编写代码
点击 在IDE中编辑 可以编写代码
这个示例代码的作用是:为用户请求参数加一个叹号" ! ",也就是做一个字符串拼接的功能,然后返回新的值。
注意params对象中的值,对应的是输入参数,如果下图所示:
点击 测试代码:
按图中所示三步进行测试:
点击 确定 按钮。
作用是把代码中返回的key值,作为输出的key值,以便为了下一个节点使用。
接下来 试运行 一下。
输入"你好啊",期望输出"你好啊!",点击 运行 按钮。
输出结果
可以看到,是我们期望的结果了 😊
3.4 知识库节点
与 第四章:扣子知识库使用, 所讲类似,之前讲的是直接在Bot中引用知识库,通过Bot直接进行调用。而在这里是作为工作流的一个节点,但他们的功能都是一样的,在选定的知识中,根据输入变量召回最匹配的信息,并以列表形式返回。
下面我们写一个示例,我们还是以第四章中FuturaTech的FAQ咨询为例,写一个工作流,用知识库增强回复的准确性。
首先看一下下面这个图,在这个示例里,有一个地方要注意一下,和之前的示例有一些区别。如果我们要使用知识库,还要借助一个大模型节点,这个大模型节点的作用是:对根用户提问和知识库节点匹配的内容进行重新组合,生成符合提示词要求的内容,返回给用户。
添加知识库
点击 + 添加知识库:
选择之前创建好了的知识库,点击 添加 按钮:
设置大模型节点
大模型节点这里,模型这里我使用的是通义千问。模型可以任意选择,在调试的时候可以都测试一下,看哪个效果好就用哪个。要注意的地方是 输入参数 这里,从图中可以看到,引入了两个参数,一个是question,一个是knowledge,分别对应的是用户的提问和知识库节点的输出。
设置大模型提示词
有了这两个变量,接下来我们要结合这两个变量去写提升词。这里也不需要有一个固定的写法,只要把你想要的结果,通过描述告诉大模型就可以了,下面是我写的一个提示词,大家可以在此基础修改成自己的。
# 角色
你是一个专业且耐心的客服人员,你会接收到两个输入参数:
1. {{question}}是用户询问的问题
2. {{knowledge}}是从知识库中根据用户的问题{{question}}查询出来的知识库内容
## 技能
### 技能 1: 解答常见问题
1. 你能完全可以理解{{question}}的问题,并对其中行分析。
2. 基于检索到的信息{{knowledge}},为用户生成准确、简洁的回答。
3. 如果知识库中没有相关内容,及时告知用户,并表示会进一步核实。
## 限制:
- 只处理与'FuturaTech 常见问题解答'相关的内容,拒绝回答无关问题。
- 所输出的内容必须按照给定的格式进行组织,不能偏离框架要求。
具体如下图所示:
预览与调试
如图所示,点击试运行:
输入问题
查看结果
可以看到,是我们期望的回答结果了 😊
3.5 选择器节点
选择器节点是连接多个下游分支,若设定的条件成立则仅运行对应的分支,若均不成立则只运行“否则”分支。
通过以下这个示例,大家可以一目了然的明白选择器节点的作用。用最简单的示例解释了选择器节点每个参数的作用。
我们通过以下这个示例,来解释了 选择器节点 分支的作用。
示例所期望的效果是:当用户的输入值为1时,执行消息一的流程;当输入其它值时,执行消息流程。
流程的结构如图所示:
当用户输入的参数为 1 时:
可以看到运行的是上面 消息一 的流程:
当用户输入的参数为 2 时:
可以看到运行的是上面 消息二 的流程:
可以看到,是我们期望的回答结果了 😊
3.6 消息节点
消息节点是支持中间过程的消息输出,支持流式和非流式两种方式。
下面我们通过一个示例,来看一下消息节点的作用。
这个示例是:当用户输入一个漫威人物,大模型会对输入的人物进行介绍。这里要注意的是,消息节点在这里的作用是:在大模型输出结果之前,提示用户"下面为大家介绍一下漫威人物XXX"。
这里要注意一下,如果要单独调试消息节点不容易看到效果,这里我们要借助一个大模型节点来观察效果。
试运行一下,我们在输入参数中输入:钢铁侠。
这个图可以看到,当大模型节点正在运行的时候,消息节点已经输出了内容:"下面为大家介绍一下漫威人物-钢铁侠",这个过程放在实际场景中是在让用户等待大模型输出结果。
下图可以看出,在消息结点运行完几秒之后,大模型才输出结果。
这就是消息节点的作用。在之后工作流使用过程中,我们还会看到消息节点更实用的作用。😊
3.7 工作流节点
工作流节点是集成已发布好的工作流。也就是把之前发布好的工作流当做一个子任务,嵌套子在任务流中执行。
下面我们通过一个示例,来看一下如何在一个工作流里嵌套另一个工作流。
我们把 3.6 消息节点 中讲的示例发布一下,把这个3.6的示例当成一个子任务。放到我们本节这个示例中演示。
这里先提一下,工作流节点,只有发布以后,才能被使用。
如下图所示,先把工作流进行一下发布,点击 发布 按钮即可。
可以看到,很简单就发布成功了。
接下来我们再创建一个工作流,点击 创建工作流 按钮。
为工作流节点起一个名称和描述,然后点击 确认 按钮。
点击 + 添加一个工作流。
点击 添加 按钮。
这样就把消息流节点添加进来了。
接下来我们进行一下测试,把3.6节点,用户的输入替换成当前TestCallMessageNode工作流的query参数。
接下来进行一下测试。点击 试运行 按钮。输入参数和3.6节所讲一样,还是填入"钢铁侠",然后点击 运行 按钮。
如下图所示,和我们期望结果的一样。我们在 TestCallMessageNode 工作流中调用了 MessageNodeWorkFlow,MessageNodeWorkFlow同时作为TestCallMessageNode 一个嵌套的子任务,我们得到的结果和3.6节的结果是一样的。😊
3.8 变量节点
变量节点是用于读取和写入Bot中的变量。变量名称必须与机器人中的变量名称相匹配。
我们通过一个示例,如果配合Bot来使用变量节点。
通过变量节点的定义,可以知道:使用变量节点之前要有个前提,就是首先要有个Bot,并且这个Bot里定义了一变量,否则单独使用变量是没有意义的。
所以首先,按创建第二章的方法,先创建一个Bot。
点击 + 按钮添加变量。
定义一个变量role,来表示漫威的人物
接下来发布一下。
接下来创建带节点变量的工作流。
如图所示,创建了两个变量节点。第一个节点是使用用户的输入值来设置变量role(和Bot中的变量对应)的值,第二个节点是用来获取变量role的值。最后使用role的值输出。
同学们按如下图的方式进行创建。注意红框所标准的位置设轩
细节大图:
设置好以后我们运行一下。
可以看到这里就要求我们关联之前创建的Bot了。
选择后点击运行,查看结果。
可以看到,成功输出了我们在上一步上设置的role变量的值。😊
3.9 数据库节点
简单来说,数据库是用来存储数据的。那 数据库节点 就是在工作流中存储数据的。扣子中的数据库支持放开读写控制,用户可读写其他用户提交的数据。权限由开发者控制。需要提前在 Bot 的 Database 中添加 Table。
我们通过一个示例,如果配合Bot来使用数据库节点。
通过数据库节点的定义,可以知道:数据库节点和变量节点一样。使用之前要有个前提,就是首先要有个Bot,并且这个Bot里已经创建了数据库,否则是读取不了数据的。
所以首先,按创建第二章的方法,先创建一个Bot。
点击 + 添加一个数据表。
为数据表新建字段。
为了演示方便,我们使用模板进行创建。点击 使用模板 按钮。
可以看到,模板建了一个"用于保存读书笔记"的数据表。数据表的名称、描述和字段都已经建好了。点击 保存 按钮。
可以看到数据表已经创建好了。
我们来演示一下如何向数据表中插入数据。
向数据库中插入数据,不需要你学习复杂的SQL语言。通过自然语言与 Bot 进行交互,即可插入或查询数据库中的数据。
如下面这个示例:
可以看到,我只是简单的告诉Bot:"三国演义这本书很精彩",Bot就帮我把这本书记录到数据库中了。
再来测试一下查询功能,从下图可以看出,Bot很容易的给出了答案,只有一本我们刚刚插入的《三国演义》这本书。
到这里,数据表的建立就完成了。
在这个示例中,我们想实现的效果是:先在数据库中插入一条数据,然后再查询数据表,验证是否插入成功。
如果你会写SQL也没关系,我们使用 自动生成 的功能,在查询目标里输入自然语言描述我们想要的操作:例如"向book_notes表中插入一条数据",然后点击 自动生成 按钮,就会成生一条SQL语句。点击 使用 按钮,SQL语句就被应用了。
这里注意一下,生成完SQL之后,我们需要调整一下这个SQL。生成后的SQL语法是没有问题的,但没有传实际的值,我们要把我们想传的值放到这个SQL中。调整后的效果如下,{{name}}对应的输入参数的name:
试运行,看一下效果:
如图所示产,流程执行没问题。
接下来用同样的同样的方法,我们把插入SQL改为查询SQL,来验证一下,数据是否被插入到了数据表中。
如图中标示箭头的位置要注意一下,这里的name要和查询的字段对应,当然你还可以加更多的字段,这里只要一个作为演示。
可以看到,数据被成功查询出来了。😊
💡 小结
本文详细介绍了扣子(Coze)工作流中各节点的用法,接下来的课程会用实战案例为大家讲解各节点组合,在工作流中的使用。如果希望系统学习扣子,并使用扣子(Coze)平台搭建应用程序,请查看完整教程《扣子实战教程》!
如果有任何疑问,欢迎进群交流讨论,备注:斜杠君。