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

这篇具有很好参考价值的文章主要介绍了3分钟自定义你的chatGPT聊天微信机器人。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

背景

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

现实步骤

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

相关功能

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

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

演示图片

群里时at它
3分钟自定义你的chatGPT聊天微信机器人
单聊时直接发送消息,支持根据语义来返回图片
3分钟自定义你的chatGPT聊天微信机器人文章来源地址https://www.toymoban.com/news/detail-428005.html

实现原理

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

源码

package main

import (
	"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 bot
	Openai       *openai.Client                            // openai client
	userDialogue 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 function
	bot.MessageHandler = func(msg *openwechat.Message) {
		replyChatMsg(msg)
	}

	// Register login QR code callback
	bot.UUIDCallback = openwechat.PrintlnQrcodeUrl

	// login
	if 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 exits
	bot.Block()
}
func main() {
}

// replyChatMsg
func replyChatMsg(msg *openwechat.Message) error {

	if msg.IsSendByGroup() { // only accept group messages and send them to yourself
		if !msg.IsAt() {
			return nil
		}
	} else if !msg.IsSendByFriend() { // non-group messages only accept messages from your own friends
		return nil
	}

	if msg.IsSendBySelf() { // self sent to self no reply
		return nil
	}
	// only handle text messages
	if msg.IsText() {
		msg.Content = strings.Replace(msg.Content, "@GPT3.5 ", "", 1)
		fmt.Println(msg.Content)
		// simple match processing
		if 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) {
	// TODO
	if _, 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 link
	reqUrl := 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不一样,测试的时候注意测试自己的消耗速度,图片比文本更耗钱。

到了这里,关于3分钟自定义你的chatGPT聊天微信机器人的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 十分钟快速部署一个自己的AI聊天机器人

    个人名片: 🐼 作者简介:一名大二在校生,喜欢编程🎋 🐻‍❄️ 个人主页🥇: 落798. 🐼 个人WeChat:见文末 🕊️ 系列专栏:🖼️ 零基础学Java——小白入门必备 重识C语言——复习回顾 计算机网络体系———深度详讲 微信小程序开发——实战开发 🐓 每日一句:🍭

    2024年02月14日
    浏览(38)
  • 利用GPTs,打造你的专属AI聊天机器人

    在2023年11月的「OpenAI Devday」大会上,OpenAI再度带来了一系列令人瞩目的新功能,其中ChatGPT方面的突破尤为引人关注。而GPTs的亮相,不仅标志着个性化AI时代的到来,更为开发者和普通用户提供了前所未有的便利。接下来,我们一起深入了解GPTs是什么,能帮助我们做什么。

    2024年04月08日
    浏览(52)
  • ChatGPT聊天机器人搭建全攻略精心整理汇总:微信 Discord 小爱同学 VSCode QQ 飞书 Siri OpenAI Translato翻译插件

    一、ChatGPT接入微信: ChatGPT接入微信 ChatGPT近期以强大的对话和信息整合能力风靡全网,可以写代码、改论文、讲故事,几乎无所不能,这让人不禁有个大胆的想法,能否用他的对话模型把我们的微信打造成一个智能机器人,可以在与好友对话中给出意想不到的回应,而且再

    2024年02月04日
    浏览(51)
  • ChatGPT聊天机器人问答实录

    最近ChatGPT爆火,我也在网上找到一个ChatGPT的接口(文末附链接),尝试了一下与人工智能对话的乐趣。我下载的这个应用是基于GPT-3的聊天机器人,我与它的几个问答对话实际记录如下: 答:百度和谷歌是世界上最大的搜索引擎之一,虽然它们在不同的市场中运营,但它们

    2024年02月01日
    浏览(37)
  • ChatGPT聊天机器人如何发图片????

    问题一、怎么让聊天机器人ChatGPT回复你一张图片? 有问题可以在评论区留言。

    2024年02月11日
    浏览(37)
  • ChatGPT 4.0:AI 聊天机器人

    当 ChatGPT 问世时,人们对它作为 AI 聊天机器人的自然语言能力印象深刻,人们感到敬畏。但是,当备受期待的 GPT-4 大型语言模型问世时,它揭开了我们认为 AI 可能实现的盖子,有人称其为 AGI(通用人工智能)的早期一瞥。 该模型的创建者OpenAI称其为该公司“最先进的系统

    2024年02月02日
    浏览(69)
  • ai聊天机器人chatgpt收费版

        AI聊天机器人的功能通常包括以下几个方面:     自然语言理解。该功能可以识别并理解用户输入的自然语言,如文本、语音等,以便进行后续的处理和回复。     对话管理。该功能可以管理对话的上下文和流程,并根据用户的输入和意图来产生相应的回复和行为。  

    2024年02月03日
    浏览(42)
  • 基于小程序制作一个ChatGPT聊天机器人

    在AI技术日新月异的浪潮中,将ChatGPT与实战开发相结合,制作一个随身携带的聊天机器人,紧贴前沿的同时稳固基础。

    2023年04月11日
    浏览(41)
  • 中文版ChatGPT:智能中文聊天机器人

    2017年,AlphaGo在与世界冠军柯洁的人机大战中获胜,引发了人们对人工智能的激烈讨论。 如果说,对于AlphaGo,人们更多是围观者的角色,而最新的人工智能爆款程序ChatGPT,更多人已经参与其中,上线短短两个月内,ChatGPT收获了一亿用户。而且此刻,国内版的ChatGPT也已经正式

    2024年02月12日
    浏览(51)
  • ChatGPT提示词工程(七):Chatbot聊天机器人

    这是吴恩达 《ChatGPT Prompt Engineering for Developers》 的课程笔记系列。 本文是第八讲的内容:Chatbot 参考: ChatGPT提示词工程(一):Guidelines准则 的第二节 其中,辅助函数有变化: 这里,可以自定义消息, message 里面的 role ,可以是 system 、 user 、 assistant : system :系统辅助模

    2024年02月06日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包