嘉賓 | 邵浩
編輯 | suiling
來源 | AI科技大本營在線公開課
近年來,聊天機器人技術及產品得到了快速的發展。聊天機器人作為人工智慧技術的殺手級應用,發展得如火如荼,各種智能硬體層出不窮。
本次公開課中,AI科技大本營聯合電子工業出版社博文視點邀請到上海瓦歌智能科技有限公司總經理,狗尾草科技人工智慧研究院院長邵浩老師,他將在3月21日的公開課中為大家講解聊天機器人落地及進階實戰。
本課程將全面闡述聊天機器人的技術框架及工程實現細節,並對於聊天機器人的下一代範式:虛擬生命,進行了詳細的剖析,同時,聚焦知識圖譜在實現認知智能過程中的重要作用,給出了知識圖譜的落地實踐。
本課程適合工程一線的研發人員,可以通過本課程了解聊天機器人的實現細節。適合高校學生,可以通過本課程學習聊天機器人的技術框架及典型算法。
以下為公開課速記整理
邵浩:今天跟大家聊一聊聊天「機器人的落地及進階實戰」。我是來自深圳狗尾草智能科技有限公司的邵浩,現在負責公司人工智慧研究院的工作,主要是做聊天機器人相關產品。
今天想跟大家聊的內容包括這幾個方面,包括以下幾個部分:
第一部分,跟大家講一講聊天機器人總體產生的背景和技術架構;
第二部分,會跟大家聊一聊聊天機器人在工程實現的方方面面,這裡我會配合一些代碼,跟大家解釋一下它每個模塊、每個功能是怎麼實現的,希望大家聽完這部分之後,可以自己動手去搭一個聊天機器人;
第三部分,想跟大家聊一聊知識圖譜在虛擬生命中的應用及技術路徑,並會簡單介紹虛擬生命,也就是我們發現聊天機器人的種種問題之後,想著是不是有更好的辦法去解決聊天機器人所面臨的很多問題;
最後一部分,花5-10分鐘時間跟大家聊聊工程落地的其他問題。
簡單介紹就到這裡,我們言歸正傳。
聊天機器人概述
首先介紹一下背景。大家現在對人工智慧的感覺是什麼樣子?無論是AlphaGo,還是AlphaGo Zero,戰勝人類最頂尖的圍棋選手;還是Project Debater,一個參加人類辯論賽的機器人,在今年1月份創造了不俗的成績;還是波士頓動力這種行雲流水般的機器人和機器狗,它也是人工智慧非常好的一個應用,而且像OpenAI曾經在去年DOTA2比賽中也很厲害。DeepMind最近在搞《星際爭霸2》的比賽,人工智慧正在突破一項又一項人類的想像空間,所以我們對人工智慧現在有一個非常直觀的印象是什麼?人工智慧是上天入地無所不能的,所以我們會覺得,無論是媒體中現在所說到的機器人覺醒,還是人類毀滅,就變成了非常自然的一個事情。
我們如果帶著這樣的感覺去看聊天機器人的話是什麼樣的呢?我們有什麼樣的使用感受?各位同學可能跟我一樣,凡是有這個聊天機器人產品,我們大概用了1、2天,在新鮮感過去之後,就發現這個東西再也不會開了,或者再也不會跟它聊天了,到底什麼原因造成這種現象?除了誤識音、準確率不高之外,我們對這些問題還是很寬容的。但是我們上次在媒體上看到一篇報導——外國用戶使用亞馬遜的Echo音箱的時候發生了什麼事?他晚上正在睡覺,突然這個燈亮起來了,然後冷笑了兩聲!這個太恐怖、太嚇人了、太毛骨悚然了!如果是我碰到這種情況,在大半夜時這個音箱突然自己笑了,除了拔掉它的插頭,把它從樓上面扔下去摔得粉碎之外,也沒有什麼好的辦法解我的心頭之恨,所以我們可以看到這個聊天機器人產品實在表現不佳。
說到聊天機器人產品為什麼做得這麼差?我作為一個從業者還是很寬容的,因為我知道聊天機器人的邊界在什麼地方,所以我在問聊天機器人產品的時候就在想:這個聊天機器人產品可能這個地方技術有問題,所以我不去問或者儘量避免去問它。但是普通的用戶對聊天機器人產品是沒有那麼寬容的,我花了那麼多錢買這個聊天機器人音箱,我希望的是可以跟我自然對話的機器人,但是這個達不到之後,他就會埋怨開發者。
用戶一般對我們這個產品的寬容度真的是很低的,他們覺得你們技術做得真的很差,其實我們行業從業者們覺得很委屈的,這個事情不能怪我們,是根據技術現在發展的程度所決定的。像微軟亞洲研究院副院長周明老師曾經說過,語言智能是人工智慧皇冠上的明珠,如果我們把這個美女當作我們所有的技術的話,人工智慧就是她頭上的這頂皇冠,而語言智能就是皇冠上的這顆明珠。什麼意思?自然語言處理本身就是非常難的事!
我舉個簡單的例子,大家就明白了,比如我說一句話叫「明明明明明白白白喜歡他,但是他就是不說。」我問同學們,是誰喜歡誰?是誰又不說?這句話很難。我再說一句話,比如「我沒有看見他拿了你的錢包」,如果我們在不同的語氣、不同音調和重音的情況下,這句話的含義是完全不一樣的。比如說「我沒有看見他拿了你的錢包」(重音在「看見」上),這個意思就是我沒有看見他拿了你的錢包,我可能聽別人說他拿了你的錢包,但是我沒有親眼見到,或者「我沒有看見他拿了你的錢包」(重音在「錢包」上),就是說他拿了你的別的什麼東西,但是他沒有拿了你的錢包。
所以我們在理解一句話時,它其實是跟上下文,跟說話者的世界觀、說話者的情緒、所在的環境、聽者的世界觀都是非常相關的,一句「你好嗎?」或者一句「吃了嗎?」在不同人物中的對話的含義是完全不一樣的,所以NLP技術本身就是非常難的事,
當然,還是要做,為什麼要做呢?
我曾經在其他的報告也說過,微軟在2016年就提出這樣一個口號,叫「對話即平臺」,它認為語言是人類交互最自然的方式,從遠古時代開始,人類就用語言進行狩獵時的互相協作、互相呼應,在自己豐收時,在村子裡跟大家八卦八卦,促進大家的友誼,所以語言是人類最自然的一種交互方式。但是受限於硬體和軟體,我們之前跟電腦基本上是用鍵盤和滑鼠進行交互的,所以我們現在深度學習、大數據、GPU的硬體提升之後,可以直接使用語言跟機器進行交互了,這也是為什麼2016年微軟提出「對話即平臺」的這個概念。
聊天機器人生態技術體系
我們看一下聊天機器人怎樣分類的,它可以分為三個大的生態體系:一是框架,二是產品,三是平臺。
怎麼理解?Echo是一種產品,Apple的Siri是一種產品,公子小白是一種產品,IBM Watson是一種產品,小冰也是一種聊天機器人產品。這些產品有不同的展現形式,比如Siri的載體是手機、微信或者微博;我們有一款音箱,它的載體是它的硬體,這些產品一定要有一個載體去進行承載,這個載體就叫做聊天機器人的平臺,這個平臺可能包括像微信、LINE、MSN等等這樣一些平臺。我們可以理解為是利用這個框架來造這個產品的一個平臺,國外的有Alexa、LUIS、Wit,國內有一些比如像ruyi、UNIT都屬於聊天機器人的框架。
我們再往產品這個方向看,產品主要分為兩大類方向,第一大類叫被動交互,第二大類叫主動交互。所謂被動交互就是我問它答,我跟它說一句,它跟我說一句,這叫被動交互。我們剛才講到了被動交互,被動交互其實分為好幾種。
聊天機器人的工程實踐(代碼解釋)
接下來的代碼實戰環節,會跟大家從閒聊、到任務對話、到問答,跟大家完全梳理一下聊天機器人的所有分類。很多聊天機器人都做不到主動交互,因為它需要很強的知識圖譜知識和場景設計,比如在你心情不好時給你推薦一個什麼音樂,這是主動交互方面,現在做得不是特別好。安利一下,我們出了一本書,叫《聊天機器人技術原理與應用》,感興趣的同學們可以看一下。
現在開始進入實戰環節,我從最簡單的開始,不需要有任何知識儲備,就可以去做一個聊天機器人,一直到我們自己去搭一個聊天機器人的框架,並且利用Python去實現這個聊天機器人。
快速上手
第一步帶大家看一下這個「快速上手」。我給大家準備的是這個例子,大家可以看一下我的網頁,我給大家準備的例子是一個叫ruyi的平臺,它的網址是ruyi.ai,打開這個網頁以後有一個叫「魔戒」的技能插件工具,這個時候它上面有一句話叫「我要產機器人」,登陸一下,我們就可以利用它的平臺去造一個機器人了。這裡可以看到我現在建了很多聊天機器人,我可以新建一個,為了節省時間,我直接管理我現有的聊天機器人。可以讓機器人具有不能的技能,在技能商店裡可以讓機器人擁有中譯英的技能、影視點播技能、挑戰單詞技能、兒童閒聊的技能,點擊「獲取技能」,它就可以直接部署,部署之後我就可以直接跟它聊天了,這個功能已經嵌入進去了。還有一種,是我們可以在對話場景裡去建立一些新的意圖,這個意圖相當於你配了一些語料,然後它回答一些特定的語料,比如我這裡建立了一個新意圖叫「寒暄」,這個意思就是當用戶說「Hi」或者「Hello」或者「你好」的時候,機器人回答是「Hi」/「Hello」/「你好,好久不見。」這個ruyi機器人如果我們按照這個技能去設置一下,我們可以試一下,比如我說「Hello」,它就會說「你好,好久不見」,我再說一句「Hello」,它會隨機在這兩個回復裡選擇一個進行回復。其實大家不需要任何基礎知識,就可以去造一個自己的聊天機器人,我們是利用ruyi.ai的平臺去做這個事情,這是最簡單的操作方法。
接下來,我們再講稍微難一點的一個平臺。這個平臺叫做百度的UNIT,百度的UNIT現在做得很好,我們去看一下這個百度UNIT怎麼用的,網址是unit.baidu.com,這個很漂亮,滑鼠移動過去有一些很炫的效果。進入UNIT之後,還是為了節省時間,我不直接去新建一個機器人了,我直接在我今天下午建好的機器人上進行一個測試,我建了一個叫「測試」的機器人,它同樣跟ruyi一樣可以添加一些技能,比如我可以添加打電話、電影、天氣、機票、閒聊等等這樣一些技能,而且它還有一個比較好的功能是什麼?我可以自定義去配一些技能,比如在我的技能裡可以配一個叫test的功能,我在這個test裡設置了一個「天氣」,就是問天氣的意圖、對話。
怎麼去做這個事呢?講這個平臺時,我為什麼說它比剛才的那個ruyi稍微難了一點?它這裡面需要牽扯到我們對槽位的理解。我們先不解釋什麼叫槽位,我們先看一下我設定這個意圖是怎麼設定的。我設定這個意圖叫「weather」,它的別名是「天氣」。它怎麼做呢?我設計一個詞槽叫「city(城市)」,也就是說當我在問機器人一個問題時,我必須把「城市」這個詞槽的信息告訴機器人,如果我沒有告訴機器人的話,它就會自動的反問說「你在哪個城市?」這個時候我們如果去這樣設置的話,在我說到比如「今天上海天氣如何」時,它就可以說「現在播報上海的天氣情況」,它會在會話過程中檢查我是不是已經有了「ctiy」這樣一個槽位。這就是我們講了非常簡單的兩個平臺。
剛才我提到為了用UNIT需要去了解這個槽位是什麼意思。槽位是什麼意思?我再跟大家詳細解釋一下。我們看一下這樣一個對話,比如說我現在在辦公室,跟大家講這個話題,我很困,我跟這個聊天機器人說「能不能幫我訂一杯星巴克的咖啡送到辦公室」,聊天機器人可能回覆說「好的,點你最愛喝的大杯美式可以嗎?」它其實就是個任務型對話,任務型對話就是為了滿足特定的任務指標,比如訂票、訂咖啡、訂餐。在任務型對話裡,一般會牽扯槽位提取和填充,槽位就是在這個任務裡所需要的這些關鍵信息。
我們看一下它的處理流程,當這句話進來之後我們首先會在NLU自然語言理解部分做個意圖識別,可以用規則的方法去做,可以用分類器的方法去做,也可以用現有的深度學習方法去做,這都沒有問題的。如果我們判斷這句話的意圖是訂咖啡,接下來要做的什麼事情?接下來要做的就是把咖啡需要的這些槽位,如地點、店名、口味、類型填進去,這個方法裡面又牽扯到很多自然語言處理的技術,這裡就不是我們這次課的重點關注內容,我們只關注我可以在這個句子裡去抽取到這些信息。比如說地點,它是東方科技大廈,是根據我GPS定位,定位到我是東方科技大廈,店名是星巴克,類型是外賣。因為我說的是「幫我訂一杯送到辦公室」,並沒有說口味,機器人在這一步時並不知道我想要什麼口味的咖啡,這時就有問題了,不知道什麼口味怎麼幫你點呢?這個對話現在進入到我們所說的「對話管理」模塊,對話管理分為兩部分,第一部分叫DST,第二部分叫DPO(以前我們叫DPL)。DST的意思就是「對話狀態跟蹤」,DPO的意思是「對話策略優化」。DST所做的事情就是跟蹤它的狀態,並且看一下有沒有上下文,可能他在上文裡直接說「我想喝美式」,這就不需要再去猜測用戶口味了,如果我們發現這個上下文是沒有的話,我就需要去猜測他的口味到底是什麼,這裡我直接寫了,它可能根據用戶之前點的咖啡的偏好,我直接排了個序,美式第一,拿鐵第二,摩卡第三。這時它就需要做一個決策了,這時是要反問用戶喝什麼口味呢?還是直接給用戶回復一句話,幫他點一個默認的咖啡呢?這裡就需要跟產品的設定來進行回復。
我們不希望聊天機器人在功能型對話中有太多的多輪交互,我們希望一句話就能夠理會我什麼意思。就跟皇帝和太監一樣,皇帝一個眼神,這個太監就知道馬上要做什麼事情,這個是最棒的。但是聊天機器人沒有那麼聰明,我們儘可能的讓產品設計得比較聰明。那怎麼設計?比如這句話就是設計場景,我們知道用戶最喜歡喝美式,這句話可能就說「那我點你最愛喝的大杯美式可以嗎?」這一方面詢問了用戶的口味,另一方面又節省了對話輪數,這是任務型對話的處理流程。當然,最後自然語言生成時也需要用槽位把這句話生成出來,這是我們所說的任務型對話的基本概念。理解這個東西,就理解了我們在UNIT進行天氣槽位的填充。
聊天機器人三種不同形態的實現
接下來我們開始介紹聊天機器人三種不同的形態是怎麼去實現的。檢索式機器人最簡單的做法是什麼?比如用戶對這個產品說「你穿的衣服好漂亮」。機器人會回復「謝謝你的讚美」,它一般是怎麼做的?當你說「你穿的衣服好漂亮」的時候,它會在一個很大的語料庫裡去搜索,搜索這裡面哪一句話跟我現在問的問句是最接近的,然後把最近這句話的回覆直接回復給用戶,這個看起來是不是很簡單?所以其實如果你掌握了檢索式方法的話,就完全可以做一個非常棒的機器人。只要你寫足夠多的語料,用更好的相似度算法,這個聊天機器人就會表現得非常好。但這個情況只出現在單輪的過程中,如果在多輪的情況下,檢索式的方法肯定就掛掉了。這裡最關鍵的是什麼東西?最關鍵的是匹配。
我們再看一下它基本的技術流程是怎麼走的,比如我說剛才那句話「你穿得衣服好漂亮」。它是作為一個問句,我們就需要做一個retrieval,這個retrieval是搜索,我們從大量文件語料對裡去搜索跟我這句話最接近的一些句子,並且把這個候選集給篩選出來,有了候選集之後,我們就會做一個排序,這兩句話到底哪句話跟我這句話的相似度最高,然後我再把它這句話的回覆來回復給用戶,這是它基本的檢索式的流程,這用2014年一篇論文中提到的經典模型,我就直接拿來用了。
(1) 基於文本相似度
接下來開始介紹基於文本相似度、基於語義相似度以及基於深度學習的檢索式方法,也就是說對於檢索式方法,我們現在這裡說3種比較基本的技術。
第一種,基於文本相似度的方法。什麼叫文本相似度?舉個例子「你穿的衣服好漂亮哦」,「你的衣服真漂亮」這兩句話,大家直面上感覺非常相似,它怎麼相似?因為它的字、它的詞有很多重合,這就是文本相似度的直觀感受。我們知道文本相似度算法有很經典的比如邊際距離、TF-IDF、BM25,這種都是非常經典的算法,我這裡對算法部分就不做更多深入的描述了,大家如果感興趣的話,推薦大家去聽一個課程CS 224N,這個課程是斯坦佛大學Christopher Manning教授零幾年上的一門課,應該就是叫NLP(自然語言處理)這門課,它對經典的自然語言處理算法都做了非常好的解釋。
那麼我們一般的做法是,這種相似度算法一般是用到字符串匹配,我們知道字符串匹配的速度一般非常慢,但是我們可以藉助相似度的檢索引擎提升它的搜索效率。這裡有兩個,一個叫ElasticSearch(ES),另一個叫HNSW,如果感興趣的話,大家可以在後面課程的PDF、PPT裡去看一下這兩個項目。
接下來實戰裡是用這個基於ES相似度檢索引擎,給大家實現一個檢索式的聊天機器人,我這裡列的基本是核心的代碼,就不在這裡給大家演示了,PPT可能看得更清楚一點。ES怎麼去用?這個很簡單,我們直接去Import這個ElasticSearch,首先要配置一下ES的信息,信息包括什麼?它的主機IP,比如說我這裡是172.27.1.203,埠號是9201,然後資料庫名稱是什麼?我們把它起了一個叫similarity_chat,它的表名稱叫什麼?比如我們起個名字叫「qa_corpus」。
接下來就是正常的流程了,比如我們首先要初始化一個對象,小寫的es這個對象,這個對象裡所有信息是來源於我們剛才配置的es信息,這裡面是埠號和IP。接下來我們想往這個es裡去添數據,因為我們想把這樣一批數據添加到es裡去,13頁裡這些數據,怎麼去添呢?這裡我們define一個方法,這個方法叫insert_one_data,就是我們插入一條問答語料,怎麼去插入?一個問答語料包括兩部分,一個叫Query,一個叫Answer,就是一個Q,一個A,然後我們會調用一個es的index方法,這個index方法其實是直接封裝好的插入語料的方法。它是怎麼去做?如果這個資料庫不存在的話,它會直接生成一個新的叫這個名稱的資料庫,並且建立一個表叫「qa_corpus」。然後對於每一條數據,除了Query和Answer,這是兩列數據,一個Query,一個Answer,還自動生成一個id,相當於我們最後生成的數據是三列數據,第一列是Query,第二列是Answer,第三列是id,這是我們預先存了這樣一些句子。
接下來要做什麼事?接下來要做檢索,我們來了一個問句之後,定義了一個方法叫「similarity_chat」,我們對這個問句進行檢索,跟我剛才資料庫裡哪一句話最接近,然後我們人為設置了一個90%的閾值。相似度為90%以上的答案返回作為最好的候選答案。Body的格式就是query還有這個minimum_should_match,就是它90%的值。然後我們用es這個search的方法去找到它的候選集,找到候選集之後去比較這個閾值,如果所有的閾值都低於我們設計的90%的話,它就直接返回一個兜底回復,比如else,answer這是一條兜底回復,然後return answer,這是我們的整個實現方法。
具體流程在上面看一下,首先,左邊這個圖是我們插入的三條語料,插入三條語料的Query和Answer分別是「你的衣服真漂亮」、「謝謝你的讚美」,然後還有這兩句。我們現在有一個query_sent是「你的衣服很漂亮」,我們調用剛才我們已經設定好的「similarity_chat」這個方法把這個query_sent灌進去,然後檢索出最好的句子是第一個。也就是說我們其實在這裡直接利用了ES默認的相似度的分值的計算方法,這個計算方法在這裡其實可以跟大家說一下,大家可以在裡面去改自己的計算方法,因為我們知道匹配度的分值是可以自己去做很多的優化的。所以,這裡面大家可以根據自己的實際情況去調整分值的計算方法,然後做一個比較個性化的自己的檢索引擎,最後得到這個答案是「謝謝你的讚美」,整體的用ES作為檢索式的方法就簡單跟大家介紹到這裡。
簡單總結一下,基於ES相似度檢索引擎的優勢在於什麼呢?文本相似度它本身是具有一定泛化支持的,比如你加一個語氣詞「啊」或者「哦」,或者加一個逗號、加一個標點,它都可以在相似度檢索方面起到比較好的泛化效果。當然,這個泛化它本身又是一個比較重要的一個可以單獨拎出來講的模塊。比如我們現在常用的方法叫機器翻譯,我們可以用機器翻譯的方法對大量語句進行泛化的設計,使我們的聊天機器人可以支持更多泛化語句。第二點優勢,ES裡自帶的BM25算法有很多權重可以調整,在短文本的情況下比邊際距離還要合理得很多。
劣勢也很明顯,我舉兩個例子,大家就很明白了,比如說「你好漂亮」、「我覺得你很好看」,大家看看這個文本相似度,它裡面哪幾個字是一樣的?「你」是一樣的「好」是一樣的,其他字都不一樣,語義相似但是文本字符不是很相似的情況下,這個文本相似度算法可能就沒有那麼好,但它語義是非常相似的。第二種情況是否定詞怎麼辦?比如「我喜歡你」和「我不喜歡你」它的意思是完全相反的,但是在文本相似度檢索時,如果我們沒有對否定字進行限制,它這兩個得分是非常高的,「我喜歡你」和「我不喜歡你」的得分是非常高的,這個情況就非常難以應對。我們一般的處理方法是什麼?第一種方法是規則,比如說我可以設定一些否定詞的過濾規則,遇見「不」的情況下跟原有句子是相反的意思,或者怎麼樣利用文本語義相似度的方法來去進行相似度的檢索,我們接下來跟大家講第二塊,就是基於語義相似度怎麼去做。
(2) 基於語義相似度
第二種,基於語義相似度。語義相似度一般來說是三步走,我這裡列的三條是三步走策略,第一步,先要把一個句子中單詞變成向量化的表示,向量化表示的方法實在太多了,而且有很多人講過專項的talk,這裡我就不講嵌入式怎麼做的了,如果感興趣的話可以讀一下Word2vec這種原始論文,或者看一下我們現在這種ELMo、Transformer、Bert這些語言模型的動態詞向量是怎麼做的。詞向量這塊我就不去解釋了。詞向量的輸出就是把一個單詞變成一個向量,比如變成一個200維或者300維的向量,這是單詞的向量表示。
第二步是做句子的向量表示,比如剛才我舉的例子「我喜歡你」它是三個詞,我、喜歡、你,我們把這三個詞的向量拿過來之後怎麼把句子的向量做出來,這就需要有一些方法,比如加和平均,比如向量極值,比如最近用得比較多的FastText、Skip-Thought、Quick-Thoughts,這都是非常好用的一些方法,大家可以具體的情況去把句子的向量表示出來。其實可以用一些預訓練的向量,比如騰訊應該有一個預訓練好的大規模語料上的向量,大家可以拿來用。
第三步是計算向量距離,我們有了兩個句子的向量之後,下一步就要去計算它的相似度,也就是它的向量距離。一般的做法可能採用歐氏距離或者餘弦相似度,也就是說我們得到一個分值。或者基於深度學習的一些方法,也是延續著剛才我們PPT裡講計算文本相似度的語義相似度的方法。在匹配算法方面,我這邊只列了一些最早提出來的或者最經典的算法,如果大家感興趣的話,這後面還有非常多論文可以去讀,包括最近也新出很多這方面的論文。
我們從最早的講,2014年華為的諾亞方舟實驗室這篇論文中提出兩種算法,一種算法是基於表達的,一種算法是基於交互的。兩者最大的區別在於對於句子算相似度的時候,基於表達的算法是對這兩個句子分別進行卷積、池化,進行向量化之後通過多層感知機得到它的匹配度。像MatchPyramid這種算法就是基於交互的,這種算法一開始就把兩個句子給揉起來了。我們相當於一種是分開去算,兩個兄弟先分開,然後最後再分家產;還有這種兩個兄弟先揉在一起了,揉成一個矩陣,這裡面有一些相似度的Operator,大家看原始論文時,Operator是有兩種,一個是點乘,一個是最大化。我們把這個句子裡面的比如這8個詞,每一個詞都進行一個相似度的操作,就變成了8×8的矩陣,然後在此之上我們做卷積、池化這樣的操作,通過最後的多層感知器得到它最後的分值。所以基本上只有這兩個方向,一個叫基於表達的Matching方法,一個叫基於交互的Matching方法。大家感興趣的話可以深入的去看一下論文。
(3) 基於深度學習
第三種,檢索式還有一種是基於深度學習的檢索式方法。這個我選了一篇比較經典的論文,跟大家簡單講一下它的思想。微軟小冰團隊在2016年提出一個方法,它不僅考慮詞級別的,還考慮句子級別的相似度。什麼意思呢?簡單解釋一下,我們這裡有4個句子:u(1)、u(n-1)、u(n)、r,中間還有很多句子,我們假定它是4個句子,它現在想算u跟r相似度,怎麼算呢?它會把每個詞做個嵌入,也就是做向量化,然後把這個詞跟r的這個詞直接做點乘,也就是得到M2這個矩陣,得到這個矩陣之後通過對句子做GRU,它最後得到的隱狀態我們做一下餘弦相似度計算,得到的是M1這個矩陣,所以M1和M2這兩個矩陣分別代表詞和句層面的相似度,再往後就是通過CNN,還有一個GRU,最後得到一個Score。這個就是我們有一些基於深度學習的檢索式方法,我也不深入進行介紹了。剛才已經跟大家講完了基於文本相似度的、基於語義相似度的、基於深度學習的檢索式方法。
(4) 基於生成式的深度學習方法
第四種,跟大家聊一下基於生成式的深度學習方法。這是最早一篇論文,應該也是華為做的一篇論文,他們當時做的是怎樣通過一句話直接生成它最後的這個回復,就是通過x(1)到x(t),直接生成y(1)到y(t),他們提出三種不同的方法。有一個是直接從這個隱狀態得到它的context,還有一種方法是裡面加了attention,採用加權的方式利用這個attention來得到最後的句子,還有一個是有一個contextAttention,還有一個詞層面的Attention,它們稱之為是local和global這兩個Attention生成的回覆。在這後面也出現了很多生成式的方法,因為這個talk是基於實戰的,所以我們對理論方面不做過多的深入解釋。
架構設計
最後來到最複雜的一塊了,如果我們想從0到1利用自己的Python代碼去創造一個聊天機器人,應該怎麼去做?第一步,要先把架構給設計出來。這個聊天機器人的架構應該分幾個部分,我們肯定是要用Python去寫一個DM(對話管理)這個模塊,然後這個模塊會接收自然語言理解(NLU)的一些信息,同時,它會對句子進行一個意圖解析,同時它會根據意圖解析的結果選擇一項功能,比如它是任務對話,還是功能對話,還是問答,還是閒聊,它有不同的處理方式,最後回復的時候我們還有一個NLG的模塊,這就是整個聊天機器人簡單的一個架構。
接下來這個序號是我要跟大家把這幾個模塊全過一遍:第一個,NLU,第二個,意圖解析,第三,DM,第四,任務對話,第五,問答,第六,NLG。為什麼不講功能和閒聊?功能假定可以直接使用ruyi、UNIT的技能包,我們這裡面就不做開發了。我剛才也講過了閒聊,我們直接用檢索式的方法做閒聊,我們用很多語料庫直接做檢索式的閒聊就結束了。這是我們說的架構設計。
NLU
第一點,NLU怎麼做。讓大家失望了,NLU裡沒有代碼,為什麼沒有代碼?因為很多開源的項目在做NLU的事情,NLU其實非常多的模塊,至少我們現在用的模塊就有十幾、二十個,這裡包括什麼?分詞、詞性標註、依存、情感分析、實體連結、實體發現、語義消歧、主體識別、句子有效性判斷等等,這個並不是一節課能講完的。但我建議大家,如果你真的想以簡單的方式去實現一個聊天機器人的話,我們為什麼有好的東西不用呢?Jieba分詞是很好的一個開源項目,中科院還有一個NLPIR,哈工大有一個LTP,斯坦佛有CoreNLP,我們還有最經典的NLTK的包,還有HanLP、AllenNLP。在NLU這塊如果自己做的話實在是非常煩,比如分詞、依存自己做的話,這個時間就花費得太多了,最好的辦法是我用別人的東西,我去加一些自己的個性化,這就是我NLU所要跟大家講的內容。
意圖分類
第二點,意圖分類。想跟大家聊一下意圖分類最容易實現的方法,整個方法的分類其實是有幾種的,比如:傳統方法,傳統方法裡面我們可以用特徵,用一些分類器,然後直接對這個意圖,比如我們用決策樹或者SVM直接對句子進行分類。當然還可以用深度方法,比如CNN或者CNN+LSTM來進行分類。右邊這個圖給的就是這樣一個深度分類的方法,它是對一個句子進行了一個embedding之後,I是一個單詞,它是一個5維的向量,這是一個舉例,然後它每個詞都有一個向量,這個矩陣拿過來之後,我們就會有一些卷積、池化的操作,最後得到的是二分類的一個結果,這也是利用深度學習的方法去做的。但是我們在工程中還需要考慮什麼呢?還需要考慮我們到底是二分類、多分類,還是層次分類。二分類很簡單,1和0。多分類也很簡單,比如情感裡面有「正中負」。層次分類就比較複雜了,比如我們的產品裡共有五層分類,300多種意圖,所以我在做的時候,用什麼方法才能保證它有比較高的RECALL。這就是我們在工程中所需要做的問題,其實是很複雜的事情。
接下來我跟大家聊怎樣用規則方法實現意圖分類,用規則方法實現意圖分類是非常準確的,但是它缺點在於我們要對每一個句子都進行規則的覆蓋,而且當規則實在是太多的時候模型就會變得非常難維護,這是它的缺點。我們來看一下規則怎麼去做,比如我這裡舉了一個事例是三種不同的意圖,一個是「講笑話」,一個叫「成語接龍」,還有一個叫「天氣」。它所對應的規則是這樣寫的,比如「來一個笑話」這可以覆蓋,「說一個笑話」可以覆蓋,「講笑話」也可以覆蓋,「說笑話」也可以覆蓋,這是一個規則,剩下的是同理。
怎麼去做呢?我們看一下,右邊有兩個函數,第一個函數叫build,第二個函數叫intent_recognition。這個函數的作用是正則編譯,正則編譯大家應該也很清楚,我們對正則表達式進行預編譯的話,可以有效加快正則的匹配速度,這個是編譯,我就不講了。第二個是在意圖分類的上面,如果有query進來之後,candidate_list一開始是空的,然後我們把正則編譯之後,從正則裡面去選擇正則對這個句子進行匹配,匹配之後我們會對匹配到的字符串的長度對意圖進行ranking。也就是說它可能匹配到不同的意圖,這個時候我們就需要根據它匹配的字符串的長度來對意圖進行排序,最後把所有的candidate進行排序之後輸出,這是我們在用規則實現意圖分類時的一段代碼。
神藥:fastText
如果大家不想那麼麻煩,還有一種包治百病的神藥叫fastText,是在2018年廣泛地被工程界所採用的一種分類方法。當然,現在這個方法被Bert和ELMo、Transformer這種更先進的算法所替代,也不是超越吧,大家還是一起做,有時做一些Stacking方法時去用,我們也會用到Bert或者新的GPT這種算法。但是fastText本身對意圖分類的效果是非常明顯的,而且它由於是基於字符子串的,所以它的性能也非常高,它不僅速度快,性能也非常高,所以在2018年我們笑稱fastText是「包治百病的神藥」,這個神藥對工程界的分類起到非常大的促進作用。
我們看一下fastText怎麼用,很簡單!它的代碼是非常簡單的,我們只需要準備帶有分類標籤的數據集就行了。分類數據集這裡是已經分好詞的,比如這句話的label是weather,這句話的label是music,這句話的label是news,我們準備了幾萬條的數據集,把它分為測試集、驗證集、訓練集,之後我們就import fasttext,然後定義一個訓練函數,定義一個預測函數,訓練函數的話比如直接用train_supervised就行了,然後我們還可以算它的precision,recall還有F1,這是訓練。用的時候怎麼用?我們把model提出來,然後去predict這個sentence的label,然後return這個label就結束了。fasText是非常好用的一個算法。
DM(對話管理)
第三點,下面這個部分開始講DM。DM的代碼在這裡沒有貼,因為這個實在是太複雜了。我跟大家講一下整個框架是怎麼實現的,DM是對對話進行控制,很多情況下是對多輪對話進行控制。我這裡舉了個典型的多輪對話,這裡舉的例子是天氣,我這裡列了1、2、3,是用戶在前三輪所說的一些話,比如說用戶第一句說「上海上周日下雨了嗎?」它的對話時間是3月21號的8點,它的意圖是天氣,地點是上海,時間是2019年3月17號,因為它是上周日下雨了麼。我們抽取這些信息之後,就會給它回復一個3月17號的上海天氣是什麼樣子,它下雨了沒有。這是用戶問的第一句話,以下是同理的。
用戶第二句話問的是「上海今天的天氣如何」,所以它最後的回覆是3月21號的上海天氣。第三句話用戶說了一個不相干的,用戶覺得好像今天天氣很差,怎麼辦呢,他說了一句「明天就不要出門了吧」,這個時候我們開始說重點的了。重點就是用戶當在第四句話時說「那明天呢,怎麼辦?」我們看一下它的處理流程,「那明天呢」這句話進入了意圖分析之後,我們發現這句話的正常意圖分值是非常低的,也就是說它不像是個正常的意圖,在意圖判斷時我們已經加載了上下文,也就是說它上文的日誌,這時我們用分類器模型判斷或者用一些規則,判斷它可能是屬於某個多輪意圖。這個多輪意圖是屬於哪一個呢?我們就要去找這個窗口,這裡面有兩個窗口,一個叫時間窗口,一個叫輪數窗口,比如輪數窗口我們這裡設定的是3輪,3輪內的內容都會抓取,時間窗口是5分鐘,5分鐘內的數據都會抓取,這些數據都抓取之後,我們判斷它確實是天氣意圖下面的一句話。這句話有了之後我們填充槽位,「那明天呢」我們判斷他是在問天氣,那這個天氣的槽位信息是什麼?明天是時間信息,那地點是哪裡?地點我們直接沿用上一輪他問這個天氣的地點的槽位信息。所以最後我們的槽位信息其實是「上海」是地點,時間是「3月22號」,就是明天上海的天氣是怎麼樣的。這裡面用狀態機,然後去決定我們接下來要做什麼樣的操作,這裡會經過DST的步驟。同時,我們在回復之後也把這些日誌加入到日誌的log資料庫裡去,最後會返回一個對話,這是DM的操作流程。
基於特定任務的對話實例
第四點,接下來是基於特定任務的對話實例,特定任務代碼非常多,沒辦法貼全,那麼就貼一下最基本的這樣一些模塊。比如說我們會對槽位首先進行一個限制,比如date是時間的槽位裡包括「今天|明天|後天|本周|下周」等等,地點包括「北京|上海|深圳|廣州」這樣一些地點,當有這樣的問句之後,我們首先會進行意圖識別,intent-recogniton,我們會對這個query進行意圖識別,如果這個intent是weather的時候,它就先進入到一個槽位提取,我們提取的槽位是根據weather下面的槽位信息去提的,它需要包括時間和地點,所以我們有這樣一個函數去抽它的時間和地點信息。接下來,槽位提取之後我們就要請求天氣接口了,這時比如我們用的是新浪天氣,新浪天氣有個服務,我們就需要用這個date和location去請求新浪天氣的這個服務,返回當前的這樣一個天氣的情況,叫weather-info,有了這個weather-info之後我們再用NLG模塊成一個回復,得到這個anwser,這就是基於我們特定任務對話實現的簡單流程。
問答模塊
第五點,接下來介紹剛才模塊裡的問答模塊。簡單跟大家說一下基於模塊的問答方式,還有更多的,比如基於語義解析超出了本次課程的範圍。那基於模板怎麼做?比如用戶問了「你喜歡看海賊王嗎?」這句話用模板的處理方式就是先去匹配這個模板庫,它會在模板庫裡去匹配這句話跟誰是最相近的。匹配完之後我們會有一個動漫字典,它是屬於海賊王,海賊王屬於娛樂類的動漫的類型,所以最後給一個相應的回覆語句。
怎麼去做?是這樣的流程,它的做法是這樣子的,我們首先維護了一套正則模板庫,比如「你喜歡(.*)」,這個正則模板庫大概幾千條或者幾百條,當有一個問句進來時,它會匹配正則模板庫裡的所有正則,比如它匹配的正則最後匹配到了「你喜歡」的這樣一個句子,然後把「你喜歡」後面的這一部分都抽取出來,也就是說「看海賊王嗎?」這幾個字符全抽取出來作為候選。候選裡面肯定包括一些形容詞、標點符號、無意義的詞,怎麼去刪掉它們呢?我們採用了一種方法叫TrieMatch的方法,其實可以用最常匹配的這種方法去進行匹配,我們最後匹配到字典裡的叫「海賊王」的字典庫,然後我們把「海賊王」關鍵詞抽取到文本中,「海賊王」屬於動漫字典,然後再給用戶進行一個回復,這是這邊的一個簡單說明。
自然語言生成(NLG)實例
最後,講一下自然語言生成。也就是說我們機器人在回復時,不可能讓它只是回復我們查到的答案。以天氣為例,天氣最後的結果一般是氣溫,還有天氣的狀況。所以我不可能直接回復用戶說「多雲,10度、15度」,我肯定要回復非常自然的句子。它的做法是這樣子的:比如我們對於整個NLG在天氣回復裡是這樣設計的,它的Answer包括四個部分,第一個部分叫「今天的天氣是什麼」,第二個部分叫「最低氣溫是什麼」,第三個部分叫「最高氣溫是什麼」,第四個部分叫「個性化的回覆語料」。我們可以看到,當我們有這樣一個slots_info的時候,我們有「多雲,10-15」度時,我們就直接可以把這4個信息拼成一句話,這句話可能是「今天的天氣是多雲,最低氣溫是10度,最高氣溫15度,天氣有點涼哦,主人穿件薄外套吧」,這就是自然語言生成,我們利用槽位填充來做的模塊的具體實現,其實也算一段偽代碼。
總結一下,我們整個框架怎麼實現呢?首先,NLU,我們用Jieba分詞、哈工大的LTP;意圖解析我們可以用FastText或者Bert;NLG我們用配置的方法去做;DM我們用Python自己去寫;任務對話我們用規則去實現;功能模塊我們用現成的;問答模塊我們用模板;閒聊模塊我們是用基於檢索的方法,這樣就可以非常簡單的去實現一個聊天機器人。今天的主要部分就講到這些。
知識圖譜在虛擬生命中的應用及技術路徑
接下來跟大家聊一聊關於知識圖譜方面的信息,聊天機器人這塊基本的技術方面跟大家聊得差不多了。
講講圖靈測試。聊天機器人現在表現是非常差的,但是在2014年仍然通過了圖靈測試,圖靈測試本身是圖靈在1950年代發明的測試,它是測試機器人是不是能矇騙人類,它的測試方法是在5分鐘之內,我一個人,這有一堵牆,不知道對面是一個電腦還一個人,我跟它對話5分鐘,如果參與測試的人30%都被騙了,那麼就說這個計算機通過了圖靈測試。其實這個測試標準是非常主觀的,我們可以利用很多trick去繞過這樣的一些設置。所以說其實圖靈測試並不能真正反映機器人的智能程度,因為圖靈測試的來源是什麼?大家可能聽過這個故事,圖靈是個同性戀者,所以說圖靈測試是每一個在英國的同性戀在1950年代必須通過的日常測試,也就是說作為一個同性戀,你能不能裝成一個異性戀,其實這是圖靈測試最先緣起的原由,其實是很悲慘的一個故事,最後圖靈由於被接受化學閹割,然後抑鬱而去自殺的,非常可惜的一個事情。所以我們講這些的原因是在於,我們覺得哪怕是聊天機器人它通過了圖靈測試,並不能代表它真正具有智能的一個效果。
所以我們接下來就會想:既然這個聊天機器人做得這麼差,怎麼去提升它的體驗感和效果?我們想到的一種方法是給聊天機器人賦予人格和IP化,比如大白,比如R2D2,比如外星人,好像就是叫AI,這個電影,《西部世界》,我們是不是能把這些形象放到聊天機器人裡去,這是我們想要做的事情。
我們曾經做的一個第二代產品,就是怎樣讓一個聊天機器人更加具有生命感的表達,視頻因為時間關係就不播放了。所以我們對虛擬生命有一個比較完整的定義,我們把它稱之為「虛擬生命」,它除了具有聊天機器人最基本的能力之外,它還具有比如看、聽、說、思考、動作等這樣一些方面的能力,這是我們對虛擬生命期望的效果。定義是我們希望它以多形態和多模態進行交互,具備強大的感知和認知能力,並進一步實現自我認知和自我進化。這是我們對虛擬生命總體的技術進行的總結,可以看到除了圖像、聲學和認知交互之外,我們還具備像姿態、情感、作詞作曲、演唱、多性格、情感識別、主動推薦等各方面的能力。
怎麼樣去實現這些能力?我們前面這些鋪墊都是為了引出我們接下來要講的這塊內容,叫「知識圖譜」,怎麼樣真正的讓聊天機器人擁有自己思考、理解、推理能力,也就是我們正在研究的知識圖譜技術所要帶給我們可以期望的東西。我們知道,現在是深度學習和大數據的時代,深度學習和大數據利用它的算力、利用它的數據,可以在感知層面,比如圖像識別、語音識別、語音合成做到非常好的效果,但是碰到有一些需要思考的問題深度學習肯定是要掛掉的。舉個簡單的例子,比如肖仰華老師曾經舉個經典的例子叫「我把雞蛋放到籃子裡,是雞蛋大還是籃子大?」這個問題對於深度學習來講是非常難以解決的,因為它不具備常識和推理,所以雞蛋大還是籃子大的這個問題它就回答不了。另外,我還可以問一個問題,叫「姚明的妻子的女兒的媽媽的老公的國籍是什麼?」我想現在的聊天機器人無一例外都會被繞暈的,因為姚明的妻子的女兒的媽媽的老公其實就是姚明,但是機器人是沒有辦法去理解這麼複雜的一段信息的。但這個時候如果我們擁有了這樣一套豐富的知識圖譜之後,我們其實就可以進行推理,包括常識推理這方面的內容。
知識圖譜全流程
接下來我們就開始介紹知識圖譜整體的全流程,知識圖譜的全流程在這張圖上寫得比較清楚。最下面是對於三種不同類型的數據(結構化、半結構化、非結構化)進行數據加工,這裡用到知識表示、知識融合、關係抽取、事件抽取、實體分類、屬性分類等各種方法去建立起自己的知識圖譜,我們自己的知識圖譜叫「七律」,所以我這裡把「七律」這兩個字寫上來了。當我們建立了這些知識圖譜之後,在上層就可以想像出它可以做很多應用,比如問答、推理、聯想、推薦,等等,但做這些應用之前我們還需要有一步中間層,叫「知識映射層」,比如我們需要做知識檢索、本體對齊、實體消歧、機器閱讀這方面的事情,才能夠使得這個知識圖譜能夠真正的變成知識應用。
知識來源
首先說一下知識來源,我們的來源來自百度、互動百科、知乎、新浪、維基、萌娘百科。為什麼要有萌娘百科呢?我們自己做的產品是一個偏向二次元和娛樂化的,所以在建立知識圖譜的時候一定要根據自己的領域去建立知識圖譜,萌娘百科給我們帶來很多關於二次元的百科知識,這是我們非常有用的一些知識,所以我們去建立了一套偏向二次元的這樣一套知識圖譜。
知識表示
然後是知識表示,我們都知道知識要去進行存儲的話要有一定的表示方式,我們除了比較直觀的圖表示,還有這種RDF的表示方式,大家可以理解它是一個三元組,比如川普的妻子是梅拉尼婭,川普的女兒是伊萬卡,其實是兩個實體,川普和梅拉尼婭中間的關係是妻子關係,川普的妻子是梅拉尼婭,這就是我們對知識進行表示。所以在我們最底層對知識進行處理之後,我們接下來對知識需要進行一個表示。
知識補全
然後這個PPT跟大家聊的是知識補全,知識補全是怎麼做的呢?給大家舉個例子,比如陳道明的妻子是杜憲,我們在百科裡去查陳道明這個詞條,我們會發現它有一個信息是妻子是杜憲,但是我們查杜憲的時候發現杜憲並沒有一個邊指向陳道明,那如果我們有了一套知識體系,它會限定如果一個人是另外一個人的丈夫,那麼這個人肯定是這個人的妻子,這個邏輯應該不會錯吧?這個也可能會錯,為什麼呢?兩個人如果都是男性,或者兩個人如果都是女性的話,這個就有問題了。但我們假定這個不存在,我們假定如果一個人是一個人的妻子,那麼這個人肯定是另外一個人的丈夫。所以有了這套知識體系之後,我們就可以補上一條邊,比如杜憲的丈夫是陳道明,這條邊就可以自動補上了,費麗達的丈夫是程遠,那麼程遠的妻子就是費麗達,用這樣一些手段可以舉行知識補全,這也是預處理時需要去做的一個事情。
知識擴展
什麼叫知識擴展?就是我們把一些不存在的關係學習到並且加入到知識圖譜裡去。我舉的這個例子可能不恰當,因為這個關係是已經存在的了,我只是說一下這個方法是怎麼做的。
「2015年10月1號,劉強東與奶茶妹妹在澳大利亞舉行婚禮」,這個句子它裡面是有一個關係存在的,是什麼關係?劉強東和奶茶妹妹是夫妻關係,然後我們接下來通過實體連結,在資料庫裡找到奶茶妹妹其實真名是章澤天,那這樣我們就可以直接在劉強東和章澤天之間建立起一個夫妻關係,並且把這個知識擴展到我們已有的知識圖譜中,這個就是我們所說的知識擴展方面的內容。
新知識發現
新知識發現也是我們要做的一個事情,因為我們知道知識的變化實在是太快了,我們最近有很多熱點知識不斷刷新我們的認知。比如「御三家」什麼意思?原本是指德川本家之外的三大家族,現在可能會指這個,比如亞洲表情包御三家:姚明、金館長、兵庫北,這種御三家。還有「隔壁老王」,隔壁老王以前就是指隔壁老王,現在它有一個含義還叫「親生爸爸」,這個也是新知識發現,我們要去找的一些東西。「祭天」也是前年挺火的,暴風影音那個事,但是我覺得挺有趣的,祭天是通過殺死程式設計師、產品經理等,來留住用戶的一種儀式。它其實也是老詞的一個新的解釋,其實我們在新知識發現時,就需要去發現這樣一些新的知識,有了這些新知識之後怎麼辦?後面就是更新。我們有兩種更新方式,第一種更新方式是增量,當我們發現這樣的熱詞之後,我們會對它以及它周邊的實體進行增量更新;另外一種是全量更新,比如我們定期一個月對知識圖譜進行全範圍的更新,因為它的代價是相當大的,所以知識更新也是我們知識圖譜整個構建鏈條中不可或缺的一部分來保證知識圖譜的新鮮度。
基於知識圖譜的問答
基於知識圖譜的問答是知識圖譜的一種應用,這裡面跟大家舉的例子是這個基於語義解析的知識圖譜的問答。我們可以看到,整個問答裡綜合了自然語言處理的各種模塊,也綜合了我們在知識圖譜裡所涉及到的知識領域。
川普的老婆的國籍是什麼?首先我們實體會抽取到「川普」,「川普」是指四川普通話?還是指川普?這裡我們就需要有一個映射,有一個實體的消歧,最後我們得到它是指川普。「老婆」對應的標準叫法是「配偶」,「國籍」是「國籍」,「?」是「?X」,我們就會把這個語義進行組合,比如川普的配偶是「?y」「?y」的國籍是「?x」,而我們最後一個查的是「?x」,所以它就會這樣寫,「SELECT DISTINCT?X」WHERE,限定條件是什麼?「?y」的國籍是「?x」,並且限制川普的配偶是「?y」,最後我們得到川普的配偶是梅拉尼婭,梅拉尼婭的國籍是美國,所以最後得到的答案是「美國」,具體的細節可以去研究一下基於語義解析的知識圖譜。用到很多技術,包括分詞、詞性標註、NER、關係抽取,等等,也不是我們這節課所討論的範圍。
工程落地的其他問題
我們感覺掌握了很多NLP知識,掌握了很多KG技術,又有了一些工程的手段,就覺得我可以做成非常棒的產品。但正如這幅圖給大家看到的一樣,這是一個什麼鳥,我也忘了是野鴨還是什麼,它在落地冰面時滑到了,真正落地跟我們想像的有時是完全不一樣的。所以在工程落地時有很多因素是需要考慮的,這裡面不僅僅是技術的問題,技術可能只是佔我們整個產品化的一個非常小的部分。我們需要考慮這個產品賣給誰、怎麼賣,然後我們還需要考慮整個系統的性能架構。
我們是採用檢索式的閒聊問答,還是做多模態的交互問答,同時我們還要考慮它軟硬體投入、人力投入和市場行情是什麼樣的。尤其是現在聊天機器人本身就是一個已經不是紅海市場,已經是血海市場了,大家在這個市場上真的是打得頭破血流,如果大家還是想以簡單的聊天機器人的形式來進入市場的話,就會面臨什麼樣的競爭?就會面臨49元的小米小愛音箱,就會面臨79元的天貓精靈,就會面臨199元的小米的小愛同學,還有299元百度的小度在家。所以怎麼樣做工程化和產品化,也是需要我們在商業的邏輯上思考的問題。
結語
最後耽誤大家2分鐘,簡單講一下我們做的是什麼,我們做的是事情是聊天機器人,具體的歷程就不跟大家說了,首先是公子小白。我們在2018年8月份推出了這樣一款新的產品叫琥珀,它是全息投影的智能聊天音箱,2019年5月份會和全職高手合作,給大家推出一版葉修版本的琥珀機器人,我們期待用戶可以通過機器人跟葉修直接進行交互,然後看它的一些動作。2019年12月份,也就是今年年底,我們會推出一個男性明星,這個男性明星應該是我們現在國內流量前10的一個男明星,小鮮肉級別的男明星,也希望大家來關注我們的產品。
我們的人工智慧研究院是在上海成立的,專家還包括張民老師、王昊奮博士,我們的成員來自於各個知名大學,跟蘇大、華東師範大學等也建立了聯合實驗室,也推出了一款叫「虛擬生命引擎」(GAVE)的引擎。
這是我的最後一頁,再跟大家聊兩句,我們整個虛擬生命的引擎包括幾個層面:我們在數據層其實做了很多事情,包括知識圖譜,包括基礎的數據分析和運營平臺;中間層裡我們會做一些基於認知智能的、感知智能的,比如聲音、圖像、人臉識別、情緒識別,還包括像推理、聯想、記憶、情感這樣一些認知智能;服務層我們會有聊天、智能家居、多模態問答等等;最後我們還可以提供開放平臺的接入點,讓大家方便的接入到我們的一些功能。
感謝大家的支持,我的課程就講到這。
Q&A
提問1:一個對話系統包括這麼多內容,用端到端的系統好,還是分成一步一步來做比較好?感覺工程量好大。
邵浩:看你什麼目的吧,如果你是為了做研究目的的話,那肯定是端到端了,如果寫論文的話肯定是要端到端,這個是毋庸置疑的。工程方面還是要好用,所以工程方面的原則是儘可能用最簡單的方法來得到效果;如果不行,我們再想其他的辦法。
剛才我說到分兩個層面,如果你想學工程的話,就還用這些規則自己動手實踐去做;如果你想做論文研究,你就還是去專注於論文和端到端的系統。
提問2:老師,知識圖譜在對話系統中重要嗎?現在用得多嗎?
邵浩:重要,但現在用得不多,為什麼?你說的這個是知識圖譜在對話系統中。知識圖譜在問答系統中還是蠻重要的,我們在基於知識圖譜的問答裡還是大量使用知識圖譜,但是在其他的功能模塊,剛才我講到了,比如閒聊,比如任務對話,那知識圖譜用得並不多。而且工程界對知識圖譜的使用也不是特別多。
提問3:DM中slot中如果命中Keyword,但沒有返回日期和時間,會返回相應的問題給用戶,請用戶補充日期和時間,請問這個問題也是人工設定的嗎?
邵浩:這個問題是在我們去做這個任務之前就已經設定好的,比如天氣我會給它幾個槽位,一個叫「時間」,一個叫「日期」。訂票我會給它幾個槽位:出發地、目的地、出發時間、航班、機場。所以其實你可以任務它是人工設定的,這個問題簡單回答,就是人工設定的。
提問4:如果目標是從非關係資料庫中對知識進行存儲、抽取、推理,請問這個存儲是存儲在SQL還是noSQL比較好?
邵浩:像JENA、MongoDB、Dom4J,我們在工程中要根據具體場景選擇不同的資料庫的實現方式,。說實話,現在MySQL在某些場景下真的非常好用,還有MongoDB和ES,這種資料庫有時真的比圖資料庫的效率要高非常多。所以要根據具體的工程場景要實現什麼樣的功能去決定。
提問5:對目前的算法應用效果還不如正則或者模板效果好,那怎樣去選擇呢?
邵浩:它是一種融合性方法,我們在自己的聊天機器人系統中也有大量的,但是我們會設計一些多層的策略。比如說我們在意圖識別時會做一些策略,意圖前面我們會有一些規則,規則如果能覆蓋的精確性問題那最好,如果覆蓋不了的,我們用深度學習方法去進行意圖分類時還會採用融合方法(Stacking),我們會在融合之後綜合評判是不是要選取得分最高的那個模型最後明確意圖。
而且我們在做這個事情的時候一般都是返回top3或者top5,同時我們在後面模塊如果發現這個意圖進行不下去了,我們還有一個「拒識」模塊,我們即便是走通了也會把它「拒識」掉,這個要根據產品的效果去選擇的。
提問6:意圖識別全靠人工編輯所有意圖規則在進行判斷嗎?還有其他方法嗎?
邵浩:我剛才舉的例子是用規則來進行意圖識別的,但我後面有一個PPT還講到,意圖識別其實是一種融合性方法,所以可以你先有規則,然後後面再用一些深度學習方法,剛才我說的fastText也可以做這種意圖分類,但需要有大量的數據做監督學習。
提問7:怎樣自動化測試聊天機器人的效果?
邵浩:這個要看一下評測標準。我們自己內部會有自己的評測標準,這個評測標準包含幾百項測試,比如它的識音,它的識音還要分幾米,比如近場識音、遠場識音,然後它對話過程中的輪數、學習時間、對話的自然度、語音的自然度,等等,都會作為聊天機器人的測試效果。所以現在工程界並沒有一個非常準確的、嚴格的測試聊天機器人的效果的方法。如果你們想去參考的話,學術界有很多這種聊天機器人的評測,非常多的評測,大家可以去看一下,我們那本書也有一章寫了測評的方法。
提問8:意圖識別後的分類用哪種方式好?自上而下直接分發到domain或者bot,還是中控先分發、後收集反饋?
邵浩:每一家bot的做法都不太一樣,你說的domain其實是一種兩層次分類,我們是一種五層次分類。我們的做法會採用一個兩層策略,我們先做一個粗分類,然後有一個topK的結果,然後把這個topK的結果分發給K個子模塊進行執行,每個子模塊相當於是一種競爭關係,它們在執行完這些問題之後,給我了DM一個反饋。比如我是音樂模塊,我給我的DM反饋就是我覺得我做得最好,我給自己打10分,你願意不願意接受我這種分值。然後DM就會中控再決定我收集到的這些,比如我在500毫秒收集到所有模塊的反饋之後,再決定選擇哪個模塊進行最後的返回。所以這塊最後還是根據每家bot的系統不太一樣。
提問9:圖靈測試如果不能體現聊天機器人的先進性,那麼通過哪種測試來測試性能呢?
邵浩:這個跟剛才我說的那個問題一樣,學術界是有比較多評測數據的比賽,大家可以關注一下這些比賽,看一下理論界是怎麼做的。
提問10:在意圖識別中如果遇到一個query有多個意圖,該怎麼處理比較好?
邵浩:我們其實是有topK,會以它最後的分值來判斷。
提問11:NLU會做預處理嗎?
邵浩:會的,肯定會做的,而且都是單獨模塊,比如語氣詞、標準化,都是單獨模塊去做的。
提問12:詞義消歧怎麼做?
邵浩:詞義消歧有各種不同的方法,有基於規則的,還有基於熱度的。比如基於熱度,比如我們在講「737」時,它可能指737-800,也可能指737max,這時我們可能根據社交媒體的熱度,來判斷最近最火的新聞是737max飛機失事,這時我們就可以利用熱度進行消歧。消歧的方法還有很多種,我們可以利用上下文、熱度、貢獻詞,這個都可以去用的。
提問13:在垂直領域進行對話,利用知識圖譜,性能是否會有提升?
邵浩:肯定會有的,因為我們也做過很多類似於政府的垂直項目、醫療的垂直項目,利用知識圖譜會大大提升它的問答效果,這個肯定會的。
提問14:機器人處理的鏈路很長,如何平衡響應速度和鏈路模塊的質量?
邵浩:這個問題提得很好,因為我們現在聊天機器人裡有一個非常嚴重的問題叫「錯誤傳遞」,如果你串行模塊多的話,它的錯誤傳遞下來就會非常差。我們平衡時要根據具體情況,比如我們會設置一個「超時」,有些模塊並行處理時,我們會選擇沒有超時並且效果最好的那個處理。
提問15:如何衡量情感方面的好壞?
邵浩:我們自己有一個三層體系,大概27種判斷標準,這個可能也會根據具體的情況來具體判斷吧,沒有辦法給出一個標準的指標。
提問16:有什麼指標來判定閒聊回答的優點?
邵浩:最直接的一個指標就是看看用戶願意不願意跟你聊,小冰其實提出了很多指標,比如用戶跟你進行對話的輪數作為一個指標。
提問17:多輪意圖分類是怎麼實現的?
邵浩:我剛才在PPT裡應該說得比較清楚,「那明天呢」它沒有走到正常意圖裡,它正常意圖得分會非常低,它低於我們的域值,所以我們要麼丟棄它,要麼拒識,要麼判斷它是不是多輪的,如果它走到多輪裡,我們會利用多輪的狀態機進行它後面的問答。
提問18:檢索問答琥珀是否有用問題答案的匹配方法,還是只用問題和問題的匹配方法?
邵浩:這個問題問得比較好,我們兩種都用。因為什麼?因為我們的log數據是非常多的,這個可能又涉及到我們比較底層的東西,我就不多說了。我們兩種方法都會用,而且問題到答案的這種方法,有時是把問題通過其他的方式生成答案之後再進行匹配的,這個方法是很有效的,建議大家去嘗試一下。
關注AI科技大本營微信公眾號,回覆:機器人,獲取本次公開課演講PPT。公開課講師申請,請聯繫微信1092722531
◆
CTA核心技術及應用峰會
◆
5月25-27日,由中國IT社區CSDN與數字經濟人才發展中心聯合主辦的第一屆CTA核心技術及應用峰會將在杭州國際博覽中心隆重召開,峰會將圍繞人工智慧領域,邀請技術領航者,與開發者共同探討機器學習和知識圖譜的前沿研究及應用。
更多重磅嘉賓請識別海報二維碼查看,目前會議早鳥票發售中(原票價1099元),點擊閱讀原文即刻搶購。添加小助手微信15101014297,備註「CTA」,了解票務以及會務詳情。