type
status
date
slug
summary
tags
category
icon
password

准备工作

准备好OpenAI的token,即sk—xxx,若只有账号,可在OpenAI sdk官网上获取。若没有openAI的账号,请参考博主的上一篇文章 ChatGPT注册流程

摘要

本文帮助你快速实现一个钉钉对话机器人,并在其中接入 ChatGPT 的能力,可以直接问它问题,也可以在群聊天中@它,返回 ChatGPT 的回答。博主就是通过此方法,开始走上自己部署自己的AIGC伙伴的。
notion image

通过本文你将学会

  1. 创建一个钉钉机器人
  1. 使用 AirCode 的「一键复制代码」功能,实现机器人聊天
  1. 将机器人接入 ChatGPT,实现智能对话,连续对话

第一步:创建钉钉机器人

  1. 进入钉钉开发者后台,选择应用开发 > 企业内部开发,点击创建应用按钮,在弹出的对话框中输入名称、简介等信息,完成应用创建。
notion image
  1. 在创建好的应用页面中,点击左侧菜单的应用功能 > 消息推送,并打开机器人配置
notion image
  1. 在机器人配置的表单中,依次填入机器人名称、机器人图标、机器人简介、机器人描述和机器人消息预览图,并点击发布按钮完成发布。
    1. 注意:由于钉钉的安全策略,机器人名称中不要包含「ChatGPT」关键字,否则后续无法正常调用。
notion image
notion image
  1. 发布成功后,进入基础信息 > 应用信息,可以看到 AppKeyAppSecret,点击复制备用。
notion image

第二步:创建 AirCode 应用

  1. 通过 AirCode 源码链接中右上角的「Get a copy」按钮快速生成一个自己的 AirCode Node.js 应用。 注意不要直接复制代码,如果是直接复制纯代码粘贴过去,需要再手工安装 NPM 依赖包。 如果没有登录,需先登录 AirCode。推荐使用 GitHub 登录,会快一些。
notion image
notion image
  1. 在弹出的对话框中,输入应用名称,并点击 Create 完成创建。
notion image
  1. 钉钉开发者后台中机器人的 AppKey 和 AppSecret,粘贴到 AirCode 应用的环境变量(Environments)中。在 DING_APP_KEY 的 value 中填入 AppKey,在 DING_APP_SECRET 的 value 中填入 AppSecret。
notion image
  1. 点击顶部的 Deploy 按钮,部署整个应用,使配置生效。
notion image

第三步:配置机器人接口和权限

  1. 部署成功后,选择调用文件 chat.js,可以在编辑器函数名称下看到调用 URL,点击复制 URL。
notion image
  1. 进入钉钉开发者后台中刚刚创建的机器人页面,在应用功能 > 消息推送中,将调用 URL 填写到消息接收地址项,并点击发布
notion image
  1. 进入基础信息 > 权限管理,在搜索框中输入「企业内机器人发送消息权限」,会看到列表中找到了对应的权限,点击右侧的申请权限按钮,完成权限配置。
notion image

第四步:测试聊天机器人

  1. 完成配置后,在钉钉的聊天窗口中可以搜到机器人进行私聊,或者将机器人加入到群中 at 机器人聊天。此时机器人已经可以对话了,但由于还没有配置 ChatGPT 能力,所以机器人会回复告知需要配置 OPENAI_KEY。
    1. 提示:如果你的机器人返回了类似于「系统正在维护,无法使用 @ 能力」的回复,说明你的机器人名称或简介中包含了「ChatGPT」关键字,被钉钉屏蔽了,更改一下名称或简介后,重新发布即可。
notion image
  1. 在 AirCode 中选中 chat.js 函数,并点击右侧 Debug 标签下的 Mock by online request 按钮,在弹出对话框中可以看到刚才收到的请求,点击 Use this to debug 则可以使用线上真实的请求数据来调试。
notion image

第五步:接入 ChatGPT 能力

  1. 登录到你的 OpenAI 控制台中(如果还没有账号,需要注册一个),进入 API Keys 页面,点击 Create new secret key 创建一个密钥。
notion image
  1. 在弹出的对话框中,点击复制图标,将这个 API Key 复制并保存下来。注意:正确的 API Key 都是以 sk- 开头的字符串。
notion image
  1. 进入刚才创建好的 AirCode 应用中,在 Environments 标签页,将复制的 API Key 的值填入 OPENAI_KEY 这一项的 value 中。
notion image
  1. 再次点击 Deploy 部署应用后,可以在钉钉中测试。目前 ChatGPT 服务比较慢,尤其是模型版本越高级、问题越复杂,ChatGPT 服务的返回时间会越长。
notion image
notion image

第六步:实现连续对话的能力

相信你已经体验了一下,基础的对话能力是可以的,但无法实现连续对话。博主将实现连续对话的修改代码附在了如下的代码中。
按照下文,修改chat.js,并重新编译
// @see https://docs.aircode.io/guide/functions/ const aircode = require('aircode'); const { Configuration, OpenAIApi } = require('openai'); const { generateSign, reply, handleError } = require('./_utils'); // 从环境变量中获取到钉钉和 OpenAI 的相关配置 const DING_APP_SECRET = process.env.DING_APP_SECRET || ''; const OPENAI_KEY = process.env.OPENAI_KEY || ''; // 当前使用的是 OpenAI 开放的最新 GPT-3.5 模型,如果后续 GPT-4 的 API 发布,修改此处参数即可 // OpenAI models 参数列表 https://platform.openai.com/docs/models const OPENAI_MODEL = process.env.OPENAI_MODEL || 'gpt-3.5-turbo'; const MAX_MESSAGES_PER_CHAT = 10; // 主方法 module.exports = async function (params, context) { if (context.method !== 'POST') { // 钉钉机器人消息是 POST 请求,所以忽略所有非 POST 请求 return; } // 如果设置了 SECRET,则进行验证 if (DING_APP_SECRET) { //从 Headers 中拿到 timestamp 和 sign 进行验证 const { timestamp, sign } = context.headers; if (generateSign(timestamp) !== sign) { return; } } // 打印请求参数到日志,方便排查 console.log('Received params:', params); const { msgtype, text, conversationId } = params; // 示例中,我们只支持文本消息 if (msgtype !== 'text') { return reply(params, '抱歉,目前只支持文本消息发送哦 [发呆]'); } // 如果没有配置 OPENAI_KEY,则提醒需要配置 if (!OPENAI_KEY) { return reply( params, '抱歉,目前缺少口令,请更换API!' ); } // 将用户的问题存入数据表中,后续方便进行排查,或者支持连续对话 const { content } = text; const ChatsTable = aircode.db.table('chats'); await ChatsTable.save({ conversationId, role: 'user', content }); // Retrieve chat history const chats = await ChatsTable.where({ conversationId }) .sort({ createdAt: -1 }) .limit(MAX_MESSAGES_PER_CHAT) .find(); const messages = [ //{ role: 'system', content: 'You are a helpful assistant.' }, { role: 'system', content: '你是一个十分乐于助人的AI助手。' }, ...chats.reverse().map((one) => ({ role: one.role, content: one.content })), ]; const openai = new OpenAIApi(new Configuration({ apiKey: OPENAI_KEY })); try { // 请求 GPT 获取回复 const completion = await openai.createChatCompletion({ model: OPENAI_MODEL, messages, }); const responseMessage = completion.data.choices[0].message; // 将 ChatGPT 的响应也存入数据库 await ChatsTable.save({ conversationId, ...responseMessage }); // 回复钉钉用户消息 return reply(params, responseMessage.content); } catch (error) { // 错误处理,首先打印错误到日志中,方便排查 console.error(error.response || error); // 根据不同的情况来生成不同的错误信息 const errorMessage = handleError(error); // 回复错误信息给用户 return reply(params, `错误信息: ${errorMessage}`); } };
 
ChatGPT能用来干什么其他浏览器如何使用微软New Bing聊天

AI Mind
AI Mind
'❤AIGC 改变未来,为你赋能❤'
公告
type
status
date
slug
summary
tags
category
icon
password
🎉AIGC 改变未来,为你赋能🎉
博主是一名在AI方向探索的实习生,希望能在AI帮助下逐渐由普通人成长为超级个体。大家共勉😘