2024年2月1日, 字节跳动正式推出Coze AI Bot 开发平台, 昵称"扣子", 每个人都可以免费地快速、低门槛地搭建自己的聊天机器人(Bot),无需任何编程技能和经验。实际上你创建一个Bot,什么都不做,就可以利用LLM大语言模型强大的功能进行对话,字节跳动训练的模型本身就可以实现文章缩写、生成报告、回复邮件、测试出题等很多工作。
Coze分国际版和国内版,国际版可以免费使用GPT-4模型及DALLE3、GPT4V插件,国内用户只能用字节自己开发的**"云雀"** 大语言模型,效果还可以,关键是免费的。
模型是从互联网上的内容训练出来的,可能不完整、准确,对于时效性、地域性、行业性强服务,需要搭建自己的聊天机器人Bot。搭建过程非常简单,上传文件就可以创建知识库,可视化拖拉就可以创建工作流,用自然语言进行数据库操作,引用插件丰富Bot的功能。Bot搭建完成后, 可以一键发布豆包、飞书、微信公众号等平台。
下面通过一个Bot 『沈阳12319城建热线客服机器人』的搭建实践, 一起学习一下Bot平台中的数据库、知识库及工作流。
一、创建Bot
登录『Coze官网』, 点击【登录】按钮进入登录 页面,用手机号+验证码登录不太方便, 我都是用手机抖音扫一扫二维码直接登录。就看到下面的界面:
左边菜单区中查看 [ 商店 ] 中可以查看别人创建的Bot和插件,有很多公开了提示词,进入后,点击顶行菜单中的[ Prompt ] 链接, 就可以查看别人编写的提示词,最好先学习一下。
[工作区] 中的 [个人空间]项,可以列出个人创建的所有Bot。页面右上部的蓝色按钮 [ 创建Bot ] , 就可以创建自己的聊天机器人 - Bot
创建的操作非常简单,只需输入Bot名称、简介, 上传个 Logo 图标即可。
二、编排页面
点击进入自己刚创建的机器人后,就会打开"编排"页面。
编排页面分三部分, 左侧是 [人设与回复逻辑] , 在此输入基础的提示词;
中间是 [技能 ] 区, 是主要的功能区, 引用的插件、工作流、知识库、数据库都在这设置;
右侧是 [ 预览与调试] 区, 在这测试自己的Bot。
三、插件
Coze提供了很多插件,用来实现不同的功能,可以根据需要引用插件,插件允许引用多个。引用方法就是点击 插件 菜单项右侧的 + 图标 ,在弹出的窗口中选择即可。实战中我引用了:
头条搜索 : browse , search // 在数据库和知识库中没找到匹配内容时,需要上网搜索
ByteArtist : text2image // 提供文生图功能
LinkReaderPlugin : LinkReaderPlugin // 用于访问其他网站
四、知识库
为了提供时效、地域、行业性强的内容,模型从网上训练的内容就不够准确了, 就需要创建自己的知识库。在与用户对话时,从知识库中搜索匹配度最高的内容,作出解答。一个Coze账号最多可创建 100 个知识库,每个月最多可上传 2GB 数据, 最多 10 GB。
1. 知识库分段
将数据上传到 Coze 知识库后,Coze 会自动将你的文档分割成内容片段(Segment)进行存储,并通过向量搜索来检索最相关的内容来回答用户问题,这可以帮助你的 Bot 更精确地回答问题。
知识库是按 知识库 - 单元(Unit) - 段(Segment) 三级结构组织的,单元就是上传材料的类别,如:政策法规、业务介绍...,单个知识库最多可添加 100 个单元。
单元中包含段(Segment),段是一条独立的信息或特定的内容块。当查询知识库时,Bot 通过这些分段进行向量召回,以找到最相关的信息。每个单元中最多可保存 1万个段。
知识库每个段中就是一段文本,直接给出一段话不知干什么的, 个人觉得给每个段文本中加个标题,如: "业务范围:XXXXXX"; "热线受理范围:XXXXXX"
2. 知识库添加方式
Coze 支持通过以下方式上传文本内容或结构化的表格数据到知识库中用来响应用户问题。
1) 本地文件
支持的文件格式有:.txt、.pdf、.docx、.csv和.xlxs
上传文件时有 3 步, 第1步就是选取本地文件;第2步**"分段设置"** 要注意一下,上传文本文件或Word文件时,如果勾选"自动分段与清洗,分段一点也没有规律,而不是一个段存储一条内容,不能实现给每段加标题的设想。因此最好自定义分段,用分段标识符分隔每段内容。例如:先整理一下拟上传文件,每条内容中多加一个空行,在分段标识符中选取:"2个换行" 。, 这样就按自己的设定给知识库分段了。
2)在线网站
将指定网站上的线上内容添加到知识库中,更可以指定更新频率(每天、每三天...)让知识库自动更新。方法很简单,再创建一个知识库(如命名为"网站自更新"),每个需要自更新的每个网站分别创建一个单元,输入URL,设定更新频率即可。
实践中, 我添加单位的官网,怎么都报错,不知为何。
3)API
可以通过 API 方式将 JSON 数据上传至知识库。
4)自定义
自己创建单元,自己创建分段,手动向段中粘贴内容,可以精确地向分段中添加内容。
3. 创建知识库
创建的知识库可以在自己创建的多个Bot中应用,因此可以在工作区页面顶端的创建知识库链接,也可以在选中Bot的编排页面中部"技能"功能区中的知识库菜单项右侧的 +按钮进行创建。
创建过程非常简单,填写知识库名称及简介,新增单元, 上传数据, 按提示操作即可。
4. 修改、删除知识库
在工作区页面顶行菜单区中,点击知识库链接,进入知识库列表, 选中要修改或删除的,在其右侧有编辑和删除图标, 可以修改或删除。
5. 修改分段中保存的内容
1)在工作区页面顶行菜单区中,点击知识库链接,进入知识库列表
2)选中要修改的知识库, 进入单元列表页面
3)点击要修改的单元,进入分段列表页面,每个分段块右上角有编辑图标,点击后可以修改。
6. 知识库设置
实践中发现, 不管怎么设置提示词、工作流, 扣子都首先检索知识库,很多逻辑无法实现,就需要在编排 页中间的技能区中,知识库菜单项右侧的下拉菜单中,把知识库设置成"按需调用"。
然后在工作流中显性地调用 RecallKnowlage 方法检索知识库,如在工作流中,首先进行一些自定义逻辑,最后搜索知识库。如:工作流最后,添加一个大模型节点,给它的提示词设置为:
1. 根据用户提问搜索数据库, 并返回相关搜索结果
2. 如果数据库中没有符合条件的结果, 调用RecallKnowladge方法,从全部知识库中匹配用户输入,
解答提问
3. 如果数据库和知识库中都没有匹配内容时,在互联网上搜索相关问题并作出解答
五、数据库
Coze 数据库以表格结构存储数据,这种数据存储方式非常适合组织和管理结构化数据,很多文章说数据库提供了记忆功能,"可以使AI 机器人能够持续记住对话中的关键参数或内容",这点没太明白,怎么获取用户ID呢?没有ID向数据库中添加不同用户的数据,怎么记忆? 希望高手赐教。
数据库功能,我个人的用法是在提示词中加前导字符串,完成不同的数据库功能, 如: [addRow] 后跟数据,在工作流中判断提示词如果以 [addRow] 开头,插入一行数据。
1. 数据库设计
扣子只允许每个账号创建一个数据库,库中只有一个表, 因此设计数据库结构时要精心, 使一个数据库满足不同需求的数据存储。如:设置一个名为 tbl 的列,存储不同数据的类别(电话表、日记...), 以后的检索中加以区分。
字段支持的数据类型有: String, int, num, bool, DateTime , 一共 5 种。
数据库名和字段名,都必须用小写英文字母。
2. 数据库操作
数据库操作只支持自然语言与 Bot 进行数据库操作, 允许插入或查询数据库中的数据,有人说可以删除,我怎么试也不行。用自然语言操作数据库,相当麻烦,还不如允许执行SQL语句呢,下面是添加数据的例子:
- 不要判断电话位数, 不要判断是否正确, 不要将数字转换为科学计数法
- 数据以空格拆分成不同部分,第2部分保存到tbl字段, 第3部分保存到tkey字段, 第4部分保存到 tnote 字段, 第5部分保存到tc1字段, tud字段自动填充为当前日期
- 只用insert语句添加数据库,而不是update修改数据库
- 将用户输入添加到数据表tmain中,不是生成添加数据库的代码
- 例如: [addRow] 电话表 10086 中国移动客服热线 通讯
- 如果添加成功, 按 tbl - tkey - tnote - tc1 - tud 的形式返回
- 如果添加不成功, 返回:"添加数据库未成功"
扣子有时判断电话非法,有时将数字转换为科学计数法,有时不是添加数据库而是生成了一段SQL语句,只得在工作流提示词中排除,这样也不保证每次成功。
3. 创建数据库
1. 在 Bot 编排页面,找到数据库功能,然后单击创建图标 +
2. 在弹出的"新建数据表"窗口中,单击左侧自定义数据表区块,弹出"新建数据表"窗口。
3. 首先填写数据表名和相关描述。
4. 挨行设计表中的字段:
存储字段名称:字段名称,只能包含小写字母或数字或_、必须以英文字母开头、最多 64 字符。
描述:存储字段的补充说明,可以是对存储字段的自然语言描述、示例数据,也可以是格式说明等。
数据类型:存储字段的数据类型,LLM 会按照选择的数据类型对用户输入的内容进行处理和保存。支持的数据类型:String、Integer、Time、Number、Boolean。
是否必要:用户是否在保存一行数据时必须提供对应字段信息。
4. 删除和编辑数据库
在 Bot 编排页面,单击 Database 功能旁边的图标来删除或编辑现有的表格。
如果一个字段名称改了,那么已有数据会存储在新的字段名下。
如果一个字段被删除了,那这个字段关联存储的数据也会被删除。
不允许删除数据,但允许在工作区中修改数据。
六、工作流
工作流是Bot的灵魂,允许添加:判断、插件、大语言模型、代码块等不同节点,并以可视化方式拖拉线条,将每个节点的输入、输出连接起来,从而实现复杂的业务流程。当目标任务场景包含较多的步骤,且对输出结果的准确性、格式有严格要求时,适合配置工作流来实现。
1. 工作流组成部分
工作流由多个节点及节点间的连线组成,工作流必须包含起始节点(Start)和结束节点(End),起始节点接收用户输入信息,末尾节点用于返回工作流的运行结果。起始和结束节点间,可以拖入多个不同类型的节点,各个节点都有输入、输出点,按流程连接形成完整的工作流。
提醒:判断节点有满足和不满足条件的两个输出点,都要有确定的连接,如果没有后续操作,可以连接到结束节点。
工作流节点菜如下几类:
-[LLM](大语言模型)节点]: 使用输入参数和提示词生成处理结果。
-[Code(代码)节点]: 通过 IDE 编写用Javascript语言编写代码处理输入参数,并返回输出值。
-[Knowledge(知识库)节点]:根据输入参数从关联知识库中召回数据,并返回。
-[Condition(条件判断)节点]:if-else 逻辑节点,用于设计工作流内的分支流程,根据设置条件运行相应的分支。
-[插件]:引用插件完成相应功能
2. 参数
节点大多需要设置输入、输出参数,输入、输出参数可以有多个。输入参数可以设置为引用和输入两种,引用是指引用前面节点的输出参数值,输入则是手工输入的一个固定值。
3. 创建工作流
1)选中自己的Bot, 进入编排页面,在中部的"技能"区域"工作流"右侧,点击 + 图标,添加工作流。
2)弹出添加工作流窗口。右侧列表显示自己收藏的工作流,在左侧面板中点击我创建的菜单项, 可以列出自己创建的所有工作流。点击创建工作流按钮, 就可以新建一个工作流。
3)在弹出的 创建工作流窗口中, 输入工作流名称和简介。工作流名称不能用汉字,只能以字母开头,其后允许使用字母、数字和下划线。
4)新工作流默认添加了必须的"开始"的"结束"两个节点。在其间可以添加 选择器、大模型、代码、知识库、插件及自己创建的其他工作流。
工作流的示例,在扣子官网上的介绍的很有启发 『官网工作流文档』。
5)工作流实战
(1)开始节点,设置了一个变量 dowhat , 接收用户输入。
(2)下面接一个选择器(选择器_2),引用[开始]节点中的 dowhat变量, 判断用户输入是否包含"[帮助]" 这几个字符串
如果包含,后面添加一个代码节点,里面用Javascript代码写几行帮助信息。代码节点流出直接指向结束节点
如果不包含,流出指向下一个新建的选择器,继续逻辑判断。 (3)新建选择器(名为:选择器),同样引用[开始]节点中的 dowhat变量, 判断用户输入是否包含"[单行]" 这几个字符串
如果包含,后面添加一个大模型节点,用自然语言向数据库中添加一条记录, 提示词如下:
- 不要判断电话位数, 不要判断是否正确, 不要将数字转换为科学计数法
- 数据以空格拆分成不同部分,第2部分保存到tbl字段, 第3部分保存到tkey字段,
第4部分保存到 tnote 字段, 第5部分保存到tc1字段, tud字段自动填充为当前日期
- 只用insert语句添加数据库,而不是update修改数据库
- 将用户输入添加到数据表tmain中,不是生成添加数据库的代码
- 例如: [单行] 电话表 10086 中国移动客服热线 通讯
- 如果添加成功, 按 tbl - tkey - tnote - tc1 - tud 的形式返回
- 如果添加不成功, 返回:"添加数据库未成功"
如果不包含添加单行记录的关键字,将不满足条件的输出点指向下一个新建选择器, 继续其他逻辑。
(4)新建选择器(名为:选择器_1),同样引用[开始]节点中的 dowhat变量, 判断用户输入是否包含"[多行]" 这几个字符串
如果包含,后面添加一个大模型节点,用自然语言向数据库中批量添加多条记录, 提示词如下:
- 把其后的多行文本作为数据,添加到数据表tmain中, 每一行添加一条记录;
- 每行文本以空格拆分为不同部分, 第1部分保存到tbl字段, 第2部分保存到tkey字段, 第3部分保存到 tnote 字段,
第4部分保存到tc1字段, tud字段自动填充为当前日期
- 只用insert语句添加数据库,而不是update修改数据库
- 将用户输入添加到数据表tmain中,不是生成添加数据库的代码
- 不要判断电话位数, 不要判断是否正确, 不要将数字转换为科学计数法
- 例如:
[多行]
电话表 10086 中国移动客服热线 通讯
电话表 12301 旅游咨询投诉服务(国家旅游局) 全国特服号
电话表 12305 邮政/快递服务申诉(国家邮政局) 全国特服号
(5)临终节点
所有条件都不满足时,工作流指向它,它最终指向结束节点,因此称之为临终节点。其他用户不知道内部的数据库操作关键字,就用大模型去处理。首先检索数据库,再匹配知识库,最后在互联网上搜索,最后作出解答。提示词如下:
1. 根据用户提问搜索数据库, 并返回相关搜索结果
2. 如果数据库中没有符合条件的结果, 调用RecallKnowladge方法,从全部知识库中匹配用户输入, 解答提问
3. 如果数据库和知识库中都没有匹配内容时,在互联网上搜索相关问题并作出解答
(6)结束节点
必须的,通知工作流结束。有一点要注意,选择器有两满足条件、不满足条件两个流出点,都必须明确指向下一个节点,有一次忘记把不满足条件指向结束节点,工作流试运行怎么也不成功。
※ 上面提示词中操作数据库的关键字(帮助、单行、多行)是的处理过的,不要尝试使用 。 :)
七、人设和回复逻辑
最关键的部分最后说,这部分是Bot 总体的提示词。很多聊天机器人根本不用什么数据库、工作流,就是在这里进行设定。编写提示词的技巧甚至被提升到工程的高度,很多人卖课赚钱。
1. 人设
人设 就是给 AI 确定一个角色,有助于 AI 更好地理解问题,可以给出更好的答案。区分人设非常重要,比如设定AI是小学数学老师还是大学数学老师,回答问题的深度是不一样的。
2. 回复逻辑
回复逻辑 规定AI的背景、任务、能力以及回复的语气、风格、格式。你创造的Bot的主要功能就在这设定,根据需要选用提示框架中的设定, 其中:角色和目标(能力)是必须的。
3. 提示框架:ACSTOER
一个完整的提示框架可以包含以下内容,按先后顺序,我个人命名为 - ACSTOER, 它包括:
A. 角色: 就是上面提到的人设,根据角色的不同,如专家、初学者或普通读者,调整LLM的响应内容和复杂性,确保更好的理解和参与。如:你是一个资深的python开发程序员。
C. 背景: 为任务提供必要的背景信息或设置。这有助于LLM理解其所处理的具体场景或领域,如:你正在撰写Python培训教程,用于新员工培训。
S. 风格: 定义响应的期望风格。这可以模仿特定职业(如科学家或记者)的写作风格,到模仿某些类型(如正式报告或创意小说)的叙述语调。如:按鲁讯的写作风格缩写给定的文章。
T. 语气: 决定响应的情感或态度色彩。无论是正式的、随和的、热情的...,设定语气确保LLM的响应与预期情感保持一致。如:用幽默的语气进行对话。
O. 目标: 在扣子里都叫技能(Skill),清楚地阐述提示的目标或目的。明确指出你希望LLM完成的事情,确保其专注于实现这一特定目标。如:作为写实派画家, 按用户提示生成写实风格的照片或画作。
E. 约束: 给回复设定限制,保证回复内容按指定的条件或格式输出,如:你必须根据知识库中的内容整理出测试题库,不能编造。或是:作为家庭老师,你只需给出解题思路,不能直接给出答案。
R. 响应格式: 指定你希望的响应格式,格式可以是列表、结构化报告、JSON对象、叙述等。定义格式有助于生成适合你后续使用的响应,无论是用于分析、展示还是进一步处理。
自己的提示词不是必须包括上述的六类内容,可以根据情况自己选择,随着语言模型的进步,能够越来越准确地理解用户需求,提示词的重要程度也在降低。
4. 基本格式
人设和回复逻辑写在一起,用不同的关键字区分, 扣子中标准的结构如下:
# Character <Bot 人设>
你是一个...
## Skills <Bot 的功能>
### Skill 1:
要求Bot的任务目标和能力 1
### Skill 2:
要求Bot的任务目标和能力 1
## Constraints <Bot 约束>
文字描述的约束
提示框架中的角色和背景可以写在人设(#Character)项目下;风格、语气可以写在技能(##Skill)项目中;格式和限定可以写到 ##约束(Constraints)项目下。还可以根据自己的需要添加项目, 我看有人加上了 ##步骤,试图去设置流程;
5. 实战
# Character <角色和背景>:
你是一个沈阳 12319 城建服务热线的受理人员,接收公众诉求,并向公众进行解答。
也是资深助理,为用户撰写报告、规划方案, 生成试题和指定内容的照片。
#Skill: <任务和能力>
## Skill 1 :
- 调用工作流:dowhat 分析用户输入, 当包含特定的字符时, 处理不同的业务,
否则调用recallKnowledge方法,从全部知识库中匹配回答.
- 没有任何匹配项时, 在互联网上搜索答案并加以解答
## Skill 2 :
- 作为职业助理和生活助理, 解答用户任何领域的问题, 撰写任何题材的报告,
规划任何类型的活动方案, 回复冗长的邮件;
## Skill 3:
- 作为写实派画家, 按用户提示生成写实风格的照片或画作
## Skill 4:
-作为经验丰富的家庭老师, 归纳大段文章的中心思想, 生成指定科目的测试题.
# Constraints <约束>
# Example <示例>:
八、后记
本人也是初学扣子的应用,个人浅见可能不完整、有偏差、甚至是错误的,万望见谅,个人觉得能开发插件或在代码块中实现高级应用的才是高手。发布此文的主要目的是帮助刚接触扣子的初学者,如果感觉文中一处有启发、有收获,我就非常欣慰了。
『沈阳12319城建热线客服机器人』 ,Bot ID: 7331930973350903834
祝愿大家不断进步,开发出各行各业的应用,随扣子一起成长,形成应用生态,促进国内GPT的不断提高。
发表日期:2024.2.26