2016年12月13日

建立自己的Channel與LUIS Action Binding整合

在上一篇中,我們展示了如何透過LUIS Action Binding & Action Fulfillment整合Bot Framework建立一個不需要寫程式也能運作的Chat Bot;不必寫程式碼雖然很吸引人,但是必要的複雜邏輯勢必還是要透過萬能的程式解決。

LUISAction Binding機制中,也允許我們寫自己的Channel,在ActionTrigger之後,LUIS可以去呼叫我們自己的API取得回應。下面我們用一個很簡單的範例說明。

l   首先,我們先建立一個C#API App

n   事實上,任何形式的REST API都可以;這裡只是為了簡單使用API APP。你可以使用任何熟悉的語言建立REST API

l   在這個範例中,我的API會接受LUIS判斷出來的Entity,並產生回應;因此,我先定義兩個Class,一個是DEMO.cs,代表LUIS呼叫我時的傳入參數;另一個是DemoResponse,代表我的API的回應。

n   Demo.cs

    [Serializable]

    public class Demo

    {

        public string demotype;

    }

n   DemoResponse.cs

    [Serializable]

    public class DemoResponse

    {

        public string Message;

        public DateTime Time;

    }

l   新增一個DEMOController.cs

public class DMEOController : ApiController

    {

       

 

        // POST api/DoDemo

       [SwaggerOperation("DoDemo")]

        [SwaggerResponse(HttpStatusCode.OK)]

        [HttpPost]

        public Models.DemoResponse DoDemo([FromBody]Models.Demo demotype)

        {

            return new Models.DemoResponse

            {

                Message = $"so be it:{demotype.demotype}!!",

                Time = DateTime.Now

            };

        }

       

    }

l   發布之後,記錄下網址。

l   接著,回到LUIS Portal,建立一個新的IntentDEMO;建立一個新的Entitydemotype並開始訓練模型。

l   完成後,點開DEMO Intent的設定頁面

l   新增Action Fulfillment其型別為JsonRequest;必要輸入項為demotype Entity

l   接著,在Body欄位,我們需要把LUIS辨別出來的Entity傳給API;而先前我們的API已經定義了一個DEMO Class作為傳入參數;因此,這裡我們需要輸入一個JSON Template如下:

{{"demotype":"{DEMOTYPE}"}}

n   {DEMOTYPE}就是LUIS辨別出來的Entity值,在剛剛我們指定它的名稱為DEMOTYPE,這裡用{DEMOTYPE}變數的形式帶入。

n   整個字串其實就是剛剛DEMO ClassJson型式;與一般Json的差別僅僅在於物件需要用兩個"{"包住

l   Response Template中,我們可以提供一個回應給前端的句型;如果沒有指定,則會直接把我們的API的回應回給Bot Client

n   在這裡我們先前已經定義過一個DemoResponse class,他有兩個屬性:MessageTime,在這裡我們用{{Message}}{{Time}}變數代表

n   URL的部分填上剛剛發布的API AppController網址

l   完成之後發布新的LUIS application,然後回到Bot Portal測試看看

 

 

LUIS Action Fulfillment +Bot Framework = 不需要程式碼的Chat Bot

Bot Framework搭配LUIS作為語意分析,可以讓我們的對話機器人更有人性的理解我們的需求。在LUIS新的版本中,也推出了許多方便的功能與Bot Framework搭配;其中一個Action Fulfillment可以讓我們不必寫程式也能夠完成許多基本的需求。

在這個例子中,我會建立一個LUIS應用程式透過預設的GetWeather Channel來取得現在的天氣狀況,並與Bot Framework整合。(完整的預設Channel列表在:https://www.luis.ai/Help#PublishingModel )

以下的例子假設您已經有使用LUIS的經驗,並且使用過Bot Framework Developer Portal

l   登入https://dev.botframework.com註冊一個新的Bot

n   Message Endpoint的部分可以先隨便填,稍後我們會用LUIS Endpoint取代

n   記下Bot App IDPassword,稍後會需要用到

l   首先,進入LUIS並建立一個新的Application。建立一個GetWeatherIntent並輸入一些句子訓練這個application

n   在這裡,我透過pre-builtentity來識別地點

l   打開GetWeather Intent

n   勾選"Fulfillment"並選擇Action TypeGetCurrentTemerature

n   新增一個Action

n   新增一個Parameters,名稱為LOCATIONTypegeography,並設為Required

n   因為GetCurrentTemerature Channel需要一個LOCATION作為輸入;因此在下面Action Settings的地方,"Append a Parameter"下拉選單選擇LOCATION

n   按下SAVE

l   回到Portal Publich這個Application

n   勾選Enable Action Binding using Microsoft Bot Framework

n   將剛剛註冊的Bot App IDPassword填入對應欄位

n   記下Endpoint URL for Microsoft Bot Framework Bot的網址

l   Publish完成後,回到https://dev.botframework.com打開剛剛註冊的Bot,把剛才Endpoint URL for Microsoft Bot Framework Bot填上去

l   測試看看

About Me