在上一篇中,我們展示了如何透過LUIS Action Binding & Action Fulfillment整合Bot Framework建立一個不需要寫程式也能運作的Chat Bot;不必寫程式碼雖然很吸引人,但是必要的複雜邏輯勢必還是要透過萬能的程式解決。
在LUIS的Action Binding機制中,也允許我們寫自己的Channel,在Action被Trigger之後,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,建立一個新的Intent叫DEMO;建立一個新的Entity叫demotype並開始訓練模型。
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 Class的Json型式;與一般Json的差別僅僅在於物件需要用兩個"{"包住
l 在Response Template中,我們可以提供一個回應給前端的句型;如果沒有指定,則會直接把我們的API的回應回給Bot Client端
n 在這裡我們先前已經定義過一個DemoResponse class,他有兩個屬性:Message和Time,在這裡我們用{{Message}}和{{Time}}變數代表
n URL的部分填上剛剛發布的API App的Controller網址
l 完成之後發布新的LUIS application,然後回到Bot Portal測試看看