來關軍 于丹 閆曉宇 肖鵬



摘? 要:世界上很多高價值的數據信息儲存在關系數據庫中,訪問這些數據需要掌握專門的結構化查詢語言(SQL),普通人很難直接使用。基于對現有對話機器人存在的問題和相關關鍵技術的梳理,本文融合了數據倉庫、數據同步、數據庫查詢、消息推送、自然語言理解及語音識別等相關技術及產品,設計了數據庫驅動的對話機器人。方案可以實現用戶理解、消息推送、事實數據查詢和分析數據查詢四個功能,使得用戶能夠快速地獲取信息。本文提出的數據庫驅動的對話機器人具有較強的泛化性和可擴展性。
關鍵詞:關系型數據庫;對話機器人;SQL;消息推送
Abstract: Many high-value data in the world are stored in relational databases. Access to these data requires a special Structured Query Language (SQL), which is difficult for ordinary people to use directly. Aiming at problems of the existing chatbot, this paper proposes to design database-driven chatbots by integrating related technologies and products, such as data warehouse, data synchronization, database query, message push, natural language understanding and speech recognition. The solution realizes four functions: user understanding, message push, fact-data query and analysis-data query, so that users can quickly obtain information. Database-driven chatbots proposed in this paper has a capability of strong generalization and scalability that enable chatbots to work with data-driven conversations.
Keywords: relational database; chatbot; SQL; message push
1? ?引言(Introduction)
數據庫驅動的對話機器人是指人們可以通過自然語言完成信息查詢或者得到關注信息推送的對話系統。數據庫是指長期存儲在計算機內有組織的、可共享的數據集合,它的概念比較寬泛,在本文中數據庫特指關系型數據庫。對話機器人是一種以自然語言在計算機與人之間進行交互的軟件[1]。近年來,它開始應用于日常生活的方方面面,例如服務臺工具、自動電話應答系統等,以促進教育、醫療、電子商務等領域服務質量的提升。
研究數據庫驅動的對話機器人具有深遠的應用價值。對于企業的各種應用系統,其信息更多地存儲在業務數據庫中,包括Oracle、SQL Server、MySQL等關系型數據庫。而關系型數據庫的查詢還是一個比較專業的領域,對大眾并不友好。采用人機對話的方式,通過對話機器人來查詢數據是一個很好的方向,它使用戶直接以自然語言的方式,向數據庫系統發問并獲得所需信息,從而大大提升人機交互的容易程度;另一方面,當人們關注的主要信息在數據庫中有所更新時,也能第一時間主動地通知用戶。這樣的對話機器人能夠提高用戶獲取信息的友好性和便捷性,具有更廣泛的實用價值和社會意義。
關于數據庫驅動的對話機器人的研究和技術實現,遇到的主要問題包括以下三個方面:
(1)對話機器人理解用戶的需求和自然語言非常困難。由于自然語言的創造性、遞歸性、多義性、主觀性和社會性等特點[2],既讓人類的自然語言具備強大的表達力和生命力,同時呈現出非常復雜且難以捉摸的情景,因此讓計算機去準確理解人類語言是首要的問題。
(2)現在對話機器人對于數據庫的查詢通常是被動的,缺少主動推送信息。即針對用戶的提問和聊天,對話機器人或者被動應答,或者被動查詢數據庫,總之,被動地提供反饋,主動性不足。
(3)現在對話機器人對業務數據庫進行直接查詢通常會對現有業務系統造成性能和安全影響,特別是對統計性結果的查詢影響更大。
針對以上問題,本文基于現有開放的軟件產品和服務,提出了數據庫驅動的對話機器人的一種技術實現方案。該方案可以方便快捷地構建對話機器人,使用戶通過語音或者文本查詢數據庫內容,并在數據庫相關內容更新時主動地向用戶發送推送信息,使用戶能夠更便捷地獲得數據庫中的內容,簡化了用戶的信息獲取方式。
2? ?相關研究和技術(Literature review)
數據庫驅動的對話機器人技術實現所面臨的主要技術挑戰分別是自然語言理解、消息推送以及數據庫設計和優化。
在自然語言理解和實現方面,隨著1995年以來信息檢索技術的發展,Baidu、Google等搜索引擎公司計算能力的飛速提升,以及2005年后互聯網業的蓬勃發展和移動終端的迅速普及,自然語言理解的研究進展迅猛,也產生了一系列比較成熟的聊天系統,比如蘋果的Siri、微軟的Cortana、Facebook的Messenger、Google的Assistant等[3]。這些跨平臺型人工智能機器人借助本公司在大數據、自然語義分析、機器學習和深度神經網絡方面的技術積累,精煉形成自己的真實語料庫,在不斷訓練的過程中通過理解對話數據中的語義和語境信息,實現超越一般簡單人機問答的自然交互。相比國外,我國在智能聊天領域的投入規模和研究水平上都有著不小的差距,研究成果并不顯著。但是有多所高校在此領域成績顯著,主要集中在自然語言處理工具的開發上,比如哈爾濱工業大學的HIT工具(中文詞法分析、句法分析和語法分析)以及臺灣“國防大學”的CQAS中文問答系統(側重于命名實體及其關系的處理)等[4]。因此,借助現有成熟的自然語言理解平臺和工具,開發對話機器人可以起到事半功倍的效果。
在消息推送的研究和實現方面,目前服務端給客戶端推送消息,普遍做法是客戶端與服務端維持一個長連接,客戶端定時向服務端發送心跳以維持這個長連接。當有新消息過來的時候,服務端查出該消息對應的TCP Channel的ID,并找到對應的通道進行消息發放[5]。在此之上,又衍生出針對消息的發布/訂閱模型,客戶端可以訂閱某一個Topic,服務端根據Topic找到對應的Channel進行批量的消息發放。在此基礎上又衍生出了如MQTT等開源協議用于定義以上過程[6]。在如今動輒成千上萬用戶量的情況下,如何應對大規模的消息下發以及如何保證消息推送的及時性、高可靠性和高可用性是消息推送的技術難點。目前,國內較為常用的第三方推送服務工具有極光推送、騰訊信鴿、百度云推送、華為推送、小米推送等。通過基于第三方的消息推送云服務,來保障消息推送的及時性、高可靠性和高可用性。
在數據庫設計和優化方面,近年來各種數據庫層出不窮,解決各領域內具體的業務問題。經過了60多年發展的關系型數據庫主要存儲和管理結構化的數據,應用于聯機事務處理系統(On-line Transaction Processing, OLTP),但對超大規模的數據管理,特別是橫向擴展方面支持不足[7]。NoSQL數據庫是關系型數據庫的一種補充,不使用模式(Schemaless)或使用靈活的模式追求高性能和高吞吐量,可以支撐超大規模數據的橫向擴展,主要管理非關系型數據,但它不支持ACID和事務,不支持關聯,缺少標準接口[8]。隨著數據量的增加以及數據統計、分析和挖掘的需求,各種數據倉庫和大數據處理平臺也同步快速發展,包括MPP平臺和Hadoop生態平臺,可以廣泛應用于聯機分析處理系統(On-line Analytical Processing, OLAP)。針對不同的業務需求以及數據規模,采用不同的適合的數據庫并進行優化,是實現技術方案適用性的首要準則。
3? ?技術方案(Solution)
一個數據庫驅動的對話機器人應該包括四個功能。首先,該對話機器人能夠通過文字或語音理解用戶的意圖;其次,該對話機器人在用戶關心的信息發生變化后能夠主動通知用戶;第三,該對話機器人能夠幫助客戶在不知道數據庫表結構的情況下,從數據庫中查詢到特定的事實數據;最后,該對話機器人能夠從數據庫中查詢到分析型的數據。
基于以上四種功能,本文提出的總體框架包括用戶理解、消息推送、事實數據查詢、分析數據查詢四個服務,具體如圖1所示。
首先,用戶理解服務實現對話機器人能夠通過文字或語音理解用戶意圖的功能,包括文本處理模塊、語音識別模塊和自然語言理解模塊三個部分。
其次,消息推送服務實現對話機器人在用戶關心的信息發生變化后主動通知用戶的功能,包括文本處理模塊、數據庫監聽模塊和業務數據庫三個部分。
第三,事實數據查詢服務實現對話機器人幫助用戶在不知道數據庫表結構的情況下從數據庫中查詢到特定事實數據的功能,包括SQL解析器、以個體為中心的數據集市、業務數據庫及ETL四個部分。
最后,分析數據查詢服務實現對話機器人從數據庫中查詢分析型數據的功能,包括SQL解析器、分析型多維數據倉庫、業務數據庫及ETL四個部分。
3.1? ?用戶理解服務
用戶理解服務是與用戶溝通的接口,主要功能是理解用戶的語音和文本,并將結果或者消息告知用戶。其結構如圖2所示。
其中,文本處理模塊把用戶的文本輸入直接傳遞給自然語言理解模塊;語音識別模塊把用戶的語音輸入轉換成文本傳遞給文本處理模塊,并最終傳遞給自然語言理解模塊。另外,文本處理模塊接收來自自然語言理解模塊的文本,并將文本展示給用戶查看。語音識別模塊主要是接收語音,并把語音轉化為文本,在本技術實現中采用百度的語音識別服務。自然語言理解模塊則接收文本,理解文本,并進行語義表示,生成意圖和實體,在本技術實現中采用Google的API.AI服務。
在語音識別模塊中,當用戶輸入為語音時,需要將語音轉換為文本,采用的技術為語音識別技術(Automatic Speech Recognition, ASR)。ASR是以語音為研究對象,通過語音信號處理和模式識別讓機器自動識別和理解人類口述的語言,本質上是一種模式識別系統,包括特征提取、模式匹配、參考模式庫等三個基本單元[9]。目前市場上有很多家的語音識別接口可用,國內的百度、阿里巴巴、騰訊、華為和科大訊飛,國外的微軟和谷歌都提供了中文的語音識別接口,包括SDK和Web API。百度語音識別技術領先,近場中文普通話識別準確率達98%,簡單快速且支持API及多種SDK接入。本文采用百度語音識別接口,完成語音向文本的轉換。
在自然語言理解模塊中,根據用戶的自然語言輸入來理解用戶的意圖,其目標是將自然語言文本信息轉換為可被機器處理的語義表示。語義表示可以用“意圖+槽位”的方式來描述。意圖即這句話所表達的含義,槽位即表達這個意圖所需要的具體參數。自然語言理解(Natural Language Understanding, NLU)的挑戰主要包括三個:首先,語音識別錯誤率通常在10%—20%,這會影響語義理解的準確性;其次,通過自然語言表達的語義存在不確定性,同一句話在不同語境下的語義可能完全不同;最后,在自然語言中往往存在不流暢性、錯誤及重復等情況[10]。針對這些挑戰,目前有一些公司將NLU作為一種云服務提供,方便其他產品快速地具備語義理解能力,比如Facebook的WIT.AI、Google的API.AI
和微軟的LUIS。使用者上傳數據,平臺根據數據訓練出模型并提供接口供使用者調用。
API.AI是一個為開發者提供服務的機器人搭建平臺,幫助開發者迅速開發一款bot并發布到各種message平臺上。使用API.AI可以將用戶輸入的自然語言翻譯成一種“程序能讀懂”的語言,并以JSON的格式返回結果。使用API.AI包括五個步驟:首先是自定義Entity,然后是自定義Intents和Action,接著上傳數據,再使用API.AI的訓練器進行模型的訓練并得到分類器,最后是整合和發布,可以用Web Service的方式提供服務。使用API.AI的好處是能夠快速地搭建出數據驅動的NLU模塊,本文采用API.AI提供的云服務完成自然語言理解的功能。
3.2? ?消息推送服務
消息推送服務的主要功能是監控數據庫中用戶特別關注的信息的變化,當相應的信息發生變化后,準實時且主動地通知用戶。其結構如圖3所示。
其中,業務數據庫為關系型數據庫,具體選擇為MySQL數據庫,用于存儲數據和信息;數據庫監聽模塊監控MySQL的Binlog日志,準實時增量更新用戶關注的信息,并將更新的信息以消息的形式發送至消息推送模塊;當消息推送模塊接收到要推送的消息任務后,將消息推送給相關用戶的文本處理模塊;文本處理模塊則將消息以文本的方式展示給用戶。其中,數據庫監聽模塊采用阿里巴巴的Canal工具,消息推送模塊采用百度云推送。
在消息推送模塊中,消息推送是指通過后臺將用戶強烈關心的信息主動地發送給用戶,可通過短信、即時信息(Instant Message, 如微信、釘釘等)、非即時消息(比如手機App中新聞資訊類、活動推送類、產品推薦類、系統功能類的通知)等方式發送,其中短信的用戶查看率高,但價格昂貴,非即時消息成本次之,即時信息免費。消息推送的實現有兩種主要方式,第一種方式是自己研發,但由于研發成本較高,難度非常大,大多數App都會選擇使用第二種方式,即使用第三方工具進行推送。本文采用百度云推送。百度云推送(Push)是百度云平臺向開發者提供的消息推送服務,通過云端與客戶端之間建立穩定、可靠的長連接來為開發者提供向用戶端實時推送消息的服務。
在數據庫監聽模塊中,需要實時監控業務數據庫的變化,當數據庫中用戶最關心的數據發生變化時,要將相應的變化發送給特定的人。監控業務數據庫變化的方法有多種,一種方法是在數據庫增加觸發器(Trigger)。觸發器是由事件來觸發某個操作,這些事件包括INSERT語句、UPDATE語句和DELETE語句,當數據庫系統執行這些事件時,會激活觸發其執行相應的操作。這種方法操作簡單,但是會對原業務系統造成很大的影響,特別是性能壓力方面。第二種方法是通過第三方軟件平臺,比如阿里巴巴的開源框架Canal,監控數據庫的Binlog,進而同步增量數據。這種方法對原業務系統的影響更小。Canal的工作原理是模擬MySQL Slave的交互協議向MySQL Mater發送Dump請求,MySQL Mater收到請求后,向Canal推送Binlog,然后Canal解析Binlog,再發送數據到存儲目的地,實現數據庫鏡像、數據庫實時備份、增量數據處理等。Canal的好處在于對業務代碼和數據庫沒有侵入,實時性也能做到準實時,因此是在很多企業中廣泛應用的一種比較常見的數據同步方案。
本文采用Canal監控用戶關心的增量數據,并將數據發送到消息隊列,然后通過百度云推送,發送給用戶。
3.3? ?事實數據查詢服務
事實數據查詢服務的主要功能是根據意圖和實體,查詢數據庫中用戶關心的實際數據(業務數據、存儲的數據),并將查詢結果反饋出去,其結構如圖4所示。
其中,SQL解析器根據意圖和實體,生成相應的數據庫查詢語句(SQL):意圖是指要查詢的表;實體(槽)是參數,包括主鍵和需查詢的列名。以個體為中心的數據集市是一種數據倉庫,內容是根據用戶的所有業務活動,使用ETL(Extract-Transform-Load)工具重新組織的業務數據。業務數據庫為關系型數據庫,具體選擇為MySQL數據庫。
在構建以個體為中心的數據集市方面,由于業務數據庫邏輯復雜,且運行穩定,通過SQL解析器生成的SQL直接訪問業務數據庫,一方面會對原始業務造成很大的影響,另外一方面也會增加上游自然語言理解模塊的訓練復雜度,因此需要將原始的業務數據庫通過ETL轉化為以主數據為中心的新型數據倉庫。ETL將數據從來源端經過抽取(Extract)、轉換(Transform)、加載(Load)到目的端。其中,Extract即數據抽取,就是把數據從數據源讀出來;Transform即數據轉換,就是把數據轉換為特定的格式;Load即數據加載,把處理后的數據加載到目標處。
在構建以個體為中心的數據集市中,主數據(Master Data)是指具有高業務價值的、可以在企業內跨越各個業務部門被重復使用的數據,是單一、準確、權威的數據來源,比如教學系統中的學生、老師等。建立以主數據為中心的數據庫是指首先識別出主數據,然后將所有的業務數據同主數據直接關聯。以學校管理系統中的學生為例,其數據庫ER圖如圖5所示。
學生是學校中各個部門都要使用的基礎數據,必須要保證準確唯一,通過學號可以確定唯一的學生。學生會涉及選課、住宿、考試、食堂消費等活動,這些活動的數據即是業務數據,所有這些業務數據都可以通過學號與學生關聯起來。這樣在對數據庫進行查詢時,只需要知道學號以及要查詢的具體內容(選課、考試、住宿、食堂),即可由SQL解析器生成相應的SQL,查詢得到相應的結果。這樣的好處是可以將原始的業務數據同對話機器人的數據庫進行隔離,提高了系統的穩定性和安全性;另一方面,在自然語言理解方面,可以更明確地定義意圖和相關的語義,在不需要了解底層數據庫結構的情況下得到相應信息。
3.4? ?分析數據查詢服務
分析數據查詢服務的主要功能是根據意圖和實體,查詢數據庫中用戶關心的分析型結果,并將查詢結果反饋出去。其結構如圖6所示。
其中,SQL解析器和業務數據庫內容與事實數據查詢服務中的內容相同;分析型多維數據倉庫是將業務數據庫中的數據經過ETL過程整理得到的多維數據倉庫模型。本文選用Apache Kylin對多維數據倉庫中的統計結果進行提前計算,以備查詢需要。
在構建分析型多維數據倉庫方面,用戶對數據庫的查詢并不都是對某一條記錄的查詢,有時查詢的內容是統計結果,比如某門課的學生人數是多少,食堂里每人的平均消費是多少等,本文稱這類查詢為分析型查詢。同理,基于數據安全性、業務數據庫的壓力以及查詢的效率考慮,需要通過ETL將業務數據庫中相對分散和孤立的數據轉換到分析型多維數據倉庫中。
本文的多維數據倉庫具體采用星型模式。星型模式的核心是一個大的中心表(事實表)和一組小的附屬表(維表)。其中,事實表用來記錄具體事件,包含每個事件的具體要素和具體發生的事情,主要包含維和度量兩方面的信息。維的具體描述信息記錄在維表,事實表中的維屬性只是一個關聯到維表的鍵,并不記錄具體信息。度量記錄事件的相應數值,比如商品銷售中產品的銷售數量、銷售金額等。某零售行業的數據倉庫星型模式示例如圖7所示。
其中銷售為事實表,時間、物品、品牌和商店為維度表,這樣對于銷售事實表來說,時間、物品、品牌和商店是維,銷售金額和銷售個數是度量值。
采用星型模式這種多維數據倉庫模型的優點是其面向分析優化的數據組織和存儲模式。由于在實時查詢統計信息時,直接計算速度比較慢,本文選擇Apache Kylin對多維數據倉庫進行管理和計算。Apache Kylin是一個開源的、分布式的分析型數據倉庫,提供Hadoop/Spark之上的SQL查詢接口及多維分析(OLAP)能力以支持超大規模數據,它能在亞秒內查詢巨大的表。
4? ?結論(Conclusion)
本文提出了一種數據庫驅動的對話機器人的技術實現方案,可以實現用戶通過語音或自然語言文本同對話機器人溝通,查詢數據庫中的事實記錄和統計結果,并在用戶關注的信息發生改變時主動通知用戶的功能。該技術方案的主要思想是立足于“以用戶為中心”的服務理念,借鑒語音識別、自然語言處理、消息推送、數據庫設計和優化方面的先進技術和方案,整合成一個對用戶更友好的平臺,幫助用戶便捷地獲得高價值的信息。針對語音識別、自然語言理解、消息推送和數據庫優化方面的技術難點,本技術方案分別采用了百度語音識別、Google API.AI、百度云推送、阿里巴巴Canal、Apache Kylin等成熟的云服務、技術和平臺,在滿足功能的同時,也能夠實現可靠性、可用性、魯棒性以及擴展性方面的需求。
不過,現有的技術方案還只是把查詢結果或者推送的消息直接反饋給用戶,沒能實現以更自然的語音或者自然語言文本的方式告知用戶,這涉及自然語言生成相關的技術。另一方面,本文提出的是一種技術實現方案,還沒有針對一個行業具體落地。因此,下一步我們計劃針對高校的學生,實現數據庫驅動的對話機器人,以滿足其對學習、考試方面信息的查詢需求。
參考文獻(References)
[1] 侯佳騰,常薇,林冠峰.基于自然語言理解技術的智能客服機器人的設計與實現[J].電子技術與軟件工程,2019(23): 238-240.
[2] Hafezi Manshadi, Mohammad. Dealing with quantifier scope ambiguity in natural language understanding[D]. Rochester: University of Rochester, 2014.
[3] 王浩暢,李斌.聊天機器人系統研究進展[J].計算機應用與軟件,2018,35(12):1-6;89.
[4] 夏艷輝,聶百勝,胡金鳳.中文開放域問答系統的問題分類研究[J].價值工程,2019,38(016):147-149.
[5] 曹鵬飛,李杰,楊君.云環境下實時消息推送服務構建研究[J].計算機技術與發展,2020,30(03):204-208.
[6] 關慶余,李鴻彬,于波.MQTT協議在Android平臺上的研究與應用[J].計算機系統應用,2014,23(04):197-200;196.
[7] 連樂,付杰.無線監測系統的數據處理方法研究[J].計算機科學,2018,45(0z1):580-582.
[8] 申德榮,于戈,王習特,等.支持大數據管理的NoSQL系統研究綜述[J].軟件學報,2013(08):96-113.
[9] 程建軍,胡立志.關于深度學習的語音識別應用研究[J].科技經濟導刊,2019,27(12):195.
[10] 侯沐瀾.面向自然語言理解的新槽值問題研究與應用[D].北京:北京郵電大學,2019.
作者簡介:
來關軍(1984-),男,碩士,中級研究員.研究領域:大數據分析,人工智能.
于? ?丹(1976-),女,博士,研究員.研究領域:數據分析與挖掘,人工智能.
閆曉宇(1995-),女,碩士,初級研究員.研究領域:自然語言處理,對話系統.
肖? ?鵬(1993-),男,碩士,初級研究員.研究領域:計算機視覺,自然語言處理.