最近小馬在搞AI,目標是實現一個智能問答系統(tǒng)來支撐業(yè)務。經過了之前一段時間的基礎AI技術學習后,小馬開始NLP并調研智能問答系統(tǒng)。本文介紹如何5分鐘快速搭建一個智能問答系統(tǒng)。親測效果良好。
典型的QA 系統(tǒng)包括在線客戶服務系統(tǒng)、QA 聊天機器人等。大多數問答系統(tǒng)可以分為:生成式或檢索式、單輪或多輪、開放域或特定問答系統(tǒng)。
傳統(tǒng)的問答機器人大都是基于規(guī)則的知識圖譜方式實現,這種方式需要對大量的語料進行分類整理。
而基于深度學習模型的實現方式可以徹底擺脫對語料的預處理,只需提供問題和答案的對應關系,通過自然語言處理的語義分析模型對問題庫提取語義特征向量存入Milvus中,然后對提問的問題也進行語義特征向量提取,通過對向量特征的匹配就可以實現自動回復,輕松實現智能客服等應用。
一、理論準備
如何5分鐘快速搭建一個智能問答系統(tǒng),小馬最初受到啟發(fā)的是這個視頻教程《5分鐘搭建智能問答系統(tǒng)》,文章《快速搭建對話機器人,就用這一招!》--文章里有比較清晰的原理描述,但是發(fā)現教程中的項目版本已經過舊,而且資源已經被下架,所以視頻僅供參考。于是順藤摸瓜,找到最新相關教程的開源github地址(如果開源地址打不開了,來這里找或者找到文末源碼下載鏈接并找到下圖所示目錄中的教程文件),跟著這個教程走。(附:加載中文模型的參考文章《bootcamp問答系統(tǒng)部署》)

我們先來看看這個項目的描述。
This project combines Milvus and BERT to build a question and answer system. This aims to provide a solution to achieve semantic similarity matching with Milvus combined with AI models.
直譯為:
本項目結合 Milvus 和 BERT 構建問答系統(tǒng)。旨在提供一種解決方案,通過 Milvus 結合 AI 模型實現語義相似度匹配。
Milvus是一款全球領先的開源向量數據庫,賦能 AI 應用和向量相似度搜索,加速非結構化數據檢索。
Milvus is the most advanced open-source vector database built for AI applications and supports nearest neighbor embedding search across tens of millions of entries, and Towhee is a framework that provides ETL for unstructured data using SoTA machine learning models.

BERT是Google開發(fā)的一種基于Transformer的機器學習技術,用于自然語言處理(NLP) 預訓練。
BERT 是一個算法模型,它的出現打破了大量的自然語言處理任務的記錄。在 BERT 的論文發(fā)布不久后,Google 的研發(fā)團隊還開放了該模型的代碼,并提供了一些在大量數據集上預訓練好的算法模型下載方式。Goole 開源這個模型,并提供預訓練好的模型,這使得所有人都可以通過它來構建一個涉及NLP 的算法模型,節(jié)約了大量訓練語言模型所需的時間,精力,知識和資源。BERT模型的全稱是:BERT(Bidirectional Encoder Representations from Transformers)。從名字中可以看出,BERT模型的目標是利用大規(guī)模無標注語料訓練、獲得文本的包含豐富語義信息的Representation。
BERT模型簡介
BERT BASE: 與OpenAI Transformer 的尺寸相當,以便比較性能。
BERT LARGE: 一個非常龐大的模型,是原文介紹的最先進的結果。
BERT的基礎集成單元是Transformer的Encoder。
這里有一個BERT相關視頻教程《BERT從零詳細解讀,看不懂來打我》,涉及AE輸入形式? mask模型,其使用到概率學,所以無監(jiān)督學習依賴于訓練數據,需要從訓練數據中計算概率。
BERT是一個多任務模型,它的任務是由兩個自監(jiān)督任務組成,即MLM和NSP。
所謂MLM是指在訓練的時候隨即從輸入預料上mask掉一些單詞,然后通過的上下文預測該單詞,該任務非常像我們在中學時期經常做的完形填空。正如傳統(tǒng)的語言模型算法和RNN匹配那樣,MLM的這個性質和Transformer的結構是非常匹配的。
Next Sentence Prediction(NSP)的任務是判斷句子B是否是句子A的下文。相關還有教程1,2。
BERT其中的一個重要作用是可以生成詞向量,它可以解決word2vec中無法解決的一詞多義問題。獲取完BERT詞向量后還可以結合CNN、RNN等模型來實現自己的任務。

我們現在可以來看下系統(tǒng)的架構原理圖。


該系統(tǒng)可以將新的用戶問題與先前存儲在向量數據庫中的大量答案聯系起來。要構建這樣的聊天機器人,請準備您自己的問題數據集和相應的答案。將問題和答案存儲在關系數據庫 MySQL中。然后使用用于自然語言處理 (NLP) 的機器學習 (ML) 模型BERT將問題轉換為向量。這些問題向量在 Milvus 中存儲和索引。當用戶輸入一個新問題時,BERT 模型也會將其轉換為一個向量,Milvus 會搜索與這個新向量最相似的問題向量。問答系統(tǒng)對最相似的問題返回相應的答案。
系統(tǒng)會使用 Milvus 存儲和搜索特征向量數據,Mysql 用于存儲 Milvus 返回的 id 與問題數據集的對應關系,此時需要先啟動 Milvus 和 Mysql。
二、快速部署
根據教程,我們需要安裝 Milvus and MySQL。(注意參考視頻中用的不是mysql來支持,是PostgreSQL)
小馬的操作系統(tǒng)是ubuntu,并已安裝了docker。
1. Start Milvus and MySQL
Start Milvus v2.0
基于docker直接安裝好Milvus,Install Milvus Standalone這一步相對比較簡單照著教程敲就可以跑起來。
如果以上鏈接打不開,可以參考這個官方英文版教程。

wget https://github.com/milvus-io/milvus/releases/download/v2.2.0/milvus-standalone-docker-compose.yml -O docker-compose.yml


Start MySQL
照著命令敲就可以跑起來。

2. Start Server
現在我們需要起服務,教程提供了兩種方式:通過運行docker、運行源碼。如果是前者,需要注意參照教程設置好環(huán)境變量,而且需要注意跑起來的時候可能需要下依賴,其中報錯不好排查。為了更清晰直觀地學習,小馬采用后者的方式運行服務。
Install the Python packages
先將代碼拉取到本地,如果遇到git clone 等命令報錯等問題,請先解決git問題,不是本文重點不再贅述。
我們進去源碼的server目錄,cd server,進行pythone依賴包的安裝pip install -r requirements.txt??梢钥匆谎垡蕾囄募?。

這一步命令的運行可能會遇到各種報錯,請自行尋找解決方案。
比如,pymilvus只支持python >= 3.4,在3.4、3.5、3.6、3.7下進行了全面測試。所以如果系統(tǒng)默認的python命名運行的是python2.7版本的,就會報錯,需要更改命令執(zhí)行的默認版本或者更新pip到3版本等等。pip3 install -r requirements.txt,如果不行還可以嘗試更換源pip3 install -r requirements.txt -i https://pypi.douban.com/simple,或者直接指定命令版本python3 -m pip install -r requirements.txt來運行??傊@里要特別注意以py版本和源導致的報錯為解決方向。
wget the model
安裝完python依賴包之后,我們需要到cd server/src/model目錄下進行模型下載(注意如果是docker運行的server指定的模型文件解壓后目錄是server/src/models,這取決于配置文件的配置)。教程里指定的地址是英文的模型https://public.ukp.informatik.tu-darmstadt.de/reimers/sentence-transformers/v0.2/paraphrase-mpnet-base-v2.zip,這個模型將句子和段落映射到768維的密集向量空間,可用于聚類或語義搜索等任務。號稱是支持中英文的,小馬親測,中文效果不佳。于是很多教程是建議換成中文模型的(即:要更換為中文訓練模型,項目bootcamp默認是支持西文的。 bootcamp中text_search_engine默認使用的是paraphrase-mpnet-base-v2預訓練模型的,通過上面的修改也能對中文進行搜索,但其主要針對的是西文,如果要使用中文進行NLP檢索的話最好更換預訓練模型)。于是小馬就著手把這里的模型文件進行更換。
sentence-transformers框架包(如paraphrase-multilingual-MiniLM-L12-v2模型可以支持NLP文本相似度的計算),SBERT的作者發(fā)布了他們預訓練的SBERT模型。所有預訓練的模型可以在這里找到(也是教程默認的模型包含目錄),可惜沒有中文版的。sentence-transformers開源地址。
《Sentence-BERT實戰(zhàn)》通過SBERT查找相似句子,假設我們有一個電子商務網站,假設在我們的數據庫中有很多訂單相關的問題,比如How to cancel my order?, *Do you provide a refund?*等等?,F在當新問題進來時,我們的目標是找到與新問題最相似的問題。
SBERT模型是基于pytorch和transformers來實現的。
我們根據網絡推薦將模型文件換成這個訓練好的BERT中文模型:https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
chinese_L-12_H-768_A-12是谷歌google發(fā)布的唯一一個中文模型。
類似的有:
chinese_wwm_ext_pytorch是哈工大訊飛聯合實驗室發(fā)布的中文預訓練bert模型。
google-research? bert訓練好的模型。
Set configuration
同時按照參數表修改quick_deploy/server/src/config.py文件,修改MODEL_PATH地址為我們中文模型的路徑(需要特別注意,這里只是模型文件目錄的設置,具體目錄里面是什么模型文件內容可能還得通過復查確認并修改encode.py代碼來支持(可參考這里修改),即MODEL_PATH目錄下的文件應該要是直接為模型的幾個支撐文件):

插播一下:我們看到如果按照上文直接將上文提到的中文模型解壓到模型文件目錄,運行報錯:

檢查了下模型的目錄,chinese_L-12_H-768_A-12中文的有兩層上級目錄,目錄處理后與默認的英文模型來對比文件,確實模型文件中的內容不太相同(如上圖默認必須要有modules.json)。其實,谷歌官方發(fā)布的中文版chinese_L-12_H-768_A-12文件是基于TensorFlow的,TensorFlow可是谷歌旗下的寶貝,使用pytorch無法運行。不過據說有可以將其轉化為pytorch版本的腳本,可以自己搜一下。
Towhee is a machine learning framework that allows the creation of data processing pipelines, and it also provides predefined operators for implementing insert and query operations in Milvus.