使用 Bot Framework 與 Azure Bot 建立 Teams Bot (2024)

這題目好繞口。

最近LLM(大語言模型)正夯,其中 OpenAI 算是主流模型之一,而MS 的Teams 又幾乎是台灣中大型企業的標配,使得很多客戶想要在 Teams 裡面建立一個可以串接 OpenAI 的對談機器人,讓 LLM 來回答企業內部員工的問題。

建立 teams bot

要建立可以在 teams 裡面與用戶對談的機器人,最理想的方式大概有兩種,一個是 MS Bot framework,另一個則是 Copilot Studio。

如果你具有開發能力,也喜歡寫程式,那我覺得 MS Bot Framework 是一個頗理想的選擇。我曾經在 2017 年寫過 Bot Framework 相關的文章。對,七年之前! 內容當然也已經作古了。

在大語言模型以勢如破竹之姿地佔據開發人員的注意力,以及這麼多用戶的需求下,我今天終於有動力寫一個 2014的版本。

其實,這幾年 Bot Framework 也悄悄的有了一些改變,讓整個開發流程和設計變得非常簡單。想要透過 Bot framework建立 teams bot,基本上只有幾個動作…

  1. 使用VS 2022建立 AI Bot專案,在開發環境透過 Emulator 測試和 debug。
  2. 確定可以運行之後,在雲端建立一個 Azure Bot 與 Web App。
  3. 把AI Bot專案佈署到雲端的 Web App,取得 WebHook URL之後,在 Azure Bot上將 WebHook URL 進行配置。
  4. 在Azure Bot上設定 teams channel,完成後取得該 Teams Bot 的 URL
  5. (在 teams 中)開啟該URL,這樣就可以囉。

Let’s do it.

使用 VS 2022 建立 AI Bot專案

當你安裝好 Bot Framework SDK 之後,VS2022會出現底下範本:
圖片

我個人是建議選擇 Echo Bot,因為它最好修改。
建立好的專案架構如下:
圖片
其中,ChatGPT.cs那支程式是我自己加上去的,主要是為了讓 Bot 可以串接 OpenAI API,其餘的全是 Bot Framework 原本的內容。

其中比較需要注意的是 appsettings.json ,其中有一些關鍵的資訊需要設定。(容後詳述)

我已經把最終寫好的專案放上 github,開發人員可以參考:
https://github.com/isdaviddong/MsBotV4WithOpenAIAPI.git

程式碼中有幾個重點,實際負責對談機器人對話的部分在 EchoBot.cs 中的:

protected override async Task OnMessageActivityAsync(ITurnContext<IMessageActivity> turnContext, CancellationToken cancellationToken)
{
    var replyText = EchoBot1.Bots.ChatGPT.getResponseFromGPT(turnContext.Activity.Text);
    //var replyText = $"Echo: {turnContext.Activity.Text}";
    await turnContext.SendActivityAsync(MessageFactory.Text(replyText, replyText), cancellationToken);
}

你會發現上面我們透過 getResponseFromGPT(…) 這個方法,把用戶傳來的對話訊息,轉送給 OpenAI 的 API,然後取得回應,最後回傳給用戶。
而 getResponseFromGPT 這個方法中的程式碼,主要是呼叫 OpenAI 的API:

public static string getResponseFromGPT(string Message)
{
    return ChatGPT.CallOpenAIChatAPI("👉OpenAI_API_Key",
        new
        {
            model = "gpt-3.5-turbo",
            messages = new[]
            {
                new {
                    role = ChatGPT.role.system ,
                    content = @"
                        假設你是一個專業的客戶服務人員,對於客戶非常有禮貌、也能夠安撫客戶的抱怨情緒、
                        盡量讓客戶感到被尊重、竭盡所能的回覆客戶的疑問。

                        請檢視底下的客戶訊息,以最親切有禮的方式回應。

                        但回應時,請注意以下幾點:
                        * 不要說 '感謝你的來信' 之類的話,因為客戶是從對談視窗輸入訊息的,不是寫信來的
                        * 不能過度承諾
                        * 要同理客戶的情緒
                        * 要能夠盡量解決客戶的問題
                        * 不要以回覆信件的格式書寫,請直接提供對談機器人可以直接給客戶的回覆
                        ----------------------
"
                },
                new {
                        role = ChatGPT.role.user,
                        content = Message
                },
            }
        });
}

如果你熟悉 OpenAI 的API,會發現上面的程式碼就只是組出 ChatCompletion 所需要的 JSON Body ,最後呼叫 http post request:

public static string CallOpenAIChatAPI(string apiKey, object requestData)
{
    var client = new HttpClient();

    // 設定 API 網址
    var apiUrl = $"https://api.openai.com/v1/chat/completions";

    // 設定 HTTP request headers
    client.DefaultRequestHeaders.Add("Authorization", $"Bearer {apiKey}"); //👉OpenAI key
    client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));//ACCEPT header
    // 將 requestData 物件序列化成 JSON 字串
    string jsonRequestData = Newtonsoft.Json.JsonConvert.SerializeObject(requestData);
    // 建立 HTTP request 內容
    var content = new StringContent(jsonRequestData, Encoding.UTF8, "application/json");
    // 傳送 HTTP POST request
    var response = client.PostAsync(apiUrl, content).Result;
    // 取得 HTTP response 內容
    var responseContent = response.Content.ReadAsStringAsync().Result;
    var obj = Newtonsoft.Json.JsonConvert.DeserializeObject<dynamic>(responseContent);
    return obj.choices[0].message.content.Value;
}

取得 LLM 的回應之後,就可以把結果再回傳給用戶。

如此一來,就設計完成啦。在地端環境,你可以透過 VS2022把這個 bot 運行起來,執行起來之後,你會發現它是一個網站:
圖片

該網站中有一個 Web API Controller ,其 endpoint 是 http://localhost:3978/api/messages

接著,我們可以透過 Bot Emulator(一個工具程式) ,開啟該 endpoint 進行測試。你會發現,這個機器人就活了起來,我們可以嘗試跟機器人對話,甚至可以在 VS2022 中單步執行和除錯:
圖片

完成測試之後,我們就可以將該機器人佈署到雲端站台,並且取得一個 endpoint。

佈署機器人

由於要佈署該應用程式,因此我們必須先在 Azure 雲端建立一個 Web App:
圖片

佈署的選項我個人建議 asp.net 4.8 ,採用 windows 伺服器:
圖片

建立好之後,有很多種方式可以佈署程式碼到這個站台。例如,透過『下載發行設定檔』,當然也可以透過 VS 2022直接佈署:
圖片

應用程式佈署上去 Azure Web App 之後,你會得到一個正式的網址,把該網址加上 /api/messages,就是我們需要的 endpoint 了。

有了endpoint 之後,我們接著可以在 Azure 上建立一個 Azure Bot,以便於配置這個 endpoint。

建立 Azure Bot時,請留意 Bot 控制代碼 必須是唯一的值:
圖片

接著請在『應用程式類型』處,選擇『單一租用戶』:
圖片
完成後,即可建立出一支位於雲端的 Azure Bot。

建立好之後,我們先在底下畫面,把剛才取得的 endpoint 配置上去:
圖片

這邊要特別注意一件事情,我們剛才在 bot framework 所開發的程式中,有一個 appsettings.json 設定檔:
圖片
這個設定檔裡面,有些關於 bot 的配置需要設定。
首先 MicrosoftAppType 是你的 bot 的類型,如果你開發的 bot 只需要給自己企業用戶使用,建議設定為 SingleTenant。

至於MicrosoftAppId,則可以從 Azure Bot 的配置中找到:
圖片
而 MicrosoftAppPassword ,則是從上圖的 Microsoft App ID(管理密碼) 中找到。請點選『管理密碼』,會出現底下畫面:
圖片
這是在你建立 Azure bot 時,系統自動幫你在你的AAD(現在叫 Entra ID)所建立的應用程式(Application),你可以在該應用程式的『憑證及秘密』中,建立一個用戶端密碼(Client Password),這個就是你需要填在 MicrosoftAppPassword 中的參數。

最後一個參數 MicrosoftAppTenantId,則可以從應用程式的『概觀』找到,內容就是下圖中的『目錄(租用戶)識別碼』:
圖片
這些都配置好之後,重新建置佈署到 WebApp,然後該 endpoint 才真正的可用,

設置 teams channel

目前,這支 Azure Bot 還沒有建立 teams channel,因此無法連到 teams,我們可以為這個 Azure Bot 建立teams channel:
圖片

建立時無須設定甚麼,只需要採用預設值,然後直接套用即可:
圖片

完成後,你會看到 teams channel 配置後,會出現一個 hyper link 『Open In Teams』:
圖片

點選該連結,即可進入 teams 並且開啟該機器人,並且可以跟機器人對話囉:
圖片

一點都不難吧。
hope it helps~

留言

Kimxinfo寫道…
文中年份寫錯了 "2014"

這個網誌中的熱門文章

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

VS Code的字體大小

使用 Dify 建立企業請假機器人

使用C#開發LineBot(3) - 使用LineBotSDK發送Line訊息

使用Qdrant向量資料庫實作語意相似度比對