五分钟开发一个钉钉 ChatGPT 机器人

基于AirCode、ChatGPT-3.5、Node.js、钉钉微服务机器人搭建。

本文帮助你快速实现一个钉钉对话机器人,并在其中接入 ChatGPT 的能力,可以直接问它问题,也可以在群聊天中 at 它,返回 ChatGPT 的回答。(以下为效果截图)
在这里插入图片描述

第一步:创建钉钉机器人

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

第二步:创建 AirCode 应用

  1. AirCode 钉钉机器人模板创建地址,这会基于此模板创建一个你自己的应用也可以点击此链接跳转官网。如果没登录的话,可能会先跳转到登录页面,推荐使用 GitHub 登录,会快一些,。在这里插入图片描述
  2. 在弹出的对话框中,输入应用名称,并点击 Create 完成创建。在这里插入图片描述
  3. 将钉钉开发者后台中机器人的 AppKey 和 AppSecret,粘贴到 AirCode 应用的环境变量(Environments)中。在 DING_APP_KEY 的 value 中填入 AppKey,在 DING_APP_SECRET 的 value 中填入 AppSecret。在这里插入图片描述
  4. 点击顶部的 Deploy 按钮,部署整个应用,使配置生效。在这里插入图片描述

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

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

第四步:测试聊天机器人

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

第五步:接入 ChatGPT 能力

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

服务端代码模板里面已经自带了,有些小伙伴需要自己部署的话我就贴下面

_utils.js

	// @see https://docs.aircode.io/guide/functions/
const aircode = require('aircode');
const crypto = require('crypto');
const axios = require('axios');// 从环境变量中获取到钉钉的相关配置
const DING_APP_KEY = process.env.DING_APP_KEY || '';
const DING_APP_SECRET = process.env.DING_APP_SECRET || '';// 辅助方法,用于根据钉钉的规则生成签名,校验消息合法性
function generateSign(timestamp) {const stringToSign = timestamp + '\n' + DING_APP_SECRET;const hmac = crypto.createHmac('sha256', DING_APP_SECRET);hmac.update(stringToSign);const sign = hmac.digest().toString('base64');return sign;
}// 辅助方法,获取钉钉机器人的 AccessToken
async function getAccessToken() {if (!DING_APP_KEY || !DING_APP_SECRET) {throw new Error('没有正确设置 DING_APP_KEY 和 DING_APP_SECRET 环境变量,请进入 AirCode 中完成设置。')}// 先从数据库中获取 token 看下是否过期,这样不用每次都发起请求const TokenTable = aircode.db.table('token');const item = await TokenTable.where().sort({ expiredAt: -1 }).findOne();const now = Date.now();// 如果 token 还在有效期内,则直接返回if (item && item.expiredAt > now) {return item.token;}// 否则,请求钉钉获取 tokenconst { data } = await axios.post('https://api.dingtalk.com/v1.0/oauth2/accessToken',{appKey: DING_APP_KEY,appSecret: DING_APP_SECRET,},);const token = data.accessToken;const expiredAt = now + data.expireIn * 1000;// 将 token 存入数据库await TokenTable.save({ token, expiredAt });// 返回 tokenreturn token;
}// 辅助方法,用于钉钉发送单聊消息
async function sendPrivateMessage(userId, content) {const token = await getAccessToken();return axios.post('https://api.dingtalk.com/v1.0/robot/oToMessages/batchSend',{robotCode: DING_APP_KEY,userIds: [ userId ],msgKey: 'sampleText',msgParam: JSON.stringify({ content }),},{headers: {'x-acs-dingtalk-access-token': token,},},);
}// 辅助方法,用于钉钉发送群聊消息
async function sendGroupMessage(conversationId, content) {const token = await getAccessToken();return axios.post('https://api.dingtalk.com/v1.0/robot/groupMessages/send',{robotCode: DING_APP_KEY,openConversationId: conversationId,msgKey: 'sampleText',msgParam: JSON.stringify({ content }),},{headers: {'x-acs-dingtalk-access-token': token,},},);
}// 辅助方法,回复用户的消息
async function reply(event, content) {// 如果没有配置钉钉的 Key 和 Secret,则通过直接返回的形式回复// 注意这种形式虽然简单,但可能因为超时而无法在钉钉中获得响应if (!DING_APP_KEY || !DING_APP_SECRET) {return {msgtype: 'text',text: { content },};}// 如果配置了 Key 和 Secret,则通过调用接口回复// 根据 conversationType 判断是群聊还是单聊if (event.conversationType === '1') {// 单聊await sendPrivateMessage(event.senderStaffId, content);} else {// 群聊await sendGroupMessage(event.conversationId, content);}return { ok: 1 };
}// 辅助方法,处理错误,生成错误消息
function handleError(error) {let errorMessage;if (error.response) {// 如果有 error.response,代表请求发出了,而服务器回复了错误const { status, statusText, data } = error.response;if (status === 401) {// 401 代表 OpenAI 认证失败了errorMessage = '你没有配置正确的 OpenAI API Key,请进入 AirCode 中配置正确的环境变量。'} else if (data.error && data.error.message) {// 如果 OpenAI 返回了错误消息,则使用 OpenAI 的errorMessage = data.error.message;} else {// 否则,使用默认的错误消息errorMessage = `Request failed with status code ${status}: ${statusText}`;}} else if (error.request) {// 如果有 error.request,代表请求发出了,但没有得到服务器响应errorMessage = 'OpenAI 服务器没有响应,可以前往 https://status.openai.com/ 查看其服务状态。';} else if (error.code === 'ENOTFOUND' || error.code === 'ECONNREFUSED') {// 网络错误,例如 DNS 解析错误或者建连失败errorMessage = `Network error: ${error.message}`;} else {errorMessage = error.message;}return errorMessage;
}module.exports = {generateSign,reply,handleError,
};

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 || '';
const OPENAI_MODEL = process.env.OPENAI_MODEL || 'gpt-3.5-turbo';// 主方法
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, '恭喜你已经调通了机器人,现在请进入 AirCode 中配置 OPENAI_KEY 环境变量,完成 ChatGPT 连接。');}// 将用户的问题存入数据表中,后续方便进行排查,或者支持连续对话const { content } = text;const ChatsTable = aircode.db.table('chats');await ChatsTable.save({ conversationId, role: 'user', content });// 构建发送给 GPT 的消息体const messages = [{ role: 'system', content: 'You are a helpful assistant.' },{ role: 'user', 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}`);}
}
从机器人的创建到上线至此已全部完成啦!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/977.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

新技术前沿-2023-ChatGPT基于人工智能技术的聊天机器人

chatgpt镜像网站 一文带你了解爆火的Chat GPT ChatGPT系列文章 为什么ChatGPT这么强?—— 一文读懂ChatGPT原理! 1 简介 1.1 ChatGPT是什么 ChatGPT是一种基于人工智能技术的聊天机器人,它可以模拟人类对话,回答用户的问题和提…

ChatGPT - 高效的提问结构

文章目录 Pre提问结构 Pre ChatGPT - 如何高效的调教ChatGPT (指令建构模型-LACES问题模型) 提问结构 与ChatGPT进行高效的对话,有几个提示: 问清楚和具体的问题。避免问含混和过于宽泛的问题,ChatGPT会找不到准确和满意的答案。避免问需要复杂推理和…

关于ChatGPT,想了解的看过来

12月1日,微软投资的AI实验室OpenAI发布了一款聊天机器人模型ChatGPT,能够模拟人类的语言行为,与用户进行自然的交互。 一经问世,ChatGPT就被用户们疯狂“调戏”,有人用其写小作文,有人拿高考题来考验它&…

ChatGPT学习-如何向ChatGPT提问

​ 最近在学习chatGPT,怎么样的提问是一个好的提问。通过网上找资料肯定不是最好的方法,我想起一句话,“不识庐山真面目,只缘身在此山中”。最好的老师就是chatGPT! 下面先展示下提问成果,我通过xmind生成了思维导图 一…

ChatGPT常用提问技巧

上篇文章《ChatGPT万能提问技巧》中提到的万能提问技巧-RPEP提问法,家人们用ChatGPT能够轻松应对大部分的对话场景,获得更加出色的回答了吧!今天,我们在提供两种常用的提问模式,让家人们使用ChatGPT都很轻松获得需要的…

向ChatGPT提问的方法技巧

如何向ChatGPT提问,获得高质量的回复?针对这个问题,小编进行了相关的测试,今天跟大家分享向ChatGPT提问的技巧。 以自媒体作者为例,不同平台具有不同的阅读习惯,当我们想要创作一篇小红书笔记,…

ChatGPT 提问公式大全,内容详细

Chat GPT chatGPT 提问公式大全 1.假设你是一个XX角色,如何回答以下问题 2.在遵守以下X条规则的前提下,回答这个问题 3.请参考以下例子,将其扩展到XX字数,并保持类似的风格 4.你作为一个XX领域的专家,请完成以下XX任务 5.请尽可能具体地描述以下情景,以便读者仅通过…

【Prompt】7 个向 chatGPT 高效提问的方法

欢迎关注【youcans的 AIGC 学习笔记】原创作品 【Prompt】7 个向 chatGPT 高效提问的方法 0. 向 chatGPT 高效提问的方法1. 提问方法:明确问题2. 提问方法:简洁清晰3. 提问方法:避免歧义4. 提问方法:提供上下文5. 提问方法&#x…

如何使用ChatGpt来学习和提问【对话ChatGPT】?

ChatGPT的不断发展和进步,我们需要工作中很多时候会用到ChatGPT,那么如何使用ChatGPT来解决我们工作中的问题呢? Q1如何向ChatGPT提问,从而更快解决我们的问题? ChatGPT:以下是向ChatGPT提问的一些提示&a…

ChatGPT提问指令大全(建议收藏)

在使用 ChatGPT 时,当你给的指令越精确,它的回答会越到位,举例来说,假如你要请它帮忙写文案,如果没给予指定情境与对象,它会不知道该如何回答的更加准确。 一、写报告 1、我现在正在 [报告的情境与目的]。…

chatgpt赋能python:用Python自动买卖股票-实现你的金融自由梦想

用Python自动买卖股票 - 实现你的金融自由梦想 随着数字化时代的不断发展,越来越多的人开始投资股票以实现财务自由。而对于投资股市的人来说,如何自动化交易是一个很重要的问题。Python自动买卖股票就是一种可行的方式。 什么是Python自动买卖股票 P…

ChatGPT实用指南!!设计师必看!!

ChatGPT 最近真的太火了,每天都会在网上刷到关于它的各种讨论,身边的同事也已经在用它处理一些文字相关工作,不知道大家有没有用起来呢? 最近我在网上看很多大神分享的 ChatGPT 使用教程,发现自己之前对 ChatGPT 的认…

ChatGPT背后的模型

文章目录 1.RLHF方法2.ChatGPT中的RLHF方法2.1 微调模型GPT-32.2 训练奖励模型2.3 利用强化学习进一步微调语言模型 3.效果4.面临挑战5.参考 InstructGPT语言模型,是一个比 GPT-3 更善于遵循用户意图,同时使用通过我们的对齐研究开发的技术使它们更真实、…

ChatGPT Prompt工程:设计、实践与思考

作者 | 太子长琴 整理 | NewBeeNLP 大家好,这里是 NEewBeeNLP。ChatGPT 火爆出圈了,有些人惊叹于它的能力,当然也有部分人觉得也就那样。这就不得不提 Prompt 了,据说【相关文献1】,ChatGPT 效果好不好完全取决于你的…

chatgpt的一些思考

中文RLHF大模型开发阶段,谁愿意手上有高性能的显卡可以支持文章评论处聊(审核不允许通讯方式) 代码中,6B参数模型调试中,现在受显卡影响进度很严重 结论 国内同行对chatgpt的认识是不够的,太轻视这个模式的…

如何用ChatGPT做设计?激发设计师们的灵感

伴随着人工智能技术的迅猛发展,AI 工具在设计领域中的应用也越来越广泛。 当前,诸如ChatGPT等 AI 工具不仅可以进行自然语言处理,还可以应用于图像、视频等多种媒体领域,为设计师们提供了丰富的应用场景。 使用Chatgpt&#xff1…

想要用 ChatGPT 设计游戏,资深设计师给出了忠告!

【CSDN 编者按】随着 ChatGPT 的进入到我们的视野,游戏设计师们开始蠢蠢欲动,想要借助这款工具创建一个虚拟世界,但是人工智能在游戏方面的创造却还面临挑战。在本文中,一位资深MMO设计师Damion Schubert结合自身的尝试过程&#…

使用ChatGPT设计多选题

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

使用 ChatGPT 来设计系统时序图

前言 ChatGPT 的受欢迎程度不断增长,现在被广泛用于各种应用程序。作为一名全栈工程师,出于对技术的追求,使用 ChatGPT 来探索一些可能的使用场合,本文就来探索 ChatGPT 设计一个资产购买系统并画出 Mermaid 流程图,开…

英语考试的作文模板

考试需要,但是老是忘记,所以发出来备忘~~~~~ 这里写目录标题 1 高频考点:正面话题 (能力/事情/习惯/行为/品质/意识/习惯)1.1 题干关键词与结构1.2 开头段1.3 主体段 2 一起写范文【正面话题】主体段:重要性怎么做重要…