博客: https://wenjie.blog.csdn.net/
作者:艾文编程
抖音:艾文编程,关注我分享小知识
介绍:计算机硕士,10+工作经验,技术和制品负责人,现就职BAT大厂一线技术专家。
资料获取,请大众查看文案最末尾。
学完您将收获
从0到1搭建基于文本语义的智能问答设备人
认识智能问答系统工业应用和技术方法
把握文本向量化搜索引擎在工业界应用
把握文本语义匹配检索系统实现
把握文本语义的FAQ智能问答实现
适合人群:
NLP算法工程师;想认识智能问答系统从业人员;软件开发人员等
目的:
把握从0到1搭建基于文本语义的智能问答设备人,把握BERT模型和Faiss算法库在项目的应用
本项目结合Facebook AI 科研院开源的针对聚类和类似性搜索库Faiss 、Google供给的BERT模型实现一个基于文本语义的智能问答系统。经过项目案例从0到1搭建FAQ智能问答设备人,让大众容易把握 文本语义类似度文本检索系统和FAQ问答设备人在工业界应用。
1 开篇介绍
问答系统是自然语言处理行业一个很经典的问题,它用于回答人们以自然语言形式提出的问题,有着广泛的应用。
经典应用场景包含:智能语音交互、在线客服、知识获取、情感类聊天等。
平常的归类有:生成型、检索型问答系统;单轮问答、多轮问答系统;面向开放行业、特定行业的问答系统。
本文触及的重点是在检索型、面向特定行业的问答系统——智能客服设备人。
传统客服设备人的搭建流程
一般需要将关联行业的知识(Domain Knowledge),转化为一系列的规则和知识图谱。构建过程中重度依赖“人工”智能,换个场景,换个用户都需要海量的重复劳动。
深度学习-智能问答设备人
深度语言模型会将问题和文档转化为语义向量,从而找到最后的匹配答案。本文借助Google开源的Bert模型结合Faiss开源向量搜索引擎,快速搭建基于语义理解的对话设备人。
案例分享:FAQ问答设备人
FAQ是Frequently Asked Questions的简叫作。假定咱们有一个平常问题和答案的数据库,此刻用户提出了一个新问题,能不可自动从平常问题库中抽取出最关联的问题和答案来作答呢?在这个项目中,咱们会探索怎样构建这般问答设备人。
项目核心技术点: 经过深度学习模型判断问题与答案的匹配得分运用BERT模型特征提取并判断问题类似度运用检索引擎Faiss索引构建和检索构建在线FAQ问答系统
1-1 学什么
结合Faiss和bert供给的模型实现了一个中文问答系统。旨在供给一个用Faiss结合各样AI模型实现语义相似度匹配的处理方法。最后经过项目案例实现:文本语义类似度文本检索系统和FAQ问答设备人。
1-2 在线系统DEMO文本语义类似度匹配检索文本语义FAQ问答设备人
项目实现以一种平台化思路意见系统,是一个通用的处理方法。研发者只需要根据数据规范就可,不需要修改代码就能够运行系统了
2 应用场景介绍
CSDN 问答系统:https://ask.csdn.net/
百度晓得:https://zhidao.baidu.com/
360问答: https://wenda.so.com/search/
2-1 对话系统整体简介
2-2 文本搜索场景
2-3 论坛类似问答系统
汽车之家持有全世界最大的汽车社区论坛。累积了丰富的用户问答数据,能够处理用户在看车、买车、用车等方面遇到的各样问题。针对用户在平台上提出的各样问题,从海量的高质量问答库中匹配语义最类似的问题和答案
文本数据拥有表达多样化、用语不规范(如:车型车系用语存在海量缩写、简写、语序颠倒等现象)、歧义性强(如:“北京”可能指汽车品牌,亦可能指城市)等特点,这给传统基于关键词匹配的搜索办法带来了很大挑战。因此呢,在传统关键词匹配的基本上,进一步引入语义搜索技术,将精华问答库的问题映射为多维向量,进行语义匹配,提高问题匹配准确性。
2-4 智能对话闲聊系统
数据格式: query-answer 对如下
不要骂人 好的,听你的就行了
不要骂人严重的直接禁言 好的,听你的就行了
不要骂人了吧 好的,听你的就行了
不要骂人哦 好的,听你的就行了
不要骂人小心封号啊 好的,听你的就行了
不认识你不记得你 你当我傻逼啊
不认识你昂 你当我傻逼啊
不认识你老哥了 你当我傻逼啊
3 问答系统发展状况
FAQ检索型问答流程是按照用户的新Query去FAQ知识库找到最合适的答案并反馈给用户。
检索过程如图所示
其中,Qi是知识库里的标准问,Ai是标准问对应的答案。
详细处理流程为: 候选集离线建好索引线上收到用户 query ,召回一批候选集做为粗排结果传入下一模块进行进一步精确排序;利用matching模型计算用户query和FAQ知识库中问题或答案的匹配程度;利用ranking 模型对候选集做 rerank 并返回 topk个候选答案。matching 模型负责对 (query, reply) pair 做特征匹配,其输出的 matching score 一般会做为 ranking 模型的一维特征;ranking 模型负责详细的 reranking 工作,其输入是候选回复对应的特征向量,按照实质需要构造区别类型(如:pointwise, pairwise, listwise)的损失函数,其输出的 ranking score 是候选回复的最后排序依据。有些检索系统可能不会知道区分 matching 和 ranking 这两个过程。
3-1 智能问答常用处理方法
针对FAQ检索式问答系统,通常处理流程 问答对数据集的清洗Embedding模型训练计算文本类似度在问答库中选出与输入问题类似度最高的问题返回类似度最高的问题所对应的答案
搭建一个FAQ问答系统通常实现办法 基于ES的智能问题系统
(经过关键词匹配获取答案,类似电商、资讯搜索行业关键词召回) 基于TF-IDF方式
(计算每一个单词的tfidf数值,分词后换算句子暗示。 TF-IDF 方式亦在用在关键词提取) 基于Doc2Vec 模型(思虑词和段,相比于word2vec来讲有了段落信息)经过深度学习语言模型bert 提取向量,而后计算类似度
方法能够扩展到的业务需要(本文介绍的是一种文本语义匹配通用处理方法) 智能客服行业语义匹配
(对话系统检索式智能问答系统,答案在知识库中且返回独一的数据记录) 以图搜索(resnet 照片向量化暗示)资讯行业文本类似举荐(类似资讯举荐等)基于文本语义匹配检索系统(文本类似性rank )
针对这类问题,重点文本等经过某种方式进行向量化暗示(word2vec、doc2vec、elmo、bert等),而后把这种特征向量进行索引(faiss/Milus) ,最后实此刻线服务系统的检索,而后再经过必定的规则进行过滤,获取最后的数据内容。
3-2 传统文本匹配办法存在问题
传统的文本匹配技术有BoW、VSM、TF-IDF、 BM25、Jaccord、SimHash等算法,重点处理字面类似度问题。
面临的困难:
由 于中文含义的丰富性,一般很难直接按照关键字匹配或基于设备学习的浅层模型来确定两个句子之间的语义类似度。
3-3 深度学习文本匹配
深度学习模型文本做语义暗示逐步应用于检索式问答系统。
相比传统的模型优点: 能够节省人工提取特征的海量人力物力从海量的样本中自动提取出词语之间的关系,并能结合短语匹配中的结构信息和文本匹配的层次化特性,发掘传统模型很难发掘的隐含在海量数据中含义不显著的特征
本文采用类似问题匹配来实现一个FAQ问答系统。
问题:什么是类似问题匹配?
答案:即对比用户问题与现有FAQ知识库中问题的类似度,返回用户问题对应的最准确的答案
深度语义匹配模型能够分为两大类,分别是representation-based method 和 interaction-based method,这儿咱们针对Represention-based Method这种办法进行探索。
这类算法首要将待匹配的两个对象经过深度学习模型进行暗示,之后计算这两个暗示之间的类似度便可输出两个对象的匹配度。针对匹配度函数f(x,y)的计算一般有两种办法: cosine 函数 和 多层感知器网络(MLP)
对比两种匹配办法的优缺点 cosine 函数:经过类似度度量函数进行计算,实质运用过程中最常用的便是 cosine 函数,这种方式简单有效,并且得分区间可控道理知道多层感知器网络(MLP):将两个向量再接一个多层感知器网络(MLP),经过数据去训练拟合出一个匹配度得分,更加灵活拟合能力更强,但对训练的需求亦更高
4 问答系统关键技术
Google 的 BERT 模型在 NLP 行业中拥有巨大的影响力。它是一个通用的语言暗示模型,能够应用于许多行业。本文的项目是将 Faiss与 BERT 模型结合搭建文本语义匹配检索系统,运用 BERT 模型将文本数据转成向量,结合 Faiss特征向量类似度搜索引擎能够快速搜索类似文本,最后获取想要的结果
4-1 Faiss
Faiss是Facebook AI团队开源的针对聚类和类似性搜索库,为稠密向量供给有效类似度搜索和聚类,支持十亿级别向量的搜索,是日前最为成熟的近似近邻搜索库。它包括多种搜索任意体积向量集(备注:向量集体积由RAM内存决定)的算法,以及用于算法评定和参数调节的支持代码。Faiss用C++编写,并供给与Numpy完美衔接的Python接口。除此以外,对有些核心算法供给了GPU实现。关联介绍参考《Faiss:Facebook 开源的类似性搜索类库》
4-2 BERT
BERT 模型是 Google 发布的一个新的语言表达模型(Language Representation Model),全叫作是 Bidirectional Encoder Representations from Transformers,即双向编码表征模型。BERT 模型的优良表现在两方面。 一方面,它运用基于尤其设计的重视力机制(Attention Mechanism)的简单全连接网络取代了繁杂的 CNN 和 RNN 网络。不仅大大减少了训练时间,同期有效地提高了网络性能。另一方面,BERT 模型是第1个真正捕捉上下文语义信息的预训练语言暗示模型。这是由于 BERT 模型运用了 Transformer 做为算法的重点框架,而 Transformer 框架能更彻底地捉捕语句中的双向关系。
Google 供给了有些预先训练的模型,其中最基本的两个模型是BERT-base 模型和 BERT-large 模型。详细参数如下表所示:
BERT-base 模型和 BERT-large 模型的参数总量体积和网络层数区别,BERT-large 模型所占计算机内存较多,因此本文项目选择 BERT-base 模型对文本数据进行向量转化。(注:其中,层数(即 Transformer 块个数)暗示为 L,隐匿尺寸暗示为 H ,自重视力头数暗示为 A 。)
5 问答系统实现
关于main.py 重点参数
$ python main.py --help
usage: main.py [-h] --task TASK [--load] [--index] [--n_total N_TOTAL]
[--search] [--sentence SENTENCE] [--topK TOPK]
optional arguments:
-h, --help show this help message and exit
--task TASK project task name
--load load data into db
--index load data text vector into faiss
--n_total N_TOTAL take data n_sample ,generate it into faiss
--search search matched text from faiss
--sentence SENTENCE query text data
--topK TOPK take matched data in topK
第1步:知识库存储 < id,answer>
$ python main.py --task medical --load
第二步:索引构建<id,question>
$ python main.py --task medical --index --n_total 120000
第三步:文本语义类似度匹配检索
$ python main.py --task medical_120000 --search --sentence 得了乙肝怎么治疗
备注:medical_120000 中task_${索引记录数} 组合
完成以上功能后,咱们能够这里基本上,按照业务区别搭建有些关联应用,例如: 能够实现FAQ智能问答能够实现资讯新闻内容类文本语义匹配召回能够实现基于文本语义的中文检索系统
第四步:基于文本语义检索服务实现FAQ问答
$ python main.py --task medical_120000 --search --sentence 身上显现 --topK 10
第五步:基于文本语义检索服务Web服务
起步服务python app.py --taskmedical_120000 ,而后拜访位置 http://xx.xx.xx.xx:5000/
咱们这儿呢,运用以上基本服务完成一个FAQ问答设备人
5-1 数据规范
项目数据集包括三个部分:问题数据集+答案数据集+问题-答案独一标识,数据是一一对应的。
针对区别的业务系统,咱们只需要供给这种数据格式,经过本文的模板就能够快速搭建一个demo了,祝大众学习愉快。
5-2 系统整体架构
本文的文本语义匹配搜索项目运用的 Faiss和BERT的整体架构如图所示:
(注:深蓝色线为数据导入过程,橘黄色线为用户查找过程。) 首要,本文项目运用开源的 bert-serving , BERT做句子编码器,标题数据转化为固定长度为 768 维的特征向量,并导入 Milvus 或Faiss库。而后,对存入 Milvus/Faiss 库中的特征向量进行存储并创立索引,同期原始数据供给独一ID编码,将 ID 和对应内容存储在 PostgreSQL 中。最后,用户输入一个标题,BERT 将其转成特征向量。Milvus/Faiss 对特征向量进行类似度检索,得到类似的标题的 ID ,在 知识库(PostgreSQL/MySQL/SQLite。。。) 中找出 ID 对应的仔细信息返回
6-3 文本向量服务 bert-serving
学习资料:
https://github.com/hanxiao/bert-as-service
https://github.com/tensorflow/tensorflow
https://blog.csdn.net/abc50319/article/details/107171952(关于bert-as-service 运用文案)
运用bert as service 服务
第1步:安装tensorflow
Python >= 3.5
Tensorflow >= 1.10 (one-point-ten)
ubuntu系统-gpu下载离线安装文件并pip安装
tensorboard-1.15.0-py3-none-any.whl
tensorflow_estimator-1.15.1-py2.py3-none-any.whl
tensorflow_gpu-1.15.3-cp37-cp37m-manylinux2010_x86_64.whl
亦能够经过下面的方式快速下载(这儿下载cpu版本)
pip install tensorflow==1.15.0 --user -i https://pypi.tuna.tsinghua.edu.cn/simple
MAC 系统cpu版本安装
pip3 install --upgrade https://files.pythonhosted.org/packages/dc/65/a94519cd8b4fd61a7b002cb752bfc0c0e5faa25d1f43ec4f0a4705020126/tensorflow-1.15.0-cp37-cp37m-macosx_10_11_x86_64.whl
https://blog.csdn.net/u012359618/article/details/107054741
https://www.tensorflow.org/install/pip?hl=zh-cn#system-install
http://www.yebaochen.com/deep-learning/install-tensorflow-on-mac
验证是不是安装
import tensorflow as tf
print(tf.__version__)
第二步:bert-serving 服务搭建
( 咱们在ubuntu系统搭建完成bert-serving ,目录:/home/ubuntu/teacher/ )
经过bert-serving服务,帮忙咱们处理:文本-> 向量的转换
1、参考github 供给的代码
git clone https://github.com/hanxiao/bert-as-service.git
2、安装server和client
pip install bert-serving-server # server
pip install bert-serving-client # client, independent of `bert-serving-server`
3、下载pretrained BERT models
Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters
https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip
解压模型:
chinese_L-12_H-768_A-12
├── bert_config.json
├── bert_model.ckpt.data-00000-of-00001
├── bert_model.ckpt.index
├── bert_model.ckpt.meta
└── vocab.txt
bert_config.json: bert 模型配置参数
vocab.txt: 字典
bert_model: 预训练的模型
4、起步bert-service
nohup bert-serving-start -model_dir chinese_L-12_H-768_A-12 -num_worker 1 -max_seq_len 64 >start_bert_serving.log 2>&1 &
( CPU和GPU 模式都能够 )
针对每一个字段进行说明
workers = 4 暗示同期并发处理请求数
model_dir 预训练的模型
max_seq_len 业务分析句子的长度
关闭服务
bert-serving-terminate -port 5555
5、测试文本-> 向量暗示结果 from bert_serving.client importBertClient
bc = BertClient()
result = bc.encode([First do it])
print(result)5-4 向量类似度搜索引擎
制品学习手册
5-5 知识库存储
知识库:能够存储mongo/PostgreSQL/mysql 按照数据量进行选取
本文给大众分享的内容,数据存储在mysql上。
备注:关于mysql 的详细安装,大众去上网查询一下。(root,12345678)
大众在学习过程中,倘若有任何的问题:能够网站留言(或 aiwen2100)
create database faiss_qa;
use faiss_qa;
CREATE TABLE `answer_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`answer` mediumtext COLLATE utf8mb4_bin,
PRIMARY KEY (`id`),
KEY `answer_info_index_id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
5-6 索引构建
$ python main.py --task medical --index --n_total 120000
5-7 文本语义类似度匹配搜索
$ python main.py --task medical --search --sentence 小安信贷
完成以上功能后,咱们能够这里基本上,按照业务区别搭建有些关联应用,例如: 能够实现FAQ智能问答能够实现资讯新闻内容类文本语义匹配召回能够实现基于文本语义的中文检索系统
对输入数据微小的差别瞧瞧有什么区别?
5-8 文本语义FAQ问答设备人-API接口
首要,咱们起步服务:python app.py
而后,请求API 服务位置查看检索检索
$ curl -H " Content-Type:application/json" -X POST --data {"query": "乙肝怎么治疗"}
http://localhost:5000/api/v1/search | jq
5-9 文本语义FAQ问答设备人-Web界面
起步服务 python app.py,而后拜访位置 http://xx.xx.xx.xx:5000/
用户表达的细微差别,经过文本语义匹配总之能找到最佳的答案,最后反馈给用户。
例如: 两种语言表达瞧瞧效果
第1句: 小孩儿感冒吃什么
第二句: 小孩儿感冒不可吃什么
以上显著表达的是两个含义,而经过文本语义的方式亦很好得识别出来了,效果还不错。
咱们瞧瞧后端服务位置数据
重视:FAQ系统依赖bert-serving 服务,请确认正常工作。
http://xx.xx.xx.xx:5000/status,正常状况下的返回结果格式如下:
{
"status":"success",
"ip":"127.0.0.1",
"port":5555,
"identity":"cbc94483-1cd6-406d-b170-0cb04e77725bb"
}
6 总结展望
在 AI 高速发展的时代,咱们能够运用深度学习模型去处理各种类型的非结构化数据,例如照片、文本、视频和语音等。本文项目经过 BERT 模型能够将这些非结构化数据提取为特征向量,而后经过Faiss 对这些特征向量进行计算,实现对非结构化数据的分析与检索。
本文利用Faiss搭建的FAQ问答系统亦只是其中一个场景,展示了Faiss在非结构化数据处理中的应用。欢迎大众导入自己的数据创立自己的FAQ问答系统(或文本搜索、智能客服等新系统)。Faiss向量类似度检索引擎搜索十亿向量仅需毫秒响应时间。你能够运用 Faiss探索更加多 AI 用法!
详细关联资料请私信留言,分享大众。
|