跑了一個簡單場景的chatbot demo之后,簡單歸納下構建方法:
1、從特定任務中歸納出Intents、Actions、Entities。
2、分別編寫Intents、Entities的examples,兩類examples是做DST的基礎,用來訓練chatbot準確地識別user intents和entity parameters,至于算法,自己寫也可以,用api.ai也可以。
3、做好DST之后,chatbot就知道用戶的意圖和相應的參數(shù),丟給后臺的web service去執(zhí)行,并得到執(zhí)行的結果,然后填充預先定義好的templates,生成response,返回給用戶。
結束語
簡單場景的chatbot關鍵之處在于做好DST,有一個叫Dialogue State Tracking Challenge的比賽正式為了解決這個問題而舉辦的。我們說,封閉域的chatbot涉及兩個方面,一是NLU,一是NLG,前者通過大量的examples來學習一個分類器和抽取器,得到Dialogue State,而后者根據(jù)Dialogue State,生成合適的response。
NLU不是一個簡單的事情,尤其是標注大量的examples不是那么容易;NLG同樣也不是一個好解決的問題,預先定義的template會讓chatbot受限制于template的多少,手工痕跡太重,需要一種更牛的解決方案來代替。(其實挺多paper都在做這件事情,PaperWeekly也分享過幾篇相關的paper,data driven的NLG方案同樣需要大量的examples做訓練。)
Context是個挺難的事情,現(xiàn)有的、成熟的解決方案仍是手工來定義條件,然后根據(jù)條件來trigger。我在想,能否構建一個動態(tài)的DST,可以是一張動態(tài)hash table,也可以是一個動態(tài)graph,記錄著某一個user方方面面的狀態(tài),而不僅僅是某一輪對話中抽取出的信息,而是多輪對話中的信息,不僅在intent識別中可以用到context,在生成response時也可以用到,多輪對話和個性化對話都將不是什么問題了?;蛘?,用現(xiàn)在流行的表示學習思維來想這個問題的話,也許context可以是一個分布式表示,user profile也是一個表示,NLG時以context distribution為condition來做generatation。
本文介紹了構建簡單場景下chatbot的一般方法,用api.ai確實很容易做一個chatbot,而對于復雜場景,我覺得用api.ai來開發(fā)也沒有太大問題,最費時的可能是構建context trigger。api.ai因為是面向developer的,所以對于普通的用戶并不適合,但對于有一定經(jīng)驗的developer來說,使用起來就非常簡單,提供的web界面也很好用,如果說chatbot是一個平臺的話,那么api.ai正像是一個開發(fā)工具,提高了開發(fā)chatbot的效率,雖然NLG和context這兩個問題可以做的更好,但整體來說降低了開發(fā)chatbot的門檻,是個很有意義和錢景的服務。