如何使用Azure Bot Services創(chuàng)建聊天機(jī)器人的分步說明
譯文譯者 | 李睿?
審校 | 孫淑娟?
信使、網(wǎng)絡(luò)服務(wù)和其他軟件都離不開機(jī)器人(bot)。而在軟件開發(fā)和應(yīng)用中,機(jī)器人是一種應(yīng)用程序,旨在自動(dòng)執(zhí)行(或根據(jù)預(yù)設(shè)腳本執(zhí)行)響應(yīng)用戶請求創(chuàng)建的操作。在本文中, NIX United公司的.NET?開發(fā)人員Daniil Mikhov介紹了使用微軟Azure Bot Services創(chuàng)建聊天機(jī)器人的一個(gè)例子。本文將對想要使用該服務(wù)開發(fā)聊天機(jī)器人的開發(fā)人員有所幫助。
為什么使用Azure Bot Services? ?
在Azure Bot Services上開發(fā)聊天機(jī)器人的優(yōu)勢在于微軟公司對其產(chǎn)品的高度支持。該公司的專家積極與技術(shù)社區(qū)溝通,并迅速識別和修復(fù)服務(wù)中的漏洞。此外,微軟公司提供了創(chuàng)建自定義JSON文件的能力,以配合?一些信使的API,讓開發(fā)人員在創(chuàng)建聊天機(jī)器人時(shí)有很多可能性。
記住Azure Bot Services的其他優(yōu)點(diǎn)也很重要:?
- Azure Bot Services允許開發(fā)人員使用開源SDK工具(軟件開發(fā)工具包)來創(chuàng)建、測試和部署聊天機(jī)器人。 ?
- 與認(rèn)知服務(wù)的集成是指在工作中使用機(jī)器學(xué)習(xí)工具來解決典型任務(wù)的服務(wù)。認(rèn)知服務(wù)確保了聊天機(jī)器人和用戶之間更好的交互過程。 ?
- 多平臺是指將聊天機(jī)器人連接到多個(gè)通道而無需更改原始代碼的能力。 ?
- 大量的開源示例以促進(jìn)開發(fā)過程和快速啟動(dòng)(GitHub上有很多現(xiàn)成的代碼示例)。 ?
開發(fā)人員可以通過添加新功能來擴(kuò)展Azure平臺上的聊天機(jī)器人基礎(chǔ)設(shè)施。例如,可以添加更多通道并使用每個(gè)通道進(jìn)行測試??梢允褂肅osmos DB服務(wù)來存儲對話狀態(tài)和用戶輸入的信息。要訓(xùn)練聊天機(jī)器人,可以添加語言理解 (LUIS)。它使用機(jī)器學(xué)習(xí)算法來更好地與用戶交流。然而,LUIS并不是免費(fèi)的,并且不是每個(gè)客戶都想分配額外的資金。 ?
Azure Bot Services中的聊天機(jī)器人剖析 ?
在Azure上創(chuàng)建的聊天機(jī)器人的功能結(jié)構(gòu)可以表示為: ?
可以在右側(cè)看到連接到聊天機(jī)器人的可能通道列表。這個(gè)列表會(huì)隨著新的平臺不斷更新。其底部是Azure平臺可以使用的Microsoft認(rèn)知服務(wù)。這些服務(wù)允許通過語音請求、面部表情、手勢等與聊天機(jī)器人交流。 ?
Bot Builder SDK用于在Azure上開發(fā)聊天機(jī)器人。該產(chǎn)品處于公共領(lǐng)域,其主要優(yōu)勢是開發(fā)人員的持續(xù)支持。在GitHub上的一個(gè)單獨(dú)的分支中,可以獲得關(guān)于該服務(wù)的最新信息,或者向其開發(fā)人員提問。 ?
創(chuàng)建聊天機(jī)器人?
在編寫代碼之前,分析一下在Azure Bot Service上創(chuàng)建聊天機(jī)器人之前應(yīng)該考慮的細(xì)微差別: ?
- 破壞功能的更新。微軟公司正在不斷更新其產(chǎn)品。新的更新經(jīng)常會(huì)破壞以前可以工作的部分代碼。所以一定要了解新的Bot Builder SDK版本的補(bǔ)丁列表,而用來開發(fā)聊天機(jī)器人的其他手冊可能會(huì)變得無關(guān)緊要。 ?
- 不明顯的解決方案。在使用Bot Builder SDK時(shí),應(yīng)該始終對實(shí)驗(yàn)持開放態(tài)度,并愿意以不同于以往的方式進(jìn)行操作。?
- 多功能性。同一個(gè)聊天機(jī)器人可以上傳到不同的頻道(Telegram、Skype、Slack等等),而不需要更改源代碼。在開發(fā)聊天機(jī)器人時(shí)應(yīng)該記住,每個(gè)平臺都有細(xì)微差別,這需要開發(fā)人員在創(chuàng)建應(yīng)用程序的工作邏輯時(shí)采用不同的方法。 ?
(1)聊天機(jī)器人能正確理解人們的問題嗎? ?
與聊天機(jī)器人的交流是通過用戶界面進(jìn)行的。用戶界面允許開發(fā)人員采用聊天機(jī)器人能理解的語言與它交流。為此,微軟Azure使用了一個(gè)對話框系統(tǒng),它遵循特定的層次結(jié)構(gòu): ?
在這里可以看到與聊天機(jī)器人建立對話的三種基本方法:?
- 提示——聊天機(jī)器人通過提示和回答與用戶交互。例如,以數(shù)字提示的形式給出聊天機(jī)器人信息。Prompt檢查用戶是否正確地回答了提示。如果成功,與聊天機(jī)器人的對話將繼續(xù)進(jìn)行。如果從用戶那里收到不正確的回答,他將被提示輸入有效的數(shù)據(jù)。 ?
- 瀑布——瀑布是一種通過一系列連續(xù)任務(wù)/問題從用戶那里收集信息的方法。瀑布對話框的每個(gè)步驟都是作為異步函數(shù)實(shí)現(xiàn)的。在每個(gè)階段,聊天機(jī)器人要求用戶輸入數(shù)據(jù),等待響應(yīng),然后將結(jié)果傳遞到下一步。第一個(gè)函數(shù)的結(jié)果作為參數(shù)傳遞給下一個(gè)函數(shù),以此類推,直到傳遞完整個(gè)問題循環(huán)。 ?
- 組件——組件是將一個(gè)龐大的對話框分解成更小的、易于管理的部分的一種方法。組件允許開發(fā)人員創(chuàng)建一個(gè)可重用的對話框,并在以后的各種獨(dú)立場景中使用它。例如,可以使用它來創(chuàng)建一個(gè)對話框,該對話框?qū)⒁来蜗蛴脩粼儐柦值烂Q/地址/郵政編碼。 ?
在最下面的一行,可以看到為聊天機(jī)器人創(chuàng)建自定義請求的允許方法:?
- 文本查詢(文本) ?
- 號碼查詢(數(shù)量) ?
- 日期/時(shí)間請求(日期時(shí)間) ?
- 確認(rèn)請求(確認(rèn)) ?
- 選擇請求(選擇) ?
- 附件要求(附件) ?
在本質(zhì)上,查詢是分階段的對話框:在第一個(gè)階段,聊天機(jī)器人請求輸入數(shù)據(jù);在第二個(gè)階段,它向用戶返回有效值,或者在收到無效值時(shí)重新啟動(dòng)數(shù)據(jù)查詢循環(huán)。?
(2)控制器和模板 ?
以下看看Daniil Mikhov創(chuàng)建的“稍后提醒我”聊天聊天機(jī)器人示例中的代碼,它的主要任務(wù)是提醒他將來需要采取的任何行動(dòng)。 ?
為了創(chuàng)建聊天機(jī)器人,Mikhov使用了Visual Studio提供的Empty Template,它包括幾種類型的控制器:BotController和NotifyController。 ?
BotController為聊天機(jī)器人接收消息并將它們傳遞給聊天機(jī)器人框架。聊天機(jī)器人還包含幾個(gè)部署模板,用于更輕松地將應(yīng)用程序部署到Azure平臺。 ?
Notify Controller確定何時(shí)向用戶發(fā)送消息。將在后面更詳細(xì)地討論這個(gè)問題。 ?
(3)啟動(dòng)功能和填充ToDoDialog選項(xiàng)卡 ?
轉(zhuǎn)到Startup.cs選項(xiàng)卡,查看它的內(nèi)容。在這里可以看到注冊的錯(cuò)誤處理程序AdapterWithErrorHandler。如果錯(cuò)誤發(fā)生在程序中,應(yīng)用程序?qū)﹀e(cuò)誤的反應(yīng)是必要的。注意注冊ConversationState——使用它來讓聊天機(jī)器人了解正在與哪個(gè)用戶交流,以及在對話的哪個(gè)階段。 ?
以下看看ToDoDialog.cs選項(xiàng)卡的內(nèi)容。Mikhov聲明了waterfallSteps,這是瀑布對話框的一組步驟,已經(jīng)在上面提到過了。在waterfallSteps中,指定在每個(gè)步驟中使用哪些異步函數(shù)來構(gòu)建用戶和聊天機(jī)器人之間的對話。 ?
以下可以看到聊天機(jī)器人將使用什么類型的輸入提示。這里的內(nèi)容是相當(dāng)標(biāo)準(zhǔn)的:聊天機(jī)器人會(huì)問人們一些關(guān)于事件的問題,然后提供安排提醒。?
現(xiàn)在運(yùn)行聊天機(jī)器人,并使用Bot Framework Emulator界面測試它的操作。 ?
(4)在聊天機(jī)器人框架模擬器中首次啟動(dòng)和測試 ?
當(dāng)運(yùn)行這個(gè)應(yīng)用程序時(shí),會(huì)出現(xiàn)一個(gè)鏈接到聊天機(jī)器人將等待用戶消息的URL。 ?
在開始測試之前,在聊天機(jī)器人框架模擬器中指定這個(gè)鏈接:?
在第一個(gè)通信步驟中,聊天機(jī)器人要求用戶輸入需要提醒的事件名稱。為此,調(diào)用以下代碼: ?
現(xiàn)在,當(dāng)調(diào)用聊天機(jī)器人時(shí),它將返回以下文本:請輸入事件描述。在聲明想要進(jìn)行提醒的事件(例如買牛奶)后,調(diào)用第二步的代碼,在這里,聊天機(jī)器人將提供三個(gè)提醒時(shí)間選項(xiàng)中的一個(gè):?
注意stepContext的使用。它保存關(guān)于對話框的所有信息,記錄中間值。為了實(shí)現(xiàn)可能的提醒時(shí)間列表,使用了ChoicePrompt。這個(gè)方法將為用戶提供三個(gè)選項(xiàng)和一個(gè)可能的提醒時(shí)間(2分鐘,5分鐘,或第二天的同一時(shí)間)。本來可以有更多的選擇,但只選了三個(gè)。?
采用選擇來表示每個(gè)新的選擇時(shí)間,可以得到:?
在聊天機(jī)器人框架模擬器中,這段代碼將像這樣呈現(xiàn):?
可以使用Parse對結(jié)果進(jìn)行解析。在此提醒的是,解析是一個(gè)自動(dòng)收集數(shù)據(jù)并對其進(jìn)行結(jié)構(gòu)化的過程。然后聊天機(jī)器人會(huì)詢問用戶是否確定所選的提醒時(shí)間,使用ConfirmPrompt來確認(rèn)協(xié)議:?
從視覺上看,這個(gè)方法如下所示:?
最后一步是從stepContext中取出之前填寫的信息,并生成一個(gè)SavedNotificationModel,必須向其添加一個(gè)conversationReference。如果沒有它,聊天機(jī)器人將無法恢復(fù)與用戶的對話,也無法確定是哪個(gè)用戶專門解決了這個(gè)問題。?
Mikhov使用字典方法作為這些事件的臨時(shí)存儲庫,多虧采用它,聊天機(jī)器人將其唯一的instanceId分配給每個(gè)特定的對話框: ?
這將結(jié)束與聊天機(jī)器人的對話??梢韵蛴脩麸@示文本,指示對話框的結(jié)束并創(chuàng)建相應(yīng)的提醒請求:“謝謝。通知已成功保存”。 ?
(5)聊天機(jī)器人如何穿越時(shí)間 ?
為了及時(shí)定位聊天機(jī)器人,Mikhov創(chuàng)建了notiffiedcontroller方法NotifyTimeCheck()。這種方法允許系統(tǒng)地輪詢應(yīng)用程序,如果某個(gè)事件即將發(fā)生,聊天機(jī)器人將從字典中檢索該事件并向用戶發(fā)送通知。
為了獲得通知,將調(diào)用BotAdapter的ContinueConversationAsync()方法,并將ConversationReference傳遞給它。ContinueConversationAsync()的第一個(gè)參數(shù)必須始終是聊天機(jī)器人服務(wù)的appId(應(yīng)用ID),否則,它將無法工作。 ?
此外,還需要提醒聊天機(jī)器人,當(dāng)某個(gè)時(shí)間到達(dá)時(shí),必須將事件提醒給特定的用戶。開發(fā)人員可以使用Azure Function(BotTimerFunction),它將由一個(gè)時(shí)間觸發(fā)器(TimerTrigger)觸發(fā)。 ?
每隔一分鐘,函數(shù)將向這個(gè)端點(diǎn)發(fā)送一個(gè)請求,并開始檢查指定的事件。如果它到達(dá)了正確的時(shí)間框架,聊天機(jī)器人將通知用戶預(yù)定的事件即將發(fā)生。?
如今,WhatsApp、Facebook Messenger、Telegram和其他通信工具不僅是交流平臺,也是業(yè)務(wù)平臺。聊天機(jī)器人幫助企業(yè)有效地在線銷售和推廣商品和服務(wù)。實(shí)現(xiàn)日常流程的自動(dòng)化,及時(shí)向客戶提供必要的產(chǎn)品信息,接收和處理請求——所有這些適當(dāng)配置的聊天機(jī)器人的功能將有助于將用戶轉(zhuǎn)化為客戶。因此,作為開發(fā)人員,應(yīng)該記住這個(gè)工具現(xiàn)在是多么流行,能夠創(chuàng)建這樣的應(yīng)用程序并因此成為受歡迎的專家是多么酷的事。?
原文標(biāo)題:??How to Create a Chatbot Using Azure Bot Service: Step-by-Step Instruction??,作者:Daniil Mikhov?