赞
踩
向AI转型的程序员都关注了这个号????????????
人工智能大数据与深度学习 公众号:datayx
问答系统是自然语言处理领域一个很经典的问题,它用于回答人们以自然语言形式提出的问题,有着广泛的应用。
经典应用场景包括:智能语音交互、在线客服、知识获取、情感类聊天等。
常见的分类有:生成型、检索型问答系统;单轮问答、多轮问答系统;面向开放领域、特定领域的问答系统。
本文涉及的主要是在检索型、面向特定领域的问答系统**——智能客服机器人。**
传统客服机器人的搭建流程
通常需要将相关领域的知识(Domain Knowledge),转化为一系列的规则和知识图谱。构建过程中重度依赖“人工”智能,换个场景,换个用户都需要大量的重复劳动。
深度学习-智能问答机器人
深度语言模型会将问题和文档转化为语义向量,从而找到最后的匹配答案。本文借助Google开源的Bert模型结合Faiss开源向量搜索引擎,快速搭建基于语义理解的对话机器人。
案例分享:FAQ问答机器人
FAQ是Frequently Asked Questions的简称。假定我们有一个常见问题和答案的数据库,现在用户提出了一个新问题,能不能自动从常见问题库中抽取出最相关的问题和答案来作答呢?在这个项目中,我们会探索如何构建这样问答机器人。
项目核心技术点:
通过深度学习模型判断问题与答案的匹配得分
使用BERT模型特征提取并判断问题相似度
使用检索引擎Faiss索引构建和检索
构建在线FAQ问答系统
结合Faiss和bert提供的模型实现了一个中文问答系统。旨在提供一个用Faiss结合各种AI模型实现语义相似度匹配的解决方案。最后通过项目案例实现:文本语义相似度文本检索系统和FAQ问答机器人。
文本语义相似度匹配检索
文本语义FAQ问答机器人
项目实现以一种平台化思路建议系统,是一个通用的解决方案。开发者只需要按照数据规范即可,不需要修改代码就可以运行系统了
对话系统可以根据人的输入自动选择或者生成出相应的回复,来达到帮助人们在特定领域或者开放域解决一定的问题。(最后,通过医疗数据提供FAQ智能问答: aiwen2100)
用途:任务型、问答型、闲聊型对话系统;
场景:封闭域、开放域对话系统;
使用方法:检索式、生成式对话系统
问答型(案例:提供基于文本语义-bert 和 faiss 的通用解决方案)
用户希望得到某个问题的答案,机器人回复来自于特定知识库,以特定的回复回答用户
任务型
用户希望完成特定任务,机器人通过语义执行后台已对接能力,帮用户完成指定任务
闲聊型
用户没有明确目的,机器人回复也没有标准答案,以趣味性的回复回答用户
基于检索的模型不会产生新的文字,只能从预先定义的“回答集”中挑选出一个较为合适的回答。
缺点
检索式对话系统不会产生新的回复,其能够回复类型与内容都由语料库所决定。一旦用户的问话超脱了语料库的范围,那么对话系统将无法准确回答用户。
优点
相对严谨可靠,可控性强,不会回复令人厌恶或违法法规的文本。
一般处理流程:
1.问答对数据集的清洗
2.Embedding(tfidf,word2ec,doc2vec,elmo,bert…)
3.模型训练
4.计算文本相似度
5.在问答库中选出与输入问题相似度最高的问题
6.返回相似度最高的问题所对应的答案
基于自然语言理解生成式对话策略:即通过机器学习算法构建深层语义模型,结合句词分析
等统计规律提取特征,让模型从大量的已有对话中学习对话规则,利用训练好的模型预测结果。
缺点
评估问题,需要依赖人工评定;生成内容,控制不好会回复令人厌恶或违反法规的文本。
优点
智能对话,回复内容丰富。
任务型对话的最终目标是完成指定任务,比如小度智能音箱,需要在每一轮对话都采取合适的决策,保证自己执行正确的指令(即识别出用户的正确意图)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5W9MrmV-1606198473806)(https://uploader.shimo.im/f/iOwhzmol8N1oJdI5.png!thumbnail)]
多轮对话是一种在人机对话中初步明确用户意图之后,获取必要信息以最终得到明确用户指令的方式。
这里介绍一种对话管理的一种方式:Frame-Based Dialogue Control,预先指定了一张表格 (Frame),聊天机器人的目标就是把这张表格填满。
通过一个实际场景的案例来解释上述实现具体执行过程:
我:『去北京大兴机场多少钱』
意图:行程花费计算
槽位:【起始地:当前位置;目的地:北京大兴机场;使用货币:???】)
智能客服:『您好,请问是使用人民币吗』
我:『是的』
意图:行程花费计算
槽位:【起始地:当前位置;目的地:萧山机场;使用货币:人民币】)
智能客服:『200元』
1.编程语言:python( 模型 或者服务) ,C++,Java,go 在线服务
2.数据处理及机器学习相关库:pandas、scikit-learn、jieba
3.深度学习框架:tensorflow、pytorch
4.开发工具:pycharm、visual studio code
5.其它工具:ElasticSearch搜索引擎、向量检索引擎Faiss/Milvus
1、分词算法
传统算法:HMM隐马尔可夫模型、CRF条件随机场
深度学习:LSTM、Bi-LTSM
2、文本向量化表示
OneHot 、N-Gram 、TFIDF等词袋模型、Word2Vec、Doc2Vec、Glove
Bert(本案例文本向量化表示选择bert) 、XLNet等神经网络模型
3、文本相似度计算(项目中:我们采用余弦相似度,计算得分)
余弦相似度、欧式距离
4、检索方法
ElasticSearch搜索引擎
向量检索引擎Faiss(本项目采用,Facebook AI 研究院开源相似性的检索引擎,5000万 ms)
闲聊系统
1、Seq2Seq模型
2、Seq2Seq + Attention模型
3、Transformer
4、Bert模型
重要,在我们实际工作中,很多场景都会用到
1、意图识别
2、填槽、对话管理
3、多轮对话
分类
NER识别
多伦对话(模型,规则。。。。)
客服机器人指帮助客服回答问题提高人工客服效率的机器人。客服机器人可以用于回答客户的常规、重复性的问题,但不是替代,而是辅助人工服务,改变客服工作的模式,进一步提高客服工作效率。
纯机器人完全替代客服的并不多,人机结合模式使用广泛。分析一下主要有以下几个原因:
1、机器人响应速度快,且可同时接待多位客户,而且客户不需要等待;
2、机器人替代人工处理咨询中的重复问题,人工客服不易陷入烦躁情绪,客户体验好;
3、遇到复杂问题,人机结合模式可以无缝切换人工来处理,顾客体验不会中断。
1、机器人可以7 X 24 小时在线服务,解答客户的问题。
2、常问的问题,重复的问题都可以交给机器人来自动回复,省去很多重复的输入及复制粘贴。
3、可以辅助人工客服,在人工服务的时候,推荐回复内容,并学习人工客服的回复内容。
1、时间特性要求。系统极限相应时间到底是多少
2、灵活性。系统的各个模块应该在可控的状态内,每一个模块可插拔,保证线上质量。
3、安全性。内外网隔离,注意网络完全,系统安全,用户安全,数据安全。
4、可扩展性:系统的各个模块支持扩展,支持跨平台,支持多种语言,算法模型可以灵活切换。
5、可靠性:系统和集群稳定运行,主要的集群实现双机热备;实现灾备;当单个节点发生故障可以迅速切换。
6、可用性:系统的各项功能可用,系统上线必须符合一定的正确率
https://blog.csdn.net/qq_40027052/article/details/78672907
传统的服务模式
经典的服务模式
智能问答服务模式
阿里巴巴于2015年7月推出了阿里小蜜产品,在面世的仅仅几年中,阿里小蜜发展之迅速令人难以想象。阿里小蜜给出了一个典型的智能对话系统的架构。
自然语言处理(NLP)是对话系统的核心部分
智能问答模块用来完成问答类任务(FAQ问答系同,可以基于语义匹配检索来完成)
智能聊天用来完成闲聊类任务
对话系统自然语言理解采用的是frame semantics 表示的一种变形,即采用领域(domain)、意图(intent)和属性槽(slots)来表示语义结果
CSDN 问答系统:https://ask.csdn.net/
百度知道:https://zhidao.baidu.com/
360问答:https://wenda.so.com/search/
汽车之家拥有全球最大的汽车社区论坛。积累了丰富的用户问答数据,能够解决用户在看车、买车、用车等方面遇到的各种问题。针对用户在平台上提出的各种问题,从海量的高质量问答库中匹配语义最相似的问题和答案
文本数据具有表达多样化、用语不规范(如:车型车系用语存在大量缩写、简写、语序颠倒等现象)、歧义性强(如:“北京”可能指汽车品牌,也可能指城市)等特点,这给传统基于关键词匹配的搜索方法带来了很大挑战。因此,在传统关键词匹配的基础上,进一步引入语义搜索技术,将精华问答库的问题映射为多维向量,进行语义匹配,提升问题匹配准确性。
数据格式:query-answer 对如下
不要骂人 好的,听你的就行了
不要骂人严重的直接禁言 好的,听你的就行了
不要骂人了吧 好的,听你的就行了
不要骂人哦 好的,听你的就行了
不要骂人小心封号啊 好的,听你的就行了
不认识你不记得你 你当我傻逼啊
不认识你昂 你当我傻逼啊
不认识你老哥了 你当我傻逼啊
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 这两个过程。
针对FAQ检索式问答系统,一般处理流程
问答对数据集的清洗
Embedding
模型训练
计算文本相似度
在问答库中选出与输入问题相似度最高的问题
返回相似度最高的问题所对应的答案
搭建一个FAQ问答系统一般实现方法
基于ES的智能问题系统
(通过关键词匹配获取答案,类似电商、新闻搜索领域关键词召回)
基于TF-IDF方式
(计算每个单词的tfidf数值,分词后换算句子表示。TF-IDF 方式也在用在关键词提取)
基于Doc2Vec 模型(考虑词和段,相比于word2vec来说有了段落信息)
通过深度学习语言模型bert 提取向量,然后计算相似度
方案可以扩展到的业务需求(本文介绍的是一种文本语义匹配通用解决方案)
智能客服领域语义匹配
(对话系统检索式智能问答系统,答案在知识库中且返回唯一的数据记录)
以图搜索(resnet 图片向量化表示)
新闻领域文本相似推荐(相似新闻推荐等)
基于文本语义匹配检索系统(文本相似性rank )
针对这类问题,重点文本等通过某种方式进行向量化表示(word2vec、doc2vec、elmo、bert等),然后把这种特征向量进行索引(faiss/Milus) ,最终实现在线服务系统的检索,然后再通过一定的规则进行过滤,获取最终的数据内容。
传统的文本匹配技术有BoW、VSM、TF-IDF、BM25、Jaccord、SimHash等算法,主要解决字面相似度问题。
面临的困难:
由 于中文含义的丰富性,通常很难直接根据关键字匹配或者基于机器学习的浅层模型来确定两个句子之间的语义相似度。
深度学习模型文本做语义表示逐渐应用于检索式问答系统。
相比传统的模型优点:
能够节省人工提取特征的大量人力物力
从大量的样本中自动提取出词语之间的关系,并能结合短语匹配中的结构信息和文本匹配的层次化特性,发掘传统模型很难发掘的隐含在大量数据中含义不明显的特征
本文采用相似问题匹配来实现一个FAQ问答系统。
问题:什么是相似问题匹配?
答案:即对比用户问题与现有FAQ知识库中问题的相似度,返回用户问题对应的最准确的答案
深度语义匹配模型可以分为两大类,分别是representation-based method 和 interaction-based method,这里我们针对Represention-based Method这种方法进行探索。
这类算法首先将待匹配的两个对象通过深度学习模型进行表示,之后计算这两个表示之间的相似度便可输出两个对象的匹配度。针对匹配度函数f(x,y)的计算通常有两种方法: cosine 函数 和 多层感知器网络(MLP)
对比两种匹配方法的优缺点
- * cosine 函数:通过相似度度量函数进行计算,实际使用过程中最常用的就是 cosine 函数,这种方式简单高效,并且得分区间可控意义明确
- * 多层感知器网络(MLP):将两个向量再接一个多层感知器网络(MLP),通过数据去训练拟合出一个匹配度得分,更加灵活拟合能力更强,但对训练的要求也更高
1
2
Google 的 BERT 模型在 NLP 领域中具有巨大的影响力。它是一个通用的语言表示模型,可以应用于诸多领域。本文的项目是将 Faiss与 BERT 模型结合搭建文本语义匹配检索系统,使用 BERT 模型将文本数据转成向量,结合 Faiss特征向量相似度搜索引擎可以快速搜索相似文本,最终获取想要的结果
Faiss是Facebook AI团队开源的针对聚类和相似性搜索库,为稠密向量提供高效相似度搜索和聚类,支持十亿级别向量的搜索,是目前最为成熟的近似近邻搜索库。它包含多种搜索任意大小向量集(备注:向量集大小由RAM内存决定)的算法,以及用于算法评估和参数调整的支持代码。Faiss用C++编写,并提供与Numpy完美衔接的Python接口。除此以外,对一些核心算法提供了GPU实现。相关介绍参考《Faiss:Facebook 开源的相似性搜索类库》
BERT 模型是 Google 发布的一个新的语言表达模型(Language Representation Model),全称是 Bidirectional Encoder Representations from Transformers,即双向编码表征模型。BERT 模型的优势体现在两方面。
一方面,它使用基于特别设计的注意力机制(Attention Mechanism)的简单全连接网络取代了复杂的 CNN 和 RNN 网络。不但大大减少了训练时间,同时有效地提升了网络性能。
另一方面,BERT 模型是第一个真正捕获上下文语义信息的预训练语言表示模型。这是因为 BERT 模型使用了 Transformer 作为算法的主要框架,而 Transformer 框架能更彻底地捕捉语句中的双向关系。
Google 提供了一些预先训练的模型,其中最基本的两个模型是BERT-base 模型和 BERT-large 模型。具体参数如下表所示:
BERT-base 模型和 BERT-large 模型的参数总量大小和网络层数不同,BERT-large 模型所占计算机内存较多,所以本文项目选用 BERT-base 模型对文本数据进行向量转化。(注:其中,层数(即 Transformer 块个数)表示为 L,隐藏尺寸表示为 H ,自注意力头数表示为 A 。)
关于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
第一步:知识库存储 < id,answer>
$ python main.py --taskmedical–load
第二步:索引构建<id,question>
$ python main.py --taskmedical–index --n_total 120000
第三步:文本语义相似度匹配检索
$ python main.py --taskmedical_120000–search --sentence 得了乙肝怎么治疗
备注:medical_120000中task_${索引记录数} 组合
完成上述功能后,我们可以在此基础上,根据业务不同搭建一些相关应用,例如:
可以实现FAQ智能问答
可以实现新闻资讯内容类文本语义匹配召回
可以实现基于文本语义的中文检索系统
第四步:基于文本语义检索服务实现FAQ问答
$ python main.py --taskmedical_120000–search --sentence 身上出现 --topK 10
第五步:基于文本语义检索服务Web服务
启动服务python app.py --taskmedical_120000,然后访问地址http://xx.xx.xx.xx:5000/
我们这里呢,使用上述基础服务完成一个FAQ问答机器人
项目数据集包含三个部分:问题数据集+答案数据集+问题-答案唯一标识,数据是一一对应的。
针对不同的业务系统,我们只需要提供这种数据格式,通过本文的模板就可以快速搭建一个demo了,祝大家学习愉快。
本文的文本语义匹配搜索项目使用的 Faiss和BERT的整体架构如图所示:
(注:深蓝色线为数据导入过程,橘黄色线为用户查询过程。)
首先,本文项目使用开源的 bert-serving , BERT做句子编码器,标题数据转化为固定长度
为 768 维的特征向量,并导入 Milvus 或者Faiss库。
然后,对存入 Milvus/Faiss 库中的特征向量进行存储并建立索引,同时原始数据提供唯一ID编码,将 ID 和对应内容存储在 PostgreSQL 中。
最后,用户输入一个标题,BERT 将其转成特征向量。Milvus/Faiss 对特征向量进行相似度检索,得到相似的标题的 ID ,在 知识库(PostgreSQL/MySQL/SQLite。。。) 中找出 ID 对应的详细信息返回
使用bert as service 服务
第一步:安装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 -ihttps://pypi.tuna.tsinghua.edu.cn/simple
验证是否安装
import tensorflow as tf
print(tf.version)
第二步:bert-serving 服务搭建
( 我们在ubuntu系统搭建完成bert-serving ,目录:/home/ubuntu/teacher/ )
通过bert-serving服务,帮助我们解决:文本-> 向量的转换
1、参考github 提供的代码
git clonehttps://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 import BertClient
- bc = BertClient()
- result = bc.encode(['First do it'])
- print(result)
1
2
3
4
产品学习手册
知识库:可以存储mongo/PostgreSQL/mysql 根据数据量进行选择
本文给大家分享的内容,数据存储在mysql上。
备注:关于mysql 的具体安装,大家去上网查找一下。(root,12345678)
大家在学习过程中,如果有任何的问题:可以网站留言(或者weixin: 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;
$ python main.py --taskmedical–index --n_total 120000
$ python main.py --task medical --search --sentence 小安信贷
完成上述功能后,我们可以在此基础上,根据业务不同搭建一些相关应用,例如:
可以实现FAQ智能问答
可以实现新闻资讯内容类文本语义匹配召回
可以实现基于文本语义的中文检索系统
对输入数据微小的差别看看有什么不同?
首先,我们启动服务:python app.py
然后,请求API 服务地址查看检索检索
$ curl -H “Content-Type:application/json” -X POST --data '{“query”: “乙肝怎么治疗”}'http://localhost:5000/api/v1/search| jq
启动服务 python app.py,然后访问地址http://xx.xx.xx.xx:5000/
用户表达的细微差别,通过文本语义匹配总之能找到最佳的答案,最终反馈给用户。
例如:两种语言表达看看效果
第一句:小孩子感冒吃什么
第二句:小孩子感冒不能吃什么
上述明显表达的是两个含义,而通过文本语义的方式也很好得识别出来了,效果还不错。
我们看看后端服务地址数据
注意: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”
}
在 AI 高速发展的时代,我们可以使用深度学习模型去处理各种类型的非结构化数据,例如图片、文本、视频和语音等。本文项目通过 BERT 模型可以将这些非结构化数据提取为特征向量,然后通过Faiss 对这些特征向量进行计算,实现对非结构化数据的分析与检索。
本文利用Faiss搭建的FAQ问答系统也只是其中一个场景,展示了Faiss在非结构化数据处理中的应用。欢迎大家导入自己的数据建立自己的FAQ问答系统(或者文本搜索、智能客服等新系统)。Faiss向量相似度检索引擎搜索十亿向量仅需毫秒响应时间。你可以使用 Faiss探索更多 AI 用法!
原文地址 https://wenjie.blog.csdn.net/article/details/107823959
阅读过本文的人还看了以下文章:
基于40万表格数据集TableBank,用MaskRCNN做表格检测
《深度学习入门:基于Python的理论与实现》高清中文PDF+源码
2019最新《PyTorch自然语言处理》英、中文版PDF+源码
《21个项目玩转深度学习:基于TensorFlow的实践详解》完整版PDF+附书代码
PyTorch深度学习快速实战入门《pytorch-handbook》
【下载】豆瓣评分8.1,《机器学习实战:基于Scikit-Learn和TensorFlow》
李沐大神开源《动手学深度学习》,加州伯克利深度学习(2019春)教材
【Keras】完整实现‘交通标志’分类、‘票据’分类两个项目,让你掌握深度学习图像分类
如何利用全新的决策树集成级联结构gcForest做特征工程并打分?
Machine Learning Yearning 中文翻译稿
斯坦福CS230官方指南:CNN、RNN及使用技巧速查(打印收藏)
中科院Kaggle全球文本匹配竞赛华人第1名团队-深度学习与特征工程
不断更新资源
深度学习、机器学习、数据分析、python
搜索公众号添加: datayx
机大数据技术与机器学习工程
搜索公众号添加: datanlp
长按图片,识别二维码
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。