ChatBot framework 開發實踐

2021-08-21 10:42:37 字數 3033 閱讀 4620

通常而言,通用聊天機械人(比如小冰等)底層技術是採用類似seq2seq等「生成」技術的。但是這種機械人屬於探索性質,無法

提供特定的服務。而siri則是兼具閒聊以及垂直領域功能的,比如可以預約提醒,打**,定餐廳等特定功能。相信siri在實現特定預約提醒,打**功能等,則是使用了「語言模板」匹配技術以及結合分類器來實現精度的控制和定向動作的執行。

對於聊天機械人我個人是相當感興趣的,奈何現在的已經公開的文章都「相對初級和入門」,或者說過於專注裡面的某個演算法,比如問答匹配演算法。所以萌生了寫一篇文章的想法。本文基於自己開發相應系統的經驗,理論上會給大家帶來一些幫助。但是因為是內部系統,只能談及一些較為公開的思想。

現在我們的目標是**是如何設計和實現乙個,只要通過簡單配置就完成乙個特定主題對話的機械人。有需要的話,可以經過外掛程式(元件)開發,為其增加新垂直領域對話功能。這些外掛程式,就如我前面所言,可能需要整合大量的針對特定領域問題的演算法。

語言模板引擎

對話配置系統

機器學習相關技術

語言模板可以保證意圖識別的準確性,機器學習除了能否增加覆蓋度以外,同時也是對話配置系統的核心所在。在今天這篇文章裡我們會重點**1,2兩點,3有需要的時候會提及。

語言模板很好理解,就是一句話匹配上了某個模板,這個模板會指向乙個動作,從而能夠給出乙個響應。乙個大致的配置如下:

比如糖尿病怎麼辦,就會匹配上這個模板,並且執行action動作。如果怕模板定製的過於寬泛,可以再通過reg (正則)來進行限制。id 則是這個模板的唯一編號。 * 表示中間可以匹配任何字元。《疾病》 則表示特定實體,這需要有海量的實體詞典支援。

通常語言匹配模板引擎會有比較明顯的效能問題。當你有幾千個上萬個模板,每個模板裡面又有幾十個甚至上百個子模板,那麼一次匹配的成本會相當高,對cpu壓力也會非常大。所以通常我們會採用倒排索引技術,比如*怎麼***會進行如下編碼:

怎麼 -> [24,100...... ]

** -> [24,36...... ]

比如糖尿病應該怎麼辦**,我們會提取出」怎麼「,」**「,兩個詞彙,然後獲得他們的倒排列表,求交集,就能得到24,並且再做一次實體檢查,就能實現快速查詢了。當然具體如何做倒排列表,如何做抽詞,包括做實體識別,實體積累我們在本文不做詳解。

語言模板引擎是聊天機械人裡較為核心的元件,通常演算法在這種場景裡是補充。

對話配置系統,其實就是chatbot framework, 據說有一些開源實現,不過我沒具體了解過。我這裡說說我的設計。

通常對於一次性對話(一問一答)這個比較好處理,依託於上面的語言模板引擎基本就能實現了。對於有乙個」對話引導流程「的會話,這種多倫對話則需要乙個較為完善的對話配置系統。

對話配置系統會涉及到幾個概念:

會話主題。每次對話應該都是圍繞乙個主題的,比如幫助使用者完成轉賬流程,這期間要和使用者發生多次互動,直到最後幫使用者搞定。

跳轉。 根據使用者的反饋,又分為會話內跳轉,和會話間跳轉。因為乙個會話會有多次互動,所以會有會話內跳轉。會話間跳轉,可以通過乙個簡單的例子來解釋:比如使用者問附近哪家餐廳比較好,你可能會詢問使用者是要西餐還是中餐,這個時候使用者不搭理你了,說給我安排乙個日程吧,這個時候時候就需要主題間的跳轉。主題通常依託在特定會話中。

對話樹。乙個對話對話是乙個樹狀結構。同時我們又會有多個對話,對話之間不一定是互通的,最終有個會話森林的概念。

對話樹節點。前面我們提及,乙個會話會有多倫互動,所以為了完成乙個會話, 配置上至少有兩種型別的節點:乙個是條件節點,乙個回答節點。

上面都是一些要點,我這裡會舉乙個最簡單的配置例子:

}}

],"conversation": [

},},

"msg": "您好 $先生",

"step": 6,

"target_step": -1

}

intercept表示會話攔截,在對話流程裡任何乙個環節,都需要檢查下是不是發現了主題變更,如果符合,則會根據target_step實現對應的跳轉。在interceptor的target_step 被表示為 a:b 這種形式,意思是跳轉到a對話裡的b節點上。

match 表示匹配了哪些模板,當然,也可以是乙個演算法模型,比如"model:com.org.questionclassify",比如我需要判定使用者是不是在描述自己的身體狀況,這個時候用模板顯然是不行的,可能需要繼承乙個演算法分類器。顯然上面的配置是支援這種整合的。

如果匹配上了則跳轉到對應的step 11,如果沒有匹配則跳轉到step 10。根據型別(chain_type),這是乙個條件節點,所以他不會對使用者做任何輸出,而是默默的根據條件往其他節點條。

msg 表示應答的語句,如果你想動態調整這個輸出,可以配置format_class。format_class主要實現複雜動態的應答邏輯。另外還有乙個類似配置是query_class,會攔截進來使用者的問題,並且改寫使用者的問題。

step 表示當前處於會話的那個節點,這個節點處理完後的下乙個節點會是target_step。 通過適當形態,可以實現會話之間的跳轉。我舉的例子只是展示了內部跳轉。

有了這套配置引擎後,比如做乙個客服機械人,就變得很簡單了,把使用者的常見問題羅列下,之後執行特定的動作。當然,很多傳統的客服機械人為了簡單期間,主要是通過依託於qa演算法做匹配,並不會採用這種我說的方案。

我們根據這套配置引擎,可以實現乙個很複雜的對話。而且可以配置很多有趣的功能,比如 功能導航對話,比如吃飯請按1,睡覺輕按2 這種。只要配置乙個新對話即可,然後這個對話作為作為起始對話,通過會話間跳轉來完成導航功能。

因為千人千面,所以在實際的引擎實現過程中,我們需要記錄每個使用者當前所處的會話以及所在的節點,還包括會話期間的一些資訊蒐集,這也是乙個較為複雜的話題了。我們底層採用redis做這個儲存。

一般而言,我們無法使用「某個」演算法就實現乙個複雜的系統,當然,「某個」演算法可能很重要,甚至是系統能否成功的關鍵。乙個複雜的系統通常都是根據每個環節的需求不同,綜合利用了方方面面的演算法,而每個演算法使用的資料又是其他演算法處理而來的。chatbot framework 本身能夠通過配置,復用一些已有的元件完成一些基礎的對話功能,但是如果要實現更複雜的對話,則需要更多演算法和元件的支援。

SpringBoot Angular開發實戰一

歪棗網採用前後臺分離設計模式,前端web採用開源的angular框架,後端採用springboot框架 redis快取。資料介面主要用到了 資料 歷史資料等介面。web整體設計介面如下,對技術有興趣的可以一起 交流。左側為選單樹,主要分為兩大類。右側主要為api介面資訊,介面資訊包括請求入參 返回引...

Android遊戲開發之旅(十四) 遊戲開發實戰一

從今天開始android123將開始帶領大家進入android遊戲開發實戰篇,本次我們首個遊戲為2d的基於su ceview的類似橫版卷軸遊戲。第一天我們說下需要做哪些準備 一 遊戲地圖編輯器,在j2me時代我們可能都是用gif分割多幀或bmp上放置多個通過減少檔案頭來壓縮體積,但是在android...

微信支付開發實記

詳細文件可以看這裡 整個流程,服務端需要做的有三件事。前端支付按鈕被觸發後,服務端要去呼叫 統一下單 介面,把預付單資訊 支付引數和引數簽名返回給前端。前端根據這些引數喚起支付。提供乙個查詢介面,讓前端再次確認是否支付成功。介面 引數巨多,具體還是看文件 我們不能直接把呼叫統一下單介面返回的簽名返回...