快速集成一个使用腾讯RTC聊天的AI聊天机器人

10 分钟阅读
Feb 18, 2025

场景概述

随着ChatGPT在全球的普及,人工智能(AI)成为了当今开发者关注的焦点,中国的主流供应商也推出了自己的大模型(BM)应用和产品。许多供应商将其应用与AI结合,以发现新的机会。下一代大型语言模型(LLMs)强大的对话沟通能力自然适用于各种即时消息场景,为聊天与AI的结合带来了广阔的想象空间。

在办公场景中,用户可以与对话AI聊天,高效地做工作笔记、撰写文档、收集信息等。在客户服务场景中,AI驱动的智能客服可以提供类似于人类客服的对话体验,并引导用户更有效地购买和使用产品。在社交场景中,AI聊天机器人可以为用户提供24小时在线心理咨询和情感陪伴,增加用户的参与度等。作为全球领先的通信云服务提供商,Chat也看到了AI在即时消息场景中的巨大潜力,并迅速发布了AI能力调用API。基于Chat提供的通信基础,开发者可以自由调用行业领先的BM能力,赋予自己丰富的AI能力,以高效实施特定场景的创新。

本文件描述了如何通过Chat的Webhook功能将AI服务能力集成到Chat中,以构建一个AI聊天机器人,实现智能客服、创意辅助和工作助手等功能。(本文中的过程以MiniMax LLM为例。您可以使用相同的方法集成其他类似ChatGPT的服务。)

应用产品

Chat

基本集成指南

创建Chat账户

登录您的账户,进入控制台,创建一个应用,获取应用的SDKAppID和密钥(Chat密钥)。

Create an Application in Tencent RTC Console

Step-by-step guide to setting up a new application in the Tencent RTC console
Create an application interface, click 'Create application' and 'Create' buttons step by step.

注册相应AI服务提供商的账户

注册并登录要集成的AI服务提供商的账户,获取API密钥(AI_SECRET_KEY)。

创建Chat聊天机器人账户

通过RESTful API创建Chat聊天机器人账户。Chat聊天机器人是一个特殊用户,其用户ID以@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和基于Chat密钥生成的UserSig。有关更多信息,请参见生成UserSig。在Linux中运行该命令后,服务器返回以下信息:

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

上述信息表明聊天机器人@RBT#001与昵称MyRobot已成功创建。

配置Chat Webhook

Chat webhook是Chat后台在事件发生前或发生后发送给相应应用的后台服务器的请求。然后,应用后台可以执行必要的数据同步或干预事件的后续处理。我们将使用“机器人事件Webhook”来监听并响应发送给聊天机器人的用户消息或群聊中的@RBT#事件。您需要在Chat控制台中找到并点击“机器人事件Webhook”以启用该功能并保存设置。

场景特定实现

以一对一聊天为例,整体工作流程如下:

1. 用户user1向聊天机器人@RBT#001发送“hello”消息。

2. Chat后台发送Webhook通知应用后台事件。

3. 应用后台接收到事件通知,其中包含消息发送者user1、消息接收者@RBT#001和消息内容hello等信息。

4. 应用后台调用AI服务API(MiniMax API),并接收包含回复消息的响应,例如“很高兴认识你”。

5. 应用后台调用Chat RESTful API(API sendmsg用于一对一聊天,API send_group_msg用于群聊)将回复消息发送给user1,发送者为@RBT#001

以Go编程语言为例,应用后台的关键代码如下。

注意:

以下代码仅用于演示,省略了许多异常处理代码,不能直接在生产环境中使用。

分发和处理Webhook命令

我们创建一个HTTP服务,监听80端口,并注册一个处理程序,该处理程序使用/im URL处理发送到http://im的所有请求。所有由Chat发送的Webhook请求都包含一个CallbackCommand参数,不同的值表示不同的Webhook命令。处理程序根据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": // 聊天机器人的Webhook命令,用于一对一消息
       dealC2c(context.Background(), reqbody)
       rspbody = []byte("{\"ActionStatus\": \"OK\", \"ErrorCode\": 0, \"ErrorInfo\": \"\"}")
   default:
       rspbody = []byte("无效的CallbackCommand。")
   }
   w.Write(rspbody)
}
 
func main() {  // 注册一个处理程序以处理发送到应用后台的Webhook命令
    http.HandleFunc("/im", handler)
    http.ListenAndServe(":80", nil)
}

处理聊天机器人接收到的一对一消息

在处理一对一消息时,我们首先检查发送者是否不是聊天机器人(一般情况下聊天机器人不会向另一个聊天机器人发送消息),以防止无限Webhook循环。然后,我们解析消息的主体,以获取用户发送给聊天机器人的消息内容文本,将发送者的UserID保存到上下文中,以便后续调用RESTful 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服务API

在此步骤中,我们使用第三方AI服务MiniMax LLM来实现智能聊天。可以使用任何其他AI服务替代MiniMax LLM服务。请注意,这里演示的是一个简单的completion API,不包含对话的上下文,您可以查看MiniMax文档以了解其他API的详细信息。

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的sendmsg RESTful API模拟聊天机器人回复用户,指定消息的发送者为@RBT#001,接收者为user1

// 发送RESTful 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失败。%s", err.Error())
    return
  }
  defer rsp.Body.Close()
  rsptext, _ := io.ReadAll(rsp.Body)
  log.Printf("rsp:%s", rsptext)
}

// 调用Chat的RESTful 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聊天机器人演示的最终实现效果:

通过上述步骤,我们已经实现了Chat服务器与MiniMaxAI开放平台之间的一对一聊天连接。按照上述步骤,也可以通过简单替换askAI函数为相应AI服务提供商的API调用来集成其他AI服务。对于群聊聊天机器人,只需补充实现Bot.OnGroupMessage webhook命令的处理即可。

立即订购

点击这里快速进入购买页面进行订购。