作者:李云軍
圈動(dòng)無(wú)界創(chuàng)始人CEO。資深互聯(lián)網(wǎng)從業(yè)者,歷任方正、金山安全產(chǎn)品總監(jiān)、高級(jí)技術(shù)總監(jiān)。擁有2個(gè)智能排版算法專(zhuān)利。公司曾獲英諾天使千萬(wàn)級(jí)投資。公司主打團(tuán)隊(duì)協(xié)作產(chǎn)品Teamin,結(jié)合自然語(yǔ)言處理及人工智能,為新型社交協(xié)作人群提供更智能的助理服務(wù)。
淺談人機(jī)對(duì)話(huà)
寫(xiě)在前面?
寫(xiě)這篇blog,目的是希望幫助初步接觸人機(jī)對(duì)話(huà)的同學(xué)可以對(duì)這一塊的工作有個(gè)相對(duì)完整的了解 并針對(duì)人機(jī)對(duì)話(huà)可以做和比較難做的地方做了一些討論,以便大家可以在做這方面產(chǎn)品的時(shí)候知道如何劃分人機(jī)對(duì)話(huà)的能力邊界。
引子
在開(kāi)始之前,想請(qǐng)大家先思考個(gè)問(wèn)題:
在和人溝通的時(shí)候,大家經(jīng)常會(huì)擔(dān)心并會(huì)說(shuō)的一句話(huà)是什么?
嗯,不要想太復(fù)雜,其實(shí)是這兩句:
說(shuō)話(huà)的人:聽(tīng)明白我的意思了么?
聽(tīng)的人:你說(shuō)的是什么意思?
這也很好理解,溝通的目的就是為了傳遞思想,如果哇啦哇啦說(shuō)半天,對(duì)方還沒(méi)有明白,那是多沮喪的一件事情。
現(xiàn)在我們來(lái)?yè)Q個(gè)角度看這個(gè)事情,如果把人看成一臺(tái)機(jī)器,那么機(jī)器和機(jī)器之間用什么東西來(lái)溝通呢? 技術(shù)男們馬上會(huì)說(shuō),肯定是走協(xié)議啊,就好像tcpip那樣,要傳遞什么數(shù)據(jù),都基于協(xié)議來(lái)就好啦。 嗯,很有道理的樣子,那么,是不是可以這么認(rèn)為,語(yǔ)言其實(shí)也是一種協(xié)議,是人們?yōu)榱丝梢詭椭鷤鬟f自己內(nèi)心的想法而定義的一些規(guī)則, 大家都按照這個(gè)規(guī)則來(lái)做,那么互相之間表達(dá)一些思想就沒(méi)問(wèn)題啦。
嗯嗯,中文是一種協(xié)議,英文是另外一種協(xié)議,想想世界上這么多國(guó)家,好像人類(lèi)之間用的協(xié)議也蠻多的哦。 站在這個(gè)角度,人機(jī)對(duì)話(huà)的核心就應(yīng)該是讓機(jī)器理解這些協(xié)議啦。
實(shí)現(xiàn)對(duì)話(huà)的基本方法
繼續(xù)往下之前,我們先來(lái)看看兩個(gè)例子:
我要去公園
今天北京的天氣怎么樣
當(dāng)我們聽(tīng)到這兩句話(huà)的時(shí)候,腦袋里就會(huì)浮現(xiàn)出這些信息: 我要去公園,嗯嗯,應(yīng)該是想出去玩了,而且是室外,有花有草的地方。 今天北京的天氣怎么樣,想知道今天北京的天氣,冷還是熱,晴天還是下雨。
其實(shí)這個(gè)過(guò)程,就是大腦在下意識(shí)處理話(huà)語(yǔ)的意圖的過(guò)程,每當(dāng)一個(gè)人說(shuō)一句話(huà)出來(lái),我們聽(tīng)到了以后第一反應(yīng)就是,他想表達(dá)什么。 然后在表達(dá)的這些信息中,最關(guān)鍵的信息是什么。
如果要特別標(biāo)明出來(lái),大概是這樣的:
我要去公園
今天北京的天氣怎么樣
加粗的字體部分就是關(guān)鍵信息,可以幫助我們更準(zhǔn)確理解說(shuō)話(huà)的人想表達(dá)的意思。
其實(shí),機(jī)器實(shí)現(xiàn)對(duì)話(huà)的過(guò)程也是基本類(lèi)似這樣的:
首先,判斷你想表達(dá)的意圖是什么
其次,找到其中的關(guān)鍵信息
根據(jù)意圖和關(guān)鍵信息,生成帶條件的命令去執(zhí)行
我們用個(gè)完整的具體再分析一下看看:?請(qǐng)?zhí)嵝盐颐魈焐衔?0點(diǎn)去開(kāi)會(huì)?這句話(huà)的分析結(jié)果如下:
核心目的:幫我設(shè)置一個(gè)提醒
關(guān)鍵信息:明天上午10點(diǎn) 去開(kāi)會(huì)
翻譯成代碼邏輯: 創(chuàng)建一條去開(kāi)會(huì)的任務(wù),任務(wù)的截止時(shí)間明天上午10點(diǎn),并且會(huì)在那個(gè)時(shí)候提醒我
是不是很簡(jiǎn)單,:)
那么,怎么能夠讓機(jī)器理解一個(gè)人說(shuō)話(huà)的意圖,并且把關(guān)鍵的信息識(shí)別出來(lái)呢? 聽(tīng)起來(lái)好想好難的樣子,完全無(wú)從下手啊,用神經(jīng)網(wǎng)絡(luò)去訓(xùn)練么?對(duì)于我這樣的算法渣,這完全是Mission Impossible。。。
很happy的是,今時(shí)已不同于往日,大廠們都在爭(zhēng)先恐后地“做慈善”(“圈地”),這些都不要我們自己來(lái)做啦,現(xiàn)成的平臺(tái),免費(fèi)的接口,讓人睡覺(jué)都能笑醒啊。 好吧,我知道你們也很著急,那就趕緊來(lái)看看這些大廠的平臺(tái)到底做的怎么樣吧。 電影「Her」中的場(chǎng)景再現(xiàn),是不是不遠(yuǎn)了,嘿嘿。。。
常見(jiàn)平臺(tái)的實(shí)現(xiàn)方法
由于篇幅的原因,咱們主要對(duì)比百度的Unit和微軟的Luis兩個(gè)平臺(tái), 例句同樣是這個(gè):請(qǐng)?zhí)嵝盐颐魈焐衔?0點(diǎn)去開(kāi)會(huì)
先來(lái)看看百度的:
百度Unit?按照百度官方的推薦方法,要識(shí)別這句話(huà)的意圖,并且挑出關(guān)鍵信息, 最基本的,需要做這幾點(diǎn)事情:
1.先定義意圖
2.定義一系列的詞槽
3.將詞槽和意圖進(jìn)行關(guān)聯(lián)
4.在意圖下面,定義一套或者多套模版,模版由前面關(guān)聯(lián)好的詞槽組成
5.訓(xùn)練
6.測(cè)試結(jié)果
嗯嗯,好專(zhuān)業(yè)的樣子,那我們就開(kāi)始把!
首先,創(chuàng)建一個(gè)意圖
CREATE_TASK
接下來(lái),定義幾個(gè)詞槽,后面關(guān)鍵信息的挑取,就靠這些詞槽了,所以要好好思考一下怎么定義
[Op.Remind] :提醒、通知
[UserName] :通用人名、代詞的詞槽
[DateTime] :通用時(shí)間詞槽
然后,為意圖添加一個(gè)模版 |意圖|模版內(nèi)容|模版片段順序|必須匹配| |:-:|:-:|:-:|:-:| |CREATE_TASK|[Op.Remind]|1|是| ||[UserName]|2|否| ||[DateTime]|2|是|
在這套模版里面,[Op.Remind]和[DateTime]是必須要有的, 也就是說(shuō)當(dāng)一句話(huà)中這兩個(gè)詞槽都能匹配到的時(shí)候,就會(huì)認(rèn)為這句話(huà)想表達(dá)一個(gè)CREATE_TASK的意圖了,是不是挺簡(jiǎn)單?
使用Unit的這套方法,優(yōu)點(diǎn)明顯,缺點(diǎn)同樣不少:
優(yōu)點(diǎn)
1.在對(duì)話(huà)樣本數(shù)極少的時(shí)候,規(guī)則可以快速達(dá)到還不錯(cuò)的效果
2.基于規(guī)則,可以比較明確知道匹配的邊界
3.詞槽的不同值加上模版,有一定的靈活度,較好理解
缺點(diǎn)
1.模版沒(méi)有覆蓋到的,基本就不行
2.對(duì)模版、詞槽的配置能力有一定的要求
3.話(huà)術(shù)的學(xué)習(xí)泛化能力有點(diǎn)慘
接下來(lái)看看微軟的,這個(gè)昔日的王者,在語(yǔ)義理解上能做到一個(gè)什么樣的高度:
微軟Luis?微軟的做法相對(duì)比較簡(jiǎn)單,他不推薦使用模版來(lái)做,而是直接將對(duì)話(huà)的話(huà)術(shù)給他,他自己訓(xùn)練,就可以了。 基本的步驟是這樣的:
1.定義意圖(intent)
2.定義實(shí)體(entities)
3.準(zhǔn)備一些針對(duì)意圖的話(huà)術(shù)
4.訓(xùn)練
5.測(cè)試結(jié)果
嗯,馬上開(kāi)始: 第一步,話(huà)術(shù)的收集整理(可以認(rèn)為是機(jī)器學(xué)習(xí)的訓(xùn)練集數(shù)據(jù))
1、5分鐘以后提醒我去3樓開(kāi)會(huì)
2、添加一條下午3點(diǎn)的任務(wù),預(yù)定會(huì)議室,并準(zhǔn)備好紙筆
3、和小明說(shuō)一下下周三下午開(kāi)全體大會(huì)
……
接下來(lái),定義實(shí)體 - 用來(lái)提取關(guān)鍵信息
[DateTime] :系統(tǒng)默認(rèn)實(shí)體
[UserName] :系統(tǒng)默認(rèn)實(shí)體[Op.Remind] :提醒、通知
[Op.Add] :添加、增加、創(chuàng)建、……
[Name.Task] :任務(wù)、提醒、事項(xiàng)、安排、……
然后訓(xùn)練,測(cè)試,結(jié)果應(yīng)該類(lèi)似下面這樣:
請(qǐng)?zhí)嵝盐颐魈焐衔?0點(diǎn)去開(kāi)會(huì)
intent:CREATE_TASK
entites:
? ? [Op.Remind] :提醒
? ? [Datetime] :明天上午10點(diǎn)
? ? ?[UserName] :我
是不是感覺(jué)luis簡(jiǎn)單了很多?反正我在用的過(guò)程中感覺(jué)輕松愜意,:) 當(dāng)然,優(yōu)點(diǎn)很多,也有一些需要注意的問(wèn)題點(diǎn):
優(yōu)點(diǎn)
1.幾句簡(jiǎn)單典型的話(huà)術(shù),即可實(shí)現(xiàn)一定程度的泛化能力
2.對(duì)配置的要求低
3.訓(xùn)練是一個(gè)愉悅的過(guò)程
缺點(diǎn)
1.訓(xùn)練集的數(shù)據(jù)質(zhì)量很重要,訓(xùn)練結(jié)果會(huì)有一定的不確定性
2.為了保證每次調(diào)整后的效果,測(cè)試集的整體測(cè)試很重要
3.實(shí)體基于正則的方式匹配出來(lái),誤差略大
使用這些平臺(tái),是可以解決所有的對(duì)話(huà)問(wèn)題么? 理想是豐滿(mǎn)的,現(xiàn)實(shí)是骨感的,遺憾的是,現(xiàn)在所有的對(duì)話(huà)平臺(tái),都還不算處理的太好。
我找?guī)讉€(gè)典型的句式給大家看看:
幾個(gè)典型問(wèn)題
模版式匹配的局限 查詢(xún)小明創(chuàng)建的任務(wù) 如果用模版式匹配,就會(huì)發(fā)現(xiàn):查詢(xún)?nèi)蝿?wù)、創(chuàng)建任務(wù),都可以被匹配到,那么這句話(huà)到底是想查詢(xún)?nèi)蝿?wù)還是創(chuàng)建任務(wù)呢? 當(dāng)然,我們?nèi)艘谎劬湍芸闯鰜?lái),機(jī)器嘛,咳咳。。。
分詞的錯(cuò)誤 上周小明的文檔在哪里 嗯,很無(wú)語(yǔ)是不是,他會(huì)認(rèn)為周小明是個(gè)人名,但其實(shí)我想表達(dá)的是,上周?小明?的文檔在哪里?。。。
正則方式拿到實(shí)體的誤差 有沒(méi)有關(guān)鍵時(shí)刻這個(gè)文檔 好吧,偷偷滴告訴你,不管是詞槽,還是實(shí)體,挑關(guān)進(jìn)信息的方式都是正則,是不是讓你很沮喪 所以他告訴我,這里面有個(gè)詞叫有關(guān),會(huì)不會(huì)有點(diǎn)崩潰 我在這里定義有關(guān)這個(gè)詞槽的目的是為了能夠提取前面的關(guān)鍵詞的,比如:?會(huì)員有關(guān)的文檔,會(huì)員兩個(gè)字就是我想要找的關(guān)鍵詞,如果有關(guān)這個(gè)詞槽匹配錯(cuò)了,我的結(jié)果自然也就錯(cuò)了
關(guān)鍵信息多且說(shuō)法多樣 找下小明執(zhí)行小張關(guān)注的任務(wù) 找下小明執(zhí)行關(guān)注人是小張的任務(wù) 這兩句話(huà),都是為了得到關(guān)鍵信息:小明-執(zhí)行者,小張-關(guān)注者 但怎么拿到呢?詞槽或者實(shí)體只能單純把這些信息挑出來(lái),但小明還是小張是執(zhí)行者,怎么判斷?根據(jù)文字的位置遠(yuǎn)近?顯然不行對(duì)吧
來(lái),給大家個(gè)題目,思考一下,這兩句話(huà)如何處理:
1、產(chǎn)品運(yùn)營(yíng)項(xiàng)目下小明執(zhí)行的會(huì)員系統(tǒng)相關(guān)的任務(wù),幫我找下
2、和小張說(shuō)一下,明天下午3點(diǎn)提醒大家去3層會(huì)議室開(kāi)會(huì),提前5分鐘提醒他
嗯,這里說(shuō)到的還是一些簡(jiǎn)單的,做不太好的問(wèn)題,其實(shí),人機(jī)對(duì)話(huà)現(xiàn)在能做到的,還真的很少。 要真正做到像電影「Her」那樣的流暢對(duì)話(huà),路漫漫其修遠(yuǎn)兮。。。
人機(jī)對(duì)話(huà)的空間和局限
咱們看看這個(gè)問(wèn)話(huà)?如果有人這么說(shuō)
今天天氣冷嗎?
如果是人的話(huà),從里面可以看出好多的意圖來(lái)
是否可以出門(mén)?
需要多穿衣服嗎?
是不是不能爬山?
這些意圖可能是并行存在的,對(duì)于機(jī)器,怎么做呢?
再來(lái)看看這句?如果聽(tīng)到一句這樣的話(huà):
這個(gè)網(wǎng)站很重要,記得保存一下啊
可能直男會(huì)這么做
把這個(gè)網(wǎng)站趕緊放入收藏夾
然后?就木有然后了。。。 但其實(shí),稍微有點(diǎn)情商的人,一定會(huì)仔細(xì)分析里面的含義
這是一個(gè)賣(mài)花的網(wǎng)站
最近是不是她生日了
她心情不好,求安慰?
表面上是讓你去收藏一個(gè)網(wǎng)站,但其實(shí)可能會(huì)有另外的意圖, 這個(gè),機(jī)器又該怎么處理呢?
隨便列舉一些人之間的對(duì)話(huà)特點(diǎn):
1.用戶(hù)話(huà)術(shù)充滿(mǎn)多樣性和隨意性
2.正常交流中有大量多意圖對(duì)話(huà)
3.隱性對(duì)話(huà)信息機(jī)器無(wú)法獲得
4.機(jī)器的自主個(gè)性化回復(fù)還不太好
你會(huì)發(fā)現(xiàn),要處理好太復(fù)雜了,因?yàn)槿擞兴枷?,?huì)聯(lián)想,會(huì)推理 intent + entity,還不能很好解決這些問(wèn)題。
寫(xiě)在最后
人機(jī)對(duì)話(huà)注定是個(gè)細(xì)活兒?好吧,其實(shí)也沒(méi)有那么悲觀,我們把人機(jī)對(duì)話(huà)要解決的領(lǐng)域收窄一點(diǎn), 比如只解決開(kāi)關(guān)燈的問(wèn)題,只回復(fù)天氣,這樣看起來(lái)是不是簡(jiǎn)單很多?而且會(huì)發(fā)現(xiàn)很容易實(shí)現(xiàn)。 但由于用戶(hù)的多樣性對(duì)話(huà)話(huà)術(shù),不同的語(yǔ)言習(xí)慣的表達(dá),即使是這么窄的領(lǐng)域,要真正做的很好,也需要做大量的對(duì)話(huà)細(xì)節(jié)處理工作。 只有這樣才可能讓機(jī)器看起來(lái)更像人。
現(xiàn)在機(jī)器學(xué)習(xí)的技術(shù)發(fā)展也的確是突飛猛進(jìn),可能不久的將來(lái),「Her」的場(chǎng)景就能真實(shí)再現(xiàn)了吧,:)