代码编织梦想

背景

基于FAQ的智能问答本质是一个信息检索的问题,所以可以简单划分成:召回+精排 两个步骤。召回的目标是从知识库中快速的召回一小批与query相关的候选集。所以召回模型的评价方法,主要侧重于 响应时间top@n的召回率 两个方面。

本文将分享我们召回模型的逐步迭代过程,从最基础的“ES字面召回”到 “ES字面召回和向量召回”的双路召回模式。

基于ES的简单召回

在第一篇分享"基于FAQ的智能问答(一): Elasticsearch的调教" 中已经介绍了信息检索中的神器Elasticsearch!所以可以基于ES快速搭建一个召回的baseline。

具体而言,构建如下的ES查询语句,按照评分从高到低返回top50的结果:

{
    "query":{
      "match":{
        "question":"公务员考试"
      }
    },
    "explain": true
}

而基于ES的召回实质是基于BM25的召回[1]:

63f2d306a35a80a82b664a1a19839917.jpeg
ES官网关于相似度计算的说明

通过在查询添加`explain=true`可以获取计算的细节:

...
"hits" : [
{
    "_shard" : "[lime-ai-faq][0]",
    "_node" : "X0rpCxNLQcuOW56gzFjPAA",
    "_index" : "lime-ai-faq",
    "_type" : "_doc",
    "_id" : "360",
    "_score" : 17.105383,
    "_source" : {
        "question" : "公务员考试省考和国考的题型区别大吗?",
},
"_explanation" : {
    "value" : 17.105383,
    "description" : "sum of:",
    "details" : [
    {
        "value" : 4.8125763,
        {
            "value" : 4.8125763,
            "description" : "score(freq=1.0), computed as boost * idf * tf from:",
            "details" : [
            {
                "value" : 2.2,
                "description" : "boost",
                "details" : [ ]
            },
            {
                "value" : 5.628467,
                "description" : "idf, computed as log(1 + (N - n + 0.5) / (n + 0.5)) from:",
                "details" : [
                {
                    "value" : 8,
                    "description" : "n, number of documents containing term",
                    "details" : [ ]
                },
                {
                    "value" : 2364,
                    "description" : "N, total number of documents with field",
                    "details" : [ ]
                }
                ]
            },
            {
                "value" : 0.38865548,
                "description" : "tf, computed as freq / (freq + k1 * (1 - b + b * dl / avgdl)) from:",
                "details" : [
                {
                    "value" : 1.0,
                    "description" : "freq, occurrences of term within document",
                    "details" : [ ]
                },
                {
                    "value" : 1.2,
                    "description" : "k1, term saturation parameter",
                    "details" : [ ]
                },
                {
                    "value" : 0.75,
                    "description" : "b, length normalization parameter",
                    "details" : [ ]
                },
                {
                    "value" : 11.0,
                    "description" : "dl, length of field",
                    "details" : [ ]
                },
                {
                    "value" : 7.777073,
                    "description" : "avgdl, average length of field",
                    "details" : [ ]
                }
                ]
            }
            ]
        }
        ]
    }
},
{
  "value" : 4.8125763,
  "description" : "weight(question:公务 in 965) [PerFieldSimilarity], result of:",
  "details" : [...]
},
{
  "value" : 3.8403268,
  "description" : "weight(question:员 in 965) [PerFieldSimilarity], result of:",
  "details" : [...]
},
{
  "value" : 3.639904,
  "description" : "weight(question:考试 in 965) [PerFieldSimilarity], result of:",
  "details" : [...]
},
]

score = \Sigma boost * tf * idf  = \Sigma boost * (\frac{freq}{freq + k_{1} * (1 - b + b * \frac{d}{d_{avg}} )}) * log_{2} \frac{N + 1}{n+0.5})

boost:用来控制检索字段的权重。默认值为2.2;

k1:控制词频结果在词频饱和度中的上升速度默认值为1.2。值越小饱和度变化越快,值越大饱和度变化越慢;

b:控制字段长归一值所起的作用0.0会禁用归一化,1.0会启用完全归一化。默认值为0.75;

-----------

但是基于ES的召回,也就是BM25的召回方案,还是基于字面的关键词进行召回,无法进行语义的召回。考虑下面的场景

知识库内的问题是:“可以免运费吗?”

用户的query如果是:“你们还包邮?”

可以看到用户的query和知识库中的问题没有一个关键词相同,但是其实是语义一致的。这就需要基于语义的召回来补充。

基于语义的召回

基于语义的召回通常是基于embedding的召回。具体而言,首先训练sentence embedding模型,然后将知识库中的问题都预先计算出embedding向量。在线上预测阶段,对于每个query同样先计算出embedding,再到知识库中检索出相近的embedding所属的问题。

这里采用的方案参考的是facebook最新的论文: Embedding-based Retrieval in Facebook Search[2],是一个pair wise的模型架构,并且针对负样本的构建做了深入的实验。

模型结构

我们采用的基本结构是albert获取embedding,然后通过pair-loss function进行fine-tuning。

748a20a795a7d5b259f6e6561e17ff0c.jpeg
基于pair-wise的模型结构

这里的loss function:

L = max(0,D(q,d+) - D(q,d-) + m)

其中

D(q,d) = 1 - cos(q,d) \in [0,1]

这里m为超参数,对于“简单”的样本,正样本和负样本之间的距离大于m,L即为0。所以m的存在,让模型更加关注比较“难”的样本。

数据构建

我们尝试构建一个通用领域的召回数据集,格式为(q,d+,d-)的三元组。

这里我们借鉴了论文Embedding-based Retrieval in Facebook Search中的思路,d-负样本包括easy和hard两类。

具体而言,首先收集一个通用领域的query集合,再带入百度知道中检索,提取1-20页的结果。

de5c02a4af384897228f46f50abb40cf.jpeg
第一页的结果,作为正样本

df3af6706fa236c21ab6b36720d4f6b4.jpeg
第二十页的结果
{
    "q":"北京有哪些旅游景点"
    "page_1": [
        "北京有哪些旅游景点啊?"
        "北京有哪些旅游景点好玩"
        "北京有哪些旅游景点最出名?可以推荐一些吗?"
        ...
    ],
    ....
    "page_20": [
        "北京旅游景点线路的服务标准都有哪些?"
        "北京周围方圆三百里有什么旅游景点。。农业观光区。。",
        "北京到包头沿途有什么旅游景点?"
        ...
    ]
}

抓取的数据集如上所示,每个query包括都包括1-20页的问题。

对于每个query,随机从page1-3页中提取5个问题作为正样本,从page20页中随机抽取3个问题,并且与query之间的rouge值<0.15的作为 “hard”负样本,从其他的query的问题中随机抽取12个问题作为 “easy 负样本

这样每个query,包括5个正样本和15个负样本。两两组合就可以构建出 75个 (q,d+,d-)三元组。

ES dense_vector

基于embedding的检索,已经有很多成熟的方案,包括:Annoy、Faiss、Elasticsearch (dense_vector)等。最终考虑不引入新的框架(挖坑),我们还是选择继续在ES中来实现,主要就是基于ES的dense vector。

在MySQL同步到ES的阶段,为每个问题计算出句子级别的embedding向量,并存储到`question_vector`字段中。在检索阶段,先计算出query的embedding向量,再基于以下的检索语句:

{
  "script_score": {
    "query": {"match_all": {}},
    "script": {
      "source": "cosineSimilarity(params.query_vector, 'question_vector') + 1.0",
      "params": {"query_vector": query_vector}
    }
  }
}

具体可以参考ES的官网blog:

elastic.co/cn/blog/text

双路召回

最终的召回框架如下图所示,是 “字面召回 + 语义召回” 的双路召回结构。在收到query的请求后会同步发起两路召回,最后进行结果的合并。

21cf454ccb2d5b41d6cab3213fd8b5fd.jpeg

其中Embedding Server是一个基于Tensorflow-Serving的独立服务。

全部的服务(Flask,ES,TF-Serving)均部署在CPU的k8s集群上,在知识库问题数量<10000的场景下,整个召回阶段的响应时间<50ms,满足线上的实际需要。 同时top@50的召回率也能接近100%

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/nghuyong/article/details/127959436

智能客服faq问答任务的技术选型探讨_ted_li的博客-爱代码爱编程

引子 在智能客服的业务场景中,对于用户频繁会问到的业务知识类问题的自动解答(以下简称为FAQ)是一个非常关键的需求,可以说是智能客服最为核心的用户场景,可以最为显著地降低人工客服的数量与成本。 比如10086的在线智能客服,用户提问“如何查询话费”,那系统可以自动给出一个对应的知识“请您向10086号码发送‘HF’短信,即可查询当前话费”,而不再需要耗

基于深度学习的智能问答_天一生水water的博客-爱代码爱编程_深度学习 智能问答

原文地址:https://yq.aliyun.com/articles/58745 摘要: 纵观自动问答系统的技术发展历史,从1950年代因图灵测试而诞生至今,已经有几十年的历史。但真正在产业界得到大家的广泛关注,则得益于2011年Siri和Watson成功所带来的示范效应。自此,自动问答系统较以往任何时候都显得离实际应用更近。这一方面归功于机器学习与自

基于深度学习的faq问答系统_stay_foolish12的博客-爱代码爱编程_基于深度学习的问答系统

| 导语 问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库、知识图谱或问答知识库返回简洁、准确的匹配答案。相较于搜索引擎,问答系统能更好地理解用户提问的真实意图, 进一步能更

基于深度学习的FAQ检索式问答系统-爱代码爱编程

问答系统是信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库、知识图谱或问答知识库返回简洁、准确的匹配答案。相较于搜索引擎,问答系统能更好地理解用户提问的真实意图, 进一步能更有效地满足用户的信息需求。问答系统是目前人工智能和自然语言处理领域中一个倍受关注并具有广泛发展前景的研究方向。 一、引言        问答系统

基于文本语义的智能问答系统以及数据格式应用-爱代码爱编程

基于文本语义的智能问答系统以及数据格式应用 NLP: 基于文本语义的智能问答系统 应用场景: 智能语音交互,在线客服,知识获取,情感类聊天等 常见的分类:生成型,检索型问答系统; 单论问答,多轮问答系统; 面向开放领域,特定领域的问答系统example: 基于检索,面向特定领域的问答系统——智能客服机器人1. 传统客服机器人的搭建流程: 思路一:需要

FAQ问答系统-爱代码爱编程

参考 摘要:FAQ(Frequently Asked Questions)问答系统是目前应用最广泛的问答系统。这种问答系统的结构框架明了、实现简单、容易理解,非常适合作为问答系统入门学习时的观察对象。这里基于本人在问答系统建设方面的“多年”经验,对FAQ问答相关的定义、系统结构、数据集建设、关键技术、应用等方面进行了整理和介绍。 1引言 2019年至今

搜索智能问答的探索与实践-爱代码爱编程

搜索智能问答的探索与实践 搜索引擎的演化历程 搜索智能问答的探索与实践 搜索引擎的演化历程 搜索中的问题需求搜索中的问答形态搜索中问答的技术路线KBQA 什么是KBQA解决方案 方案一:结构化推理 基于组合范畴语法 (CCG) 或句法依存树解析Query结构,并将其以固定的规则转换为图引擎表达式 方案二:结果端到端 基于神经网络,一站式完成从原

对话系统-“问答型”单轮对话:FAQ检索式对话系统【步骤:①用户意图判断、②文本检索召回、③文本匹配计算排序】【搜索引擎的最终形态】-爱代码爱编程

一、基本概念 文本匹配:计算文本之间的相似度,主要分为两大类: 1)基于句子向量表示的相似度模型(适合初始召回); 2)基于词级别匹配的相似度模型(适合对召回结果重排) 问答系统:信息检索的一种高级形式,能够更加准确地理解用户用自然语言提出的问题,并通过检索语料库、知识图谱或问答知识库返回简洁、准确的匹配答案。相较于搜索引擎,问答系统能更好地理解用

基于neo4j图谱搭建问答系统-爱代码爱编程

前言 承接前文,本文介绍如何根据已有的neo4j图谱来搭建一个简单的问答系统。 ps:因为是基于neo4j图谱的,所以这个问题必须是在图谱中有答案才能进行回答。 完整项目github地址:https://github.com/Chtholly1/KG-and-QA-demo 正文 问答系统是NLP中最复杂的场景之一,根据查阅资料和个人的理解,一个简单

基于faq的智能问答(三): 精排篇_nghuyong的博客-爱代码爱编程

在上一篇<基于FAQ的智能问答(二):召回篇>中已经介绍了,给定一个用户的query如何从知识库中快速准确的召回一小批相关的问题,本篇将继续介绍如何对这一小批问题进行精排,最终构建出answer返回给用户。 任务描述 给定一个用户的问题q,和一批召回的问题d,对每个d进行相关性的打分计算,并根据相关性进行评价。同时根据top1打分的不同

基于faq的智能问答(一): elasticsearch的调教_nghuyong的博客-爱代码爱编程

背景 对话领域是当前最热门的一个NLP的方向之一,无论在学术界还是在工业界。由此衍生出来的产品包括通用形态的苹果siri,微软小冰,小米的小爱同学等,以及各个行业领域的智能助手,智能客服等。 这些产品基本可以看成下一代人机自然语言交互的雏形。 具体而言人机对话又可以拆分为以下几种形式: (1) FAQ-Bot: 基于常见问答对的问答,也是运用最为