微軟認知服務中的QnA Maker– (4) 與LINE Bot整合

好,接續著前面的介紹,在我們看過了如何從外部工具postman來呼叫QnA Maker之後,接著我們來看,當我們建立知識庫(KB)並訓練好QnA Services之後,要如何與我們的Line bot整合呢?

建議LINE Bot的開發人員可以直接透過我們寫好的範例程式碼來進行,您可以用我們先前在介紹過的方式,使用現成的StudyHost.Example.Linebot套件。

您只需樣建立一個空專案(建議採用.net framework 4.6.1):

記得請務必勾選Web Form與WebAPI,專案建立完成後再透過Nuget安裝StudyHost.Example.Linebot套件:

安裝完成後,你會發現專案中有一個TestQnAController.cs,這個WebHook是我們寫好的範本,你只需要把其中的一些參數置換掉即可:

分別是:

channelAccessToken : 就是你Line bot的channelAccessToken

AdminUserId : 你Line bot的管理者UserId(傳送錯誤訊息用)

QnAEndpoint : 這個參數很重要,必須填寫完整的Endpoint,例如像是這樣 https://xxxxxxx.azurewebsites.net/qnamaker/knowledgebases/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxx/generateAnswer

QnAKey : 你正式使用QnA Maker的Key

UnknowAnswer : 當找不到符合問題時,預設回答。

當你都設定好了之後,可以透過ngrok或發佈到Azure WebSite上測試,記得要將Line bot的WebHook設定為:

https://你的domain/api/TestQnA

這是因為我們範例中的WebHook的Route是TestQnA:

設定完成之後,你就可以嘗試一下了:

你會發現,你的WebHook的行為已經變成,當用戶傳遞訊息給LINE Bot時,LINE Bott果然會把訊息傳遞給QnA Service並抓取到回答。

而如果QnA Service沒有適合的答案則會出現:

這也是我們設定在UnknowAnswer參數中的預設回答。

接著我們來看一下程式碼,LINE Bot具體到底是怎麼與QnA Service整合的。

套件程式碼說明

你會發現,其實程式碼非常簡單,下圖A的地方我們先判斷用戶輸入的是否為文字(也就是收到的是否為text message),如果是,我們丟給isRock.MsQnMaker.Client這個物件幫我們向QnA Maker詢問答案(該物件中的程式碼會自動幫我們以http post方式去呼叫服務):

39行透過GetResponse(…)這個方法,將用戶輸入的問題(LineEvent.message.text),傳給QnA Service,並且取回答案,要注意的是,前面我們說過,取回的答案可能不只一組,所以40-43行我們透過score(分數)排序,只抓取最高的那一個。

45行是先把要回覆的答案設定為預設回答,如果QnA Maker沒有抓取到答案,我們就會用這個預設答案回傳。

46行判斷如果QnA Maker有抓取到答案,我們就採用QnA Maker的答案,最後透過49行的ReplyMessage回傳,如此就大功告成囉。

直接透過.net API呼叫QnA Maker服務

當然,除了使用我們開發的套件,你也可以直接透過.net 程式碼來呼叫,最簡單的方式就是WebClient物件。

上面這段程式碼透過WebClient,把要問的問題組成JSON型式,以UploadData的方式(其實就是http post)丟給Endpoint,取回結果(JSON)後再透過Newtonsoft反序列化成物件,就可以在程式碼當中使用囉。

至於反序列化時候所需要的物件類別定義,可以參考底下位置:

https://gist.github.com/isdaviddong/6c32ea2f06c60891879c6e953eb61a5b

好啦,看到這邊,你已經會建立QnA Maker並且透過程式碼呼叫它,要撰寫一隻支援Q/A的LINE Bot大概也不是問題囉,這個系列先介紹到這邊,後面我們會再介紹一些具體應用上的範例。

--------------------------------------------
本系列索引: https://studyhost.blogspot.com/2019/01/cognitive-servicesqna-maker-x-4.html
線上課程:https://www.udemy.com/line-bot/
電子書:https://www.pubu.com.tw/ebook/103305
LineBotSDK:https://www.nuget.org/packages/LineBotSDK
如果需要即時取得更多相關訊息,可按這裡加入FB專頁。若這篇文章對您有所幫助,請幫我們分享出去,謝謝您的支持。

留言

Unknown寫道…
我有一個問題放在IT邦幫忙,
可以麻煩您解答嗎?

https://ithelp.ithome.com.tw/questions/10197506

就差一步,其餘都順利,剩最後在網址加上/api/TestQnA,就會出現錯誤
而原先建立好的QnA Maker也會出現錯誤....

這個網誌中的熱門文章

使用 Airtable 在小型需求上取代傳統資料庫

在POC或迷你專案中使用 LiteDB

專業的價值...

精彩(且驚人)的Semantic Kernel入門範例

周末讀書會 - 一如既往