全文共5101字,預計學習時長10分鐘
機器閱讀理解(MC)的源頭可以追溯至AI誕生之時。艾倫·圖靈在其著作《計算機和智能》中提出了衡量人工智慧的一項測試——圖靈測試。大約70年後,MC的子領域人機問答(QA)依然是AI領域最困難的任務之一。
然而自去年開始,得益於深度學習研究的發展和遷移學習技術的發明,自然語言處理(NLP)領域快速革新。在行業頂尖研究員的努力下,強大的預訓練NLP模型,如 OpenAI-GPT、 ELMo、BERT和XLNet 已走向社會。
有了這些發展,一些改良後的NLP系統和應用也即將面世。其中一個系統就是cdQA-suite。這是由筆者團隊、法國工程學院Telecom ParisTech和歐洲個人理財的領軍者BNP Paribas Personal Finance共同合作開發的軟體包。
開域QA vs 閉域QA
QA系統主要分為兩類,開域QA(ODQA)和閉域QA(CDQA)。
開域系統幾乎能處理所有問題,並且只依賴於通用的本體和世界知識。DrQA就是其中一個例子。它是由Facebook Research開發的開域系統,使用維基百科的大量文章作為知識來源。鑑於這些文章與幾個不同的主題和科目相關,因而該系統被視作開域系統。
另一方面,閉域系統處理的是某個特定領域的問題(例如醫學或汽車維護),並通過一個特定領域的資料庫獲取特定領域的知識。cdQA-suite旨在幫助人們快速創建閉域QA系統。
cdQA-suite
cdQA是一個端到端閉域問答系統
cdQA-suite由三個板塊組成:
· cdQA:方便快捷的Python軟體包,用於搭建QA管道
· cdQA-註解器:簡化問答數據集註解的工具,用於評估模型和進行微調
· cdQA-用戶界面:可接入任何網站和後端系統的用戶界面
下文將解釋各板塊如何運作,及如何通過該系統建立基於個人數據的私人QA系統。
cdQA架構基於兩個主要組件:檢索器和閱讀器。下圖展示了系統機制的結構。
將問題發送到系統時,檢索器會選擇資料庫中最有可能包含答案的文檔。該系統的基礎是與DrQA相同的檢索器,檢索器基於uni-gram和bi-gram創建TF-IDF特徵,並計算題幹與資料庫的每個文檔之間的餘弦相似性。
選擇了最貼近的文檔後,系統把每個文檔分為不同段落,將它們與問題一起發至閱讀器。本質上閱讀器是預訓練的深度學習模型。使用的模型是由HuggingFace提供的著名NLP模型BERT的Pytorch版本。然後,閱讀器輸出在每個段落中找到的最貼近的答案。之後,系統最後一個層級將用內部評分函數比較答案,根據分數輸出最貼近的答案。
使用cdQA的Python軟體包
使用前首先要安裝軟體包。pip install cdqa是一個選擇。但本教程用原始碼進行安裝,從而運行一個腳本來下載預訓練的模型和BNP數據集(數據集包含從公共新聞網頁中摘錄的文章)。
# Installing cdQA package with pip
pip install cdqa
# From source
git clone
cd cdQA &&
pip install .
現在可以打開Jupyter筆記本,按照以下步驟以了解cdQA如何運作:
import pandas as pd
from ast import literal_eval
from cdqa.utils.filters import filter_paragraphs
from cdqa.utils.download import download_model, download_bnpp_data
from cdqa.pipeline.cdqa_sklearn import QAPipeline
# Download data and models
download_bnpp_data(dir='./data/bnpp_newsroom_v1.1/')
download_model(model='bert-squad_1.1', dir='./models')
# Loading data and filtering / preprocessing the documents
df = pd.read_csv('data/bnpp_newsroom_v1.1/bnpp_newsroom-v1.1.csv', converters={'paragraphs': literal_eval})
df = filter_paragraphs(df)
# Loading QAPipeline with CPU version of BERT Reader pretrained on SQuAD 1.1
cdqa_pipeline = QAPipeline(reader='models/bert_qa_vCPU-sklearn.joblib')
# Fitting the retriever to the list of documents in the dataframe
cdqa_pipeline.fit_retriever(X=df)
# Sending a question to the pipeline and getting prediction
query = 'Since when does the Excellence Program of BNP Paribas exist?'
prediction = cdqa_pipeline.predict(X=query)
print('query: {}\n'.format(query))
print('answer: {}\n'.format(prediction[0]))
print('title: {}\n'.format(prediction[1]))
print('paragraph: {}\n'.format(prediction[2]))
可能的輸出結果應如下:
QA管道預測的輸出結果
可以看到,系統不僅輸出答案,還輸出答案所在的段落和文檔/文章的標題。
上面的代碼片段需要進行預處理/過濾,從而將BNP Paribas數據幀轉換為以下結構:
需要發送到cdQA管道的數據幀結構
如果使用自己的數據集,請確保數據幀具備此類結構。
使用模型的CPU版本時,每個預測需要10到20秒才能完成。預測的中等執行速度由BERT閱讀器決定。該閱讀器是一個非常大的深度學習模型(約110M參數)。如果有GPU,可以直接使用模型models/bert_qa_vGPU-sklearn.joblib的GPU版本。
這些預訓練的模型也可以在cdQA github的發布頁面上獲取
訓練/微調閱讀器
此外還可以提高預訓練閱讀器的性能,可在SQuAD 1.1 數據集上預先培訓。如果有格式與SQuAD數據集相同的帶注釋的數據集(可通過cdQA-annotator生成),便可對其中的閱讀器進行微調:
# Put the path to your json file in SQuAD format here
path_to_data = './data/SQuAD_1.1/train-v1.1.json'
cdqa_pipeline.fit_reader(path_to_data)
請注意,應使用GPU執行此類微調。因為BERT模型太大,無法使用CPU進行培訓。
你也可以在官方教程中查看執行相同步驟的其他方法
cdQA註解器
為了便於備註數據,我們建立了基於網絡的應用程式,即cdQA註解器。使用該程序前,先將數據集轉化成類似SQuAD格式的JSON文件。
from cdqa.utils.converters import df2squad
# Converting dataframe to SQuAD format
json_data = df2squad(df=df, squad_version='v1.1', output_dir='.', filename='dataset-name.json')
現在可以安裝、運行這個程序:
# Clone the repo
git clone
# Install dependencies
cd cdQA-annotator
npm install
# Start development server
cd src
vue serve
進入網站的頁面,加載JSON文件後可以看到下圖:
cdQA註解器的界面
備註一組問答題時,應先列出一個問題,用滑鼠光標將答案標亮(答案便自動生成),再點擊「添加備註」:
用cdQA註解器給問答題備註
正如前面解釋的那樣,備註完成後可以進行下載,並在數據中微調BERT閱讀器。
cdQA用戶界面
我們還提供了基於網絡的用戶界面,與cdQA並行。接下來將介紹如何操作與cdQA後端連接的用戶界面。
首先,通過在shell腳本上執行命令(確保在cdQA文件夾中運行)來運行cdQA REST API。
export dataset_path = 'path-to-dataset.csv'
export reader_path = 'path-to-reader-model'
FLASK_APP=api.py flask run -h 0.0.0.0
其次,繼續安裝cdQA用戶界面的程序包:
git clone
cd cdQA-ui &&
npm install
之後啟動開發伺服器:
npm run serve
在網站上登陸網絡應用程式,隨即可以看到下圖:
cdQA用戶界面的網絡應用程式
應用程式通過REST API與後端連接良好時,便可進行提問,應用程式隨即列出答案、答案所在的文本及文章標題:
演示運行中的網絡應用程式
在網頁中插入界面
如果想將界面與網頁結合,只需在Vue程序中輸入以下內容:
import Vue from 'vue'
import CdqaUI from 'cdqa-ui'
Vue.use(CdqaUI)
import Vue from 'vue'
import BootstrapVue from "bootstrap-vue"
Vue.use(BootstrapVue)
import "bootstrap/dist/css/bootstrap.css"
import "bootstrap-vue/dist/bootstrap-vue.css"
之後插入cdQA的界面組件:
<CdqaUI api_endpoint_cpu=['What is Artificial Intelligence?', 'What is Blockchain?']">
</CdqaUI>
樣本演示
你也可在官方網址中查看應用程式的樣本演示。
結語
本文展示了cdQA-suite,一套用於部署端到端閉域問答系統的軟體。
如果對這個項目感興趣並想進一步了解,可以參考GitHub官方儲存庫
留言 點讚 關注
我們一起分享AI學習與發展的乾貨