【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/用戶提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)
- 2021 年 6 月 18 日
- 筆記
- 【Azure 機器人】, Azure Bot Service, Bot Framework Composer, 創建一個簡單的對話天氣機器人, 機器人/用戶提問回答模式, 機器人從API獲取響應並組織答案
歡迎來到微軟機器人編輯器使用教程,從這裡開始,創建一個簡單的機器人。
在該系列文章中,每一篇都將通過添加更多的功能來構建機器人。當完成教程中的全部內容後,你將成功的創建一個天氣機器人(Weather Bot)。在本系列中將學會以下內容:
2)在機器人中提出問題,並獲取從HTTP API獲取響應
3)在機器人中增加幫助提示和取消功能
4)使用語言生成功能(LG: Language Generation)
5)把機器人的回復轉換為卡片
6)添加LUIS功能,理解自然語言
準備條件
- 完成系列一種的簡單對話機器人創建(//www.cnblogs.com/lulight/p/14891002.html)
- 準備天氣的API介面的Token(Open Weather: //openweathermap.org/)
添加機器人提問
在機器人能獲取天氣之前,它需要知道請求天氣的具體位置。為此,需要先創建一個文本輸入操作來提示用戶數據郵政編碼(Postal Code),然後機器人根據它從Weather API中獲取對應的天氣數據。
第一步:啟動編輯器(Bot Composer) 並打開 weather_bot項目
第二步:在「getWeather」對話中選中「BeginDialog」開始事件,點擊「+」號按鈕,添加一個 Ask a question(提問) –> Text(文本) 任務。
「提問文本」任務創建完成後,主介面中會多出三個節點,第一個節點是機器人提出問題,第二個節點的內容為用戶輸入的郵政編碼. 第三個為其他:
-
- Bot response:指機器人發出詢問用戶資訊的提示
- 用戶輸入:存儲用戶輸入的內容,機器人可以使用這一值進行進一步的處理
- 其他:驗證用戶輸入,在輸入無效時回復驗證消息
第三步:在Bot response部分,在文本屬性中輸入問題文本(點擊『Add alternative』 分兩次輸入下面的內容)
What's your postal code? 請輸入郵政編碼?
第四步:在用戶輸入部分,在”Property“中輸入「 user.postalcode 」。這將把用戶輸入的郵政編碼保存在user.postalcode屬性中
第五步:在用戶輸入部分,在「Output format」中輸入「 =trim(this.value) 」。函數trim()是Bot的默認方法,用於把用戶輸入值的的多用空格去除(前後空格)。
註:用戶第一次輸入郵政編碼後,機器人不會再次提示輸入值。 如果希望機器人每一次都詢問新的郵政編碼,則在「其他」選項卡中,必須將「Always prompt」設置為 true。
請查看添加提問的演示動畫:
添加輸入驗證規則
驗證規則:用戶輸入的郵政編碼長度必須大於5或者6個字元。如果輸入短於5個或者長於6個,機器人都會發送錯誤消息。此消息在「Invalid prompt」欄位中設定
第一步:接上一節操作,選中「其他」選項卡。這裡指定驗證規則,並根據規則設定消息提示。
第二步:展開「識別器」部分,在「」中輸入下面的內容
Sorry, I do not understand '${this.value}'. Please specify a 5 or 6 digit postal code in the format 123456. 輸入有誤,請輸入5位,或者六位的郵政編碼!
第三步:展開「驗證」部分,在「驗證規則」中輸入規則 length(this.value) == 5 || length(this.value) == 6
第四步:在「Invalid prompt」部分,點擊「Add alternative」。輸入下面的文本
Sorry, '${this.value}' is not valid. I'm looking for a 5 or 6 digit number as postal code. 對不起,輸入的內容'${this.value}' 不是有效的郵政編碼,請輸入5位或者6位編碼。
第五步:展開「提示配置」部分,在”Default value Response“中可以輸入默認值。
註:默認情況下,提示配置為向用戶詢問3次後(在 Max turn count 欄位中指定,默認為 3)提示將停止,並且在繼續對話之前,該屬性將設置為默認值欄位中定義的值。
請查看添加驗證的演示動畫:
現在,機器人已經將用戶輸入的郵政編碼存放在user.postalcode 屬性中。 接下來,將在 HTTP 請求中將該屬性的值傳遞給天氣服務API。
[重要] 添加HTTP請求
在開始之前,需要把調用天氣API的資訊準備好。OpenWeather 站點中註冊完成後,可以在用戶的API Keys資訊中獲取到能夠訪問API的Token。當前的完整URL為:
GET http://api.openweathermap.org/data/2.5/weather?zip=${user.postalcode},us&appid=f8b74e2161e8a98afa3fdc8233b74adb
- appid= Your_API_Token . 如果需要實驗,可以使用以上的Token,但是該token有效期無法保證。
- zip=${user.postalcode}表示輸入的內容為郵政編碼
- us 表示地區是美國,CN表示中國。但是由於中國區的郵政編碼在openweathermap中沒有包含。所以無法通過郵編獲取。如果有興趣的可以自己使用城市名來查看天氣情況。使用城市名的介面如:
GET http://api.openweathermap.org/data/2.5/weather?q=ChengDu&appid=f8b74e2161e8a98afa3fdc8233b74adb Response Body: {"coord":{"lon":-122.088,"lat":37.3855},
"weather":[{"id":721,"main":"Haze","description":"haze","icon":"50d"}],
"base":"stations","main":{"temp":291.68,"feels_like":291.39,"temp_min":284.81,"temp_max":297.16,"pressure":1007,"humidity":69},
"visibility":9656,"wind":{"speed":2.06,"deg":290},"clouds":{"all":1},"dt":1624026023,
"sys":{"type":2,"id":2010364,"country":"US","sunrise":1624020446,"sunset":1624073504},
"timezone":-25200,"id":0,"name":"Mountain View","cod":200}
第一步:在「getWeather」的對話中,選擇編輯區中最下面的「+」按鈕,添加一個「訪問外部資源」–>「發送HTTP請求」
第二步:在HTTP的屬性中,設置請求方式為GET. 請求的URL為 //api.openweathermap.org/data/2.5/weather?zip=${user.postalcode},us&appid=Your_API_Token (註:Token需替換), ${user.postalcode}為參數佔位符,在機器人運行時根據輸入自動替換。
第三步:在「Result Property」中,輸入 dialog.api_response 。 Response的數據類型為”json”
第四步:在HTTP請求發送後,需要根據API的返回做下一步的操作,當請求返回200(成功)或者是其他狀態(失敗),使用if/else模組來完成邏輯判斷
第五步:在「分支 If/Else」 的 「Condition」 中輸入 」= dialog.api_response.statusCode == 200「表達式。注意必須要在語句前有」=「號表達式。
第六步:在「分支 If/Else」 的 」True「 部分,點擊「+」按鈕,添加「管理屬性 –> 設置屬性」。然後添加下列屬性 (註:如在添加屬性時,無法添加多個屬性值,可以修改編輯器的語言版本為英文後,重新載入試一試)
Property |
Value |
dialog.weather | =dialog.api_response.content.weather[0].description |
dialog.icon | =dialog.api_response.content.weather[0].icon |
dialog.city | =dialog.api_response.content.name |
dialog.country | =dialog.api_response.content.sys.country |
dialog.kelvin | =dialog.api_response.content.main.temp |
dialog.fahrenheit | =round((9/5 * (dialog.kelvin-273)) + 32,0) |
dialog.celsius | =round(dialog.kelvin-273.15) |
第七步:在「True」的分支中,繼續點擊「+」按鈕,添加一個「發送響應」任務。在響應中回復如下內容:
The weather is ${dialog.fahrenheit}F or ${dialog.celsius}C and ${dialog.weather} 當前地區的溫度為${dialog.celsius}C, ${dialog.weather}
第八步:當HTTP請求返回失敗時,在False的分支中也需要設定回復消息。點擊「+」按鈕,同樣選擇「發送響應」任務。在響應中回復如下內容:
I got an error: ${dialog.api_response.content.message}.
調用天氣介面失敗,錯誤消息: ${dialog.api_response.content.message}.
註:由於調用API失敗的情況應為用戶輸入的郵政編碼無效,為了保證數據的有效性,需要在False分支中刪除錯誤的user.postalcode屬性。繼續點擊「+」按鈕,在「管理屬性」下選擇「刪除屬性」任務。輸入需要刪除的屬性值:user.postalcode
以上步驟,就完成了機器人的問答,獲取API數據並提供響應的整個功能。在測試機器人環節中驗證是否正常工作。
請查看添加HTTP請求的演示動畫:
測試機器人
第一步:在編輯器的右上角點擊 「Start Bot」按鈕,啟動機器人
第二步:啟動後,會彈出一個「Local bot runtime manager」的窗口,選擇「Open Web Chat」,打開一個頁面聊天窗口
第三步:在對話框中輸入「weather」 或者「天氣」來觸發機器人的對話
第四步:輸入郵編「94040」查看機器人的正常返回,
第五步:再次輸入「weather」 或者「天氣」來觸發機器人的對話,輸入錯誤的內容
在下一篇中將演示:在機器人中增加幫助提示和取消功能
(以上內容均是參考微軟官方的機器人文檔進行的中文操作步驟,原文連接見參考資料)
參考資料
Tutorial: Add actions to your dialog://docs.microsoft.com/en-us/composer/tutorial/tutorial-get-weather?tabs=v2x
Current weather data://openweathermap.org/current
[完]