歡迎來到微軟機器人編輯器使用教程,從這裡開始,建立一個簡單的機器人。
在該系列文章中,每一篇都將通過新增更多的功能來構建機器人。當完成教程中的全部內容後,你將成功的建立一個天氣機器人(Weather Bot)。在本系列中將學會以下內容:
2)在機器人中提出問題,並獲取從HTTP API獲取響應
3)在機器人中增加幫助提示和取消功能
4)使用語言生成功能(LG: Language Generation)
5)把機器人的回覆轉換為卡片
6)新增LUIS功能,理解自然語言
準備條件
- 完成系列一種的簡單對話機器人建立(https://www.cnblogs.com/lulight/p/14891002.html)
- 準備天氣的API介面的Token(Open Weather: https://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為 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請求的演示動畫:
測試機器人
第一步:在編輯器的右上角點選 “Start Bot”按鈕,啟動機器人
第二步:啟動後,會彈出一個“Local bot runtime manager”的視窗,選擇“Open Web Chat”,開啟一個頁面聊天視窗
第三步:在對話方塊中輸入“weather” 或者“天氣”來觸發機器人的對話
第四步:輸入郵編“94040”檢視機器人的正常返回,
第五步:再次輸入“weather” 或者“天氣”來觸發機器人的對話,輸入錯誤的內容
在下一篇中將演示:在機器人中增加幫助提示和取消功能
(以上內容均是參考微軟官方的機器人文件進行的中文操作步驟,原文連線見參考資料)
參考資料
Tutorial: Add actions to your dialog:https://docs.microsoft.com/en-us/composer/tutorial/tutorial-get-weather?tabs=v2x
Current weather data:https://openweathermap.org/current
[完]