微軟小冰對話機器人架構
本文基於小冰的這篇文章:“
The Design and Implementation of XiaoIce, an Empathetic Social Chatbot, Li Zhou et al., Microsoft, 2018.12
”。
小冰的這篇文章是18年12月份放出來的,沒有引起很大反響,可能是因為裡面沒有過多演算法細節吧。但這篇文章我倒是非常看重,它把對話機器人的構建思路和小冰的整體結構都講的非常清楚。基本按照這個流程就可以自己從0開始構建一個“工業級”對話機器人。
雖然已經有一些部落格介紹了這篇文章的內容,不過基本都是按照原文結構在翻譯。本文希望結合我之前對對話機器人的瞭解,重構文章的內容,以期更好理解。
小冰的設計理念是讓機器人具備
IQ + EQ + Personality
的能力。
IQ
就是智商,指能做很多事,有很多技能。
EQ
是情商,主要指對話答覆要考慮到對方的情緒和興趣,也即常說的“會聊天”。使用者難過就要安慰鼓勵他,高興就要陪著高興。
Personality
是指小冰的答覆要符合小冰的人設。小冰的人設是可靠、有同情心、有愛心、有幽默感的18歲少女。所以她說的話不能偏離這個人設。
小冰的最佳化目標是使用者長時間段內的session對話輪次:
Conversation-turns Per Session (CPS)
。 最佳化過程會使用增強學習EE策略,探索已知好的策略的同時,也會去嘗試未知效果的策略。
資料統計
2014年5月
釋出
使用情況
至2018年5月:使用歷史包含了
300億
個qr對
至2018年7月:
6。6億
使用者
小冰已釋出了
230
個技能
覆蓋大概
80
個IoT裝置,涉及約
300
個場景
最長聊天記錄
整體框架
小冰的能力包含兩大塊:
核心閒聊(Core Chat)
和各類
技能(Skills)
。核心閒聊就是一般的閒聊(開域聊天)。而技能是小冰在某些方面的能力,如天氣諮詢、講笑話、看圖作詩等等。整個系統結構如下圖:
上面的圖看不出系統整體流程,所以我又重畫了一個:
其中DM是對話管理模組,而IQ則是小冰的各種技能庫。DM決定當前query交給IQ中的哪個技能處理,對應的技能產生答覆返回給使用者。
這個結構和愛因的
DeepBot
架構(見下圖)是類似的。都有一個總控(DM vs RouteBot)決定把當前對話分配給哪個(些)技能,技能也都採用了可插拔的設計。
DeepBot架構稍微複雜靈活一些。DeepBot中每次query可以並行由多個技能響應,也可以序列迴圈被多個技能響應。技能能夠更新全域性的對話狀態,保證對話狀態在不同技能之間共用流動。DeepBot流程前面的
問題分析
模組也會對使用者query做更細緻的分析。
但小冰的閒聊技能比愛因的閒聊技能(Chitchat-Bot)強大很多。這也是由於小冰和愛因要解決的對話問題截然不同所導致的。
對話管理(Dialogue Manager)
當收到使用者的對話資訊後,系統會經過一個對話管理的模組,對話管理模組有兩個功能:
狀態追蹤模組(Global State Tracker)
更新系統狀態
s
,
對話策略模組(Dialogue Policy)
依據更新後的對話狀態來決定接下來的策略
π(s)
,也即決定這個資訊是交由核心閒聊還是某個技能來回答。啟用某個功能後,這個功能也會有自己的對話策略或者流程,來最終決定返回什麼資訊作為回覆。
這是典型的對話管理模組的結構,常在任務型對話機器人中被使用和強調。
對話狀態追蹤
對話狀態
s
由四部分組成:
,其中
表示對話背景,
是利用
對使用者當前使用者query
進行改寫後的版本。而
儲存了使用者相關的各種資訊,如當前情緒、對話題的觀點(興趣讀)、長期的興趣愛好、個人資料等。
和
有類似的結構,只是儲存的是小冰的資訊。
作者把計算
的過程,稱為
同理心計算(Empathetic Computing)
。同理心計算包含三個步驟:
帶背景query理解
、
使用者理解
和
系統理解
,分別對應
、
、
的產生過程。
帶背景query理解(Contextual Query Understanding (CQU))
CQU
利用背景資訊
對使用者當前訊息
進行改寫,得到
。改寫的步驟包括:
實體連結
:識別出
中的實體,並與之前的狀態中儲存的實體進行連結(就是對上號)。
指代消解
:把
中所有代詞替換為它們指代的實體。
句子補全
:如果
不是一個完整的句子,就使用
對它進行補全。
下圖是論文中給出的一個示例:
使用者理解(User Understanding (UU))
UU
基於
和
產生
。
是有一系列kv對組成的,其中包括:
話題
記錄了使用者當前對話的話題。
意圖
儲存的是使用者當前對話的動作,如
greet
,
request
,
inform
等。就是任務型對話NLU中的動作(act)。
情感
記錄了使用者當前的情緒,如
高興
,
傷心
,
生氣
,
中立
等。
觀點
儲存了使用者對當前話題的觀點,如
正向
,
負向
,
中立
。
如果使用者可辨認,可以獲取到他的
個人資料
,如年齡,性別,興趣,職業等。
下圖是論文中給出的一個示例(對應CQU中的示例):
系統理解(System Understanding (SU))
SU
就是為了產生
向量。(原文中不叫這個名字,而是
Interpersonal Response Generation
。)
UU完成後,SU就比較簡單。有些和UU相同的資訊直接從UU拷過來即可,如話題。有些基於小冰的人設,就可以知道,如情感和觀點永遠是正向的,個人資料也都是設定好固定不變的。
下圖是論文中給出的示例(對應CQU和UU中的示例):
對話策略
對話策略模組(Dialogue Policy)
依據更新後的對話狀態來決定接下來的策略
π(s)
,也即決定這個資訊是交由哪個功能處理,是核心閒聊還是某個技能。啟用某個功能後,這個功能也會有自己的對話策略或者流程,來最終決定返回什麼資訊作為回覆。作者稱這個決策過程為
分層決策(Hierarchical Dialogue Policy)
。
最佳化過程會使用RL模型和EE策略,探索已知好的策略的同時,也會去嘗試未知效果的策略。
本文沒提具體細節,但作者之前的一些工作專門在說這個事。除了RL,當然也可以用其他更簡單的方法,如啟發式規則,單輪分類,或者多輪分類等。
核心閒聊(Core Chat)
核心閒聊(Core Chat)面向開域對話,它還會分為兩類:通用閒聊(General Chat)和領域閒聊(Domain Chat)。通用閒聊主要回答一般性的資訊,而領域閒聊主要是回答某些帶主題的閒聊,例如”你喜歡王菲的歌麼“、”全聚德的烤鴨味道怎麼樣“。
話題管理(Topic Manager)
核心閒聊中有一個重要的模組,叫
話題管理模組(Topic Manager)
。話題管理模組包含一個分類模型,來決定小冰是繼續當前話題聊下去,還是開啟一個新話題。
什麼時候該開啟新話題?比如小冰發現她沒法產生一個有意思的回覆資訊,或者使用者對當前對話感覺無聊了:
核心閒聊使用了設定好的處理異常情況的編輯回覆。
產生的回覆資訊只是簡單重複使用者的輸入,或者沒包含什麼新資訊量。
使用者開始給出灌水性的回覆,如“嗯”,“哦”,“呵呵”,“知道了”等。
如果要開啟一個新話題,系統會從話題庫中找出一個新話題。話題庫是利用一些高質量的論壇(如Instagram和豆瓣)爬取的資料構建起來的。
選擇新話題的流程是典型的
檢索 + 排序
過程。檢索使用當前的對話狀態
s
,排序使用了boosted tree模型,主要基於以下型別特徵:
與背景資訊的相關性:新話題要與對話背景相關,且還沒被使用過。
新鮮度:新話題要夠新鮮,在當前時間點討論要比較合適。
使用者感興趣:使用者要對新話題感興趣。
流行度:網上或者小冰使用者中熱議的話題。
接受度:從歷史資料上可以知道小冰使用者對此話題的接受度。
利用話題管理模組,對話就可以在通用閒聊和領域閒聊之間切換。通用閒聊和領域閒聊使用了相同的框架,只是資料不同。所以論文中以通用閒聊為例做了具體介紹。
通用閒聊(General Chat)
通用閒聊的整體流程也是
檢索 + 排序
,流程圖如下:
檢索主要是產生response候選集,這些候選集再由排序模組進行排序。小冰有三種候選集產生方式,下面分別介紹。
檢索
1. Paired-Data based Retriever (PDR)
系統收集了很多 query-response 對,此檢索器就是從這些qr對中檢索出最相關的一些候選。這些qr對來自兩個方面:1) 從網上各種平臺(社交網路、論壇、公告欄、新聞評論等)爬取的資料;2) 從小冰的使用日誌中挖掘。時至今日,小冰
70%
的回覆是從她的聊天曆史中獲得的。
獲得的qr對首先用同理心計算模組轉化成
的形式。然後基於小冰的人設和其他規則過濾掉不合適結果。剩下的qr對就作為知識存入Lucene供線上使用。
線上使用時,
作為檢索輸入,然後利用
關鍵詞搜尋
和
語義搜尋
從候選庫中檢索出
400
個最相關的qr對。
PDR產生的response效果很好,但覆蓋面比較小。
2. Neural Response Generator (NRG)
NRG使用了標準的GRU-RNN seq2seq框架,訓練資料就是上面收集到的qr對。輸入上除了使用
外,還會使用到
和
。先使用以下方式把
和
合併為
:
然後把
注入到解碼器的每個時間點。模型結構如下圖。
NRG使用 beam search 產生
20
個候選response。
NRG產生的response覆蓋面廣,但效果較差,生成的response一般會比較短。
3. Unpaired-Data based Retriever (UDR)
除了PDR中從網上爬取的qr對資訊,網上有更龐大的unpaired資料。作者從網上的公開演講和新聞報道的引用(雙引號擴起來的那種)中搜集unpaired句子。所以這些句子是誰說的我們是知道的,這樣就可以計算
。
然後基於小冰的人設和其他規則過濾掉不合適結果。剩下的資料存入Lucene供線上使用。
和PDR不同的是,UDR中只有候選response資料,而沒有對應的候選query資料。所以線上使用光靠使用者query
是無法確定哪些候選response更合適的。q跟r之間需要一個橋樑。作者的解決方案是引入知識圖譜(KG)來搭起這座橋。
微軟自己有個很大的KG叫Satori,用於對話只需要其中的一部分就好。作者使用PDR中搜集的qr對資料集來進行篩選。如果Satori中的一個三元組
head-relation-tail
中的
和
分別在qr對中 q(
)和 r(
)
出現
的次數超過指定的閾值,才保留這個三元組。所謂
在 q 中
出現
,是指 q 中包含了
這個話題。 例如下圖是保留KG的一個片段。
線上使用時,小冰會利用前面構建的KG對使用者的query
進行話題擴充套件,具體步驟如下(以query “Tell me about Beijing”為例):
識別出
中包含的所有話題。本句query中只有“Beijing”一個話題。
對於每個話題,從KG中檢索出
20
個最相關的話題。如 “Badaling Great Wall” 和 “Beijing snacks”。最相關是利用 boosted tree 模型排序得到的,模型的訓練資料是人為標註的。
query中的所有topic和上一步檢索出的相關topic一起作為檢索輸入,從收集的unpaired資料集中檢索出
400
個最相關的句子作為候選response。例如:“Beijing‘s Badaling Great Wall is best known in the Ming Great Wall, and it can be overlooked from Guanritai。” 和 “When you come to Beijing, you must try authentic Beijing snacks。 There are always a few that you like。”。
UDR的候選質量沒有PDR好,但加入UDR後話題覆蓋面要廣很多。UDR的結果也比NRG生成的結果包含更多文字。
排序
PDR、NRG和UDR生成的所有候選response,利用 boosted tree 模型統一進行排序。最終的response是從那些排序分值高於設定閾值的responses中隨機選出來的。這樣可以保證小冰的結果不會一成不變,更有“人性”。
給定狀態
,模型基於以下幾類特徵為每個
計算一個排序分數:
區域性凝聚力(Local Cohesion)
特徵:
要與
語義一致。
與
之間的區域性凝聚力分數透過語義匹配模型DSSM計算得到。DSSM的訓練資料來自歷史對話qr對。
全域性凝聚力(Global Cohesion)
特徵:
要與
、
語義一致。
與
之間的全域性凝聚力分數透過另一個語義匹配模型DSSM計算得到。DSSM的訓練資料來自歷史對話session。
同理心匹配(Empathy Matching)
特徵:好的
應當符合小冰的人設。可以把
當作query,
作為背景,透過同理心計算模組中的 CQU 和 UU 計算得到
。
然後再把
和我們期望得到的
進行比較,獲得各種比較分數作為特徵。
檢索匹配(Retrieval Matching)
特徵:這類特徵僅用在 PDR 產生的候選response上。記與候選response
對應的q為
。可以利用各種方法計算
與
的匹配分數,如BM25、Tf-Idf、或者各種意義匹配方法如DSSM等。
排序模型的訓練資料是
對集合。為每個
標註一個
0~2
的分數值。
0
表示
不相關;
1
表示還行,可接受;
2
表示很合適。
編輯回覆(Editorial Response)
編輯回覆即所謂的異常時兜底回覆,或者預設回覆。當前面的機制沒法產生回覆時,編輯回覆就會作為最終回覆返回給使用者。小冰的編輯回覆期望能讓對話繼續下去,所以通常不會用“I don’t know”這種話術,而會更傾向於類似“Hmmm, difficult to say。 What do you think?”這種。
對話技能(Skills)
技能又分為這幾類:
圖片評論(Image Commenting)
,
內容建立(Content Creation)
,
互動(Deep Engagement)
和
任務完成(Task Completion)
。 到目前為止,小冰已釋出了
230
個技能,基本一週釋出一個新技能的節奏。
多個技能如果同時被觸發,則會有個排序過程,最終把query分給分數最高的技能。排序會用到設定好的技能優先順序,技能confidence和session context。
圖片評論(Image Commenting)
圖片評論指的是使用者發了一張圖,然後小冰看圖回話。整體架構類似通用閒聊,先用檢索和生成的方式產生候選response,然後再對候選結果做排序。
圖片評論和一般的圖片描述略有不同,它需要讓結果文字更適合對話場景。從論文中給出的下圖可以看成差異。所以它不僅會使用圖片中識別出的物件,還會使用圖片中展示出的事件、動作、情緒(如競技、贏)。
Retrieved-based Retriever (RR)
RR 首先從社交網站上收集(圖片,評論)對。然後線上一張新圖片來了以後,首先把它向量化(CNN等各種模型都行),然後從庫中檢索出
3
張與之最相似的候選圖片,它們對應評論就是候選評論了。
Generator-based Retriever (GR)
GR 基本就是image-to-text的結構,只是會融入對生成結果的情感和形式要求。
Ranker
排序還是用的 boosted tree 模型。和通用閒聊裡排序一樣,給定狀態
,模型為每個
計算一個排序分數。這裡的
是圖片的向量表達。模型使用的特徵也類似。
內容建立(Content Creation)
小冰可以和使用者一起做一些創造性的事,比如看圖寫詩、FM頻道建立、電子書生成、兒童故事生成等。使用者設定好建立條件,由小冰完成建立。
下圖是論文中給出的看圖寫詩流程:
據說小冰已經出了兩本詩集。
互動(Deep Engagement)
互動技能主要指小冰和使用者一起做情緒或者智力方面的互動。按照一對一、多人互動,和EQ、IQ互動兩個方向,可以把各種互動技能放在四個象限,如下:
任務完成(Task Completion)
任務機器人應該用的還是 Frame-based 的經典框架。這塊就不再多說,值得提的是,小冰會依據使用者畫像給出個性化的答覆。例如一個美國人問中國面積多大時,答覆裡的面積單位是平方英里,而中國人問答覆裡的面積單位是平方公里。
在答覆裡小冰也會嘗試把對話做些延伸。比如調完燈的亮度後,再問一句亮度是否滿意;回答完天氣後推薦一些使用者感興趣的戶外去處。
總結
這篇文章詳細介紹了小冰對話機器人的構建思路和整體結構。按照對應流程完全可以從0開始構建一個“工業級”對話機器人。雖然整體框架和愛因的DeepBot相似,但因為解決的目標問題不同而各有取捨。
總結幾點我認為比較重要的資訊:
對話狀態使用了這樣的結構:
。使用
同理心計算模組
計算對話狀態。
使用
話題管理模組
決定什麼時候該切換到新話題,以及切換到哪個新話題。
從網際網路公開演講和新聞報道的引用中搜集unpaird data,作為paired data的補充。
任務機器人依據使用者畫像給出個性化的答覆。
看References,有更詳細的資料。