实践 | 即时通信IM如何接入AI服务,搭建聊天机器人

随着ChatGPT在全球范围的爆火,AI已成为当下开发者最为关注的焦点,国内各大厂商也纷纷跟进,推出了各自的大模型应用与产品。很多应用都在尝试与AI结合,寻找新的发力点。而新一代大语言模型的强大对话交流能力与各类即时通信场景天然契合,这为IM与AI结合带来了广阔的想象空间。

那即时通信IM该如何接入AI服务呢?本文将拆解接入AI服务的各个步骤,为您详细介绍如何通过腾讯云即时通信IM第三方回调功能,将AI服务能力引入到IM应用中,创建一个可以智能聊天的AI机器人,为用户提供真人般对话体验,实现智能客服、创意辅助、工作助手等功能。(文中的实践步骤以接入MiniMax中文大语言模型为例,类ChatGPT服务均可通过文中介绍的方法实现接入)

准备工作

注册腾讯云账号

注册并登录腾讯云账号,进入即时通信IM控制台,创建应用,并获取应用的SDKAppID和密钥(以下称为 IM Key),并创建一个管理员账号administrator。

注册对应AI服务商账号

注册并登录计划接入的AI服务商的相应账号并获取API密钥(以下称为AI_SECRET_KEY)。

创建腾讯云IM机器人账号

通过REST API创建一个腾讯云IM机器人账号。腾讯云机器人是一种特殊的用户,UserID以@RBT#开头。

curl -d '{"UserID":"@RBT#001","Nick":"MyRobot"}'"https://console.tim.qq.com/v4/openim_robot_http_svc/create_robot?sdkappid= {}&identifier=administrator&usersig={}&random=123456789&contenttype=json"

复制

将上述命令的sdkappid={}和usersig={}替换成您的SDKAppID和使用IM Key生成的Usersig。Usersig的生成可以参考官网文档(https://cloud.tencent.com/document/product/269/32688)。在Linux环境运行上述命令后,云服务器返回:

{"ActionStatus": "OK", "ErrorCode": 0, "ErrorInfo": ""}

复制

表示成功创建了一个昵称为MyRobot的机器人@RBT#001。

配置腾讯云IM第三方回调

即时通信 IM 第三方回调即云IM后台会在某一事件发生之前或者之后,向 App 的后台服务器发送请求,App 后台可以据此进行必要的数据同步,或者干预事件的后续处理流程。我们将使用“机器人事件回调”监听用户发消息给机器人,或者在群聊中@机器人的事件,并对其做出反应。在腾讯云IM控制台中找到“机器人事件回调”,点击开启并保存。

编写APP后台服务

以单聊为例,总体上的工作流程如下:

  1. 用户user1发消息“hello”给机器人@RBT#001;
  2. 云IM后台发送第三方回调将事件通知App后台;
  3. App后台收到事件通知,通知内容包含发送方user1,接收方@RBT#001,消息内容hello以及其他信息;
  4. App后台调用AI服务接口(即MiniMax API),并得到响应回复内容,如nice to meet you;
  5. App后台调用云IM REST API接口(单聊为sendmsg接口,群聊为send_group_msg接口),将回复内容以@RBT#001的身份发送给user1。

以Golang为例,App后台的关键代码大概如下(请注意,本代码仅作为展示用途,省略了大量异常处理代码,不可直接用于生产环境):

分发处理回调命令

我们创建一个监听在80端口的http服务,注册一个url为/im的处理函数handler,所有发送给http://<your.domain.com>/im的请求都会被handler处理。所有云IM发送的回调请求都带有CallbackCommand参数,不同的值代表不同的回调命令。在handler中,根据云IM设置的参数CallbackCommand进行对应的处理。

func handler(w http.ResponseWriter, r *http.Request) {command := r.URL.Query().Get("CallbackCommand")reqbody, _ := io.ReadAll(r.Body)var rspbody []byteswitch command {case "Bot.OnC2CMessage": // 机器人C2C回调命令字dealC2c(context.Background(), reqbody)rspbody = []byte("{\"ActionStatus\": \"OK\", \"ErrorCode\": 0, \"ErrorInfo\": \"\"}")default:rspbody = []byte("invalid CallbackCommand.")}w.Write(rspbody)
}func main() {// 注册一个handler,处理发送给App后台的回调命令http.HandleFunc("/im", handler)http.ListenAndServe(":80", nil)
}

复制

处理机器人接收到单聊消息事件

处理单聊消息时,我们先检查发送方是不是机器人(一般不会出现这种机器人发送消息给机器人的情况),以防止无限的回调循环。接着,我们解析消息体,拿到用户发送给机器人的消息内容text,将发送方UserID保存到context中以方便后续调用REST API回复,最后调用askAI请求AI服务。

func dealC2c(ctx context.Context, reqbody []byte) error {root, _ := simplejson.NewJson(reqbody)jFromAccount := root.Get("From_Account")fromAccount, _ = jFromAccount.String()// 检查发送方ID,不处理机器人发送给机器人的请求,防止无限循环if strings.HasPrefix(fromAccount, "@RBT#") {return nil}jToAccount := root.Get("To_Account")toAccount, _ := jToAccount.String()msgBodyList, _ := root.Get("MsgBody").Array()for _, m := range msgBodyList {msgBody, _ := m.(map[string]interface{})msgType, _ := msgBody["MsgType"].(string)if msgType != "TIMTextElem" {continue}msgContent, _ := msgBody["MsgContent"].(map[string]interface{})text, _ := msgContent["Text"].(string)ctx = context.WithValue(ctx, "from", fromAccount)ctx = context.WithValue(ctx, "to", toAccount)go askAI(ctx, text)}return nil
}

复制

调用AI服务接口

在这一步我们使用第三方AI服务公司MiniMax实现智能聊天的功能,您可以将MiniMax服务替换成任意的其它AI服务。需要注意的是这里演示的是简单的completion接口,没有保存对话的上下文,其他接口可按需查阅MiniMax文档。

type MiniMaxRsp struct {Reply string `json:"reply"`
}// 请求MiniMax并得到回复
func askAI(ctx context.Context, prompt string) {url := "https://api.minimax.chat/v1/text/completion"var reqData = []byte(`{"model": "abab5-completion","prompt": prompt}`)request, _ := http.NewRequest("POST", url, bytes.NewBuffer(reqData))request.Header.Set("Content-Type", "application/json; charset=UTF-8request.Header.Set("Authorization", API_SECRET_KEY)client := &http.Client{}response, _ := client.Do(request)defer response.Body.Close()body, _ := ioutil.ReadAll(response.Body)rsp := &MiniMaxRsp{}json.Unmarshal(body, rsp)reply(ctx, rsp.Reply) // 将AI回复的内容发送给用户
}

复制

将AI返回的结果返回给用户

从AI服务得到回复之后,我们只需调用云IM的REST API接口sendmsg,制定消息发送方为@RBT#001,接收方为user1,模拟机器人回复用户。

// 发送一个REST API请求
func doRestAPI(host string, sdkappid int, admin, usersig, command, body string) {url := fmt.Sprintf("https://%s/v4/%s?sdkappid=%d&identifier=%s&usersig=%s&random=%d&contenttype=json",host, command, sdkappid, admin, usersig, rand.Uint32())req, _ := http.NewRequest("POST", url, bytes.NewBufferString(body))req.Header.Set("Content-Type", "application/json")cli := &http.Client{}rsp, err := cli.Do(req)if err != nil {log.Printf("REST API failed. %s", err.Error())return}defer rsp.Body.Close()rsptext, _ := io.ReadAll(rsp.Body)log.Printf("rsp:%s", rsptext)
}// 调用腾讯云IM的REST API,回复用户
func reply(ctx context.Context, text string) {rsp := make(map[string]interface{})msgbody := []map[string]interface{}{{"MsgType":    "TIMTextElem","MsgContent": map[string]interface{}{"Text": text},}}// GenUserSig 的实现可以参考腾讯云文档usersig, _ := GenUserSig(IM_SDKAPPID, IM_KEY, "administrator", 60)rsp["From_Account"] = ctx.Value("to").(string) //"@RBT#001"rsp["To_Account"] = ctx.Value("from").(string)rsp["SyncOtherMachine"] = 2rsp["MsgLifeTime"] = 60 * 60 * 24 * 7rsp["MsgSeq"] = rand.Uint32()rsp["MsgRandom"] = rand.Uint32()rsp["MsgBody"] = msgbodyrspbody, _ := json.Marshal(rsp)doRestAPI("console.tim.qq.com", IM_SDKAPPID, "administrator", usersig, "openim/sendmsg", string(rspbody))
}

复制

效果展示

使用腾讯云IM的demo实现,最终的效果展示如下:

通过以上步骤,我们便实现了腾讯云IM在服务端和MiniMaxAI开放平台的单聊对接,接入其他AI服务商也可参照上述步骤,仅需将askAI函数替换成其他AI服务商的对应API调用即可。对于群聊机器人,开发者仅需补充实现Bot.OnGroupMessage回调命令处理即可。

注意:

         目前腾讯云IM接入AI服务有活动,首单低至0.9折

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

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

相关文章

阿联酋哈姆丹国际摄影大赛 多位中国摄影师得奖

2014年3月17日&#xff0c;第三届阿联酋哈姆丹国际摄影大赛在迪拜揭晓&#xff0c;中国摄影家周抚阳凭借《山村学校》获得全场大奖并捧回12万美元奖金。中国另有李亚楠、林建华、髙炼辉、廖建辉、黄仲鹏分获金银铜等奖项&#xff0c;并分别获得8000-2万美元不等的奖金。在创造未…

那个跑外业的同事开始学习考测绘师了

临近年末&#xff0c;身为外业大哥的老五倒是悠闲了起来。平常外业出差回来后不是刷抖音就是玩王者的老五这次竟然拿起了书&#xff01; 这次湖南出差后的老五像变了一个人&#xff0c;一番“戏耍”后才知道老五要考注册测绘师了。 随着工作年限的调整老五准备明年开考&#…

倾斜摄影行业背景知识介绍

今天跟大家聊一下倾斜摄影的行业背景知识。 概念和原理就不讲了&#xff0c;听得太多了。首先我们来聊一下倾斜摄影的行业发展&#xff0c;大概了解一下&#xff0c;出去跑客户的时候也是谈资嘛。 整个行业的发展差不多有十来年的发展历史吧&#xff1a;国外代表性的有苹果公司…

高品质摄影作图台式计算机推荐,能拍出高品质作品的强大系统 摄影师段岳衡专访...

佳能专微EOS R&#xff0c;不仅彩色照片&#xff0c;从黑白到多重曝光&#xff0c;都能拍出高品质作品的强大系统&#xff0c;这是在佳能对段岳衡老师的访谈中总结出的特点。 ――请您谈谈刚拿到EOS R时的印象。 段老师&#xff1a;首先是手柄易握持&#xff0c;感觉比EOS 5D系…

第一周 一起走进摄影世界

目录 1.1 课程介绍1.2 带你快速认识照相机1.3 认识相机的镜头与焦距初学摄影的一些建议及参考书目 1.1 课程介绍 十九世纪起源。 相机的智能化降低了摄影的门槛。 爱生活&#xff0c;才能更好地记录生活。 花海、云海、晨光、街边小店 摄影和音乐、绘画一样 1.2 带你快速认识…

香港的Web3从业者们 出走新加坡还是选择留下?

只有进一步降低Web3的进入门槛&#xff0c;让更多人了解并使用到Web3的产品&#xff0c;才可能在香港发展出蓬勃的虚拟资产行业和生态圈。 近日&#xff0c;香港财经事务及库务局在香港金融科技周上发布了《有关香港虚拟资产发展的政策宣言》&#xff0c;成为近期Web3圈子最热…

摄影的艺术:一个狂热爱好者的摄影之路 | 读书

为什么说摄影的激情很容易消退&#xff1f;这是一个来自知乎的提问。 看过太多摄影爱好者&#xff1a;新买的相机拿在手中&#xff0c;抑制不住地想要掀动快门的冲动&#xff0c;恨不能把目之所及的一切都收入取景框&#xff0c;再把成像后的“作品”&#xff0c;po到每一个社交…

大咖访谈 | 做开源,最核心的就是要随缘 —— Apache SkyWalking 创始人吴晟

转载自 | 开源雨林 编辑 | 高旖阳 责编 | 钱英宇 本期访谈阵容 嘉宾&#xff1a;吴晟 ShengWu •Tetrate 创始工程师&#xff0c;Apache 软件基金会首位华人董事&#xff0c;开源 APM 项目 Apache SkyWalking 创始人&#xff0c;分布式追踪与诊断技术专家&#xff0c;骨灰级开源…

磨金石教育摄影技能干货分享|有哪些让你难以忘怀的人文摄影照片

在摄影分类中&#xff0c;人文摄影往往没有明确的释义。它既有纪实摄影的真实&#xff0c;又有艺术摄影的深奥。 实际上&#xff0c;人文摄影可以说是二者的结合&#xff0c;在创意和表达上更倾向于艺术性&#xff0c;在画面上更有真实感。 1 大雨滂沱 这张肖像照极具张力&…

Adobe国际认证-摄影的供求:成为专业摄影师需要什么

Adobe国际认证-摄影的供求&#xff1a;成为专业摄影师需要什么&#xff08;内容来源&#xff1a;Adobe国际认证中文网站_Adobe认证专家&#xff09; 摄影是一个价值 115 亿美元的行业&#xff0c;也是当今增长最快的职业之一——预计从 2020 年到 2030 年将增长 17%。它也是最难…

USV合伙人反思FTX:应以更长远的眼光看待Web3

潜力博主推荐&#xff0c;点击上面关注博主 ↑↑ FTX的事件动摇了许多人的信心。那么&#xff0c;最大的加密货币交易所之一是如何迅速崩溃的&#xff1f;为什么加密世界的类似崩溃似乎一直在发生&#xff1f; 在这个时候&#xff0c;我们要对Web3整个行业&#xff0c;有一个更…

chatgpt赋能python:Python从文本中提取年份月份的方法

Python从文本中提取年份月份的方法 Python作为一种高效、优秀的编程语言&#xff0c;被广泛应用于文本分析、数据分析等领域。其中&#xff0c;从文本中提取年份月份是一项常见的工作。本文将介绍Python如何从文本中提取年份月份的方法&#xff0c;让您能够更好地应用Python进…

chatgpt赋能python:Python动态页面的SEO

Python动态页面的SEO 介绍 Python是一种广泛使用的开源编程语言&#xff0c;因其简单易用、高效可靠的特性而备受欢迎。Python与web开发密切相关&#xff0c;被广泛用于开发动态网站。 然而&#xff0c;与传统的静态网页不同&#xff0c;动态网页的内容是通过JavaScript或其…

HighNewTech:【2019WAIC世界人工智能大会】上海正式开幕——现场精彩时刻

High&NewTech&#xff1a;【2019WAIC世界人工智能大会】上海正式开幕——现场精彩时刻 导读 2019年8月29日-8月31日&#xff0c;2019年世界人工智能大会在上海世博中心&#xff08;会议论坛&#xff09;和 上海世博展览馆&#xff08;应用展示&#xff09;两地举行。…

【人工智能】全网首发!2020年AI、CV、NLP等最全国际会议、顶会时间汇总!!

联盟花费一周对2020年顶会时间进行了总结&#xff01; 联盟总结为PDF&#xff0c;可下载收藏&#xff01;关注公众号【计算机视觉联盟】回复关键词【2020AI】&#xff0c;即可获取PDF下载&#xff01; 2020 AI、CV、NLP顶会时间表&#xff0c;包含会议举办的时间、地点、投稿截…

2022 IEEE 全球机器人、人工智能与信息技术学术会议(GCRAIT2022)

2022 IEEE 全球机器人、人工智能与信息技术学术会议(GCRAIT2022) 会议简介 2022 年 7 月 30-31 日 | 美国 芝加哥 2022 IEEE 全球机器人、人工智能与信息技术学术会议(GCRAIT2022)将于2022年7月30-31日在美国芝加哥召开&#xff0c; 本届会议的主要目的在于为全球的研究人员、…

报名 | 2019世界人工智能大会-腾讯论坛:8月,在上海等你!

购物逛街、预订外卖、缴纳水电费、挂号看病&#xff0c;社保登记……这些寻常琐事如今都可以在指尖上办理。科技总是充满力量&#xff0c;不断提升我们的生活品质。当人们还在感叹移动互联网大潮的力量之时&#xff0c;下一轮的技术革命&#xff0c;以AI、大数据、生命科学为代…

2023年机器人与人工智能国际会议(JCRAI 2023)

2023年机器人与人工智能国际会议&#xff08;JCRAI 2023&#xff09; 重要信息 会议网址&#xff1a;www.jcrai.org 会议时间&#xff1a;2023年7月7-9日 召开地点&#xff1a;中国上海 截稿时间&#xff1a;2023年5月20日 录用通知&#xff1a;投稿后2周内 收录检索&am…

2023年AI语音会议汇总

2023年&#xff0c;AI语音领域学术会议精彩纷呈&#xff0c;语音之家汇总了国内外重要的会议呈现给大家&#xff0c;大家可根据时间统筹安排好2023年的学术活动交流行程。如果信息有误&#xff0c;欢迎指正。 ICASSP 2023 2023 IEEE International Conference on Acoustics, S…

HighNewTech:【2019WAIC世界人工智能大会】上海正式开幕——马化腾的AI深思、二马激辩AI

High&NewTech&#xff1a;【2019WAIC世界人工智能大会】上海正式开幕——马化腾的AI深思、二马激辩AI 导读 2019年8月29日-8月31日&#xff0c;2019年世界人工智能大会在上海世博中心&#xff08;会议论坛&#xff09;和 上海世博展览馆&#xff08;应用展示&#x…