AI 机器人 - 自定义工具

:bookmark: 本指南介绍了如何在 Discourse AI 插件中创建、配置和集成自定义 AI 工具,使管理员能够通过用户定义的 JavaScript 函数扩展机器人的功能。

:person_raising_hand: 所需用户级别:管理员

工具是可编程的功能,AI 机器人可以使用它们来执行特定任务或检索信息,而不仅仅是基于文本的响应。这些工具是脚本或集成,允许机器人与外部 API 交互、操作数据或执行其他功能来扩展其功能。

摘要

本文档涵盖:

  • 创建新的自定义 AI 工具
  • 配置工具参数和脚本
  • 可用于工具脚本的 API
  • 将自定义工具与 AI 角色集成
  • 测试和故障排除自定义工具

创建新的自定义 AI 工具

要创建新的 AI 工具:

  1. 导航到管理面板 > 插件 > Discourse AI > 工具
  2. 点击“新建工具”(您可以使用现有的预设来了解选项)
  3. 填写以下字段:
    • 名称:工具在 LLM 中显示的名称
    • 描述:工具在 LLM 中显示的描述
    • 摘要:工具的作用以帮助用户的摘要(显示在详细信息中)
    • 参数:定义工具作为 LLM 显示的输入
    • 脚本:为工具提供动力的 JavaScript 代码
  4. 点击“保存”

配置工具脚本

可用 API

您的工具脚本可以访问以下 API:

  1. HTTP 请求:

    http.get(url, options)
    http.post(url, options)
    

    使用这些与外部服务进行交互。您可以使用 options 来指定 HTTP 标头:

    http.get(url, { headers: { Auth: "some value" } })
    http.post(url, { headers: { Auth: "some value", body: "some body" } })
    http.patch(url, { headers: { Auth: "some value", body: "some body" } })
    http.delete(url, { headers: ...})
    http.put(url, { headers: ... , body: ...})
    
  2. LLM(语言模型)集成:

    llm.truncate(text, length)
    

    这允许您在 AI 模型令牌限制内操作文本。

  3. 自定义上传集成 (RAG)

    index.search(query, { filenames: options, limit: max_fragments_optional })
    
  4. 上传创建支持

    upload.create(filename, base_64_content)
    
  5. 执行链控制

    chain.setCustomRaw(raw) - 设置链中 post 的正文。
    

所需函数

您的脚本必须实现:

  • invoke(params):调用工具时执行的主函数

它还可以选择实现:

  • details():(可选)提供有关工具执行的附加信息

示例脚本:

function invoke(params) {
  let result = http.get("https://api.example.com/data?query=" + params.query);
  return JSON.parse(result.body);
}

function details() {
  return "Fetched data from Example API";
}

限制和安全

  • 执行超时:工具的默认超时时间为 2 秒
  • HTTP 请求:每个工具执行最多 20 个请求
  • 沙盒环境:无法访问服务器文件系统或 Ruby 库

测试您的工具

您应该测试您构建的任何工具,以确保提供给 LLM 的结果符合您的预期。

将工具与 AI 角色集成

要将自定义工具添加到 AI 角色:

  1. 转到管理面板 > 插件 > Discourse AI > 角色
  2. 编辑现有角色或创建新角色
  3. 在“工具”部分,您将看到自定义工具与内置工具并列显示
  4. 选择您的自定义工具以将其添加到角色

自定义工具实战

一旦您将自定义工具提供给 LLM,它就可以使用它来增强对话。

故障排除

如果您的工具无法按预期工作:

  1. 使用测试界面确保它对您的输入表现符合预期。
  2. 确保您的组在 ai_bot_debugging_allowed_groups 中。此组的成员可以完全访问机器人会话记录;您可以在此处查看 AI 日志。
  3. 如果发生任何意外情况,请访问 https://SITENAME/logs 检查错误。

附加资源

14 个赞

我刚开始为 Discourse 中的 AI 角色构建工具,部分原因是为了能够真正专注于此;鉴于存在如此多有用且公开的 API,这似乎非常有益!

例如,我得到的结果包括:

通过扑克策略理解决策制定 AI

maiki:

创建一个《塞尔达传说:旷野之息》的信息卡。

gpt-4o:

这是《塞尔达传说:旷野之息》的信息卡:


标题: 《塞尔达传说:旷野之息》
开发商: 任天堂
发行商: 任天堂
发布日期: 2017 年 3 月 3 日
平台: Nintendo Switch、Wii U
类型: 动作冒险
模式: 单人

剧情简介:
游戏设定在一个广阔的开放世界中,玩家扮演林克,他从沉睡中醒来,以击败灾厄盖侬并拯救海拉鲁王国。游戏因其沉浸式环境而受到赞誉,玩家可以自由地探索和与世界及其系统互动。

奖项:
该游戏因其创新的设计、广阔的世界和迷人的玩法赢得了众多奖项,包括多个年度游戏奖项。

更多信息: Wikidata 条目


《旷野之息》以重新定义开放世界游戏并提供鼓励探索和发现的迷人体验而闻名。

maiki:

为《集合啦!动物森友会》也做同样的事情。

gpt-4o:

这是《集合啦!动物森友会》的信息卡:


标题: 《集合啦!动物森友会》
开发商: 任天堂
发行商: 任天堂
发布日期: 2020 年 3 月 20 日
平台: Nintendo Switch
类型: 社交模拟
模式: 单人、多人

剧情简介:
在这款迷人的社交模拟游戏中,玩家扮演一个可定制的角色,在购买了 Nook 先生的一揽子计划后,搬迁到一个荒岛上。游戏允许实时探索、资源收集、制作和定制,营造出一种社区感和轻松的游戏体验。

奖项:
该游戏因其创意自由和发布时机而广受好评,并因其在疫情期间对年度游戏和社交游戏的贡献而获奖。

更多信息: Wikidata 条目


《集合啦!动物森友会》成为一种文化现象,因其引人入胜的社交功能和在充满挑战的时期缓解压力的游戏玩法而受到赞誉。

maiki:

远离芝加哥

gpt-4o:

这是关于书籍《远离芝加哥》的信息卡:


标题: 《远离芝加哥》
作者: Richard Peck
出版年份: 1998
类型: 历史小说、青少年文学
ISBN: 978-0141303529

剧情简介:
这部纽伯瑞荣誉奖小说是一系列短篇故事,讲述了乔伊和他的妹妹玛丽·爱丽丝在 20 世纪 20 年代末和 30 年代每年夏天从芝加哥前往伊利诺伊州的一个乡村小镇拜访他们极富传奇色彩的奶奶 Dowdel 的经历。每一章都呈现了一个有趣而感人的插曲,在经济大萧条的背景下传达了生活课程。

奖项:
这本书于 1999 年获得纽伯瑞荣誉奖,并因其幽默、深度以及对 20 世纪早期美国乡村生活的描绘而受到赞誉。

更多信息: Wikidata 条目


这本书因其怀旧而温馨的故事而受到赞赏,捕捉了家庭纽带和简单时光的精髓。

maiki:

思考的赌注

gpt-4o:

我之前找到了“思考的赌注”的 Wikidata 条目,但目前无法直接从 Wikidata 获取更多具体细节。不过,这是基于现有信息的一个简短卡片:


标题: 《思考的赌注:在信息不全时做出更明智的决定》
作者: Annie Duke
出版年份: 2018
类型: 非虚构、决策、心理学
ISBN: 978-0735216358

剧情简介:
这本书借鉴了扑克的经验,帮助读者理解不确定情况下的决策制定。Annie Duke 结合了她作为职业扑克玩家和认知心理学家的经验,提供了一个做出更明智决策、评估结果和采用概率思维的框架。

更多信息: Wikidata 条目


如需详细见解,您可以考虑查阅有关书籍出版物的其他资源或数据库。


好的,这没问题,但我注意到这个描述……

……我想知道:我是否应该直接参考这些工具来构建我的提示,以便高效使用?

我编写提示的一般方法是随着时间的推移进行完善,然后锁定我希望 AI 工具采用的行为模式。但是,如果我能够添加具体的说明,例如何时查找 Wikidata 条目,以及何时列出特定条目的所有声明(两个不同的 API),那么我觉得我可以将整个工作流程精炼成我想要的样子…… :star_struck:

3 个赞

在系统提示中清楚地解释工具并提供示例确实是有益的。

2 个赞

在自定义工具中是否可以从管理员设置中插入 API 密钥和 OpenAI 项目?

1 个赞

您可以从自定义工具发出 REST 调用并指定所有标头

2 个赞

刚意识到,哈哈……抱歉,我脑子短路了。

1 个赞

我已经将一些文档上传到一个 Persona,它生成了嵌入,现在可以对其进行语义搜索。但在某些情况下,语义搜索并非理想选择,因此我想对其进行增强,实现混合搜索,例如保留现有功能并添加关键字搜索。目前,如果我想这样做,我应该编写一个自定义工具,对吗?
我知道我可以简单地将文档发布为主题,然后它就可以与原生的 Discourse 搜索配合使用,但这目前不是一个选项。