Skip to main content

夯实机器人开发的基础 - QnA Maker 使用指南

分类:  Azure认知服务 标签:  #Azure #人工智能 #语言理解(LUIS) #Azure QnA Maker #QnA Maker 发布于: 2023-06-10 21:20:38

我们先来看一下微软提供的LUIS服务和QnA Maker服务之间的区别和使用场景。

LUIS和QnA Maker

QnA Maker和LUIS是微软Azure平台提供的两大自然语言处理的API, 我们前面有文章介绍了LUIS(语言理解服务), 简而言之, LUIS处理的场景是对用户输入的自然言语进行意图分类以及提取言语中的实体数据,但是并不会直接给用户进行一个回应,如果需要给用户一个回应,那么用户的应用需要基于已经确定的意图和实体数据向其他应用提出需求,然后基于业务逻辑返回给用户回应,这些业务逻辑的范围非常广,例如帮助客户创建日历,发送邮件,订酒店机票等等。但是QnA Maker是收集用户的言语输入,然后根据用户的言语输入直接会给出用户需要的答案,也就是说QnA Maker虽然也是自然语言处理的API, 但是QnA Maker的业务逻辑很单一,就是为了会话,根据用户的提问返回用户答案,无法完成其他的业务。这就是LUIS服务和QnA Maker最大的区别。

那么我们什么时候使用LUIS,什么时候使用QnA Maker呢?加入你需要更强的业务逻辑,更强的业务处理,只能选择LUIS, 如果是为了分享知识,回答问题,那么QnA Maker是好的选择,那么我们可以两者都使用吗?当然可以,假如你有一个机器人应用,既要回答客户问题,又要其他的业务支持,那么完全可以同时结合二者来使用,甚至微软的Bot Framework已经提供了一个Dispatch CLI的工具,无需您写代码,可以自动用该工具生成一个路由,您的应用直接引用就可以了,会自动判断是使用LUIS应用还是将查询发送到QnA Maker服务上。

QnA Maker的知识库(KB)

我们在创建QnA Maker时已经发现了,创建QnA Maker服务时,会同时创建Azure Search以及Azure Web App的资源,同时我们确认QnA Maker不保存数据,它知识根据你提供的资料使用模型生成问答对以及使用模型分析用户的输入,由Azure Search来提供数据保以及搜索的功能,比提供答案排名等功能。所以一个知识库就相当于一个Azure Search的索引,因此能创建多少个知识库取决于您的Azure Search定价层可以存储多少个索引数n-1, 加入您的Azure Search最多支持15个索引,那么你的知识库最多就是15-1 = 14 14个。

QnA 问答对

刚刚我们讨论了QnA Maker服务本身不存储数据,数据的存储是在Azure Search中,那么Azure Search存储哪些数据呢?这里就需要提到我们这里概念,也就是QnA 的问答对,我们可以给出一个图片来说明这个问题,如下图:


QnA Maker模型的作用就是从用户提供的数据中自动判断并生成问答对,用户需要通过SDK(API)或者Portal给出的工具向QnA Maker提供数据,然后数据提交成功后,使用Portal上的工具保存并训练,最后发布到endpoint上即可。

QnA Maker支持的数据源

当前QnA Maker支持如下的类型的数据:

  • 可以公开访问的Web URL
  • PDF/Word文档: 包括常见问题解答,产品手册,小册子,论文,传单,使用指南,结构化的问答等等。
  • Excel 文档
  • SharePoint 文档或者URL
  • TxT文档
  • 在QnA Maker Portal上编辑的问答对。

用户可以使用SDK(API)将这些文档上传到QnA Maker中,同时再保存和训练就可以了。

QnA 问答对支持的特性

我们除了可以直接向QnA Maker里添加问答对之外,为了更加精确的返回结果和适应更多的使用场景,QnA Maker问答对支持更多的特性。

  • 默认答案
  • 替代问答
  • 问答对元数据
  • 多回合跟进提示
默认答案

默认答案是用于在QnA Maker中确实没有找到更适合的答案,那么QnA Maker会返回这个答案。默认答案的设置可以在创建一个新的知识库的时候设置,如下图:


也可以在一个已经创建的知识库中进行更改,如下图:


替代问题

一个问答对,可能有很多个问题对应的都是同一个答案,那么这些问题就是替代答案,例如用户用不同的表达方式询问同一个问题,如下图:


问答对元数据

问答对的元数据主要作用是为了给客户端更加精确的查询答案而准备的,例如客户询问一个产品什么价格,给出答案后,可以考虑在答案后面加上元数据,例如给出问答对的中产品的型号,和产地,这样用户在搜索的时候可以提交元数据进行过滤。
例如:

{
    "question": "When does this hotel close?",
    "top": 1,
    "strictFilters": [ { "name": "restaurant", "value": "paradise"}]
}

注意这个实例是使用json的查询格式向QnA Maker的api进行查询的,这里的top属性表示返回多少条查询记录,strictFilters就是表示使用元数据对答案进行限定。

在按照元数据进行筛选的时候可以使用逻辑符进行按逻辑来返回答案,如下就是按照OR逻辑关系返回查询结果。

{
    "question": "When do facilities in this hotel close?",
    "top": 1,
    "strictFilters": [
      { "name": "type","value": "restaurant"},
      { "name": "type", "value": "bar"},
      { "name": "type", "value": "poolbar"}
    ],
    "strictFiltersCompoundOperationType": "OR"
}

注意这里要使用strictFiltersCompoundOperationType属性来表明逻辑运算符。

创建元数据

创建元数据很简单,只需要在问答对上进行创建就可以了,首先需要打开上下文菜单,如下图:


然后使用如下的菜单创建就可以了


多回合跟进提示

为了更加有好的对应用进行提示,可以在问答对里添加多回合跟进提示,什么是多回合跟进提示呢?如下图所示,一张图就把这个问题说明白了:


如上图Your Azure AccountWhere's the Azure Portal Login url就是跟进提示,点击跟进提示之后,会自动向QnA 发送问题,同时会即刻返回预定的答案。

要创建跟进提示也很容易,如下图,点击Add follow-up prompt即可以出现对话框


在出现的对话框填写提示文本,并引用或者创建新的问答对,回答该问题。


使用主动学习和主动学习反馈提升问答精度

我们可以对知识库开启主动学习的功能,该主动学习功能能从用户的查询中主动学习并重新训练模型,要启用主动学习,可以如下图操作:


这样即可启用主动学习。

使用主动学习

从机器人中使用 GenerateAnswer 和训练 API 的体系结构流
机器人或其他客户端应用程序应通过以下体系结构流来使用主动学习:

  • 机器人借助 GenerateAnswer API 并使用 top 属性来指定获取的答案数量,从知识库中获取答案。
  • 机器人确定显式反馈:
  • 使用你自己的自定义业务逻辑,筛除低分数。
  • 在机器人或客户端应用程序中,向用户显示可能答案列表并获取用户选定的答案。
  • 机器人会通过训练 API 将选定的答案发回 QnA Maker。

关于这个部分更详细的实例,请参考地址:https://docs.microsoft.com/zh-cn/azure/cognitive-services/qnamaker/how-to/improve-knowledge-base

好了,QnA Maker的指南到此介绍完了,大家有什么问题,欢迎大家联系我。