シナリオ概要
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アカウントの作成
アカウントにログインし、コンソールに移動してアプリケーションを作成し、アプリケーションの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": ""}
上記の情報は、ニックネーム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コマンド処理の実装を追加する必要があります。
今すぐ注文
こちらをクリックして、購入ページにすばやくアクセスして注文してください。