我將首先說Google的Dialogflow Fulfillment功能很棒。實現可以輕鬆構建可以與我們的後端系統交互的酷聊天機器人,但有時這還不夠。
在我的例子中,我為Golang中的Marvik.ai構建了一個chatbot核心引擎,用於處理上下文,會話流等,還可以連接到多個平臺,如Facebook Messenger,Telegram,Slack等。它可以使用IBM Watson,Microsoft LUIS和Facebook Wit,但我想添加Google Dialogflow。有了這個,我可以在最短的時間內構建不同的靈活和可擴展機器人。這樣做我發現Dialogflow的一些問題並不完全是文檔,所以我發了這篇文章試圖幫助其他人面對同樣的問題。
使用Fulfillment,你可以構建如下架構:
但是按照本教程,你將能夠構建更複雜,更靈活的內容,例如:
這很好,因為你可以擴展這個(就像我們一樣)來構建像這樣的酷東西:
在本教程中,我將假設你已經熟悉Dialogflow和chatbots,並且不會介紹一些基本概念。
如果你不想閱讀整個教程,你可以隨時通過此連結轉到Github中的代碼(robeceiro/dialogflow-golang)。
Dialogflow的聊天機器人(chatbots)
首先,讓我們創建聊天機器人的意圖和實體。如果你不知道該怎麼做,我建議你閱讀其他帖子。我們的機器人將專注於電子商務,並允許我們根據訂單ID檢查訂單的狀態。我們將使用名為OrderID的數字實體處理CheckOrderStatus意圖。
讓我們看看我們的意圖實體:
現在讓我們來看看配置:
谷歌的身份驗證
進入配置後,單擊下面顯示的服務帳戶連結:
這將帶你進入Google的Cloud Platform面板。驗證你是否在「服務帳戶」選項卡中,並按下面顯示的按鈕創建新的服務帳戶:
選擇我們服務帳戶的名稱,這僅供我們使用:
獲得名稱後,按「創建」按鈕。然後,系統將提示你輸入帳戶角色。搜索並選擇Dialogflow API Client。你可以選擇其他人,但這對我們來說已經足夠了:
一旦你完成它就會看起來像這樣。此時按繼續:
以下步驟將如下所示。只需按Create Key即可。
將出現一個彈出窗口。只需選擇JSON選項,然後再次按「創建」。這將下載一個JSON文件(不要丟失它!):
將文件保存到項目的目錄中(或者你想要的任何地方,只需記住密鑰的路徑,稍後我們將需要它):
Golang伺服器
現在讓我們關注我們的Golang代碼。首先創建一個簡單的Golang伺服器。這裡沒有什麼魔術,只需要在埠5000上聽POST請求。我們期望一個名為Message的欄位帶有用戶輸入:
我們將定義一些稍後會有用的結構。此時我們將導入Google的Dialogflow v2庫。
DialogflowProcessor將用於處理我們所有的參數,NLPResponse將用於回答POST請求。
注意我們如何定義一個名為DialogflowProcessor類型的dp的變量(它在main方法之外)。
我們需要初始化與Dialogflow的通信。我們將使用init方法來執行此操作。Dialogflow的項目ID,語言,時區和JSON密鑰的路徑將是此輸入。此時將填充變量dp。我們將定義一個上下文(ctx)並使用我們創建和下載的JSON密鑰進行身份驗證。這將創建一個會話客戶端,我們將存儲在我們的dp變量中。
現在讓我們定義一個進程NLP函數,該函數將接收原始消息,並將輸出我們在上面定義的結構,其中包含檢測到的intent,confidence和實體列表。
我們將使用Google的庫來完成所有這些操作,因此我們將導入一些新庫。請注意我們如何將dp變量與我們上面定義的所有內容一起使用。
我們將使用輔助函數來提取實體。我們需要根據輸入的類型處理我們在交換機中期望的每個實體類型。在這段代碼中,我們只需將所有內容轉換為字符串供以後使用。
可以擴展此代碼以了解其他實體類型。對於上述內容,我們需要導入一些其他庫。產生的import將是:
現在讓我們重新定義我們的主要方法,以便我們可以在啟動伺服器之前設置所需的一切。第一個輸入是項目的名稱(從Dialogflow的配置中讀取),第二個輸入是JSON文件的路徑,第三個是語言代碼(在我們的例子中是英語),最後一個是我們的時區。
讓我們重新定義我們的請求處理程序,以便我們可以使用Dialogflow來理解輸入消息:
我們將回答我們定義的NLPResponse結構。我們使用testUser作為虛擬對象,但應替換為用戶的標識符。
測試
現在讓我們從Postman測試一下。構建並運行Go代碼並打開Postman。對localhost 5000埠發出POST請求,如下所示:
太棒了,它有效!我們輸入一條原始消息,在伺服器查詢Dialogflow後輸出intent和confidence。
另外,請注意我們如何在更複雜的輸入中提取實體:
最後
我們已經構建了一個可以在我們的系統中用作微服務的伺服器。它接收原始消息並與Dialogflow通信(處理所有必要的身份驗證)並輸出意圖和實體。