2016年8月24日 星期三

關於bot framework (4) - 使用LUIS,讓你的bot理解用戶輸入文字的意義

LUIS全名是Language Understanding Intelligent Services,顧名思義,是一個提供語句理解能力的服務,請留意,LUIS並非去分析語句(這是Text Analytics的功能),而是去嘗試理解一個句子的意義,找出用戶的企圖(intents)與相關聯的entities。

而這個功能,對於我們的chatting bot,非常的重要。由於文字bot的輸入介面,用戶往往可以自由隨興的打字輸入,你根本無法限制用戶輸入什麼,而且人很有趣,只要沒有限制,就會竭盡所能地嘗試,你只要開放一個text chatting bot,就會有人手ㄐㄧㄢˋ的亂打一些有的沒的,然後bot沒理解出他的意思,他就笑這個bot很笨。(這樣很有成就感?)

因此,就對談機器人來說,首要目標之一就是理解用戶輸入的內容,而LUIS是實現這個功能的重點服務。

首先,我們需要知道一些概念,LUIS的基本功能(以後有空再說複雜的),就是區分出用戶的意圖和相關的entities。

拿點餐來說,如果我們要點一個早餐,用語大概會是:

  • 我要點一份燒餅油條
  • 麻煩你我需要一份蛋餅
  • 給我來個大亨堡
  • 三明治帶走

    上面這四句話,基本上intent都是點餐,而其中的entities則是餐點,具體的內容是燒餅油條、蛋餅、大亨堡、三明治。而LUIS的目的,是幫我們在雲端分析各種不同的句型,找出用戶的意圖,並且抓出entities。

因為,用戶不可能只用上面這四種說法點餐,有時候可能會換成:

今天請幫我來一個飯糰

這個句型就跟上面四種截然不同,但LUIS能夠從雲端大量的語句資料庫中,幫我們進行歸納,判斷(猜測)這個句型的意圖,一開始可能判斷不對,這時人工可以介入,指導LUIS,讓它理解上面這個句型就是點餐,這樣下次LUIS就知道了。而其中的entities也是,餐點種類繁多,第一次LUIS肯定不知道有個餐點叫做『飯糰』,所以它抓不出這個entity,但你可以指導它,它就知道下次看到飯糰,就可以將其視為entity。

有了這個基礎之後,我們就可以透程式碼,把從bot接收到的語句,丟給LUIS進行判斷,LUIS就會告訴我們,用戶所輸入的這個語句,其意圖intent與entities為何。

好,概念交代完畢,接著來實作,首先,請用Microsoft Account登入,登入後到底下網址註冊一個LUIS服務:
https://www.luis.ai

出現底下畫面並且跑一陣子,是正常的:

接著你會看到底下畫面,請點選 New Application:
建立LUIS App(其實我覺得叫Service比較好)時,你必須填妥底下1-4的資訊,App名稱可以用中文,而其中3的部分,關係到你的LUIS在分析語句的時候,所優先採用的資料庫,選擇正確的項目對效能會比較有幫助。

最後別忘了步驟4的Culture選中文:
建立該App會需要一點時間,完成後你可以在主畫面看到該App。可以點選Edit,進入編輯後台:

進入後台編輯畫面後,首先,我們來建立一個intent,整個情境是我們要為小吃店做一個客服bot,因此首要任務就是我們的bot必須要看懂客戶的點餐:
所以,我們先建立一個Intnets,需要輸入的資料如下。輸入完畢後按下Save:

在上圖中,我們建立一個intent,主要目的是讓bot看得懂客戶點餐的用語,因此下方的example我們給了一句"我要點一份燒餅油條",來教導bot理解這是點餐的意思。
請注意save之後,在主畫面你會看到左方多了一個 “客戶點餐” 的intents,畫面中間是我們剛輸入的語句,這時請點選下拉上圖中右方的下拉清單,選出"客戶點餐"這個intent,然後按下submit,這個動作,就是教導LUIS說,這句話是點餐的意思。

但這樣LUIS並不知道"燒餅油條"是一個entity啊,因此我們要在左方建立一個Entity:
本小吃店的餐點有兩種,一種是吃的,一種是喝的。因此我們建立了一個餐點Entity,並且設定了Children,分別是主餐、飲料。

完成後,我們可以在主畫面訓練這個LUIS,讓它不僅看懂這句對話,並且抓出entity,我需要特別把底下這個動作錄製起來,讀者會比較容易理解(而且建議你用Chrome/IE操作)。你會發現,當你要訓練LUIS抓出entity,可以在該語句上,把特定字詞用滑鼠框起來,框住的範圍會反白,這時會跳出你可以選擇的entities,你可以選擇後,再submit:

這樣LUIS就知道這個句子的intent與entity了。
我們可以用同樣的方式把前面提到的四種相關的訂餐語句都輸入進去,記得要選取intent與entity喔。

如果你有設定錯誤需要調整,或想要看目前LUIS學習了那些語句,可以點選review labels:

從上圖中可以看到LUIS目前可以理解的句子,當滑鼠停留在黃框上,會出現選定的entity。

接著,請點選畫面左下角的train,讓LUIS完整的跑一次訓練:

完成之後,接著我們就可以進行測試了。請點選畫面左上方的Publish,把這個LUIS發布成為一個Web Services App:

請在發布畫面按下圖中的按鈕:

成功後即可進行測試,你可以在上圖的query視窗中,試著輸入一句對話,例如: 『我要一份蘿蔔糕』,我們刻意輸入和先前訓練時稍微不同的對話:

回傳的結果是:

這表示,LUIS知道(成功猜測)這句話的意思是點餐,但尚且不知道entity是啥(當然,LUIS還不認得蘿蔔糕),沒關係,我們進入管理後台,你可以在Search/Suggest…等地方找到尚未被LUIS完整識別出來的語句,LUIS會去猜測這語句的意圖,但你可以透過這個管理畫面糾正或訓練它:
找到之後,我們可以用同樣的選取方法,明確的告訴LUIS,蘿蔔糕也是一個主餐,submit之後,別忘了重新訓練並且publish。然後,你再用同一句話去問LUIS,你會發現,回傳的結果是:


有沒有,蘿蔔糕被認為是entity了。如此這般,隨著用戶輸入的語句越來越多,我們也可以逐步修正並訓練LUIS判斷的結果,其結果就會越來越準確。如此一來,LUIS就真的會看得懂大部分用戶的訂餐語句,並且判斷出要點的餐點為何。

從上面的介紹中你也不難發現,呼叫LUIS的方法很簡單,就是一個單純的http get,回傳的結果就是JSON,我們下一篇再來看,如何透過SDK呼叫LUIS,讓我們的bot可以輕易的與LUIS整合。

1 則留言:

Strategist922 提到...

請問entities的type分為simple,composite,Hierarchical(後兩者又有child)
該怎麼區別呢甚麼時候用哪種呢?