Coze 扣子 | 用插件打造 "匠心千刃" 工具

发布于:2024-04-26 ⋅ 阅读:(23) ⋅ 点赞:(0)

在 一文中,介绍了 Coze 中创建 AI Bot 的过程,并且基于 知识库数据库 作为 AI Bot 的大脑,提供知识储备打造 。AI Bot 的聊天产出内容相对随机,如何能让 AI Bot 准确地通过自然语言,来精确处理任务呢?

本文就介绍一下,基于 Coze 扣子 插件,打造一款自然语言执行工具箱 。

image.png


一、 插件拓展 AI Bot 的上限

插件官网介绍:

1. 插件是什么

AI Bot 可以接收用户的输入指令,通过知识库大脑进行分析产出结果,相当于与用户交互的 客户端。而插件可以向 AI Bot 提供精确的接口运算数据,就相当于 服务端 提供 api 接口。当用户的输入,命中插件中的接口时,可以通过对应 api 返回的数据,进行回复。

image.png

插件可以大大拓展 AI Bot 的上限。知识库数据库 作为 AI Bot 的大脑,它只能基于数据做 感性 的分析;而缺乏理性的判断。插件则是通过编程语言,绝对理性地执行命令。同时用户只需通过 自然语言 来触发调用,这是非常有想象空间的。


2. 插件的价值

就像你的大脑再怎么强悍,网络查询到实时信息、对一百万个数字排序这些任务不借助外物是无法实现的。而插件就相当 让 AI Bot 的大脑,拥有编程的能力 。比如下面通过插件让 AI Bot 拥有搜索 github 仓库的功能:

image.png


或是可以给出自然语言描述,让 AI Bot 通过接口插件产出数据。如下所示,批量生成指定长度、个数的随机秘钥:

image.png


3. 插件带来的前后端分离

这样的视角下,就可以有一个很有趣现象。插件是提供数据的服务,相当于 服务端接口 。发布插件相当于部署服务,插件的代码逻辑相当于后端开发。这样 AI Bot 在发布之后,后端的数据可以发布,而不需要重新更新 AI Bot 。这就是前后端分离的思想:

image.png


打个比方,指南 命令,可以展示当前 匠心千刃 的能力。这个输出数据是通过插件接口得到的,所以可以进行更改,AI Bot 作为 前端 可以随时访问 后端 最新数据,不需更新。

image.png


二、通过 Coze IDE 创建插件

Coze 插件可以通过 python 和或 Node.js 编写代码,提供访问的 api。

官网介绍:

1. 创建插件

在扣子 主页/个人中心/插件/创建插件 中创建插件。由两种方式:

  • 基于已有服务,是基于已经有的服务器接口,提供数据
  • Coze IDE 创建插件,可以自己编辑服务代码,产出数据,灵活性非常高。

image.png


先通过一个简单的例子,介绍一下插件接口最简单的使用。如下所示,输入 指南 可以输出匠心千刃当前的功能。

image.png


下面是进入插件后的编辑区,可以展示当前插件中的所有接口。在代码区中书写接口代码。右侧可以运行测试,以及发布插件:

image.png

每个接口都有一个 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
    """}

2. 通过网络访问接口请求数据

如下所示,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 函数获取数据:

image.png

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 库,需要增加依赖包:

image.png


3. 随机数生成器

除了调用网络接口得到数据外,插件中的代码还可以执行逻辑,产出数据。这里拿 随机数生成器 来说,输入秘钥长度和生成的个数:

image.png

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 中通过人设和回复逻辑中,设计命中和回复逻辑。在中间的技能区,可以在插件中选择前面设计的插件:

image.png

AI Bot 作为和用户交互的前端,人设和回复逻辑 以及中间的面板,就相当于前端开发的组件。而一个 AI Bot 可视为一个应用程序。

[] 中是盛放输入关键字
你需要严格调用 [匠心千刃]  插件
工具应该严格输出插件接口的输出内容,禁止更改

- 输入 [指南] 时, 调用  help 接口,输出内容
- 输入 [随机秘钥] 调用 random 接口,[长度]为入参 length , [个数] 为入参 outputCount
- 输入为 [日期][date] 调用 date 接口
- 输入包含 [帮助]时, 调用  help 接口,输出内容
- 输入包含[ github 搜索], 调用 github_search 接口 , 命令中下一个单词作为入参 args。输出 10 个结果,输出包含 Star 个数

按照这个视角,如果 AI Bot 可以提供一些交互的组件,比如选择、输入、导入文件图片等。那么它的上限就可以非常高,常规的应用程序核心是视觉元素的渲染,而 AI Bot 是一个以回复数据为核心的应用程序。它可以依赖插件接口,基于输入通过代码获取输出结果。


这样 匠心千刃 可以作为一个工具箱,使用者可以通过自然语言进行使用,这是和常规应用最大的区别。匠心千刃 目前只是简单介绍插件的使用,后续有时间会逐步完善。

现在 Coze 可以发布的平台越来越多了,希望 Coze 扣子可以发展的越来越强大。本文就到这里,后面有机会再介绍一下工作流的使用,谢谢观看 ~

image.png

bot ID: 7361120595800604712