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


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

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

 

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

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

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

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

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

6)添加LUIS功能,理解自然語言

 

准備條件

 

添加機器人提問

在機器人能獲取天氣之前,它需要知道請求天氣的具體位置。為此,需要先創建一個文本輸入操作來提示用戶數據郵政編碼(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

請查看添加提問的演示動畫: 

 

 

添加輸入驗證規則

驗證規則:用戶輸入的郵政編碼長度必須大於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 datahttps://openweathermap.org/current

 

[完]

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM