开发者社区> nudger> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

【ModelScope】快速搭建FAQ智能问答机器人

简介: 本文主要介绍FAQ问答模型的使用,基于海量的标注/弱标注数据训练的FAQ模型可用作相似度计算,小样本分类,FAQ问答等多种场景,效果杠杠的
+关注继续查看

简介

  • ModelScope是阿里达摩院打造的模型即服务共享平台,为泛AI开发者提供灵活、易用、低成本的一站式模型服务产品,让模型应用更简单!在这里,你可以免费使用平台提供的预训练模型,支持免费下载运行,一行命令实现模型预测,简单快速验证模型效果
  • 本文主要介绍FAQ问答模型的使用,基于海量的标注/弱标注数据训练的FAQ模型可用作相似度计算,小样本分类,FAQ问答等多种场景,效果杠杠的


环境准备

  • 本地环境安装,modelscope相关文档比较详细,本文就不赘述了,可参考 环境安装
  • 【推荐使用】Notebook预装了modelscope环境,可直接使用,注意需要确认启动的是modelcope-0.4版本以上;

image

image

  • 快速体验,注意:模型输出的是每个label的分值;

image

FAQ问答核心组件

模型链接

模型调试:获取句子向量

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

# 获取句向量表示,可用于构建向量索引;
emb_ins = pipeline(Tasks.faq_question_answering, 'damo/nlp_structbert_faq-question-answering_chinese-base')
sentence_embs = emb_ins.get_sentence_embedding(['如何使用优惠券', '在哪里领券', '购物评级怎么看'], max_len=30)

模型调试:FAQ排序

from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

faq_ins = pipeline(Tasks.faq_question_answering, 'damo/nlp_structbert_faq-question-answering_chinese-base')
outputs = faq_ins({"query_set": ['如何使用优惠券', '在哪里领券', '购物评级怎么看'],
                   "support_set": [{'text': '卖品代金券怎么用', 'label': '6527856'}, 
                                   {'text': '怎么使用优惠券', 'label': '6527856'}, 
                                   {'text': '这个可以一起领吗', 'label': '1000012000'}, 
                                   {'text': '付款时送的优惠券哪里领', 'label': '1000012000'}, 
                                   {'text': '购物等级怎么长', 'label': '13421097'}, 
                                   {'text': '购物等级二心', 'label': '13421097'}]})
# 类维度排序
# {'output': [[{'label': '6527856', 'score': 0.9982811212539673}, {'label': '1000012000', 'score': 0.0280130784958601}, {'label': '13421097', 'score': 8.978261757874861e-05}], 
#             [{'label': '1000012000', 'score': 0.8750997185707092}, {'label': '6527856', 'score': 0.0031510782428085804}, {'label': '13421097', 'score': 0.0007711253711022437}], 
#             [{'label': '13421097', 'score': 0.6274582743644714}, {'label': '1000012000', 'score': 0.0035026895347982645}, {'label': '6527856', 'score': 0.001228355336934328}]]}

快速搭建端到端FAQ问答机器人

  • 数据准备,通常FAQ的数据结构包括知识标题、相似问法、答案、FAQID,我们使用公开的保险知道数据进行实验,为了简化,仅保留知识标题和答案内容,每条知识的相似问只有一条就是知识标题,数据获取参考链接
from dataclasses import dataclass
from typing import List
import pandas as pd
import json

@dataclass
class FAQ:
    title: str
    sim_questions: List[str]
    answer: str
    faq_id: int
    
ori_data = pd.read_csv('baoxianzhidao_filter.csv')
data = []
exist_titles = set()
for index, row in enumerate(ori_data.iterrows()):
    row_dict = row[1]
    title = row_dict['title']
    if title not in exist_titles:
        data.append(FAQ(title=title, answer=row_dict['reply'], sim_questions=[title], faq_id=index))
    exist_titles.add(title)
  • 构建索引,在实际业务场景中,由于FAQ知识库候选数量很多(通常是千级别的知识数量,万级别的问法数量),需要通过检索缩减候选数量,提升模型性能,以满足线上性能要求; (本文仅使用向量检索进行实验,为了更高的性能也可以使用elasticsearch)
    • 获取向量
from modelscope.pipelines import pipeline
from modelscope.utils.constant import Tasks

pipeline_ins = pipeline(Tasks.faq_question_answering, 'damo/nlp_structbert_faq-question-answering_chinese-base')

bsz = 32

all_sentence_vecs = []
batch = []
sentence_list = [faq.title for faq in data]
for i,sent in enumerate(sentence_list):
    batch.append(sent)
    if len(batch) == bsz or (i == len(sentence_list)-1 and len(batch)>0):
        sentence_vecs = pipeline_ins.get_sentence_embedding(batch)
        all_sentence_vecs.extend(sentence_vecs)
        batch.clear()
    • 向量索引构建
import faiss
import numpy as np
hidden_size = pipeline_ins.model.bert.config.hidden_size
index = faiss.IndexFlatIP(hidden_size)
vecs = np.asarray(all_sentence_vecs, dtype='float32')
index.add(vecs)
  • FAQ问答,问答流程包括检索+排序,来一个用户query,首先通过检索,召回候选数据,再通过faq模型给出最后的预测结果;
    • 问答函数:其中包括了检索 + 排序
from modelscope.outputs import OutputKeys

def ask_faq(input, history=[]):
    # step1: get sentence vector of query
    query_vec = pipeline_ins.get_sentence_embedding([input])[0]
    query_vec = np.asarray(query_vec, dtype='float32').reshape([1, -1])
    # step2: faq dense retrieval
    _, indices = index.search(query_vec, k=30)
    # step3: build support set 
    support_set = []
    for i in indices.tolist()[0]:
        faq = data[i]
        support_set.append({"text": faq.title, "label": faq.faq_id, "index": i})
    
    # step4: faq ranking
    rst = pipeline_ins(input={"query_set": input, "support_set": support_set})
    rst = rst[OutputKeys.OUTPUT][0][0]
    pred_label = rst['label']
    pred_score = rst['score']
    # get answer by faq_id
    pred_answer = ""
    pred_title = ""
    for faq in data:
        if faq.faq_id == pred_label:
            pred_answer = faq.answer
            pred_title = faq.title
            break
    history.append((input, f'{pred_answer}|(pred_title:{pred_title},pred_score:{pred_score:.3f})'))
    return history, history
    • UI接入,通过gradio库可快速搭建chatbot UI界面进行体验
import gradio as gr

gr.Interface(fn=ask_faq,
             theme="default",
             css=".footer {display:none !important}",
             inputs=["text", "state"],
             outputs=["chatbot", "state"]).launch(share=True)

image


至此,一个简单的端到端FAQ问答系统就搭建好了,此外,该模型还有多种应用场景,包括

  • 相似度计算:1.通过获取句向量,计算句子相似度;2. support_set中仅设置一个样本;
  • 小样本分类:support_set每个类传入少量几条样本等;

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
二维离散型随机变量 | 学习笔记
快速学习二维离散型随机变量
31 0
离散 Hopfield 网络-4| 学习笔记
快速学习离散 Hopfield 网络-4。
8 0
离散 Hopfield 网络-3| 学习笔记
快速学习离散 Hopfield 网络-3。
9 0
【SpringBoot】64、SpringBoot中集成企业微信机器人实现运维报警(下)
在企业运营中,为了实现工作效率和执行效率的提升,往往会选择在社群中使用群聊机器人进行协助管理。
21 0
离散 Hopfield 网络-5| 学习笔记
快速学习离散 Hopfield 网络-5。
13 0
离散 Hopfield 网络-1| 学习笔记
快速学习离散 Hopfield 网络-1。
11 0
ModelScope模型库体验之OFA模型实现英文视觉定位
OFA(One-For-All)是通用多模态预训练模型,使用简单的序列到序列的学习框架统一模态(跨模态、视觉、语言等模态)和任务(如图片生成、视觉定位、图片描述、图片分类、文本生成等)
543 0
机器学习系列(14)_PCA对图像数据集的降维_03
降维的目的之一是希望抛弃对模型带来负面影响的特征,同时,带有效信息的特征的方差应该是远大于噪音的,所以相比噪音,有效的特征所带来的信息不会在PCA当中大量抛弃。
71 0
零基础创建自属微信公众号问答机器人
小信子中文理解 API 云端服务平台最大的特色是采用“汉字基因”中文人工智能理解核心,提供单一界面 RESTful API 对外接口,为智慧家居、智慧陪伴、智慧助手、智慧社区服务、智慧客服、3D 虚拟智慧导览等提供全方位中文理解核心技术服务, 本文将讲解如何使用小信子中文理解 API 专属微信公众号托管服务从零基础创建自属微信公众号问答机器人。
8793 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Vision - 泛可视化搭建解决方案
立即下载
产品手册6.0-应用数据与智能
立即下载
ModelScope助力语音AI模型创新与应用
立即下载