tencent cloud

即时通信 IM

动态与公告
产品动态
公告
产品简介
产品概述
基本概念
应用场景
功能介绍
账号系统
用户资料与关系链
消息管理
群组相关
公众号系统
音视频通话 Call
使用限制
购买指南
计费概述
价格说明
购买指引
续费指引
停服说明
退费说明
开发指引
Demo 专区
开通服务
体验 Demo
快速跑通
下载中心
SDK & Demo 源码
更新日志
聊天互动(含 UI)
TUIKit 组件介绍
快速开始
全功能接入
单功能接入
AI 集成
构建基础界面
更多特性
定义外观
国际化界面语言
推送服务(Push)
服务概述
名词解释
开通服务
快速跑通
厂商通道
数据统计
排查工具
客户端 API
服务端 API
推送回调
高级功能
更新日志
错误码
常见问题
智能客服
功能概述
快速入门
集成指引
管理员操作手册
客服操作手册
更多实践
直播间搭建
AI 聊天机器人方案
超大娱乐协作社群
Discord 实现指南
游戏内集成 Chat 指南
类 WhatsApp Channel 搭建方案
发送红包
Chat 应对防火墙限制相关
无 UI 集成
快速开始
集成 SDK
初始化
登录登出
消息相关
会话相关
群组相关
社群话题
用户管理
离线推送
云端搜索
本地搜索
公众号
客户端 API
JavaScript
Android
iOS & macOS
Swift
Flutter
Electron
Unity
React Native
C 接口
C++
服务端 API
生成 UserSig
REST API
第三方回调
控制台指南
新版控制台介绍
创建并升级应用
基本配置
功能配置
账号管理
群组管理
公众号管理
回调配置
用量统计
资源包查看指南
实时监控
开发辅助工具
访问管理
高级功能
常见问题
uni-app 常见问题
购买相关问题
SDK 相关问题
账号鉴权相关问题
用户资料与关系链相关问题
消息相关问题
群组相关问题
直播群相关问题
昵称头像相关问题
协议与认证
服务等级协议
安全合规认证
IM 政策
隐私政策
数据隐私和安全协议
平滑迁移方案
平滑迁移完整版
平滑迁移简化版
错误码
联系我们
文档即时通信 IM更多实践AI 聊天机器人方案

AI 聊天机器人方案

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

在办公场景,用户可以直接通过对话让 AI 辅助自己高效完成工作纪要、文案编写、信息搜集等需求;在客服场景,与 AI 结合的智能客服可以提供真人客服般的会话体验,更有效地引导用户进行购买、使用;在社交场景,AI 聊天机器人可以为用户提供24小时在线的心理咨询和情感陪伴,提升用户粘性……腾讯云即时通信 Chat 作为全球领先的通信云服务商,也看到了 AI 在即时通信场景的巨大潜力,快速发布了相关AI能力调用接口。开发者基于腾讯云 Chat 提供的通信底座,可以自由调用业内领先的大模型能力,用丰富的AI能力赋能自己,高效实现场景创新。

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

准备工作

注册腾讯云 Chat 账号

进入Tencent Chat 控制台,登录注册后,完成创建应用

获取应用的 SDKAppID 和密钥SDKSecretKey(以下称为 Chat Key),并创建一个管理员账号 administrator。


注册对应 AI 服务商账号

注册并登录计划接入的 AI 服务商的相应账号并获取 API 密钥(以下称为AI_SECRET_KEY)。
说明:
可根据您的 AI 服务商前往对应官网获取API密钥,例如 OpenAIGemini等。

创建腾讯云 Chat 机器人账号

通过 REST API 创建一个腾讯云 Chat 机器人账号。腾讯云机器人是一种特殊的用户,UserID 以 @RBT# 开头。
curl -d '{"UserID":"@RBT#001","Nick":"MyRobot"}' "https://adminapisgp.im.qcloud.com/v4/openim_robot_http_svc/create_robot?sdkappid= {}&identifier=administrator&usersig={}&random=123456789&contenttype=json"
将上述命令的 sdkappid={} 和 usersig={} 替换成您的 SDKAppID 和使用 Chat Key 生成的 Usersig,详情可参见 生成 UserSig。在 Linux 环境运行上述命令后,腾讯云服务器返回:
{"ActionStatus": "OK", "ErrorCode": 0, "ErrorInfo": ""}
表示成功创建了一个昵称为 MyRobot 的机器人@RBT#001。

配置腾讯云 Chat 第三方回调

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


编写 APP 后台服务

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

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

分发处理回调命令

我们创建一个监听在80端口的 HTTP 服务,注册一个 url 为 /im 的处理函数 handler,所有发送给 http:///im 的请求都会被 handler 处理。所有云Chat发送的回调请求都带有 CallbackCommand 参数,不同的值代表不同的回调命令。在 handler 中,根据云 Chat 设置的参数 CallbackCommand 进行对应的处理。
func handler(w http.ResponseWriter, r *http.Request) {
command := r.URL.Query().Get("CallbackCommand")
reqbody, _ := io.ReadAll(r.Body)
var rspbody []byte
switch 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-8
request.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 服务得到回复之后,我们只需调用云 Chat 的 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)
}

// 调用腾讯云 Chat 的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"] = 2
rsp["MsgLifeTime"] = 60 * 60 * 24 * 7
rsp["MsgSeq"] = rand.Uint32()
rsp["MsgRandom"] = rand.Uint32()
rsp["MsgBody"] = msgbody
rspbody, _ := json.Marshal(rsp)
doRestAPI("console.tim.qq.com", IM_SDKAPPID, "administrator", usersig, "openim/sendmsg", string(rspbody))
}

效果展示

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

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


帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈