针对问题咨询场景中出现大量相关领域的问题,PAI提供了智能客服对话系统解决方案,以降低客户等待时间和人工客服成本。本文以汽车售前咨询业务领域为例,介绍如何基于人工智能算法,快速构建智能客服对话系统。
1. 背景信息
1.1 问题背景
在企业服务用户的过程中,每天都会出现大量相关领域内的问题。传统的人工客服作息服务解答效率低,且成本高。智能客服对话系统可以帮助企业实现在线服务的智能化人机协作系统,提高坐席服务的效率、降低人力开销及新人业务学习成本。
1.2 解决方案
机器学习平台PAI在智能客服领域,提供了端到端的纯白盒解决方案。客户只需要准备好自己相关领域的FAQ(常见问题)和知识图谱数据,就可以利用PAI自定义的搭建从算法构建到模型部署的人工智能流程,形成完整的端到端解决方案,实现对应领域智能客服的业务系统。本文以“汽车售前咨询”这一业务领域为例,为您展示如何快速搭建智能客服机器人,从而实现机器人自动回答用户关于汽车售前业务的相关问题。这样一方面节省客户的咨询等待和信息检索时间,另一方面节省企业运营人力成本,使精力可以集中在筛选出的高价值客户上。
1.3 方案优势
纯白盒:可根据您自己具体的业务场景,自定义构建智能客服业务系统。
端到端:从最初的数据准备到最后的模型部署推理,提供全链路的系统构建流程。
有据可依:对话系统内所有的回答都是有依据的,避免纯深度学习方案的不可解释性。
鲁棒可控:系统任何地方出了问题,都有相应的异常处理与bad case分析应对机制。
1.4 工程部署架构
用户将知识图谱数据,模型和特征文件以及FAQ数据存储在OSS上,然后将智能客服对话系统服务部署在PAI-EAS上,就可以使用FAQ检索和知识图谱查询提供的功能来做智能客服问答。详见第五章:智能客服在线服务配置。
1.5 对话系统内部状态
系统初始化后进入闲聊状态,对用户输入“您好”等话术进行响应。响应完成后系统进入问题接收状态,此刻等待用户提问。接入通过实体归一化/属性归一化来对用户提问中的实体和属性进行明确,接着进入问答状态进行FAQ检索或者知识图谱查询,当出现异常状况时,进入异常处理模式,在异常处理中引导用户进入正确的查询。
2. 前提条件
已开通PAI(Studio、DSW、EAS)后付费,详情请参见开通。
已开通AI工作空间,并开通MaxCompute计算资源和DLC计算资源,详情请参见AI工作空间。
已创建OSS存储空间(Bucket),用于存储标签文件和训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间。
已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组。
已下载并配置PAI-EAS的客户端工具eascmd,用于本文模型部署的相关操作,详情请参见eascmd客户端工具。
已创建ECS安全组,详情请参见创建安全组。
已创建专有网络VPC,详情请参见创建和管理专有网络。
已创建专有网络交换机,详情请参见使用交换机。
已创建数据库Redis实例,详情请参见创建实例。
3. 基于FAQ常见问题检索的问答
基于FAQ(常见问题)的问答系统总体结构如下图所示,系统的关键模块包括:
频繁问答对数据集,即FAQ问答库。
预处理模块:负责对query进行分词等操作。
检索模块:负责从FAQ中检索可能与用户查询相似的若干标准问句。
相似问句选择模块:负责从候选相似问句中,选择与用户查询最相似的标准问句。
具体而言,检索模块会在对用户提出的query进行预处理的基础上,从FAQ数据集中检索K个与query最相似的问句。然后相似问句选择模块会从K个候选相似问句中,选出与query相似度最高的,并判断是否具有足够的置信度。如果相似度最高的候选相似问句的置信度达标,“相似问句选择模块”就会判定该问句是用户query的同义问句,从而返回提前预置好的答案。
3.1 FAQ频繁问答对数据集准备
FAQ,即Frequently Asked Questions、常见问题,是业务场景中用户最常问的问题,又称“标准问题”。对这类问题,我们可以提前编制答案,构成问答对。问答对通常简称“QA对”(Question Answer Pair)。问答系统的知识库中存储的FAQ数据集,实际上是标准问题其答案构成的QA对数据集。如果用户提出的问题和FAQ数据集中的某个标准问题是相似问题,那么用户问题的答案就是该标准问题的答案。
频繁问答对数据集的建设需要根据场景特点,确定问题涉及的范围。然后根据开放数据源及自有数据集,采集问答对内容,或编写问答对内容。同时解决方案支持业务方持续对FAQ数据集进行优化,优化操作包括:增加一个标准问题、增加同一标准问题的同义问句、增加问题的答案配置集等等。
本文以“汽车售前”的智能客服场景为例,展示FAQ所需的数据,文件列表如下所示:
car_faqs
├── query_label_idx_map.txt # 标注问题ID编号文件
├── questions # 标准问题同义配置文件
│ ├── 保养灯的使用说明
│ ├── 保养一次多少钱
│ ├── 变速箱故障灯亮
│ ├── ......
├── answers # 标准答案配置文件
│ ├── 特斯拉_model3_2021款_标准续航升级版
│ ├── 特斯拉_modely_2021款_长续航版
│ ├── ......
步骤一:给标注问题编号
为提升检索模块的召回率,一般会为每一个标准问句配置若干同义问句。首先对FAQ频繁问答库中的标准问题进行ID化编号,比如针对上面FAQ中的标准问题,ID化后,问题和数字之间用tab分隔。下面为示例文件【query_label_idx_map.txt】的部分数据样例。
有几个排气管 0
是双排气管吗 1
问某款车是什么悬挂 2
有换挡拨片吗 3
问发动机产地 4
变速箱是哪里产的 5
问上市时间 6
问某款车上市了吗 7
可以加装换挡拨片吗 8
一保多少钱 9
步骤二:配置同义问题
准备好上面的标注问题ID编号文件后,现在需要为每个标准问题配置若干个同义问题。以“保养灯的使用说明”为例,文件的每一行内容对应一个和“保养灯的使用说明”同义的问题。下面为示例文件【保养灯的使用说明】的部分数据样例。
新款保养灯怎么设定
保养灯是什么样子的图标
保养灯什么消岀
保养灯归是什么标志?
保养灯长什么样子
保养灯如何设置。因为过保不想去4S店了,有谁知道的说一下
保养灯归零,是怎么,弄得,请问各位兄弟,谢谢!
保养灯和燃油指示灯同时闪烁是怎么回事?
有保养灯的没有?
汽车保养灯归零
然后将所有的标准问题同义配置文件放到文件夹questions
中。
步骤三:配置标准答案
准备好上面的标准问题列表后,下面介绍汽车售前FAQ数据问答数据集的准备。以“特斯拉_model3_2021款_标准续航升级版”这款车为例,其中[]中表示问题类型,后面展示问题的答案,其中答案和问题类型之间用tab分隔。下面为示例文件【特斯拉_model3_2021款_标准续航升级版】的部分数据样例。
[有几个排气管] 0个
[是双排气管吗] 不是
[问某款车是什么悬挂] 前麦弗逊式独立悬架,后多连杆独立悬架
[有换挡拨片吗] 没有
[问发动机产地] 美国
[变速箱是哪里产的] 上海
[问上市时间] 2021年1月
[问某款车上市了吗] 2021年1月已上市
[可以加装换挡拨片吗] 可以加装,但需要加装模块
[一保多少钱] 5000公里做首保,首保免费
然后将所有的标准答案配置文件放到文件夹answers
中。
3.2 问答特征向量化
利用PAI提供的可视化建模Studio平台,基于海量大数据语料预训练获得的NLP迁移学习模型,进行用户query向量表征模型的构建。其中示例实验用到的训练集、评估集、测试集。
进入Designer控制台
登录PAI控制台。
在左侧导航栏中,选择模型开发和训练->可视化建模(Designer)。
构建实验
在可视化建模(Designer)控制台中,选择实验模板,在实验模板列表中找到智能客服问答特征向量化,点击并创建实验。
在实验列表中找到刚才创建好的模板实验,并进入实验。
系统根据预置的模板,自动构建实验,如下图所示。运行过程中,点击组件右键,可查看运行日志。
区域 |
描述 |
① |
选择实验中模型构建需要的训练集输入,例如选择OSS目录 |
② |
选择实验中模型构建需要的评估集输入,例如选择OSS目录 |
③ |
配置智能客服特征向量训练的参数。智能客服特征向量训练组件的配置详情请参见下文的表 1。 |
④ |
选择实验中模型构建需要的测试集输入,例如选择OSS目录 |
⑤ |
配置智能客服特征向量预测的参数。智能客服特征向量预测组件的配置详情请参见下文的表 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上的每步训练的样本数Batch Size |
32 |
序列长度 |
模型的sequence length |
128 |
|
训练轮数 |
训练模型过整遍数据集的次数 |
3 |
|
模型保存间隔步数 |
训练模型时,每隔多少step保存一次模型参数 |
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 |
|
执行调优 |
指定Worker数 |
分布式服务器的数量,默认值表示1个Worker。 |
1 |
指定Worker的CPU卡数 |
每个Worker下的GPU卡数量。 |
1 |
|
指定Worker的GPU卡数 |
每个Worker下的CPU卡数量。 |
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上的每步预测的样本数Batch Size |
32 |
序列长度 |
模型的sequence length |
128 |
|
双塔模型用户自定义参数 |
用户自定义参数。 |
two_tower=True siamese=True |
|
执行调优 |
指定Worker数 |
分布式服务器的数量,默认值表示1个Worker。 |
1 |
指定Worker的CPU卡数 |
每个Worker下的GPU卡数量。 |
1 |
|
指定Worker的GPU卡数 |
每个Worker下的CPU卡数量。 |
1 |
|
GPU机器类型 |
选择实验运行的计算资源 |
GPU计算型8核60G |
4. 基于KBQA的知识图谱问答
KBQA的全称是基于知识库问答(Knowledge Base Question Answering),即给定自然语言问题,通过对问题进行语义理解和解析,进而基于知识图谱构建的知识库进行查询、推理得出答案。基于知识图谱的精准问答子系统的关键模块包括:
实体链接:将用户问句中提到的实体关联到唯一的实体表达。
语义角色标注:对属性的类型进行自动打标。
意图分类:判断用户问的是什么类型的问题。
查询链路生成:生成查询知识库的查询语句
答案生成:负责按照问句意图的类型,在答案模板里生成答案。
基于KBQA的知识图谱问答的架构图如下所示:
具体而言,实体链接会根据规则对问句进行模式匹配,将问句中的实体映射到系统中的实体规范表达。系统自动标注出属性归属的类别树,并且根据是否为叶子属性进行属性引导,直至定位到叶子属性上,然后对问句进行意图分类。最后系统生成查询路径对树形知识图谱进行查询,返回叶子结点的属性值,将生成的答案返回给用户。
4.1 知识图谱数据准备
针对实体、属性名称和属性值,智能客户系统采用可读性强的JSON来构建数据文件。属性名可以包括子属性,以“特斯拉model3_2021款_标准续航升级版”为例,车轮制动属性包括:前制动器类型,后制动器类型,驻车制动类型这三种子属性。用户需要将业务中的数据转换成JSON格式。下面为示例文件【特斯拉model3_2021款_标准续航升级版.json】的部分数据样例。
{
"实体": {
"名称": "特斯拉model3_2021款_标准续航升级版",
"关键词": "特斯拉|model3|2021款|标准续航升级版"
},
"属性":{
"厂商":"特斯拉中国",
"品牌":"特斯拉",
"经销商报价":"27.6万",
"级别":"中型车",
"上市时间":"2021.07",
"纯电续航里程":"525km",
"充电时间":"快充一小时,慢充10小时",
"百公里加速时间":"5.6s",
"整车保修期限":"4年或8万公里"
},
"变速箱":{
"变速箱档位个数":"6个",
"变速箱类型":"电动车单速变速箱"
},
"配置": {
"内部配置": {
"空调": {
"空调控制方式": "自动",
"温度分区控制": "有",
"后座出风口": "无"
},
"行车电脑显示屏": "有",
"倒车视频影像": "有"
}
}
}
5. 智能客服在线服务配置
步骤一:创建安全组
进入阿里云ECS安全组控制台
登录ECS控制台。
在左侧导航栏中,选择网络与安全->安全组。
创建安全组
点击创建安全组
填写自定义的安全组名称,网络选择专有网络的VPC。若无专有网络VPC,点击创建专有网络进行VPC的创建。并同时完成专有网络中交换机的创建。
配置访问规则的入方向
协议类型选择自定义TCP
端口范围选择6379/6379,
授权对象填写:自己创建的PAI-EAS专属资源组对应的机器IP。注意此处不能填写0.0.0.0/0,该策略会导致使用到该安全组的ECS/RDS等资源被外部入侵。
步骤二:创建Redis实例
进入阿里云Redis控制台
登录Redis控制台。
在左侧导航栏中,选择示例列表。
创建实例
点击创建实例
网络类型选择专有网络
选择创建专有网络和虚拟交换机
密码设置中选择立即设置,并深入自定义的密码。
其余的设置保持默认设置。
获取Redis的链接地址和端口号
点击创建好的Redis实例,进入实例详情。
在实例信息的连接信息中保存专有网络的连接地址和端口号,在后续的部署中会使用。
步骤三:数据准备
登录阿里云OSS控制台,将上述第三章FAQ和第四章知识图谱准备好的数据存入自己的OSS Bucket中,如下所示:
其中文件列表清单如下所示:
user_datasets
├── car_faqs
│ ├── query_label_idx_map.txt # 第三章中标注问题ID编号文件
│ ├── questions # 第三章中标准问题同义配置文件夹
│ ├── answers # 第三章中标准答案配置文件夹
│ ├── ext_match_two_tower_model_dir # 第三章中模型训练得到的模型文件
│ ├── query_features.out # 第三章中模型预测得到的特征文
├── car_knowledge_graph # 第四章中准备的知识图谱数据
│ ├── 特斯拉model3_2021款_标准续航升级版.json
│ ├── 特斯拉modely_2021款_长续航版.json
├── chatbot_service_desc.json # 检索引擎配置文件,配置介绍见下文。
创建检索引擎配置文件chatbot_service_desc.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_dir |
faq数据路径 |
/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/answers |
faq_query_label_idx_map |
query label的映射表 |
/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_faqs/query_label_idx_map.txt |
faq_confidence_threshold |
faq的置信度 |
0.4 |
knowledge_graph_data_dir |
存储基于实体&属性描述的知识图谱数据的文件夹 |
/data/eas/EasyTexMiner/examples/solutions/chatbot/user_datasets/car_knowledge_graph |
redis_host |
redis实例host |
r-uf62y0k7ho7pku54z5.redis.rds.aliyuncs.com |
redis_port |
redis端口 |
6379 |
redis_password |
redis密码 |
用户自定义 |
步骤四:部署在线服务
如果您没有使用过EAS进行部署,相关方法详见EAS命令使用说明
通过CPU部署,创建chatbot_service_desc.json文件如下
字段 |
描述 |
是否需要修改 |
image |
智能客服专属镜像的路径 |
无需修改 |
env |
传递给镜像的环境变量 |
无需修改 |
command |
启动脚本 |
无需修改 |
name |
部署在线服务的名称 |
可自定义修改 |
resource |
部署在PAI-EAS的专属资源组的资源组id |
根据用户信息修改 |
oss_endpoint |
OSS地址的endpoint |
根据用户信息修改 |
oss_mount_path |
挂载到镜像中的本地路径 |
无需修改 |
oss_path |
用户OSS上的存放数据的路径 |
根据用户信息修改 |
security_group_id |
创建的安全组id |
无需修改 |
vswitch_id |
创建的交换机id |
无需修改 |
{
"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-ia5cabi7v7fd86hua0"
},
"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"
}
}
}
之后调用eascmd以下命令进行部署:
eascmd create chatbot_service_desc.json
进入PAI EAS模型在线服务页面
登录PAI控制台。
在左侧导航栏,选择模型部署 > 模型在线服务(EAS)。
打开资源组的VPC直连
在PAI EAS模型在线服务页面,点击进入创建好的专属资源组中。
打开VPC直连。
步骤五:调试在线服务
经过上述步骤,模型部署在PAI-EAS。然后可以进入【PAI-EAS】控制台 → 找到【模型部署】 →点击【在线调试】 ,输入request进行请求调用,样式如下:
其中EAS界面在线调试的Request Body
的样式为:
'{"sent":"您好"}'
从返回的调试结果可以看出,创建好的智能客服系统针对用户的query进行了引导式的知识回复。
6. AI体验馆智能客服DEMO演示
登录阿里云AI体验馆中自然语言处理的智能客服,体验“汽车售前咨询”的服务示例。