终于!我们把 CEO 炒了,让 ChatGPT 出任 CEO

⚠️ FBI Warning:本文纯属作者自娱自乐,数字人的观点不代表 CEO 本人的观点,请大家不要上当受骗!!

哪个公司的 CEO 不想拥有一个自己的数字克隆?

想象🤔一下,如果 CEO 数字克隆上线了,那他是不是就可以一天约见 100 个投资人了?把他接入企业官方公众号后台作为客服,24 小时不吃饭不睡觉不喝水给用户答疑解惑,想想就很刺激!感觉 CEO 在给我打工

环界云的 CEO 做到了!先来看看效果:

怎么样,你也想拥有一个自己的数字克隆么?问题不大,跟着我操作。

首先你需要准备自己的语料,我们 CEO 的语料就是来自各种同性交友大会的演讲内容,如果你的语料不够多,那就得自己想办法了。

当然,本文提供的方法不仅仅适用于数字克隆,你可以基于任意专有知识库来打造一个私有领域的专家或者客服,然后再对接到公众号,它不香吗?

准备工作

已认证的微信公众号

首先你需要有一个微信公众号,而且是已经认证的公众号,因为公众号强制要求服务器每次必须在 15s 以内回复消息,公众号平台在发送请求到服务器后,如果 5s 内没收到回复,会再次发送请求等候 5 秒,如果还是没有收到请求,最后还会发送一次请求,所以服务器必须在 15s 以内完成消息的处理。如果超过 15s 还没有返回怎么办?那就超时了,用户将永远都收不到这条消息。

如果你想突破 15s 限制怎么办?

  • 如果是已认证的公众号,可以直接使用客服消息进行回复,它的原理是通过 POST 一个 JSON 数据包来发送消息给普通用户。客服消息就厉害了,只要在 48 小时以内都可以回复。具体可查看微信官方文档。
  • 如果是未认证的公众号,并不能完全解决 15s 限制的问题,但是可以优化。这里提供一个思路,你可以使用流式响应来缓解这个限制,先与 OpenAI 建立连接,再一个字符一个字符获取生成的文本,最后将所获取的文本列表拼接成回复文本。能缓解请求超时的关键在于:建立连接的时间一般情况下不会超过 15s,所以只要在给定的时间内,成功建立连接,基本就能返回内容(15s 之后接收到多少文本就返回多少文本)。虽然有可能会出现回复内容被截断的情况,但总比你回复不了强吧?

本文给出的方法是基于微信客服消息进行回复,所以需要一个已认证的公众号。如果是未认证的公众号,就需要你自己研究流式响应了,本文不做赘述。

FastGPT

其次你需要注册一个 FastGPT 账号。它是一个 ChatGPT 平台项目,目前已经集成了 ChatGPT、GPT4 和 Claude,可以使用任意文本来训练自己的知识库

🌐 注册链接:https://fastgpt.run/?inviterId=64215e9914d068bf840141d0

知识库

注册完 FastGPT 后,你可以直接填写自己的 API Key 进行使用,也可以在 FastGPT 平台充值使用。

接下来点击侧栏的数据库图标进入知识库界面,然后点击 “+” 号新建一个知识库。

点击「导入」,可以看到有 3 种方法来导入知识库。

如果你有多个文本文件,可以直接选择「文本/文件拆分」进行导入,模式建议选「QA 拆分」,也可以直接分段。

导入之后,就会开始训练,训练完成后的效果:

Laf

最后你还需要一个平台来开发你的应用,那当然是 Laf 啦。据环界云 CEO 数字克隆所说👀,Laf 是一个 Serverless 框架,可以用来快速开发具有 AI 能力的分布式应用,助你像写博客一样写代码,随时随地快速发布上线应用。真⭕五分钟上线 CEO 数字克隆!

🌐 Laf 注册链接:https://laf.run

编写云函数

一切工作准备就绪后,开始动笔写亿点点代码。

先新建应用,直接新建免费的进行测试:

点击「+」新建云函数:

然后将下面的云函数代码直接复制粘贴到 Web IDE 中:

import cloud from '@lafjs/cloud';
import * as crypto from 'crypto';// 公众号配置
const appid = 'wxb1833715d8f0809d'
const appsecret = 'fd76ce714a8083112100c2160b2f2c5d'
const wxToken = 'test';
// fastgpt配置
const apikey = "63f9a14228d2a688d8dc9e1b-xsyvfby3cui09tfcvxen3"
const modelId = "642adec15f01d67d4613efdb"// 创建数据库连接并获取Message集合
const db = cloud.database();
const _ = db.command
const Message = db.collection('messages')// 处理接收到的微信公众号消息
export async function main(event) {// const res = await cloud.fetch.post(` https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${await getAccess_token()}`, {//   button: [//     {//       "type": "click",//       "name": "清空记录",//       "key": "CLEAR"//     },//   ]// })const { signature, timestamp, nonce, echostr } = event.query;// 验证消息是否合法,若不合法则返回错误信息if (!verifySignature(signature, timestamp, nonce, wxToken)) {return 'Invalid signature';}// 如果是首次验证,则返回 echostr 给微信服务器if (echostr) {return echostr;}// -------------- 正文开始const payload = event.body.xml;const sessionId = payload.fromusername[0]console.log(payload)// 点击了清空记录if (payload.msgtype[0] === 'event' && payload.eventkey[0] === 'CLEAR') {console.log(1111)await Message.where({ sessionId: sessionId }).remove({ multi: true })await replyBykefu('记录已清空', sessionId)return 'clear record'}// 仅做文本消息例子if (payload.msgtype[0] !== 'text') return 'no text'const newMessage = {msgid: payload.msgid[0],question: payload.content[0].trim(),username: payload.fromusername[0],sessionId,createdAt: Date.now()}await replyText(newMessage, payload.fromusername[0])return 'success'
}// 处理文本回复消息
async function replyText(message, touser) {const { question, sessionId, msgid } = message;// 重复的内容,不回复const { data: msg } = await Message.where({ msgid: message.msgid }).getOne()if (msg) returnconsole.log("收到用户消息", touser, message)// 立即添加一条待回复记录 await Message.add(message);// 回复提示await replyBykefu("🤖机器人正在思考🤔中...", sessionId)await changesState(sessionId)const reply = await getFastGptReply(question, sessionId);const { answer } = reply;await Message.where({ msgid: message.msgid }).update({answer,});// return answer;await replyBykefu(answer, touser)
}// 获取微信公众号ACCESS_TOKEN
async function getAccess_token() {const shared_access_token = await cloud.shared.get("mp_access_token")if (shared_access_token && shared_access_token.access_token && shared_access_token.exp > Date.now()) {return shared_access_token.access_token}// ACCESS_TOKEN不存在或者已过期// 获取微信公众号ACCESS_TOKENconst mp_access_token = await cloud.fetch.get(`https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=${appid}&secret=${appsecret}`)mp_access_token.data.access_token && cloud.shared.set("mp_access_token", {access_token: mp_access_token.data.access_token,exp: Date.now() + 7100 * 1000})return mp_access_token.data.access_token
}// 公众号客服回复文本消息
export async function replyBykefu(message, touser) {// 判断是否为中文字符function isChinese(char) {return /[\u4e00-\u9fa5]/.test(char)  // 判断是否是中文字符}// 拆分文本长度function splitText(text) {let result = []let len = text.lengthlet index = 0while (index < len) {let part = ''let charCount = 0while (charCount < 800 && index < len) {let char = text[index]charCount++part += charif (isChinese(char)) charCount++  // 中文字符计数+1index++}result.push(part)}return result}// 定义休眠函数function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)) };const access_token = await getAccess_token()let text = splitText(message)let len = splitText(message).lengthtry {for (let i = 0; i < len; i++) {let part = text[i]  // 获取第 i 段await sleep(1000)// 回复消息const res = await cloud.fetch.post(`https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${access_token}`, {"touser": touser,"msgtype": "text","text":{"content": part}})}} catch (err) {console.log(err)}
}// 修改公众号回复状态
export async function changesState(touser) {const access_token = await getAccess_token()// 修改正在输入的状态const res = await cloud.fetch.post(`https://api.weixin.qq.com/cgi-bin/message/custom/typing?access_token=${access_token}`, {"touser": touser,"command": "Typing"})
}// 校验微信服务器发送的消息是否合法
export function verifySignature(signature, timestamp, nonce, token) {const arr = [token, timestamp, nonce].sort();const str = arr.join('');const sha1 = crypto.createHash('sha1');sha1.update(str);return sha1.digest('hex') === signature;
}// 返回组装 xml
export function toXML(payload, content) {const timestamp = Date.now();const { tousername: fromUserName, fromusername: toUserName } = payload;return `<xml><ToUserName><![CDATA[${toUserName}]]></ToUserName><FromUserName><![CDATA[${fromUserName}]]></FromUserName><CreateTime>${timestamp}</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[${content}]]></Content></xml>`
}// 调用 fastgpt 回答
async function getFastGptReply(question, sessionId) {const res = await db.collection('messages').where({ sessionId }).get()// 获取最多10组上下文const list = res.data.slice(-10)const prompts = list.map((item) => [{obj: "Human",value: item.question || ''}, {obj: "AI",value: item.answer || ''}]).concat({obj: "Human",value: question}).flat()const config = {method: 'post', // 设置请求方法为POSTurl: 'https://fastgpt.run/api/openapi/chat/chat', // 设置请求地址headers: { // 设置请求头信息apikey,'Content-Type': 'application/json'},data: { // 设置请求体数据modelId,isStream: false,prompts}}try {const ret = await cloud.fetch(config)console.log("fastgpt响应", ret.data)return { answer: ret.data.data || ret.data || '' }} catch (e) {console.log("出错了", e.response)return {error: "问题太难了 出错了. (uДu〃).",}}
}

整个云函数的调用流程如下:

❶ 当收到微信公众号消息时,首先调用 main 函数。在 main 函数中,首先验证消息是否合法,如果不合法则返回错误信息。如果是首次验证,则返回 echostr 给微信服务器。

❷ 接着根据消息类型进行处理。对于文本消息,调用 replyText 函数进行处理。

❸ 在 replyText 函数中,首先检查是否为重复的内容,如果是则不回复。然后将用户发送的问题存入数据库,并回复提示信息给用户,表示机器人正在思考中。

❹ 接下来调用 getFastGptReply 函数获取 FastGPT 的回答。在 getFastGptReply 函数中,首先从数据库中获取最多 10 组上下文信息,然后将问题和上下文信息一起发送给 FastGPT。接收到 FastGPT 的回答后返回给 replyText 函数。

❺ 回到 replyText 函数,将 FastGPT 返回的回答更新到数据库中,并通过客服接口将回答发送给用户。在发送回答之前,会调用 changesState 函数修改公众号回复状态为正在输入中。

❻ 调用 replyBykefu 函数通过微信公众号客服接口发送文本消息给用户。在 replyBykefu 函数中,首先根据文本长度拆分成多段,并逐段发送给用户。

先不要改动代码中的任何内容,后面会告诉你如何修改。

点击「发布」:

最后复制已发布的函数地址:

配置微信公众号

这一步我们需要在微信公众号平台上配置开发者信息,并将服务器地址设置为部署好的云函数服务地址。步骤如下:

首先登录微信公众平台,点开左侧的「设置与开发」,点击「基本设置」,然后点击「服务器配置」,服务器配置那里点击修改配置:

将之前的云函数服务地址复制到「服务器 URL」中,下边的 Token 与云函数代码中的 token 保持一致,下边的 EncodingAESKey 点击右侧随机生成就行,然后点击提交:

返回 token 校验成功即可。

获取公众号的 AppID 和 AppSecret:

这一步的操作请务必不要忘记!!!你需要把 laf.run 的 IP 地址全部添加到 IP 白名单中:

laf.run 域名的 IP 地址可通过以下命令获取:

$ dig +short laf.run
112.124.8.17
120.26.163.28
112.124.9.83
47.97.22.68
112.124.9.194
114.55.179.67
114.55.177.246
120.27.246.172
120.26.161.248
47.97.5.237

把获取到的 AppID 和 AppSecret 填写到 Laf 云函数中,然后点击「发布」:

最后在公众号平台点击「启用」即可。

配置 FastGPT

接下来开始配置 FastGPT,首先新建一个 API Key:

然后新建一个应用:

然后选择需要关联的知识库:

可以根据自己的需求设置一下温度、搜索模式和系统提示词,最终点击「保存修改」。

获取应用的 modelId:

将你获取的 API Key 和 modelId 填写到 Laf 云函数中,修改完成后点击发布:

到公众号里测试一下:

完美👀

当然,接入数字 CEO 只是图个乐呵,演示完了就撤了。目前 Laf 公众号真正接入的是 Laf 专有模型,可以回答与 Laf 相关的任何问题,感兴趣的小伙伴可以去体验一下,公众号的名字是:Laf 开发者

QA

如果发送消息后无响应,可以先去 Laf 控制台的日志中检查是否收到用户消息,有下面的提示代表是正常的(可能需要点下搜索才能刷新出来)。

如果收到了消息,但是没有回复,八成是公众号没有发送客服消息权限。对应是下图的权限:

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

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

相关文章

chatgpt赋能python:Python冒泡排序法详解

Python冒泡排序法详解 介绍 Python是一种高级编程语言&#xff0c;它设计简洁、易于学习&#xff0c;受到越来越多程序员的欢迎。 在Python编程中&#xff0c;排序算法是非常重要的一部分。其中&#xff0c;冒泡排序法是一种纯粹的比较排序算法&#xff0c;它是大多数排序算…

chatgpt赋能python:Python冒泡排序:从入门到精通

Python冒泡排序&#xff1a;从入门到精通 冒泡排序是一种简单且实用的排序算法&#xff0c;Python也可以轻松地实现冒泡排序。在本文中&#xff0c;我们将逐步介绍Python中如何编写冒泡排序。 什么是冒泡排序 冒泡排序是一种基于比较的排序算法。其基本思想是从列表中的第一…

chatgpt赋能python:Python冒泡排序算法详解

Python 冒泡排序算法详解 在计算机科学中&#xff0c;排序算法是一种将数据元素按照一定顺序排序的算法。其中&#xff0c;冒泡排序是最基础和最常用的排序算法之一&#xff0c;也是 python 中最容易实现的排序算法之一。在这篇文章中&#xff0c;我们将通过介绍 python 中的冒…

chatgpt赋能python:Python实现冒泡排序——让列表排序变得简单

Python实现冒泡排序——让列表排序变得简单 如果你常常处理数据&#xff0c;并需要按照一定顺序排列它们&#xff0c;那么你一定需要掌握一种快速、高效的排序算法——冒泡排序。冒泡排序是一种基础排序算法&#xff0c;也是最常用的排序之一。现在&#xff0c;我们来探究一下…

chatgpt赋能Python-python3冒泡排序代码

Python3 冒泡排序代码 什么是冒泡排序&#xff1f; 冒泡排序是一种简单的排序算法。它重复地遍历要排序的列表&#xff0c;比较相邻的两个元素&#xff0c;并根据大小交换它们的位置。如果需要&#xff0c;则重复执行该过程&#xff0c;直到整个列表都已排序。 冒泡排序的实…

chatgpt赋能python:Python冒泡排序

Python 冒泡排序 简介 冒泡排序&#xff08;Bubble Sort&#xff09;是一种基本的排序算法&#xff0c;它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果它们的顺序错误就交换位置。重复地进行这样的步骤直至整个序列有序。 冒泡排序的时间复杂度为…

chatgpt赋能python:冒泡排序算法的介绍

冒泡排序算法的介绍 冒泡排序算法是一种常见的排序算法&#xff0c;其目的是对一个列表进行排序&#xff0c;从小到大或从大到小排列。本文将为您介绍用Python实现冒泡排序算法的代码以及算法的基本思路。 冒泡排序算法的基本思路 冒泡排序算法的基本思路是通过不断地比较和…

chatgpt赋能python:Python冒泡排序详解

Python冒泡排序详解 介绍 Python是一门强大的编程语言&#xff0c;它在数据科学、机器学习、Web开发等领域都有广泛的应用。其中&#xff0c;排序算法是编程中一个重要的话题&#xff0c;冒泡排序也是最基本的排序算法之一。本文将详解Python冒泡排序的实现方法和优化技巧&am…

chatgpt赋能python:Python冒泡排序代码详解

Python冒泡排序代码详解 冒泡排序介绍 冒泡排序是一种基础排序算法&#xff0c;它通过交换相邻的元素将未排序序列逐渐转化为有序序列。它的原理是多次遍历待排序的序列&#xff0c;每次遍历都比较相邻的元素&#xff0c;如果顺序不符合要求就将它们交换位置。冒泡排序的时间…

2.心理学家-威廉.詹姆斯

尽管威廉詹姆斯与这个传统有着千丝万缕的联系&#xff0c;但他至少在思想上把握了美国东部的精神&#xff0c;并在风格上把握了整个美国的精神。用心理学的方式去解决时机生活中的问题。 牢牢把握时代和本土的精神&#xff0c;登上其他哲学家为所未闻的寂寞荒凉的声誉之巅。 正…

Java之父:詹姆斯·高斯林 (James Gosling)

Java之父&#xff1a;詹姆斯高斯林 &#xff08;James Gosling&#xff09; Java自1995诞生&#xff0c;至今已经20多年的历史。 Java的名字的来源&#xff1a;Java是印度尼西亚爪哇岛的英文名称&#xff0c;因盛产咖啡而闻名。Java语言中的许多库类名称&#xff0c;多与咖啡有…

詹姆斯等十位大佬的作息时间表曝光

知乎上有一则问题 ???? 有哪些有利于人保持年轻、健康、漂亮状态的细微的好习惯&#xff1f; 鸡仔看了大V张佳玮的回答&#xff0c;比较认同。他说&#xff1a; 规律作息。 每天黄昏慢跑&#xff08;做做简单的无氧当热身&#xff09;。 早饭规律了&#xff08;面包&#x…

勒布朗詹姆斯的承诺

** 克利夫兰 This is for you! ** 第一次听到詹姆斯这个名字的时候是07年的时候&#xff0c;真正认识并开始崇拜詹姆斯的时候是08年奥运的时候。 6月20日&#xff0c;总决赛抢七大战的那个夜晚&#xff0c;在金州勇士的主场&#xff0c;勒布朗-詹姆斯终于赢了&#xff0c;面对…

chatgpt赋能python:Python如何放在桌面:简单步骤和相关应用

Python如何放在桌面&#xff1a;简单步骤和相关应用 如果你是一名Python程序员&#xff0c;想要将Python放在桌面上以便在日常工作中更快捷地打开&#xff0c;并增强开发效率&#xff0c;那么这篇文章就是为你准备的。在这里&#xff0c;我们将介绍如何将Python安装在桌面上、…

chatgpt赋能Python-pythonidle怎么删除

如何彻底删除Python IDLE Python是一个对于开发者来说非常有用的计算机编程语言。在Python编程的过程中&#xff0c;许多开发人员会使用Python IDLE&#xff0c;这是一个Python语言的集成开发环境&#xff0c;它可以帮助开发人员轻松编写Python代码并进行调试。但是&#xff0…

chatgpt赋能python:Python桌面软件实例:探索Python桌面应用的无穷魅力

Python桌面软件实例&#xff1a;探索Python桌面应用的无穷魅力 Python语言不仅在Web开发上应用广泛&#xff0c;在桌面应用程序上也建立了它的声誉。Python在桌面端编程领域的扩展性和可扩展性极高&#xff0c;使得任何人都可以开发各种类型的桌面应用程序。 在本文中&#x…

chatgpt赋能python:Python快捷图标——快速实现编程任务的利器

Python快捷图标——快速实现编程任务的利器 随着Python的普及&#xff0c;越来越多的程序员开始采用这种高效且易于上手的编程语言。在日常编程任务中&#xff0c;快速、准确地使用Python成为了高效工作的关键。而在这个过程中&#xff0c;Python快捷图标成为了一项重要而方便…

chatgpt赋能python:Python桌面图标:从入门到精通

Python桌面图标&#xff1a;从入门到精通 如果你是一名使用Python编程语言的工程师&#xff0c;那么你可能已经见过Python桌面图标。但是&#xff0c;你曾经想过Python桌面图标是什么吗&#xff1f;在本文中&#xff0c;我们将介绍Python桌面图标的定义、功能和如何为自己的Py…

chatgpt赋能python:Python的桌面图标是啥样的?

Python的桌面图标是啥样的&#xff1f; Python一直是编程界的热门语言之一&#xff0c;受到了众多开发者的欢迎。但是&#xff0c;您是否注意到了Python的桌面图标是什么样子的呢&#xff1f;本文将介绍Python的桌面图标&#xff0c;并提供一些有关Python图标的信息。 介绍Py…

chatgpt赋能python:Python如何打开桌面文件-小白必读

Python如何打开桌面文件-小白必读 作为一名10年python编程经验的工程师&#xff0c;我了解到许多初学者在Python中打开桌面文件可能会遇到许多问题。因此&#xff0c;我编写了这篇SEO文章来帮助那些需要打开桌面文件的Python新手。 什么是桌面文件 在介绍如何打开桌面文件之…