在 《Coze 扣子 | AI 养育计划 - "Flutter 大师"》 一文中,介绍了 Coze 中创建 AI Bot 的过程,并且基于 知识库 和 数据库 作为 AI Bot 的大脑,提供知识储备打造 Flutter 大师。AI Bot 的聊天产出内容相对随机,如何能让 AI Bot 准确地通过自然语言,来精确处理任务呢?
本文就介绍一下,基于 Coze 扣子 插件,打造一款自然语言执行工具箱 "匠心千刃" 。
插件官网介绍: www.coze.cn/docs/guides…
AI Bot 可以接收用户的输入指令,通过知识库大脑进行分析产出结果,相当于与用户交互的 客户端。而插件可以向 AI Bot 提供精确的接口运算数据,就相当于 服务端 提供 api 接口。当用户的输入,命中插件中的接口时,可以通过对应 api 返回的数据,进行回复。
插件可以大大拓展 AI Bot 的上限。知识库 和 数据库 作为 AI Bot 的大脑,它只能基于数据做 感性 的分析;而缺乏理性的判断。插件则是通过编程语言,绝对理性地执行命令。同时用户只需通过 自然语言 来触发调用,这是非常有想象空间的。
就像你的大脑再怎么强悍,网络查询到实时信息、对一百万个数字排序这些任务不借助外物是无法实现的。而插件就相当 让 AI Bot 的大脑,拥有编程的能力 。比如下面通过插件让 AI Bot 拥有搜索 github 仓库的功能:
或是可以给出自然语言描述,让 AI Bot 通过接口插件产出数据。如下所示,批量生成指定长度、个数的随机秘钥:
这样的视角下,就可以有一个很有趣现象。插件是提供数据的服务,相当于 服务端接口 。发布插件相当于部署服务,插件的代码逻辑相当于后端开发。这样 AI Bot 在发布之后,后端的数据可以发布,而不需要重新更新 AI Bot 。这就是前后端分离的思想:
打个比方,指南 命令,可以展示当前 匠心千刃
的能力。这个输出数据是通过插件接口得到的,所以可以进行更改,AI Bot 作为 前端
可以随时访问 后端
最新数据,不需更新。
Coze 插件可以通过 python 和或 Node.js 编写代码,提供访问的 api。
官网介绍: www.coze.cn/docs/guides…
在扣子 主页/个人中心/插件/创建插件 中创建插件。由两种方式:
先通过一个简单的例子,介绍一下插件接口最简单的使用。如下所示,输入 指南 可以输出匠心千刃当前的功能。
下面是进入插件后的编辑区,可以展示当前插件中的所有接口。在代码区中书写接口代码。右侧可以运行测试,以及发布插件:
每个接口都有一个 handler
函数,用于逻辑处理。其中 Args
可以获取输入参数,当前接口没有使用输入,后面其他接口再做介绍。返回值里传出当前接口产出的数据:
from runtime import Args
from typings.help.help import Input, Output
def handler(args: Args[Input])->Output:
return {"message": """
文字处理
随机秘钥, 参数:长度、个数
日期工具
输入: [日期] 或者 [date] 查看当前日期
输入: [时间戳] 转换 Unix 时间戳
搜索:
搜索 github 仓库
调用方式,命令+参数:
例: 日期
例: 随机秘钥,长度 30;个数10
"""}
如下所示,github 搜索仓库可以通过 python 进行网络请求相关接口,传入搜索的仓库名:
def search_github_repo(repo_name):
base_url = "https://api.github.com"
search_path = "/search/repositories"
params = {"q": repo_name}
response = requests.get(base_url + search_path, params=params)
ret = []
if response.status_code == 200:
data = response.json()
repos = data.get("items", [])
for repo in repos:
my_dict = {}
my_dict['name'] = "名称:" + repo.get("name"),
my_dict['star'] = "Star:" + str(repo.get("stargazers_count")),
my_dict['URL'] = "URL:" + repo.get("html_url"),
my_dict['description'] = "描述:" + str(repo.get("description")),
ret.append(my_dict)
else:
ret.append("查询失败:"+response.text)
return ret
接口中的元数据,可以设定 输入参数 和 输出参数 。在 handler
方法中, Args 参数的 input
可以访问对应设置的参数,调用 search_github_repo
函数获取数据:
from runtime import Args
from typings.github_search.github_search import Input, Output
import requests
def handler(args: Args[Input])->Output:
args = args.input.args
ret = search_github_repo(args)
return {"message": ret }
网络请求中用到的的 requests 库,需要增加依赖包:
除了调用网络接口得到数据外,插件中的代码还可以执行逻辑,产出数据。这里拿 随机数生成器
来说,输入秘钥长度和生成的个数:
def handler(args: Args[Input])->Output:
len = args.input.length
count = args.input.outputCount
ret = gen(len,count)
return { "message": ret }
如下所示,提供 gen
方法生成数据,从大写字母、小写字母、数字和特殊字符中随机挑选字符组合:
def gen(len, outputCount):
letter_map = {
LetterType.low: range_letter(ord('a'), ord('z') + 1),
LetterType.up: range_letter(ord('A'), ord('Z') + 1),
LetterType.num: range_letter(ord('0'), ord('9') + 1),
LetterType.sp: ['@', '#', '$', '%', '^', '&', '*']
}
ret = []
for _ in range(outputCount):
value = gen_secret(length=len, letter_map=letter_map)
ret.append(value)
return ret
class LetterType(Enum):
low = 1 # 小写字母
up = 2 # 大写字母
num = 3 # 数字
sp = 4 # 特殊符号
def gen_secret(length=8, enables=None, letter_map=None):
if enables is None:
enables = list(LetterType)
if letter_map is None:
letter_map = {
LetterType.low: range_letter(ord('a'), ord('z') + 1),
LetterType.up: range_letter(ord('A'), ord('Z') + 1),
LetterType.num: range_letter(ord('0'), ord('9') + 1),
LetterType.sp: ['@', '#', '$', '%', '^', '&', '*']
}
result = []
for _ in range(length):
type_index = random.randint(0, len(enables) - 1)
letters = letter_map.get(enables[type_index], [])
if letters:
result.append(random.choice(letters))
return ''.join(result)
def range_letter(start, end):
return [chr(i) for i in range(start, end)]
插件作为强大的后备武器库,可以在 AI Bot 中通过人设和回复逻辑中,设计命中和回复逻辑。在中间的技能区,可以在插件中选择前面设计的插件:
AI Bot 作为和用户交互的前端,人设和回复逻辑 以及中间的面板,就相当于前端开发的组件。而一个 AI Bot 可视为一个应用程序。
[] 中是盛放输入关键字
你需要严格调用 [匠心千刃] 插件
工具应该严格输出插件接口的输出内容,禁止更改
- 输入 [指南] 时, 调用 help 接口,输出内容
- 输入 [随机秘钥] 调用 random 接口,[长度]为入参 length , [个数] 为入参 outputCount
- 输入为 [日期] 或 [date] 调用 date 接口
- 输入包含 [帮助]时, 调用 help 接口,输出内容
- 输入包含[ github 搜索], 调用 github_search 接口 , 命令中下一个单词作为入参 args。输出 10 个结果,输出包含 Star 个数
按照这个视角,如果 AI Bot 可以提供一些交互的组件,比如选择、输入、导入文件图片等。那么它的上限就可以非常高,常规的应用程序核心是视觉元素的渲染,而 AI Bot 是一个以回复数据为核心的应用程序。它可以依赖插件接口,基于输入通过代码获取输出结果。
这样 匠心千刃 可以作为一个工具箱,使用者可以通过自然语言进行使用,这是和常规应用最大的区别。匠心千刃 目前只是简单介绍插件的使用,后续有时间会逐步完善。
现在 Coze 可以发布的平台越来越多了,希望 Coze 扣子可以发展的越来越强大。本文就到这里,后面有机会再介绍一下工作流的使用,谢谢观看 ~