针对问题咨询场景中出现大量相关领域的问题,PAI提供了智能客服对话系统解决方案,以降低客户等待时间和人工客服成本。本文以汽车售前咨询业务领域为例,介绍如何基于人工智能算法,快速构建智能客服对话系统。

您可前往阿里云AI体验馆中的智能客服页面,体验“汽车售前咨询”的服务示例。

背景信息

在企业服务用户的过程中,每天都会出现大量相关领域内的问题。传统的人工客服作息服务解答效率低,且成本高。针对该问题,PAI提出了如下解决方案,搭建智能客服对话系统,从而帮助企业实现在线服务的智能化人机协作、提高坐席服务的效率、降低人力开销及新人业务学习成本:
  • 解决方案

    PAI在智能客服领域提供了端到端的纯白盒解决方案。您只需要准备好自己相关领域的常见问题FAQ(Frequently Asked Questions)和知识图谱数据,就可以利用PAI搭建自定义的人工智能流程,形成从算法构建到模型部署的端到端解决方案,从而实现对应领域的智能客服业务系统。

    本文以汽车售前咨询业务领域为例,为您展示如何快速搭建智能客服机器人,从而实现机器人自动回答关于汽车售前业务的相关问题。该方式不仅能够节省客户的咨询等待和信息检索时间,而且能够节省企业运营人力成本,使精力可以集中在高价值客户上。

  • 方案架构
    智能客服对话系统工程部署架构图如下所示。智能客服对话系统架构图您先将知识图谱数据、模型和特征文件及FAQ数据存储在OSS上,然后将智能客服对话系统服务部署在PAI-EAS上,就可以使用FAQ检索和知识图谱查询提供的功能进行智能客服问答。
    智能客服对话系统内部状态跳转逻辑如下图所示。跳转逻辑系统初始化后进入闲聊状态,对用户输入“您好”等话语进行响应。响应完成后系统进入问题接收状态,此刻等待用户提问。接入通过实体归一化、属性归一化明确用户提问中的实体和属性,接着进入问答状态进行FAQ检索或知识图谱查询。当出现异常状况时,进入异常处理模式,在异常处理中引导用户进入正确的查询。
  • 方案优势
    • 纯白盒:您可以根据自己具体的业务场景自定义智能客服业务系统。
    • 端到端:从最初的数据准备到最后的模型部署推理,提供全链路的系统构建流程。
    • 有据可依:对话系统内所有的回答都是有依据的,避免纯深度学习方案的不可解释性。
    • 鲁棒可控:系统任何地方出了问题,都有相应的异常处理与Bad Case分析应对机制。

前提条件

操作流程

基于阿里云机器学习PAI平台,构建智能客服对话系统的流程如下:
  1. 步骤一:基于FAQ构建检索问答系统

    检索问答系统在对您提出的查询进行预处理的基础上,从FAQ数据集中找到该查询的同义问句,从而匹配并回答预置好的答案。

  2. 步骤二:基于KBQA构建知识图谱问答系统

    对问题进行语义理解和解析,进而基于知识图谱构建的知识库进行查询和推理,从而得到答案。

  3. 步骤三:配置智能客服在线服务

    部署智能客服在线服务,并进行在线调试。

步骤一:基于FAQ构建检索问答系统

基于FAQ的问答系统总体结构如下图所示。问答系统总体结构图该系统包括以下关键模块:
  • 频繁问答对数据集:FAQ问答库。
  • 预处理模块:负责对查询进行分词等操作。
  • 检索模块:负责从FAQ中检索可能与您查询相似的若干标准问句。
  • 相似问句选择模块:负责从候选相似问句中,选择与您查询最相似的标准问句。
上述的检索模块在对您提出的查询进行预处理的基础上,从FAQ数据集中检索K个与查询最相似的问句。然后相似问句选择模块会从这K个候选相似问句中,选出与查询相似度最高的,并判断是否具有足够的置信度。如果相似度最高的候选相似问句的置信度达标,则相似问句选择模块会判定该问句是用户查询的同义问句,从而返回提前预置的答案。
  1. 准备FAQ频繁问答对的数据集。
    FAQ是业务场景中最常问的问题,也称为标准问题。对于这类问题,您可以提前编制答案,构成问答对,即QA对(Question Answer Pair)。问答系统的知识库中存储的FAQ数据集,实际上是标准问题与其答案构成的QA对数据集。如果您提出的问题和FAQ数据集中的某个标准问题相似,那么您问题的答案就是该标准问题的答案。

    构建频繁问答对数据集需要根据场景特点,确定问题涉及的范围。然后根据开放数据源及自有数据集,采集问答对内容或编写问答对内容。此外,本解决方案支持业务方持续对FAQ数据集进行优化,业务方可以增加一个标准问题、增加同一标准问题的同义问句、增加问题的答案配置集等。

    本文以汽车售前的智能客服场景为例,展示FAQ所需的数据,文件列表及层级关系如下所示。
    car_faqs
    ├── query_label_idx_map.txt        # 标注问题ID编号文件。
    ├── questions                      # 标准问题同义配置文件。
    │   ├── 保养灯的使用说明
    │   ├── 保养一次多少钱
    │   ├── 变速箱故障灯亮
    │   ├── ......
    ├── answers                        # 标准答案配置文件。
    │   ├── 某汽车品牌_A型号_2021款_标准续航升级版
    │   ├── 某汽车品牌_A型号_2021款_长续航版
    │   ├── ......

    以下为构建上述FAQ所需的数据文件的具体步骤。

    1. 构建标注问题ID编号文件。
      为提升检索模块的召回率,通常会为每一个标准问句配置若干同义问句。因此您需要对FAQ频繁问答库中的标准问题进行ID化编号。例如针对上面FAQ中的标准问题,ID化后如下所示(仅为示例文件query_label_idx_map.txt的部分数据样例)。
      有几个排气管  0
      是双排气管吗  1
      问某款车是什么悬挂 2
      有换挡拨片吗 3
      问发动机产地 4
      变速箱是哪里产的 5
      问上市时间 6
      问某款车上市了吗 7
      可以加装换挡拨片吗 8
      一保多少钱 9
      在上述标准问题ID编号文件中,问题和数字之间使用Tab分隔。
    2. 构建标准问题同义配置文件,并将所有标准问题的同义配置文件放到questions文件夹中。
      为每个标准问题配置若干个同义问题。以“保养灯的使用说明”为例,文件的每一行内容对应一个和“保养灯的使用说明”同义的问题。以下为示例文件保养灯的使用说明的部分数据样例。
      新款保养灯怎么设定
      保养灯是什么样子的图标
      保养灯什么消岀
      保养灯归是什么标志?
      保养灯长什么样子
      保养灯如何设置。因为过保不想去4S店了,有谁知道的说一下.
      保养灯归零,是怎么,弄得,请问各位兄弟,谢谢!
      保养灯和燃油指示灯同时闪烁是怎么回事?
      有保养灯的没有?
      汽车保养灯归零
    3. 构建标准答案配置文件,并将所有的标准答案配置文件放到文件夹answers中。
      以某汽车品牌_A型号_2021款_标准续航升级版这款车为例,答案配置文件的示例文件某汽车品牌_A型号_2021款_标准续航升级版的部分样例数据如下所示。
      [有几个排气管]  0个
      [是双排气管吗]  不是
      [问某款车是什么悬挂] 前麦弗逊式独立悬架,后多连杆独立悬架
      [有换挡拨片吗]  没有
      [问发动机产地]  美国
      [变速箱是哪里产的]  上海
      [问上市时间] 2021年1月
      [问某款车上市了吗]  2021年1月已上市
      [可以加装换挡拨片吗] 可以加装,但需要加装模块
      [一保多少钱] 5000公里做首保,首保免费
      标准答案配置文件中的[]表示问题类型,后面展示问题的答案。其中答案和问题类型之间使用Tab分隔。
  2. 对问答进行特征向量化。
    利用可视化建模PAI-Designer提供的基于海量大数据语料预训练获得的NLP迁移学习模型,构建查询向量表征模型。示例使用的训练集为train.csv、评估集为dev.csv、测试集为test.csv
    1. 进入工作空间,详情请参见工作空间管理
    2. 在左侧导航栏,选择模型开发和训练 > 可视化建模(Designer)
    3. 基于工作流模板,创建智能客服问答特征向量化工作流。创建智能客服问答特征向量化工作流
    4. 工作流列表页面,选中刚才创建好的模板工作流,并单击进入工作流
    5. 系统根据预置的模板,自动构建工作流,如下图所示。运行过程中,您右键单击工作流中的节点,可以查看运行日志。
      工作流详图
      区域描述
      配置实验的训练集,即配置读OSS数据组件的OSS数据路径参数为准备的训练集文件的OSS目录。例如oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/chatbot_demo/FAQ/train.csv,该数据集是PAI在华东2(上海)提供的公开数据集,您可以直接使用。
      配置实验的评估集,即配置读OSS数据组件的OSS数据路径参数为准备的评估集文件的OSS目录。例如oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/chatbot_demo/FAQ/dev.csv,该数据集是PAI在华东2(上海)提供的公开数据集,您可以直接使用。
      配置智能客服特征向量训练的参数。智能客服特征向量训练组件的配置详情请参见下文的特征向量训练组件配置
      配置实验的测试集,即配置读OSS数据组件的OSS数据路径参数为准备的测试集文件的OSS目录。例如oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/chatbot_demo/FAQ/test.csv,该数据集是PAI在华东2(上海)提供的公开数据集,您可以直接使用。
      配置智能客服特征向量预测的参数。智能客服特征向量预测组件的配置详情请参见下文的特征向量预测组件设置
      表 1. 特征向量训练组件配置
      页签参数描述本案例的示例值
      字段设置输入Schema数据训练向量召回内容的schema。sent:str:1,label:str:1
      文本列选择训练向量召回的内容在输入表中对应的列名。sent
      标签列选择标签在输入格式中对应的列名。label
      模型存储路径存储训练模型的OSS路径。oss://pai-online-shanghai.oss-cn-shanghai-internal.aliyuncs.com/chatbot_demo/FAQ/saved_model_dir/
      参数设置每个GPU上的每步训练的样本数Batch Size每个GPU上的每步训练的样本数目。32
      序列长度模型的Sequence Length。128
      训练轮数训练模型时,使用整遍数据集的次数。3
      模型保存间隔步数训练模型时,每隔多少步保存一次模型参数。100
      学习率模型构建过程中的学习率。1e-5
      双塔模型用户自定义参数用户自定义参数。pretrain_model_name_or_path=hfl/chinese-roberta-wwm-ext two_tower=True siamese=True loss_type=hinge_loss margin=0.45 gamma=32 embedding_size=128
      执行调优训练需要的机器数分布式服务器的数量,默认值表示1个Worker。1
      训练需要的每台机器上的CPU核数每个Worker下的CPU卡数量。1
      训练需要的每台机器上的GPU卡数每个Worker下的GPU卡数量。1
      GPU机器类型选择工作流运行的计算资源。GPU计算型8核60G
      表 2. 特征向量预测组件设置
      页签参数描述本案例的示例值
      字段设置输入Schema数据训练向量召回内容的schema。sent:str:1,label:str:1
      文本列选择训练向量召回的内容在输入表中对应的列名。sent
      预测输出文件预测结果的输出文件。oss://pai-algo-tongrun-test.oss-cn-shanghai-internal.aliyuncs.com/etm_text_match_two_tower/features.out
      参数设置每个GPU上的每步预测的样本数Batch Size每个GPU上的每步预测的样本数目。32
      序列长度模型的Sequence Length。128
      双塔模型用户自定义参数用户自定义参数。two_tower=Truesiamese=True
      执行调优训练需要的机器数分布式服务器的数量,默认值表示1个Worker。1
      训练需要的每台机器上的CPU核数每个Worker下的GPU卡数量。1
      训练需要的每台机器上的GPU卡数每个Worker下的CPU卡数量。1
      GPU机器类型选择工作流运行的计算资源。GPU计算型8核60G

步骤二:基于KBQA构建知识图谱问答系统

基于知识库问答KBQA(Knowledge Base Question Answering)是指给定自然语言问题,通过对问题进行语义理解和解析,进而基于知识图谱构建的知识库进行查询和推理,从而得出答案。基于KBQA的知识图谱问答系统的架构图如下所示。基于KBQA的知识图谱问答的架构图该系统包括以下关键模块:
  • 实体链接:将问句中提到的实体关联到唯一的实体表达。
  • 语义角色标注:对属性的类型进行自动打标。
  • 意图分类:判断问句属于什么问题类型。
  • 查询链路生成:生成查询知识库的查询语句。
  • 答案生成:负责按照问题意图的类型,在答案模板里生成答案。
上述的实体链接会根据规则对问句进行模式匹配,将问句中的实体映射到系统中的实体规范表达。系统自动标注出属性归属的类别树,并且根据是否为叶子属性进行属性引导,直至定位到叶子属性上,再对问句进行意图分类。最后系统生成查询路径对树形知识图谱进行查询,返回叶子结点的属性值,将生成的答案返回给用户。

以下为您介绍如何准备基于实体和属性描述的知识图谱数据

针对实体、属性名称和属性值,基于KBQA的知识图谱问答系统采用可读性强的JSON构建数据文件。属性名可以包括子属性,以“某汽车品牌_A型号_2021款_标准续航升级版”为例,车轮制动属性包括前制动器类型、后制动器类型、驻车制动类型这些子属性。您需要将业务中的数据转换为JSON格式。下面为示例文件某汽车品牌_A型号_2021款_标准续航升级版.json的部分样例数据。
{
    "实体": {
        "名称": "某汽车品牌_A型号_2021款_标准续航升级版",
        "关键词": "某汽车品牌|A型号|2021款|标准续航升级版"
    },
    "属性": {
        "厂商": "某汽车品牌中国",
        "品牌": "某汽车品牌",
        "经销商报价": "27.6万",
        "级别": "中型SUV",
        "上市时间": "2021.07",
        "纯电续航里程": "525km",
        "充电时间": "快冲一小时,慢充10小时",
        "百公里加速时间": "5.6s",
        "整车保修期限": "4年或8万公里"
    },
    "变速箱": {
        "变速箱档位个数": "6个",
        "变速箱类型": "手动变速箱"
    },
    "配置": {
        "内部配置": {
            "空调": {
                "空调控制方式": "自动",
                "温度分区控制": "有",
                "后座出风口": "无"
            },
            "行车电脑显示屏": "有",
            "倒车视频影像": "有"
        }
    }
}

步骤三:配置智能客服在线服务

  1. 创建安全组
    创建安全组时,您需要注意以下参数的配置。
    区域参数描述
    基本信息网络选择已经创建的专有网络VPC。如果没有专有网络VPC,单击创建专有网络创建VPC,并完成专有网络中的交换机创建。
    访问规则入方向协议类型选择自定义TCP。
    端口范围配置为6379/6379
    授权对象填写已创建的PAI-EAS专属资源组对应的服务器IP。
    重要 此处不能填写0.0.0.0/0,该策略会导致使用到该安全组的ECS、RDS等资源被外部入侵。
  2. 创建Redis实例,详情请参见步骤1:创建实例
    创建Redis实例时,您需要注意以下参数配置,其他参数使用默认值即可。
    参数描述
    网络类型选择专有网络
    专有网络选择已创建的专有网络。
    虚拟交换机选择已创建专有网络下的虚拟交换机(vSwitch)。
    密码设置选择立即设置,并填写自定义的密码。
  3. 获取Redis的连接地址和端口号。
    1. 单击已创建的Redis实例,进入实例详情页面。
    2. 在实例信息的连接信息中,查看专有网络的连接地址端口号,在后续的部署中会使用到这两个信息。
  4. 准备数据。
    1. 创建检索引擎配置文件chatbot_service_desc.json
      检索引擎配置文件中需要配置如下参数,您也可以直接下载检索引擎配置的示例文件chatbot_deploy_eas.json
      参数描述示例
      faq_modules计算文本相似度的算法。例如基于余弦相似度的特征向量匹配、基于模糊匹配的字符串匹配。"faq_modules": ["feature_vector_faq_match","fuzzy_closest_faq_match"]
      pretrained_feature_vectors_path离线批处理预测输出的特征向量库。/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/query_features.out
      feature_generator_model_dir特征向量生成器的路径。/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/text_match_two_tower_model_dir
      faq_data_dirfaq数据路径。/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/answers
      faq_query_label_idx_mapquery label的映射表。/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/query_label_idx_map.txt
      faq_confidence_thresholdfaq的置信度。0.4
      knowledge_graph_data_dir存储基于实体和属性描述的知识图谱数据的文件夹。/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_knowledge_graph
      redis_hostRedis实例Host。r-uf62y0k7ho7pku54z5.redis.rds.aliyuncs.com
      redis_portRedis端口。6379
      redis_passwordRedis密码。您自己定义。
    2. 步骤一:基于FAQ构建检索问答系统步骤二:基于KBQA构建知识图谱问答系统中准备好的数据文件存储到自己的OSS Bucket中,如下图所示。关于如何将文件上传至OSS,请参见上传文件
      目录层级目录中的文件清单如下所示。
      user_datasets
      ├── car_faqs
      │   ├── query_label_idx_map.txt          # 步骤一中标注问题ID编号文件。
      │   ├── questions                        # 步骤一中标准问题同义配置文件夹。
      │   ├── answers                          # 步骤一中标准答案配置文件夹。
      │   ├── ext_match_two_tower_model_dir    # 步骤一中模型训练得到的模型文件。
      │   ├── query_features.out               # 步骤一中模型预测得到的特征文件。
      ├── car_knowledge_graph                  # 步骤二中准备的知识图谱数据。
      │   ├── 某汽车品牌_A型号_2021款_标准续航升级版.json
      │   ├── 某汽车品牌_A型号_2021款_长续航版.json
      ├── chatbot_service_desc.json            # 上一步中创建的检索引擎配置文件。
  5. 部署在线服务。
    1. 创建服务描述文件chatbot_service_desc.json(通过CPU部署)。
      chatbot_service_desc.json的内容如下所示。
      {
          "containers": [
              {
                  "image": "registry-vpc.cn-shanghai.aliyuncs.com/eas/smart_chatbot:v20211129_pre",
                  "env": [
                      {
                          "name": "chatbot_config",
                          "value": "/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/chatbot_deploy_eas.json"
                      },
                      {
                          "name": "LC_ALL",
                          "value": "zh_CN.utf8"
                      }
                  ],
                  "command": "/data/eas/ENV/bin/python /data/eas/EasyTexMiner/examples/solutions/chatbot/easybot/chatbot_app.py",
                  "port": 8079
              }
          ],
          "metadata": {
              "cpu": 1,
              "instance": 1,
              "memory": 10000,
              "resource": "eas-r-ia5cabi7v7fd86****"
          },
          "name": "chatbot_test",
          "oss_endpoint": "oss-cn-shanghai-internal.aliyuncs.com",
          "oss_mount_path": "/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets",
          "oss_path": "oss://chatbot-test/user_datasets",
          "cloud": {
              "networking": {
                  "security_group_id": "sg-uf6ec8tbwnldltrsa1iq",
                  "vswitch_id": "vsw-uf624jjhqb7bgcqeg221r"
              }
          }
      }
      上述配置文件的字段详情如下表所示。
      字段描述是否需要修改
      image智能客服专属镜像的路径无需修改
      env传递给镜像的环境变量无需修改
      command启动脚本无需修改
      name部署在线服务的名称可以自定义
      resource部署在PAI-EAS的专属资源组的资源组ID根据实际情况修改
      oss_endpointOSS地址的Endpoint根据实际情况修改
      oss_mount_path挂载到镜像中的本地路径无需修改
      oss_pathOSS上的存放数据的路径根据实际情况修改
      security_group_id创建的安全组ID无需修改
      vswitch_id创建的交换机ID无需修改
    2. 通过eascmd如下命令部署服务。关于eascmd的命令详情,请参见命令使用说明
      eascmd create chatbot_service_desc.json
    3. 开启PAI-EAS专属资源组的VPC直连,详情请参见配置网络连通:客户端访问EAS
    4. 调试在线服务。
      PAI EAS 模型在线服务页面的服务列表,找到目标服务,单击操作列下的在线调试,即可进入调试页面。

      在调试页面,输入Request Body,再单击发送请求,即可在右侧的调试信息区域查看返回结果。

      例如,Request Body输入'{"sent":"您好"}',返回的结果如下图所示。在线调试结果从返回的调试结果可以看出,创建好的智能客服系统针对上述问题进行了引导式的知识回复。