3分钟自定义你的chatGPT聊天微信机器人

背景

最近chatGPT实在太火了,不谈下都不好意思说自己在技术圈混了,刚好前段时间公司里面在举办一个企业微信机器人比赛,然后就用注册了openai的一个账号,用python写了一个玩玩,但是想想不过瘾只能公司内部体验,于是乎又花了2个小时写了一个基于微信的聊天机器人,这里和大家交流下。

现实步骤

  1. 首先要能绕开openai 国内的访问限制,这一步骤大家自己想办法;
  2. 需要注册openai账号,这一步骤大家也自己想办法;
  3. 实现模拟登录微信账号,找到一个不错的开源代码,在我的github里面有;
  4. 在接收到微信信息时调用openai的api,这里我使用了go sdk 开源地址也在在我的github里。

相关功能

我的简单demo代码开源拉了github地址点这里
功能介绍:

  • 支持回复微信文本消息
  • 支持文本回复图片消息
  • 支持群消息at回复
  • 支持上下文记忆
  • 支持基于网页链接地址读取总结文件

演示图片

群里时at它
在这里插入图片描述
单聊时直接发送消息,支持根据语义来返回图片
在这里插入图片描述

实现原理

  1. 调用微信桌面客户端协议登录微信号
  2. 监听微信文本消息进行回复
  3. 在回复消息之前对消息进行语义识别,这里单独写了一个prompt来识别文本的语义是来生成图片还是进行文本回复就行,如果是生成图片的话,就直接回复图片。

源码

package mainimport ("bytes""context""encoding/base64""fmt""image/png""os""strings""time""github.com/eatmoreapple/openwechat"openai "github.com/sashabaranov/go-openai"
)// OpenaiWechat
type OpenaiWechat struct {ChatBot      *openwechat.Bot                           // chat botOpenai       *openai.Client                            // openai clientuserDialogue map[string][]openai.ChatCompletionMessage // save user gialogue context
}var singleton *OpenaiWechat// firstUserDialogue
var firstUserDialogue = []openai.ChatCompletionMessage{{Role:    openai.ChatMessageRoleSystem,Content: "你是一个非常有帮助的助手",},{Role:    openai.ChatMessageRoleUser,Content: "请问我怎么规划我的职业发展呢?",},{Role: openai.ChatMessageRoleAssistant,Content: `你好,我很高兴能帮助你。职业发展是一个非常重要的话题,你可以从以下几个方面考虑:你的兴趣爱好和技能:你可以考虑你的兴趣爱好和技能,看看哪些职业与你的兴趣爱好和技能相匹配。这样可以让你在工作中感到更有成就感和满足感。行业前景:你可以考虑一些行业的前景,看看哪些行业在未来几年内会有更好的发展前景。这样可以让你在职业发展中更有保障。学历和培训:你可以考虑你的学历和培训,看看哪些职业需要更高的学历和培训。这样可以让你更好地规划你的职业发展。希望这些建议能帮到你。你还有其他问题吗?`,},
}func init() {//bot := openwechat.DefaultBot()bot := openwechat.DefaultBot(openwechat.Desktop) // deskop mode,you can switch deskop mode if defualt can not login// Register message handler functionbot.MessageHandler = func(msg *openwechat.Message) {replyChatMsg(msg)}// Register login QR code callbackbot.UUIDCallback = openwechat.PrintlnQrcodeUrl// loginif err := bot.Login(); err != nil {fmt.Println(err)return}client := openai.NewClient(os.Getenv("OPENAI_KEY")) // your openai key//client := openai.NewClient("")singleton = &OpenaiWechat{Openai:  client,ChatBot: bot,}singleton.userDialogue = make(map[string][]openai.ChatCompletionMessage)// lock goroutine, until an exception occurs or the user actively exitsbot.Block()
}
func main() {
}// replyChatMsg
func replyChatMsg(msg *openwechat.Message) error {if msg.IsSendByGroup() { // only accept group messages and send them to yourselfif !msg.IsAt() {return nil}} else if !msg.IsSendByFriend() { // non-group messages only accept messages from your own friendsreturn nil}if msg.IsSendBySelf() { // self sent to self no replyreturn nil}// only handle text messagesif msg.IsText() {msg.Content = strings.Replace(msg.Content, "@GPT3.5 ", "", 1)fmt.Println(msg.Content)// simple match processingif isImage, _ := isImageContent(msg.Content); isImage {return replyImage(msg)}return replyText(msg)}return nil}// 图片生成校验
var imageMessage = []openai.ChatCompletionMessage{{Role:    openai.ChatMessageRoleSystem,Content: "你现在是一个语义识别助手,用户输入一个文本,你根据文本的内容来判断用户是不是想生成图片,是的话你就回复是,不是的话你就回复否,记住只能回复:是 或者 否",},{Role:    openai.ChatMessageRoleUser,Content: "我想生成一张小花猫的图片",},{Role:    openai.ChatMessageRoleAssistant,Content: "是",},{Role:    openai.ChatMessageRoleUser,Content: "请问冬天下雨我该穿什么衣服",},{Role:    openai.ChatMessageRoleAssistant,Content: "否",},
}// isImageConntent
func isImageContent(content string) (bool, error) {temp := append(imageMessage, openai.ChatCompletionMessage{Role:    openai.ChatMessageRoleUser,Content: content,})result, err := callOpenaiChat(temp)if err != nil {fmt.Printf("isImageConntent callOpenaiChat error: %v\n", err)return false, err}fmt.Printf("isImageContent result: %s", result)if strings.TrimSpace(result) == "是" {return true, nil}return false, nil}// replyImage
func replyImage(msg *openwechat.Message) error {path, err := generateImage(msg)if err != nil {fmt.Printf("replyImage generateImage error: %v\n", err)return err}img, err := os.Open(path)if err != nil {fmt.Printf("replyImage Open error: %v\n", err)return err}defer img.Close()msg.ReplyImage(img)return nil
}// replyText
func replyText(msg *openwechat.Message) error {messages, err := genMessage(msg)if err != nil {return err}result, err := callOpenaiChat(messages)if err != nil {fmt.Println(err)return err}msg.ReplyText(result)addResultToMessage(result, msg)return nil
}// dialogue context max length
const maxLength = 33// temporary folder to save pictures
const filePath = "./images/"// genMessage
func genMessage(msg *openwechat.Message) ([]openai.ChatCompletionMessage, error) {// TODOif _, ok := singleton.userDialogue[msg.FromUserName]; !ok {singleton.userDialogue[msg.FromUserName] = firstUserDialogue} else if len(singleton.userDialogue[msg.FromUserName]) >= maxLength {singleton.userDialogue[msg.FromUserName] = singleton.userDialogue[msg.FromUserName][2:]}element := openai.ChatCompletionMessage{Role:    openai.ChatMessageRoleUser,Content: msg.Content,}singleton.userDialogue[msg.FromUserName] = append(singleton.userDialogue[msg.FromUserName], element)return singleton.userDialogue[msg.FromUserName], nil
}// addResultToMessage
func addResultToMessage(result string, msg *openwechat.Message) error {element := openai.ChatCompletionMessage{Role:    openai.ChatMessageRoleAssistant,Content: result,}singleton.userDialogue[msg.FromUserName] = append(singleton.userDialogue[msg.FromUserName], element)return nil
}// generateImage
func generateImage(msg *openwechat.Message) (string, error) {ctx := context.Background()// Sample image by linkreqUrl := openai.ImageRequest{Prompt:         msg.Content,Size:           openai.CreateImageSize512x512,ResponseFormat: openai.CreateImageResponseFormatB64JSON,N:              1,}respBase64, err := singleton.Openai.CreateImage(ctx, reqUrl)if err != nil {fmt.Printf("Image creation error: %v\n", err)return "", err}imgBytes, err := base64.StdEncoding.DecodeString(respBase64.Data[0].B64JSON)if err != nil {fmt.Printf("Base64 decode error: %v\n", err)return "", err}r := bytes.NewReader(imgBytes)imgData, err := png.Decode(r)if err != nil {fmt.Printf("PNG decode error: %v\n", err)return "", err}filePath := fmt.Sprintf("%s%d.png", filePath, time.Now().UnixMicro())file, err := os.Create(filePath)if err != nil {fmt.Printf("File creation error: %v\n", err)return "", err}defer file.Close()if err := png.Encode(file, imgData); err != nil {fmt.Printf("PNG encode error: %v\n", err)return "", err}return filePath, nil
}// callOpenaiChat
func callOpenaiChat(messages []openai.ChatCompletionMessage) (string, error) {resp, err := singleton.Openai.CreateChatCompletion(context.Background(),openai.ChatCompletionRequest{Model:     openai.GPT3Dot5Turbo,Messages:  messages,MaxTokens: 512,},)if err != nil {fmt.Printf("ChatCompletion error: %v\n", err)return "", err}fmt.Println(resp.Choices[0].Message.Content)return resp.Choices[0].Message.Content, nil
}

注意

  1. 微信号最好不要用自己常用的微信号,因为模拟登录微信属于作弊行为很有可能会被封号;
  2. 注册的新的微信号可能无法马上模拟登录成功微信,需要实名认证之后,过一段时间才能成功登录。
  3. 注册的openai账号里面默认有18刀,调用不同的模型话费的tokens不一样,测试的时候注意测试自己的消耗速度,图片比文本更耗钱。

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

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

相关文章

全开源chatGPT聊天机器人商业版源码

下载:https://download.csdn.net/download/qq_45102995/87772789 全开源chatGPT聊天机器人商业版源码完全开放源代码 CHATGPT商业源码 全开源 全开源 随意改!

ChatGPT聊天机器人程序

ChatGPT聊天机器人程序是一种基于人工智能技术的智能对话程序,利用ChatGPT等自然语言处理模型和算法实现与用户的交互,回答问题、提供服务等。 ChatGPT聊天机器人程序通常包括以下模块: 输入模块:用于接收用户输入的信息&…

ChatGPT聊天软件开发

ChatGPT聊天软件是一款基于OpenAI技术训练的智能AI对话软件,具有自然语言处理、问答系统、语音交互等多种功能。用户可以通过输入文字或语音与ChatGPT进行互动,询问问题,获取信息以及进行娱乐和休闲。ChatGPT聊天软件支持多语言,为…

2023 ChatGPT聊天网站html源码

聊天GPT-Web ChatGPT,页面与官方页面的 API 独立。基于ChatGPT API的ChatGPT网页版,无登录障碍,功能丰富。 2023 ChatGPT聊天网站html源码

一百行代码实现搭建简易版 ChatGPT 聊天机器人,网页搭建

最近,OpenAI 的一款聊天机器人模型 ChatGPT 爆火。本篇文章旨在为大家提供一款简易的聊天机器人,只需一百行代码即可制作。话不多说,先上效果: 一百行代码实现简易版chatgpt聊天机器人 CSS代码: .container-fluid {p…

一键导出ChatGPT聊天记录:让备份更简单

重要性: 备份ChatGPT的聊天记录同样非常重要,因为这些记录可能包含了您与ChatGPT的交互记录,这些记录可能包含了您的个人信息、兴趣爱好、偏好和其他敏感信息。以下是备份ChatGPT聊天记录的一些重要性: 防止数据丢失:…

基于小程序制作一个ChatGPT聊天机器人

在AI技术日新月异的浪潮中,将ChatGPT与实战开发相结合,制作一个随身携带的聊天机器人,紧贴前沿的同时稳固基础。 一、前言1.1、什么是ChatGPT1.2、什么是文本完成二、API2.1、ChatGPT官网申请API所需要的key2.2、搭建API2.3、创建控制器及动作方法三、小程序3.1、页面创建3.…

chatGPT聊天记录消失如何找回

言归正传 记录并没有消失,只是无法显示到侧面列表,搜索浏览器历史记录就可以找回了 每次聊天都有一个独特的地址:/chat/xxxx-xxx-xxxxx-xx 查看浏览器历史记录,搜索以上关键字,找到旧的网址 打开旧的网址&#xff…

史诗级聊天AI ChatGPT来啦!

羿阁 发自 凹非寺量子位 | 公众号 QbitAI 一款新的聊天AI被网友们玩疯了。 能直接生成代码、会自动修复bug、在线问诊、模仿莎士比亚风格写作……各种话题都能hold住,它就是OpenAI刚刚推出的——ChatGPT。 有脑洞大开的网友甚至用它来设计游戏:先用ChatG…

和ChatGPT聊天,一定试试这些提问技巧

在和ChatGPT聊天时,要使用清晰简洁的语言,尽量避免使用含糊不清或模糊的词语和语句。 一、首次提问时,用这些方法提问更高效: 1. 用通俗易懂的语言: 尽可能使用通俗易懂的语言提问,不要使用过于专业或难…

教你用ChatGPT写论文(技巧干货)

目录 引语: 第一步:现象确认 第二步:学术概念化 第三步:定位优质学术资源 第四步:对比分析 第五步:深挖启示 & 第六步:写论文 结语: 引语: 大家好我们是权知…

​反其道而行,大学教授鼓励学生用 ChatGPT 写论文

来源 | AI科技大本营 出品 | CSDN(ID:CSDNnews) 新 AI 工具 ChatGPT 的到来,正在教育圈呈现出冰火两重天的态势,教授们几家欢喜几家愁。 这不近日,来自宾夕法尼亚大学沃顿商学院的一位专门研究创业与创新的…

英国卡迪夫大学学生使用ChatGPT写论文拿到一等成绩

近日,BBC报道了一则新闻: 卡迪夫大学一名学生在期末考试中使用ChatGPT撰写了一篇论文,并获得了一等成绩,要知道这是英国大学中最高等级的成绩,而他的另一篇论文没有使用ChatGPT,只获得了二等一的成绩。 此…

学术界用ChatGPT写论文,真的靠谱吗?

写论文时,赵铭用ChatGPT查询了国内外云计算技术的研究进展,并请它一一详细介绍。他用搜索引擎简单核实了真实性,润色后就放进了论文中,“我感觉它说的东西都是一些现状,也没什么好调整的,就直接用了&#x…

ChatGPT写论文算作弊吗?各校对AI态度不一

都说ChatGPT来了,一堆人要下岗,因为他们的工作会被机器取代。 但也有可能,还没等你走上职场,学生的工作AI也能帮你做了! 最近,卡迪夫大学的一位学生使用ChatGPT的论文获得了远超自己水平的高分。 真是服…

留学生用ChatGPT写论文?真的会被开除!!!

转眼进入6月,大家的论文完成的怎么样了?很多留学生都有这样的疑问,用ChatGPT写论文靠谱吗? 其实在最近,,ChatGPT被学生用来辅助写论文,已经不是什么新鲜事了。它作为新型人工智能,搜…

【ChatGPT进阶】如何使用ChatGPT写论文?

大学生最头疼的事情应该就是写论文了,别慌这就教你方法,分分钟搞定! 在使用ChatGPT编写论文的时候,重点是说明你的论文课题,以及你需要ChayGPT为你生成什么内容。不要想着一句话就能生成一篇完整的论文给你。 这里以…

五步学会用chatGPT写论文

第一步:登录ChatGPT站点 第二步:输入拟写论文相关信息 方法一:有确定的论文选题(可按照选题直接生成摘要和大纲) 我是一名金融业从业人员,我的研究生毕业论文选题是“利率市场化问题研究”,那么…

chatgpt帮你写论文

文章目录 一、 询问chatgpt论文有多少部分二、 告知chatgpt论文的其他部分三、 继续补充字数 根据chatgpt上下文衔接的功能,逐步完成论文 一、 询问chatgpt论文有多少部分 二、 告知chatgpt论文的其他部分 三、 继续补充字数

如何用chatgpt写作论文 GPT写毕业论文的技巧

如何用chatgpt写作论文 GPT写论文的技巧 经常被问到为什么万事知天下小程序不能写论文。也不是不能写,只是GPT3.5的上下文只有4K,一般论文要写上万字,所以不可能你直接输入一个论文标题就直出结果的。 不过手工分一下步骤就可以了。先让写…