【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

路邊兩盞燈發表於2021-06-18

歡迎來到微軟機器人編輯器使用教程,從這裡開始,建立一個簡單的機器人。

在該系列文章中,每一篇都將通過新增更多的功能來構建機器人。當完成教程中的全部內容後,你將成功的建立一個天氣機器人(Weather Bot)。在本系列中將學會以下內容:

 

1)建立一個簡單的對話天氣機器人

2)在機器人中提出問題,並獲取從HTTP API獲取響應

3)在機器人中增加幫助提示和取消功能

4)使用語言生成功能(LG: Language Generation)

5)把機器人的回覆轉換為卡片

6)新增LUIS功能,理解自然語言

 

準備條件

【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

 

新增機器人提問

在機器人能獲取天氣之前,它需要知道請求天氣的具體位置。為此,需要先建立一個文字輸入操作來提示使用者資料郵政編碼(Postal Code),然後機器人根據它從Weather API中獲取對應的天氣資料。

第一步:啟動編輯器(Bot Composer) 並開啟 weather_bot專案

第二步:在“getWeather”對話中選中“BeginDialog”開始事件,點選“+”號按鈕,新增一個 Ask a question(提問) --> Text(文字) 任務。

提問文字”任務建立完成後,主介面中會多出三個節點,第一個節點是機器人提出問題,第二個節點的內容為使用者輸入的郵政編碼. 第三個為其他:

    1. Bot response:指機器人發出詢問使用者資訊的提示
    2. 使用者輸入:儲存使用者輸入的內容,機器人可以使用這一值進行進一步的處理
    3. 其他:驗證使用者輸入,在輸入無效時回覆驗證訊息

第三步:在Bot response部分,在文字屬性中輸入問題文字(點選‘Add alternative’ 分兩次輸入下面的內容)

What's your postal code?
請輸入郵政編碼?

第四步:在使用者輸入部分,在"Property"中輸入“ user.postalcode ”。這將把使用者輸入的郵政編碼儲存在user.postalcode屬性中

第五步:在使用者輸入部分,在“Output format”中輸入“ =trim(this.value) ”。函式trim()是Bot的預設方法,用於把使用者輸入值的的多用空格去除(前後空格)。

注:使用者第一次輸入郵政編碼後,機器人不會再次提示輸入值。 如果希望機器人每一次都詢問新的郵政編碼,則在“其他”選項卡中,必須將“Always prompt”設定為 true

請檢視新增提問的演示動畫: 

 【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

 

新增輸入驗證規則

驗證規則:使用者輸入的郵政編碼長度必須大於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)提示將停止,並且在繼續對話之前,該屬性將設定為預設值欄位中定義的值。

請檢視新增驗證的演示動畫: 

【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

現在,機器人已經將使用者輸入的郵政編碼存放在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請求

【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

第二步:在HTTP的屬性中,設定請求方式為GET. 請求的URL為 http://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請求的演示動畫: 

【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

 

測試機器人

第一步:在編輯器的右上角點選 “Start Bot”按鈕,啟動機器人

第二步:啟動後,會彈出一個“Local bot runtime manager”的視窗,選擇“Open Web Chat”,開啟一個頁面聊天視窗

第三步:在對話方塊中輸入“weather” 或者“天氣”來觸發機器人的對話

第四步:輸入郵編“94040”檢視機器人的正常返回,

第五步:再次輸入“weather” 或者“天氣”來觸發機器人的對話,輸入錯誤的內容

【Azure 機器人】微軟Azure Bot 編輯器系列(2) : 機器人/使用者提問回答模式,機器人從API獲取響應並組織答案 (The Bot Framework Composer tutorials)

在下一篇中將演示:在機器人中增加幫助提示和取消功能

 

 

(以上內容均是參考微軟官方的機器人文件進行的中文操作步驟,原文連線見參考資料)

 

參考資料

Tutorial: Add actions to your dialog:https://docs.microsoft.com/en-us/composer/tutorial/tutorial-get-weather?tabs=v2x

Current weather datahttps://openweathermap.org/current

 

[完]

 

相關文章