迅速にTencent RTCチャットを使用してAIチャットボットを統合する

10 分読む
Feb 18, 2025

シナリオ概要

ChatGPTの世界的な人気に伴い、人工知能(AI)は今日の開発者の注目を集めており、中国の主流ベンダーも独自の大規模モデル(BM)アプリケーションや製品を発売しています。多くのベンダーは、AIと組み合わせて新たな機会を発見するために、自社のアプリケーションを強化しています。次世代の大規模言語モデル(LLM)の強力な対話能力は、すべての種類のインスタントメッセージングシナリオと自然に互換性があり、ChatとAIの組み合わせに広範な想像力の余地をもたらします。

オフィスシナリオでは、ユーザーは対話型AIとチャットすることで効率的に作業ノートを作成したり、文書を書いたり、情報を収集したりできます。カスタマーサービスシナリオでは、AIを活用したスマートカスタマーサービスが人間のカスタマーサービスに似た対話体験を提供し、ユーザーが製品をより効果的に購入・使用する手助けをします。社会的シナリオでは、AIチャットボットがユーザーに24時間オンラインの心理カウンセリングや感情的な陪伴を提供し、ユーザーエンゲージメントを高めます。通信クラウドサービスのリーディングプロバイダーであるChatも、インスタントメッセージングシナリオにおけるAIの巨大な可能性を見込み、迅速にAI機能呼び出しAPIをリリースしました。Chatが提供するコミュニケーション基盤に基づいて、開発者は業界最高のBM機能を自由に呼び出し、豊富なAI機能を活用してシナリオ固有の革新を効率的に実現できます。

この文書では、Webhook機能を通じてChatにAIサービス機能を統合し、ユーザーがインテリジェントカスタマーサービス、クリエイティブアシスタンス、ワークアシスタントなどの機能を実装するためのAIチャットボットを構築する方法について説明します。(この文書の手順ではMiniMax LLMを例として使用しています。他のChatGPT類似サービスを統合する場合も同様の方法を使用できます。)

適用製品

Chat

基本的な統合ガイドライン

Chatアカウントの作成

アカウントにログインし、コンソールに移動してアプリケーションを作成し、アプリケーションのSDKAppIDとキー(Chatキー)を取得します。

Create a new application in Tencent RTC console. Step 1: Click on
Image depicts a user interface for managing applications within a腾讯RTC (Real-Time Communication) console. The steps include clicking on 'Applications

対応する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": ""}

上記の情報は、ニックネームMyRobotのチャットボット@RBT#001が正常に作成されたことを示しています。

ChatのWebhookの設定

ChatのWebhookは、イベントの前または後にChatバックエンドから対応するアプリケーションのバックエンドサーバーに送信されるリクエストです。アプリケーションバックエンドは、その後のイベント処理に必要なデータの同期を行ったり介入したりできます。「ロボットイベントWebhook」を使用して、チャットボットまたはグループチャット内の@RBT#イベントに送信されたユーザーメッセージをリッスンして反応します。Chatコンソールで「ロボットイベントWebhook」を探し、機能を有効にして設定を保存する必要があります。

シナリオ特有の実装

一対一のチャットを例に取ると、全体の作業プロセスは次のようになります:

1. ユーザーuser1がチャットボット@RBT#001に「こんにちは」というメッセージを送信します。

2. ChatバックエンドがWebhookを送信し、アプリケーションバックエンドにイベントを通知します。

3. アプリケーションバックエンドがイベント通知を受信し、メッセージの送信者user1、メッセージの受信者@RBT#001、およびメッセージ内容こんにちはなどの情報を含みます。

4. アプリケーションバックエンドがAIサービスAPI(MiniMax API)を呼び出し、「お会いできてうれしいです」といった返信メッセージを含むレスポンスを受け取ります。

5. アプリケーションバックエンドがChat RESTful API(個別チャットの場合はsendmsg API、グループチャットの場合はsend_group_msg API)を呼び出して、チャットボットを介してuser1に返信メッセージを送信します。

Goプログラミング言語を例に取り、アプリケーションバックエンドの主要なコードは以下の通りです。

注意:

以下のコードはデモ用であり、多くの例外処理コードが省略されています。本番環境で直接使用することはできません。

Webhookコマンドの配布と処理

ポート80でリッスンするHTTPサービスを作成し、/im URLにハンドラーを登録して、http://imに送信されたすべてのリクエストを処理します。Chatによって送信されるすべてのWebhookリクエストには、異なる値が異なるWebhookコマンドを表すCallbackCommandパラメーターが含まれています。ハンドラーは、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の呼び出し

このステップでは、MiniMax LLMというサードパーティのAIサービスを使用してインテリジェントチャットを実装します。他のAIサービスを使用することも可能です。ここでは、会話のコンテキストを含まない単純な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サービスからの返信を受け取った後、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オープンプラットフォームとの一対一のチャット接続を実装しました。同様の手順で、他のAIサービスプロバイダーのAIサービスを統合することも可能で、askAI関数をそのAIサービスプロバイダーの対応するAPI呼び出しで置き換えるだけです。グループチャットチャットボットの場合は、Bot.OnGroupMessage webhookコマンド処理の実装を追加する必要があります。

今すぐ注文

こちらをクリックして、購入ページにすばやくアクセスして注文してください。