基于百度AnyQ框架的聊天系统

1 AnyQ介绍
AnyQ(Answer your Question)是基于百度的一个QA框架,具有配置化,插件化框架,各功能均需要插件形式加入。
运行成功的截图:
图片1
打开浏览器, http://localhost:8900/solr/#/ 查看Solr搜索引擎的admin页面
图片1
在浏览器中,可以调用接口localhost:8999/anyq?question=虚拟字段是否能排序
图片2
AnyQ 使用 SimNet模型 语义匹配模型构建文本语义相似度。
图片3

2 SimNet 框架
2.1 输入层
该层通过 look up table 将文本词序列转换为 word embedding 序列。
2.2 表示层
该层主要功能是由词到句的表示构建,或者说将序列的孤立的词语的 embedding 表示,转换为具有全局信息的一个或多个低维稠密的语义向量。最简单的是 Bag of Words(BOW)的累加方法,除此之外,我们还在 SimNet 框架下研发了对应的序列卷积网络(CNN)、循环神经网络(RNN)等多种表示技术。当然,在得到句子的表示向量后,也可以继续累加更多层全连接网络,进一步提升表示效果。
2.3 匹配层
该层利用文本的表示向量进行交互计算。
图片4
我们采用了 pair-wise Ranking Loss 来进行 SimNet 的训练。以网页搜索任务为例,假设搜索查询文本为 Q,相关的一篇文档为 D+,不相关的一篇文档为 D-,二者经过 SimNet 网络得到的和 Q 的匹配度得分分别为 S(Q,D+) 和 S(Q,D-),而训练的优化目标就是使得 S(Q,D+)>S(Q,D-)。实际中,我们一般采用 Max-Margin 的 Hinge Loss:max⁡{0,margin-(S(Q,D+)-S(Q,D-))}。可以通过 margin 的不同设定,来调节模型得分的区分度。

3 AnyQ 整体框架
AnyQ主要有4个模块,Question Analysis(问题分析), Question Retrival(问题检索),Question Matching(问题匹配),Ranking(排序)。
图片5
数据索引建立
首先,我们有一个FAQ set,我们将它灌入Solr企业级搜索引擎,作为Solr的候选集。可视化链接, 所有的数据都存在Solr的collection1中, 倒排索引。Solr先对文档进行分词,当文档数据来临时,solr会首先对文档数据进行分词,创建索引库和文档数据库。正排索引从文档编号找词:
图片6
倒排索引是从词找文档编号:
图片7
cp ../tools/anyq_deps.sh . sh anyq_deps.sh cp ../tools/solr -rp solr_script sh solr_script/anyq_solr.sh solr_script/sample_docs

4 ANNOY(Approximate Nearest Neighbors Oh Yeah) 超平面多维近似向量查找工具
./annoy_index_build_tool example/conf/ example/conf/analysis.conf faq/faq_json.index 128 10 semantic.annoy 1>std 2>err
调用Simnet,将所有的问答话术都先进行分词向量表示,转化为 word embedding 序列然后输出语义向量表示,然后将这些向量存入AnnoyIndex,默认余弦相似度可以选择多种进行Index,创建二叉树集合的索引,Annoy可以快速获得语义临近点。保存的结果为build/example/conf/semantic.annoy,之后可以使用这个快速查询的结果会返回指定数目的id的list,其对应的字典为:build/example/conf/faq_json.index。

5 Analysis问题分析
中文词法分析(LAC)
百度的LAC是一个联合的词法分析模型,整体性地完成中文分词(SEG)、词性标注(POS)、专名识别(NER)任务。LAC既可以认为是Lexical Analysis of Chinese的首字母缩写,也可以认为是LAC Analyzes Chinese的递归缩。LAC基于一个堆叠的双向GRU结构BI-GRU-CRF结构:
图片8

6 Retrival 问题检索
从问题分析获得分析结果会传到Retrival中,获得Retrival结果。
Term检索
从Solr搜索引擎中获取候选集,有不同的Solr查询插件,例如:
* EqualSolrQBuilder:字段等于
* BoostSolrQBuilder:字段term加权
* ContainSolrQBuilder:字段包含关键词
* SynonymSolrQBuilder:字段term同义词
* DateCompareSolrQBuilder:日期字段比较
语义检索
语义检索从Aanalysis的分析结果中的语义向量表示字段,然后在根据Annoy 获取其最近的k个问题的id列表,通过id列表字典对应到Retrival的结果列表。

7 Matching 候选集相似度匹配
首先需要对候选集RetrivalResults进行分词,然后进行语义或者词法匹配,每一种匹配方法都会输出一个分值,作为匹配结果Candidates的一个feature。可以配置多种匹配方法,获取不同的features特征。
Semantic Matching 语义匹配
百度SimNet 模型可以输出语义匹配相似度。
Lexical Matching 词法匹配
分词的结果进行不同的相似度计算
BM25: query与候选的BM25相似度
图片9
Q表示查询Query,qi表示查询被解析得到的分词qi,d表示搜索结果文档d,Wi表示分词qi的权重,R(qi,d)表示分词qi与文档d的相关性得分。定义一个词与文档相关性的权重方法有很多,较常用的有IDF。
Jaccard:交集/并集
ContainSimilarity:该特征表示query与候选之间是否存在包含关系
EditDistance: 表示query与候选编辑距离相似度
Cosine Similarity: 表示query与候选在字面上的余弦相似度

8 Rank 候选集排序
排序模型,排序模型将会对Candidates的文档进行评分,并给出一个最终得分ltr_score。
线性排序模型
给定给个feature一个权重,加权获得最终得分
特征选择预测模型
选定一个feature最为最终得分
非线性- XGBoost 模型

9 排序模型
排序 -> 删除分数低于阈值的项 -> 删除重复 -> 输出结果
在AnyQ系统中,词典和策略都以插件的形式封装。开发者可以根据实际的业务需要配置Analysis、Retrieval、Matching和Ranking策略及相关的词典。Anyq的配置文件需按照Protobuf格式。
四个模块可以进行插拔化设置,除此之外,还需要设置字典的配置。

10 load词典
在策略插件中使用的词典,需在dict.conf中配置。当前系统的词典插件主要包括以下几种:
哈希词典:HashAdapter<TYPE1, TYPE2>
干预词典:String2RetrievalItemAdapter
切词词典: WordsegAdapter
Paddle SimNet匹配模型词典: PaddleSimAdapter