场景概述
随着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账户
登录您的账户,进入控制台,创建一个应用,获取应用的SDKAppID和密钥(Chat密钥)。


注册相应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命令的处理即可。
立即订购
点击这里快速进入购买页面进行订购。