前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Coze 扣子 | 用插件打造 "匠心千刃" 工具

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

作者头像
张风捷特烈
发布2024-05-01 08:35:50
920
发布2024-05-01 08:35:50
举报

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

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


一、 插件拓展 AI Bot 的上限

插件官网介绍: www.coze.cn/docs/guides…

1. 插件是什么

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

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

2. 插件的价值

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

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

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

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

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

二、通过 Coze IDE 创建插件

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

官网介绍: www.coze.cn/docs/guides…

1. 创建插件

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

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

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

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

每个接口都有一个 handler 函数,用于逻辑处理。其中 Args 可以获取输入参数,当前接口没有使用输入,后面其他接口再做介绍。返回值里传出当前接口产出的数据:

代码语言:javascript
复制
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 进行网络请求相关接口,传入搜索的仓库名:

代码语言:javascript
复制
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 函数获取数据:

代码语言:javascript
复制
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 库,需要增加依赖包:

3. 随机数生成器

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

代码语言:javascript
复制
def handler(args: Args[Input])->Output:
    len = args.input.length
    count = args.input.outputCount
    ret = gen(len,count)
    return {  "message": ret }

如下所示,提供 gen 方法生成数据,从大写字母、小写字母、数字和特殊字符中随机挑选字符组合:

代码语言:javascript
复制
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 作为和用户交互的前端,人设和回复逻辑 以及中间的面板,就相当于前端开发的组件。而一个 AI Bot 可视为一个应用程序。

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

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

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

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

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

本文参与?腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-05-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客?前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与?腾讯云自媒体分享计划? ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、 插件拓展 AI Bot 的上限
    • 1. 插件是什么
      • 2. 插件的价值
        • 3. 插件带来的前后端分离
        • 二、通过 Coze IDE 创建插件
          • 1. 创建插件
            • 2. 通过网络访问接口请求数据
              • 3. 随机数生成器
              • 三、AI Bot 中使用插件
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
              http://www.vxiaotou.com