机器理解(MC)的历史起源于人工智能(AI)中第一个概念的诞生。辉煌的Allan Turing在他着名的文章“ 计算机器和智能 ”中提出了什么,现在称为图灵测试作为智力的标准。大约70年后,问答(QA)是MC的一个子领域,仍然是人工智能中最困难的任务之一。
然而,自去年以来,由于深度学习研究的发展和转移学习技术的出现,自然语言处理(NLP)领域经历了快速发展。功能强大的预训练NLP模型,如OpenAI-GPT,ELMo,BERT和XLNet,已由该领域的最佳研究人员提供。
随着这样的进步,预计将出现几个改进的NLP任务系统和应用程序。其中一个系统是cdQA套件,这是由一些同事和我在法国工程学院Telecom ParisTech与法国巴黎银行个人理财公司合作开发的软件包,该公司是欧洲个人融资的领导者。
开放域QA与封闭域QA
当我们考虑QA系统时,我们应该了解两种不同的系统:开放域QA(ODQA)系统和封闭域QA(CDQA)系统。
开放域系统几乎可以解决任何问题,只能依赖于一般的本体和世界知识。这种系统的一个例子是DrQA,这是由Facebook Research开发的ODQA,它使用维基百科的大量文章作为其知识来源。由于这些文档与几个不同的主题和主题相关,我们可以理解为什么这个系统被认为是ODQA。
另一方面,封闭域系统处理特定域下的问题(例如,医学或汽车维护),并且可以通过使用适合于唯一域数据库的模型来利用特定于域的知识。该cdQA套房的建立是为了使任何人谁想要轻松构建一个封闭域的质量保证体系。
cdQA套房
所述cdQA套房由三个块:
- cdQA:一个易于使用的python包来实现QA管道
- cdQA-annotator:一种工具,用于简化问答数据集的注释,用于模型评估和微调
- cdQA-ui:一个用户界面,可以连接到任何网站,并可以连接到后端系统。
我将解释每个模块的工作原理以及如何使用它来构建您自己数据的QA系统。
cdQA
cdQA架构基于两个主要组件:Retriever和Reader。您可以在下面看到系统机制的架构。
cdQA管道的机制
当问题发送到系统时,检索器会选择数据库中最可能包含答案的文档列表。它基于DrQA的相同检索器,它基于uni-gram和bi-gram创建TF-IDF特征,并计算问题句子与数据库的每个文档之间的余弦相似性。
在选择最可能的文档之后,系统将每个文档分成段落并将它们与问题一起发送到Reader,这基本上是预训练的深度学习模型。使用的模型是众所周知的NLP模型BERT的Pytorch版本,由HuggingFace提供。然后,Reader输出每个段落中可能找到的最可能的答案。在Reader之后,系统中有一个最后一层,它使用内部分数函数比较答案,并根据分数输出最可能的答案。
使用cdQA python包
在开始使用软件包之前,让我们安装它。您可以使用pip
或从源克隆存储库来安装它。在本教程中,我还将下载BNP Paribas的数据集(一个包含从公共新闻网页中提取的文章的数据集)。
# Installing cdQA package with pip
pip install cdqa
# From source
git clone https://github.com/cdqa-suite/cdQA.git &&
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]))
您应该输出以下内容作为输出:

您可以注意到系统不仅输出答案,还输出找到答案的 段落以及文档/文章的标题。
在上面的代码片段中,需要预处理/过滤步骤将BNP Paribas数据帧转换为以下结构:

如果您使用自己的数据集,请确保您的数据框架具有此类结构。
使用模型的CPU版本时,每个预测需要10到20秒才能完成。这种适度的执行时间是由BERT Reader引起的,BERT Reader是一个非常大的深度学习模型(~110M参数)。如果您有GPU,则可以直接使用该型号的GPU版本models/bert_qa_vGPU-sklearn.joblib
。这些预先训练的模型也可以在cdQA github的发布页面上找到:https://github.com/cdqa-suite/cdQA/releases
培训/微调读者
您还可以提高预训练读卡器的性能,该读卡器是在SQuAD 1.1数据集上预先培训的。如果您有一个带注释的数据集(可以通过cdQA-annotator生成),其格式与SQuAD数据集相同,则可以对其上的阅读器进行微调:
# 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进行培训。
您还可以查看在官方教程中执行相同步骤的其他方法:https://github.com/cdqa-suite/cdQA/tree/master/examples
cdQA-注释
为了便于数据注释,团队已经构建了一个基于Web的应用程序,cdQA-annotator。
为了使用它,您应该将数据集转换为具有类似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 https://github.com/cdqa-suite/cdQA-annotator
# Install dependencies
cd cdQA-annotator
npm install
# Start development server
cd src
vue serve
现在你可以转到http:// localhost:8080 /并在加载你的JSON文件后你将看到如下内容:

要开始注释问答对,您只需要编写一个问题,用鼠标光标突出显示答案(答案将自动写入),然后单击Add annotation
:

使用cdQA-annotator注释问答配对
注释之后,您可以下载并使用它来自行调整BERT Reader,如上一节所述。
cdQA的UI
该团队还提供了一个基于Web的用户界面,以配合cdQA。在本节中,我将描述如何使用链接到后端的de UI cdQA
。
首先,您必须cdQA
通过在shell上执行来部署REST API(确保在cdQA
文件夹上运行它):
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-ui包:
git clone https://github.com/cdqa-suite/cdQA-ui &&
cd cdQA-ui &&
npm install
然后,启动develpoment服务器:
npm run serve
您现在可以访问http:// localhost:8080 /上的Web应用程序。您将看到如下图所示的内容:

cdQA-ui的Web应用程序
由于应用程序与后端连接良好,通过REST API,您可以提出问题,应用程序将显示答案,找到答案的段落上下文和文章标题:

演示Web应用程序正在运行
在网站中插入界面
如果您想在网站上结合界面,只需在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="http://localhost:5000/api" :queries_examples="['What is Artificial Intelligence?', 'What is Blockchain?']">
</CdqaUI>
演示
您还可以在官方网站上查看该应用程序的演示:https://cdqa-suite.github.io/cdQA-website/#demo
结论
在本文中,我介绍cdQA-suite
了一个用于部署端到端封闭域问答系统的软件套件。
如果您有兴趣了解有关该项目的更多信息,请随时查看官方GitHub存储库:https://github.com/cdqa-suite。如果您喜欢该项目并且认为它对您和您的应用程序有价值,请毫不犹豫地加注星标并关注存储库。
我们最近发布了该cdQA
软件包的1.0.2版本,该软件包具有高性能,并且显示了非常有前途的结果。但是,仍有改进空间。如果您希望为项目做出贡献并帮助完成此类改进,您可以查看我们当前的问题:https://github.com/cdqa-suite/cdQA/issues。随意选择一个并做一个Pull Request :)。
干杯!
资料来源:
- GitHub上的cdQA-suite存储库:https://github.com/cdqa-suite
- 来自Google的官方BERT版本:https://github.com/google-research/bert
- HuggingFace的BERT的Pytorch版本:https://github.com/huggingface/pytorch-pretrained-BERT
- SQuAD数据集:https://rajpurkar.github.io/SQuAD-explorer/
- Facebook研究博士:https://github.com/facebookresearch/DrQA/
- DeepPavlov,一个拥有开放域QA系统的库:https://medium.com/deeppavlov/open-domain-question-answering-with-deeppavlov-c665d2ee4d65
- OpenAI GPT:https://openai.com/blog/better-language-models/
- ELMo:https://allennlp.org/elmo
- XLNet:https://arxiv.org/abs/1906.08237