發(fā)布于:2021-02-03 10:50:20
0
408
0
作為一名程序員,我想通過創(chuàng)建自己的聊天機器人來學習如何開發(fā)聊天機器人。我重點介紹了開發(fā)bot的以下組件:自然語言理解(NLU)組件、對話框管理器(DM)、自然語言生成(NLG)組件以及模塊化或端到端方法。
要構建一個成功的聊天機器人,請考慮用戶的觀點。首先,用戶向bot寫入一些內(nèi)容。bot處理消息并生成響應。然后,將響應發(fā)送回用戶。
這些步驟無限期地重復,直到對話者之一決定完成。讓我們對上面描述的會話過程進行更深入的挖掘,并對其進行更詳細的分析,以了解其實際的復雜性。
在本文中,我將向您展示制作聊天機器人所涉及的元素,以及每個步驟涉及的細節(jié)。聊天機器人在很多場合和商業(yè)中都有使用,知道如何實現(xiàn)一個聊天機器人對你的開發(fā)生涯非常重要。
構建聊天機器人所涉及的元素
當用戶寫東西時,bot需要處理它。由于機器人不懂人類的語言,我們需要一種方法將我們的自然語言和非結構化語言翻譯成任何可以被機器處理和理解的結構化數(shù)據(jù)。
這一步被稱為自然語言理解(NLU)。從用戶消息到結構化數(shù)據(jù)的轉換稱為“語義框架”。
一旦處理了用戶消息并生成了語義框架,bot就可以分析這些結構化數(shù)據(jù),以尋找下一步要采取的最佳操作,包括生成響應。
在此步驟中,bot可能需要記住會話中的數(shù)據(jù),因此它不會一次又一次地問相同的問題。這個過程由一個名為對話框管理器(dialogmanager,DM)的組件執(zhí)行,它跟蹤會話狀態(tài)并選擇與特定策略有關的操作。
最后,bot選擇的動作包括對用戶的響應或要生成的該響應的數(shù)據(jù)。這些數(shù)據(jù)被傳遞到一個組件,該組件處理并將其轉換為顯示給用戶的人類語言響應。這個過程被稱為自然語言生成(NLG)。
這些是構建bot過程中涉及的元素。讓我們逐一談論它們。
NLU組件
如前所述,NLU組件從用自然語言編寫的消息中生成語義框架。這個框架通常由一個意圖(用發(fā)送的消息表示用戶的意圖)和一組表示用戶在消息中給出的數(shù)據(jù)的實體組成。
例如,“我想訂一個從馬德里到哥本哈根的航班”可以翻譯成下圖中的結構:
為了完成這種翻譯,可以使用經(jīng)典的自然語言處理(NLP)方法或更高級的深度學習(DL)方法。
通常,當數(shù)據(jù)很少或沒有數(shù)據(jù)時使用經(jīng)典方法,因為DL方法需要大量數(shù)據(jù)才能很好地執(zhí)行。然而,在這種情況下,隨著預訓練模型的出現(xiàn),人們可以選擇DL方法并使用定制數(shù)據(jù)對模型進行微調(diào),即使可用數(shù)據(jù)很少。
對話框管理器
這一部分是最關鍵的,因為對話的成敗很大程度上取決于它的肩膀。當然,談話過程中隱含的所有內(nèi)容都非常重要。盡管如此,對話的連續(xù)性——流暢性——在很大程度上取決于這個組件在內(nèi)存(通過填滿的插槽)和動作選擇方面的表現(xiàn)。
這就是為什么這篇文章通常由兩個子部分組成:
對話框狀態(tài)跟蹤器(DST)
對話框策略(DP)
DST跟蹤會話歷史、時隙以及與會話上下文相關的所有信息。上面提到的插槽是內(nèi)存單元,其中填充了通過語義框架、數(shù)據(jù)庫調(diào)用、webhook響應等接收到的實體。
DP是負責根據(jù)語義框架、會話歷史或所選動作選擇下一個動作的子組件。
讓我們通過一個示例來了解此組件必須處理的復雜性:
(1)用戶:“我想從我的銀行賬戶中提取50元?!?/span>
(2)Bot:“哪種賬戶:活期還是信用?““
(3)用戶:“我的信用賬戶上有多少錢?““
(4)Bot:“您的銀行卡賬戶余額為100元?!?/span>
(5)用戶:“太好了!那我就從那一個拿走。”
(6)機器人:“好的,那么你想從你的信用賬戶中提取50元。是這樣嗎?““
(7)用戶:“是的,請?!?/span>
…。
在(1)NLU部分中,推斷的意圖可能是“提取現(xiàn)金”,實體“金額”中填有50元。bot已經(jīng)知道這個用戶,比如說因為它是一個登錄用戶,并且從DB獲取信息,得到兩個帳戶“current”和“credit”,這兩個帳戶填充了“availableu accounts”的位置
DP決定bot需要知道用戶想要從哪個帳戶取款,因此下一個操作是詢問(2)中的用戶應該從哪個可用帳戶取款。在(3)中,用戶改變了目標,現(xiàn)在想知道他們信用賬戶的余額。
DM必須足夠聰明,在目標改變后繼續(xù)對話,但要保留已經(jīng)通過插槽記住的信息。在(5)中,用戶返回到初始目標,引用過去的數(shù)據(jù)而不顯式地指定它。
bot必須將這些信息關聯(lián)起來,在(6)中,bot在執(zhí)行所需操作之前請求確認收集的數(shù)據(jù)。
正如你所看到的,這不是一項容易的任務;學術界和公司正在對這一過程進行大量研究。根據(jù)目標,可以選擇更直接的方法或更復雜的方法。
最簡單實用的方法和最不靈活的方法是將對話框建模為一個有限狀態(tài)機(FSM),其中每個狀態(tài)表示動作,邊表示意圖。插槽可以保存在鍵/值數(shù)據(jù)結構中。
更靈活的方法是將FSM與基于幀的系統(tǒng)相結合,如GUS在1977年描述的框架驅(qū)動對話系統(tǒng)。
一種更復雜但同時也更復雜的方法是將對話框建模為ML的一個分類問題,其中對話框的歷史、過去選擇的動作和槽是特征,動作是要預測的類。
NLG組件
NLP將人類語言轉化為非結構化數(shù)據(jù),NLU通過語法理解數(shù)據(jù),NLG則從結構化數(shù)據(jù)生成文本。
NLG可以比作一個分析員,他將數(shù)據(jù)翻譯成單詞、句子和段落。這個組件的主要好處是它創(chuàng)建了一個上下文化的敘述,輸入隱藏在數(shù)據(jù)中的含義并進行交流。
一旦機器人知道下一步要做什么,就應該向用戶生成一個響應,這樣他們就可以得到某種反饋。在用戶收到反饋后,他們可以決定是否有足夠的信息,是否可以完成交互,或者提出進一步的問題。
這里有兩個主要的解決方案:簡單的方法是在模板中預定義響應,在生成響應時用占位符替換它們。另一種解決方案是動態(tài)句子生成,它稍微復雜一點,使用深度學習在注入一些數(shù)據(jù)后自動生成響應。它可以用于創(chuàng)建復雜的模板系統(tǒng)。
預定義響應解決方案的示例如下所示。這種模板可以用于將數(shù)據(jù)直接翻譯成文本。
“我找到了從{從{城市}到{到{城市}的機票。”占位符是{從{城市}}和{到{城市},它們是取而代之的是談話中收集的實際數(shù)據(jù),給出這樣的回答:“我找到了從馬德里到哥本哈根的機票?!?/span>
誰知道呢,也許GPT-3會給你這個組件的答案!
模塊化方法或端到端方法
到目前為止,在本文中,我已經(jīng)介紹了構建chatbot的三個模塊或組件:NLU、DM和NLG。然而,有一種不同的方法正在積極研究中,這意味著只有一個組件接收用戶消息并生成響應。
用戶可以說:“我想飛往北京”=>生成響應的E2E黑盒=>星期一和星期二有航班。
這是一種端到端的方法,非常有趣,但目前它只存在于學術領域。然而,它看起來非常有前途!
這種方法的主要好處是,它允許您在每個模塊中控制NLP過程,對其進行培訓,并分別對其進行改進。另一個好處是單一責任原則,每個模塊只負責一件事,便于代碼維護。
為您的項目選擇正確的方法
到目前為止,我們已經(jīng)提出了開發(fā)對話系統(tǒng)的不同技術和方法。根據(jù)您的項目需要,如果所需的bot非常簡單,可以使用使用經(jīng)典NLP方法的簡單NLU和基于FSM的對話框管理器。
如果您正在研究ML提供的可能性,您可以選擇模塊化方法,每個模塊使用不同的ML技術,也可以使用端到端方法。另一種選擇是將它們結合起來——例如,實現(xiàn)一個基于ML的NLU模塊,以及一個基于幀的對話框管理器和一個基于模板的NLG。
有很多可能性,但我們的想象力是有限的。我鼓勵那些對構建bot感興趣的人深入研究本文中討論的不同選項,以發(fā)現(xiàn)哪個選項適合您的項目。