


摘? 要:對話機器人是使用自然語言處理與生成技術,模擬人類對話邏輯并與人進行交流的計算機程序。作為新一代人工智能產品的人機交互主要入口,邏輯實現方式與交互是對話機器人設計的關鍵。本文結合對話機器人的技術特點,在實現過程中采用基于Python語言的Django微服務Web應用開發框架,將對話算法模型與邏輯處理過程進行微服務化API封裝,使其他應用能夠請求對話服務的接口進行功能的二次開發。為了提高對話響應速度,本文采用了關系型數據庫MySQL與基于內存的非關系型數據庫Redis結合的方式,減少算法模型對硬盤的讀取次數,優化了用戶體驗。
關鍵詞:微服務;Django;MySQL;Redis
Abstract: A chatbot is a computer program that simulates human conversation and communicates with human through natural language processing and generation technology. As main access to human-computer interaction for a new generation of artificial intelligence products, logical implementation and interaction are critical to the design of chatbots. Based on technical characteristics of chatbots, this paper adopts Python-based Django micro-service web application development framework in the implementation and encapsulates dialogue algorithm model and logic processing process into a micro-service API (Application Programming Interface). Thus, other applications can request the interface of dialogue service for a secondary development of functions. In order to improve the efficiency of query processing, a memory-based non-relational database Redis (Remote Dictionary Server) is used with relational database MySQL (Structured Query Language) to reduce the number of reads from hard disk and so to optimize system performance.
Keywords: micro-services; Django; MySQL; Redis
1? ?引言(Introduction)
對話機器人是當前人工智能領域的研究熱點,它應用自然語言處理與生成技術,以聊天界面或API為基礎,能夠與人進行語音或文本對話,以聊天的方式解決用戶的需求[1]。對話算法主要包括以下幾個過程:自然語言理解、對話狀態追蹤[2]、對話內容管理[3]、自然語言生成[4]。但是上述過程的核心算法都是基于Python編程語言開發的,與網站軟件開發或終端硬件開發的技術架構并不兼容。為了適應越發復雜的大型網站系統單體架構,微服務技術應運而生,其核心思想是各種自治的子系統協同工作,共同完成大型網站的功能和業務需求[5]。
對話機器人與其他微服務程序不同的地方在于:處理對話邏輯需要大量高頻重復且復雜的計算過程和頻繁的存取硬盤數據的過程。隨著使用對話的用戶規模變大,由于硬件資源有限,對話程序在運行過程中很容易造成對話響應速度變慢、對話邏輯處理不完整甚至是服務宕機等現象,嚴重影響用戶體驗。
針對上述問題,本文在技術實現過程中采用基于Python語言的Django開發框架,并根據業務邏輯將對話模型進行模塊拆分,在模塊之間添加Redis緩存[6],用內存中的讀寫過程替代了高頻的復雜計算和高頻的硬盤存取過程。
2? ?相關技術(Related technologies)
2.1? ?Python
Python是由Guido van Rossum在20世紀80年代末到90年代初于荷蘭國家數學和計算機科學研究所設計出來的一種結合了解釋性、編譯性、互動性和面向對象的高級程序設計語言。它具有易于學習與維護、可移植、可擴展、可嵌入等特點。Python由于代碼簡潔、基礎代碼庫完善等優勢,已經應用于人工智能、Web應用開發、運維系統開發、游戲開發等重要領域。Python語言在人工智能領域被廣泛應用是因為它對科學計算的友好支持[7],包括基礎的Numpy、Pandas、Scikit-learn等科學計算工具箱和Tensorflow、Pytorch、Caffe等深度學習開發框架都是以Python語言為基礎進行封裝的。
2.2? ?Django
Django是一款基于Python的免費開源的Web應用開發框架,采用了MVT的框架模式,即模型M(Model)、視圖V(View)和模板T(Template),于2008年9月發布了第一個正式版本1.0。MVT模式將傳統MVC模式中的Controller層拆分成業務邏輯操作與請求的處理與轉發,將業務邏輯操作結合到了View層中,View通過調用Model層與Template層,根據HTML、CSS、JavaScript等對數據進行渲染后返回給前端瀏覽器界面。同時新增了一個URL分發器,負責將不同的URL請求分發給不同的View進行業務邏輯處理。Django擁有強大的數據庫功能,并自帶一套功能完備、界面美觀的管理后臺。由于Django具有低耦合、開發快捷、部署方便、復用性高、運維成本低、完善的開發者社區等優點,近些年來許多大型網站的開發都選擇Django作為Web應用核心開發框架,例如YouTube、Google、Instagram、Reddit,以及國內的豆瓣、知乎等。
Django框架原理如圖1所示。首先,客戶端向服務發送HTTP請求,由WSGI(Web Server Gateway Interface)模塊統一進行協議處理后,發送給請求中間件,并由請求中間件交由URL分發器進行統一分發。若找不到對應的URL地址,則直接返回給響應中間件,經過WSGI模塊統一處理后返回給瀏覽器。若找到對應的URL地址,則由視圖中間件進行處理后映射到View層中的函數。View層的函數根據業務邏輯判斷是否需要調用Model層,Model層利用對象關系映射(Object-Relational Mapping,ORM)[8]將數據庫表抽象成Python中的類,數據庫表中的字段抽象成Python類中的屬性,通過對Model層的類的操作得到數據庫的API,避免了復雜的數據庫語句編寫。View層在調用Model層的同時從Template層的靜態資源庫中調用HTML/CSS/JavaScript資源,并將數據和頁面解析、渲染成HTML頁面,經事務中間件處理后返回給響應中間件,由響應中間件交給WSGI模塊統一處理后返回給瀏覽器。
2.3? ?MySQL數據庫
MySQL在Web應用方面是最好的RDBMS(Relational Database Management System,關系數據庫管理系統)應用軟件之一,由瑞典的MySQL AB公司開發,屬于Oracle旗下產品。數據庫(Database)是按照數據結構來組織、存儲和管理數據的應用程序。關系型數據庫是建立在關系模型基礎上的數據庫,借助于集合、代數等數學概念和方法來處理數據庫中的數據。在關系型數據庫中,數據以表(Table)的形式出現,表中的每一行稱為一條記錄,表中的每一列稱為一個屬性,表與表之間以代數關系為基礎組成完整的系統數據。數據庫表的結構設計決定了數據庫的性能,合理的數據庫結構可以讓使用者在每次訪問最少數量的表的前提下完成業務需求。MySQL數據庫使用標準的SQL語言形式對數據進行增加、刪除、修改、查詢等操作,由于其體積小、速度快、成本低、使用靈活等特點被應用于中小型網站開發。
2.4? ?Redis
遠程字典服務(Remote Dictionary Server, Redis)是一個基于key-value形式存儲的NoSQL數據庫[9],用哈希表表示key與value之間的映射關系,可用key值迅速查詢對應的value值[10]。Redis使用ANSI C編寫,包含五種數據結構,并且支持網絡通信和多語言API,遵守BSD協議,可擴展性強,可選作持久化存儲[11]。由于Redis的數據以key-value的形式存儲在內存中,且Redis的事務操作具有原子性,因此比硬盤讀寫更迅速,讀取速度可以達到110,000 次/秒,寫入速度可以達到81,000 次/秒[12]。Redis通常應用在“高頻讀、低頻寫”的熱點數據緩存、計數器、消息隊列、排行榜、社交網絡、訂單系統等高吞吐、高并發場景。
3? ?流程設計與實現(Process design and implementation)
3.1? ?對話服務問答流程
基于Django的對話機器人服務流程如圖2所示。
(1)對話服務從前端接收參數sentence和userId。其中sentence為用戶輸入的句子,userId為用戶的唯一標識。
(2)Django框架中的View層函數解析參數sentence和userId。
(3)以sentence為key在Redis的nlu目錄中進行查詢。若查詢到記錄,則將value取出作為dialogue,并更新生命周期為604,800 秒;若查詢不到記錄,則將sentence傳入NLU模塊進行理解,輸出作為dialogue,并將最新的理解結果寫入Redis。其中,dialogue為NLU模塊進行理解后的計算結果。
(4)以userId為key在Redis的userdst目錄中進行查詢。若查詢到記錄,則從value列表取出dst.state和keyword,并更新生命周期為604,800 秒;若查詢不到記錄,則初始化dst.state和keyword并寫入Redis。其中,dst.state為該用戶的對話狀態追蹤信息,keyword為該用戶上次對話的關鍵詞。
(5)將sentence,dialogue,dst傳入DPL對話策略學習模塊進行意圖識別。若DPL模塊處理結果顯示為非問答,則給出回應,并傳回給前端;若DPL模塊處理結果顯示為問答,則將處理后的問題question傳入QA模塊。
(6)以question為key在Redis的qa目錄中進行查詢。若查詢到記錄,則從value列表中取出answer,并更新生命周期為604,800 秒;若查詢不到記錄,則從數據庫中掃描關鍵詞并進行問答對匹配傳回給前端,同時將問答對寫入Redis,并更新生命周期為604,800 秒。
通過上述流程,高頻輸入的句子、高頻活躍的用戶對話狀態追蹤和高頻匹配的問答對全部被緩存至Redis之中。其他用戶請求服務時,若輸入的是經常被輸入的語句和經常被理解的問題,則直接從Redis數據庫中讀取內容,不必進行煩瑣的計算過程和緩慢的讀硬盤過程。
3.2? ?MySQL數據庫結構設計
由于對話機器人模型首先需要掃描對話域內的關鍵詞,匹配成功后再掃描該關鍵詞分支下的全部問答對,因此將關鍵詞表中的keyword字段作為問答對表的外鍵。關鍵詞表和問答對表如表1和表2所示。
3.3? ?Redis存儲策略設計
根據對話機器人模型的流程可知,高頻輸入語句的NLU計算結果、用戶狀態和用戶對話關鍵詞、高頻問答對匹配結果可以在Redis進行緩存處理。其中,高頻輸入語句的NLU計算結果用set命令存入chatbot:nlu目錄下,以sentence為key,以dialogue為value,生命周期為604,800 秒;用戶狀態和用戶對話關鍵詞用lpush命令存入chatbot:userdst目錄下,以userId為key,以dst和keyword為value列表,生命周期為604,800 秒;高頻問答對匹配結果用set命令存入chatbot:qa目錄下,以question為key,以answer為value,生命周期為604,800 秒。
4? ?性能分析(Performance analysis)
4.1? ?系統硬件指標及測試工具
本文的對話機器人服務開發采用的是Windows 64位操作系統上位機,處理器為Intel(R)Core(TM)i7-8565U CPU @ 1.80 GHz 2.00 GHz,核心數8 個,內存為16 GB、2400 MHz頻率,服務部署于開發機上。性能指標測試收集工具采用的是Postman請求模擬器v7.34.0和Apache Server中的ab.exe組件。
4.2? ?單個請求響應時間測試
首先由一個新用戶向對話服務發問,然后更換用戶再向對話服務問相同的內容,記錄請求的響應時間。如圖3和圖4所示,新用戶向對話服務發問時請求完成時間為345 ms,而更換用戶后問相同問題時請求完成時間僅為83 ms。因為前一名用戶的語義理解結果和問答對匹配結果已經被記錄至Redis中,新用戶的發問請求只需在Redis中讀取數據,無須進行復雜的計算和數據庫讀取。
4.3? ?并發請求測試
設置Apache Server ab.exe組件的參數-n與-c分別為{0,10,100,1000,10000}和{0,10,100,1000,10000}。其中,-n為總請求數,-c為并發請求數。記錄服務的吞吐率(Requests per Second,RPS,單位為req/s)和平均請求完成時間(Time per Request,TPR,單位為ms),測試結果如表3所示。
由測試結果可知,對話服務在4.1節的運行條件下,接收100 個并發請求的時候達到性能瓶頸,此時RPS達到25左右,且隨著并發量增加RPS不再變化;TPR為40 ms左右,且隨著并發量增加TPR不再變化。
5? ?結論(Conclusion)
本文從對話機器人算法流程出發,根據對話算法使用框架的特點,在技術實現過程中采用基于Python編程語言的Django微服務框架對算法業務邏輯進行API封裝,以便他人調用API接口進行對話功能的二次開發;同時將復雜的計算流程和硬盤存取流程拆分,并將高頻訪問的句子、高頻使用用戶的對話狀態追蹤信息和高頻匹配的問答對進行Redis緩存處理及MySQL持久化存儲處理。對性能分析的結果表明,基于Django框架和Redis緩存的對話服務開發流程減少了計算過程和硬盤存取過程,能夠應對大規模的數據存儲需求。對話服務的請求響應迅速,吞吐率指標正常,在保證性能的同時優化了用戶體驗。
參考文獻(References)
[1] 楊曄.基于深度學習的聊天機器人的研究[J].信息技術與信息化,2020(03):158-159.
[2] Tsung-Hsien Wen, David Vandyke, Nikola Mrksic, et al. A Network-based End-to-End Trainable Task-oriented Dialogue System[C]. Proceedings of the 15th Conference of the European Chapter of the Association for Computational Linguistics(Volume 1: Long Papers), 2017:438-449.
[3] Chien-Sheng Wu, Andrea Madotto, Ehsan Hosseini-Asl, et al.? Transferable Multi-Domain State Generator for Task-Oriented Dialogue Systems[C]. Proceedings of the 57th Annual Meeting of the Association for Computational Linguistics, 2019:? 808-819.
[4] Hao Zhou, Tom Young, Minlie Huang, et al. Commonsense knowledge aware conversation generation with graph attention[C]. Proceedings of the 27th International Joint Conference on Artificial Intelligence, 2018:4623-4629.
[5] 徐維,劉屹.微服務技術框架在智慧警務應用中的優勢和缺點[J].信息通信,2019(08):82-83.
[6] 張永躍.基于微服務+Redis的政務數據共享模式設計[J].電子技術與軟件工程,2020(14):208-209.
[7] 呂戌杪,粟藝峰,張蒙蒙,等.基于Django的煤礦地測防治水信息管理系統的設計與實現[J].科技經濟導刊,2020,28(15): 13-14.
[8] 石鳳貴.基于MTV模式的遠程教學系統設計與實現[J].電腦知識與技術,2020,16(07):93-96.
[9] 屠雪真.一種大規模Redis集群云運維技術[J].電腦知識與技術,2019,15(08):1-3.
[10] 桂成杰,曾獻輝.結合Redis與WebSocket的智能空調移動環境實時控制技術[J].軟件導刊,2020,19(01):190-194.
[11] 王佩劍.基于Docker容器的Redis高可用實現方案[J].信息通信,2019(08):67-70.
[12] 寧方美,賀雪梅,牟晉娟.SpringBoot集成Redis緩存技術在企業一卡通系統中的應用[J].電子技術與軟件工程,2019? (24):133-134.
作者簡介:
孫小魚(1993-),男,碩士,初級研究員.研究領域:人工智能,微服務開發.