本文基於小冰的這篇文章:“

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

由四部分組成:

s = (Q_c, C, \mathbf{e}_Q, \mathbf{e}_R)

,其中

C

表示對話背景,

Q_c

是利用

C

對使用者當前使用者query

Q

進行改寫後的版本。而

\mathbf{e}_Q

儲存了使用者相關的各種資訊,如當前情緒、對話題的觀點(興趣讀)、長期的興趣愛好、個人資料等。

\mathbf{e}_R

\mathbf{e}_Q

有類似的結構,只是儲存的是小冰的資訊。

作者把計算

s = (Q_c, C, \mathbf{e}_Q, \mathbf{e}_R)

的過程,稱為

同理心計算(Empathetic Computing)

。同理心計算包含三個步驟:

帶背景query理解

使用者理解

系統理解

,分別對應

Q_c

\mathbf{e}_Q

\mathbf{e}_R

的產生過程。

帶背景query理解(Contextual Query Understanding (CQU))

CQU

利用背景資訊

C

對使用者當前訊息

Q

進行改寫,得到

Q_c

。改寫的步驟包括:

實體連結

:識別出

Q

中的實體,並與之前的狀態中儲存的實體進行連結(就是對上號)。

指代消解

:把

Q

中所有代詞替換為它們指代的實體。

句子補全

:如果

Q

不是一個完整的句子,就使用

C

對它進行補全。

下圖是論文中給出的一個示例:

微軟小冰對話機器人架構

使用者理解(User Understanding (UU))

UU

基於

Q_c

C

產生

\mathbf{e}_Q

\mathbf{e}_Q

是有一系列kv對組成的,其中包括:

話題

記錄了使用者當前對話的話題。

意圖

儲存的是使用者當前對話的動作,如

greet

request

inform

等。就是任務型對話NLU中的動作(act)。

情感

記錄了使用者當前的情緒,如

高興

傷心

生氣

中立

等。

觀點

儲存了使用者對當前話題的觀點,如

正向

負向

中立

如果使用者可辨認,可以獲取到他的

個人資料

,如年齡,性別,興趣,職業等。

下圖是論文中給出的一個示例(對應CQU中的示例):

微軟小冰對話機器人架構

系統理解(System Understanding (SU))

SU

就是為了產生

\mathbf{e}_R

向量。(原文中不叫這個名字,而是

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對首先用同理心計算模組轉化成

(Q_c, R, \mathbf{e}_Q, \mathbf{e}_R)

的形式。然後基於小冰的人設和其他規則過濾掉不合適結果。剩下的qr對就作為知識存入Lucene供線上使用。

線上使用時,

Q_c

作為檢索輸入,然後利用

關鍵詞搜尋

語義搜尋

從候選庫中檢索出

400

個最相關的qr對。

PDR產生的response效果很好,但覆蓋面比較小。

2. Neural Response Generator (NRG)

NRG使用了標準的GRU-RNN seq2seq框架,訓練資料就是上面收集到的qr對。輸入上除了使用

Q_c

外,還會使用到

\mathbf{e}_Q

\mathbf{e}_R

。先使用以下方式把

\mathbf{e}_Q

\mathbf{e}_R

合併為

\mathbf{v}

 \mathbf{v} = \sigma (\mathbf{W}^T_Q \mathbf{e}_Q + \mathbf{W}^T_R \mathbf{e}_R )

然後把

\mathbf{v}

注入到解碼器的每個時間點。模型結構如下圖。

微軟小冰對話機器人架構

NRG使用 beam search 產生

20

個候選response。

NRG產生的response覆蓋面廣,但效果較差,生成的response一般會比較短。

3. Unpaired-Data based Retriever (UDR)

除了PDR中從網上爬取的qr對資訊,網上有更龐大的unpaired資料。作者從網上的公開演講和新聞報道的引用(雙引號擴起來的那種)中搜集unpaired句子。所以這些句子是誰說的我們是知道的,這樣就可以計算

\mathbf{e}_R

然後基於小冰的人設和其他規則過濾掉不合適結果。剩下的資料存入Lucene供線上使用。

和PDR不同的是,UDR中只有候選response資料,而沒有對應的候選query資料。所以線上使用光靠使用者query

Q_c

是無法確定哪些候選response更合適的。q跟r之間需要一個橋樑。作者的解決方案是引入知識圖譜(KG)來搭起這座橋。

微軟自己有個很大的KG叫Satori,用於對話只需要其中的一部分就好。作者使用PDR中搜集的qr對資料集來進行篩選。如果Satori中的一個三元組

head-relation-tail

(h, r, t)

中的

h

t

分別在qr對中 q(

Q_c

)和 r(

R

出現

的次數超過指定的閾值,才保留這個三元組。所謂

h

在 q 中

出現

,是指 q 中包含了

h

這個話題。 例如下圖是保留KG的一個片段。

微軟小冰對話機器人架構

線上使用時,小冰會利用前面構建的KG對使用者的query

Q_c

進行話題擴充套件,具體步驟如下(以query “Tell me about Beijing”為例):

識別出

Q_c

中包含的所有話題。本句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中隨機選出來的。這樣可以保證小冰的結果不會一成不變,更有“人性”。

給定狀態

s = (Q_c, C, \mathbf{e}_Q, \mathbf{e}_R)

,模型基於以下幾類特徵為每個

R

計算一個排序分數:

區域性凝聚力(Local Cohesion)

特徵:

R

要與

Q_c

語義一致。

R

Q_c

之間的區域性凝聚力分數透過語義匹配模型DSSM計算得到。DSSM的訓練資料來自歷史對話qr對。

全域性凝聚力(Global Cohesion)

特徵:

R

要與

Q_c

C

語義一致。

R

(Q_c, C)

之間的全域性凝聚力分數透過另一個語義匹配模型DSSM計算得到。DSSM的訓練資料來自歷史對話session。

同理心匹配(Empathy Matching)

特徵:好的

R

應當符合小冰的人設。可以把

R

當作query,

(C, Q_c)

作為背景,透過同理心計算模組中的 CQU 和 UU 計算得到

\mathbf{e}_{R

然後再把

\mathbf{e}_{R

和我們期望得到的

\mathbf{e}_{R}

進行比較,獲得各種比較分數作為特徵。

檢索匹配(Retrieval Matching)

特徵:這類特徵僅用在 PDR 產生的候選response上。記與候選response

R

對應的q為

Q

。可以利用各種方法計算

Q_c

Q

的匹配分數,如BM25、Tf-Idf、或者各種意義匹配方法如DSSM等。

排序模型的訓練資料是

(s, R)

對集合。為每個

(s, R)

標註一個

0~2

的分數值。

0

表示

R

不相關;

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 模型。和通用閒聊裡排序一樣,給定狀態

s = (Q_c, C, \mathbf{e}_Q, \mathbf{e}_R)

,模型為每個

R

計算一個排序分數。這裡的

Q_c

是圖片的向量表達。模型使用的特徵也類似。

內容建立(Content Creation)

小冰可以和使用者一起做一些創造性的事,比如看圖寫詩、FM頻道建立、電子書生成、兒童故事生成等。使用者設定好建立條件,由小冰完成建立。

下圖是論文中給出的看圖寫詩流程:

微軟小冰對話機器人架構

據說小冰已經出了兩本詩集。

互動(Deep Engagement)

互動技能主要指小冰和使用者一起做情緒或者智力方面的互動。按照一對一、多人互動,和EQ、IQ互動兩個方向,可以把各種互動技能放在四個象限,如下:

微軟小冰對話機器人架構

任務完成(Task Completion)

任務機器人應該用的還是 Frame-based 的經典框架。這塊就不再多說,值得提的是,小冰會依據使用者畫像給出個性化的答覆。例如一個美國人問中國面積多大時,答覆裡的面積單位是平方英里,而中國人問答覆裡的面積單位是平方公里。

微軟小冰對話機器人架構

在答覆裡小冰也會嘗試把對話做些延伸。比如調完燈的亮度後,再問一句亮度是否滿意;回答完天氣後推薦一些使用者感興趣的戶外去處。

總結

這篇文章詳細介紹了小冰對話機器人的構建思路和整體結構。按照對應流程完全可以從0開始構建一個“工業級”對話機器人。雖然整體框架和愛因的DeepBot相似,但因為解決的目標問題不同而各有取捨。

總結幾點我認為比較重要的資訊:

對話狀態使用了這樣的結構:

s = (Q_c, C, \mathbf{e}_Q, \mathbf{e}_R)

。使用

同理心計算模組

計算對話狀態。

使用

話題管理模組

決定什麼時候該切換到新話題,以及切換到哪個新話題。

從網際網路公開演講和新聞報道的引用中搜集unpaird data,作為paired data的補充。

任務機器人依據使用者畫像給出個性化的答覆。

看References,有更詳細的資料。