针对App内大量问题咨询场景,PAI提供NLP意图智能识别解决方案。本文介绍如何基于BERT模型,快速构建符合业务的NLP文本分类模型,从而实现智能客服QA平台。
前提条件
- 已开通PAI(Studio、DSW、EAS)后付费,详情请参见开通。
- 已开通MaxCompute,用于存储训练数据和测试数据。关于如何开通MaxCompute,请参见通过查询编辑器使用MaxCompute。
说明 由于本文的解决方案需要使用PAI-Studio计算资源,而PAI-Studio使用MaxCompute存储结构化数据,因此您必须将训练数据和测试数据导入至MaxCompute中。
- 已创建OSS存储空间(Bucket),用于存储标签文件和训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间。
- 在DataWorks中,已创建ODPS SQL节点,用于执行PAI命令。关于如何创建ODPS SQL节点,请参见创建ODPS SQL节点。
- 已配置好EASCMD客户端工具,本文使用该工具部署模型。关于如何配置EASCMD客户端工具,请参见下载并认证客户端。
- 已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组。
背景信息
App内每天有大量用户咨询问题,问题种类不仅多,而且类别相似度高。如果采用人工解答,则人力成本过高。针对该问题,阿里云机器学习PAI提供如下解决方案,助力您有效降低人工服务成本。您仅需执行几段命令,即可在极小开发量下快速搭建智能客服QA平台:
- 解决方案:在App内自建NLP智能客服QA平台,将数据集中的用户问题分为多种不同类别的QA问题。当用户在线提问时,首先通过基于NLP领域的预训练BERT模型的文本分类算法,将用户问题定位到某一类别。然后通过人机对话形式,将提前准备的答案反馈给用户。
- 方案架构:NLP智能客服的架构图如下所示。
- BERT模型:利用Wikipedia和BooksCorpus的海量大数据语料预训练获得的NLP迁移学习模型,在具体任务中仅需要根据自己的业务数据进行Fine-tune即可。
- 场景示例:智能客服在真实场景下的示例如下图所示。
- 效果提升:该方案无需人工客服解答用户问题,在通常场景下,训练的NLP智能客服模型解答问题的准确率高达94%左右,响应时间在30 ms左右。如果使用更小的预训练模型,响应时间甚至降低到了10 ms,极大满足App内用户的问题咨询需求。
操作流程
基于阿里云机器学习PAI平台,搭建NLP智能客服的流程如下:
- 步骤一:准备数据
使用的训练集和测试集需要导入至MaxCompute,标签文件需要上传至OSS。
- 步骤二:训练模型
基于BERT进行业务数据的模型训练,您只需要输入自己的业务相关数据,并根据业务配置训练任务的相关参数,即可完成模型训练,从而获得训练好的NLP文本分类模型。
- 步骤三:评估模型
对训练好的NLP文本分类模型进行评估,查看模型效果(例如,预测准确率)。
- 步骤四:模型预测
对训练好的NLP文本分类模型输入测试数据集或评估数据集,获得预测的分类结果。
- 步骤五:导出模型
将训练满意的模型导出至文件夹中,以便后续将模型部署为在线服务。
- 步骤六:部署模型
通过PAI-EAS的EASCMD工具,将导出的模型部署为RESTful API。
- 步骤七:调试模型服务
您可以通过PAI-EAS控制台在线调用,或Python脚本批量调用的方式调式模型服务。
- 步骤八:监控服务指标
调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。
步骤一:准备数据
本文使用公开数据集TNews的数据进行实验,具体数据集如下:
- 训练集和测试集:已经上传到MaxCompute的公共项目pai_online_project中,训练表名为tnews_bert_et_train,测试表名为tnews_bert_et_dev。您可以在后续的PAI命令中直接查看或调用这两张表。在实际应用中,您需要将自己的数据上传至MaxCompute中,详情请参见导入数据。
- 标签文件:下载标签文件tnews_labels_ext.txt,并将其上传至您的OSS目录中。关于如何上传文件至OSS,请参见上传文件。
本文使用的数据集包含五个字段,如下图所示。

字段 | 描述 |
---|---|
example_id | 索引编号。 |
sentence | 用于文本分类的文本内容。 |
keywords | 文本关键词。 |
label | 标签代号。 |
label_desc | 标签详情。 |
步骤二:训练模型
基于BERT进行业务数据的模型训练,您只需要输入自己业务的相关数据,并根据业务配置训练任务的相关参数,即可完成模型训练,从而获得训练好的NLP文本分类模型。模型训练的输入数据及训练完成后的输出数据分别如下:
- 输入:在PAI命令中,将
inputTable
参数配置为训练集tnews_bert_et_train和测试集tnews_bert_et_dev,将labelEnumerateValues
参数配置为标签文件tnews_labels_ext.txt。 - 输出:在PAI命令
checkpointDir
参数配置的路径中,输出模型文件和中间结果。
pai -name easy_transfer_app_ext
-Dmode=train
-DinputTable="odps://pai_online_project/tables/tnews_bert_et_train,odps://pai_online_project/tables/tnews_bert_et_dev"
-DfirstSequence=sentence
-DsecondSequence=keywords
-DlabelName=label
-DlabelEnumerateValues='oss://tongxin-demo1/EasyTransfer/tnews_labels_ext.txt'
-DsequenceLength=64
-DcheckpointDir='oss://tongxin-demo1/EasyTransfer/ckp_dir/'
-DbatchSize=32
-DnumEpochs=5
-DdistributionStrategy=ExascaleStrategy
-DworkerCount=2
-DworkerGPU=2
-DworkerCPU=2
-DoptimizerType=adam
-DlearningRate=2e-5
-DmodelName=text_classify_bert
-DuserDefinedParameters='pretrain_model_name_or_path=google-bert-base-zh'
-Dbuckets="oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole,oss://tongxin-demo1.oss-cn-beijing-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-Darn="acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-DossHost="oss-cn-beijing-internal.aliyuncs.com"
参数 | 是否必选 | 描述 | 类型 | 示例值 | 默认值 |
---|---|---|---|---|---|
name | 是 | PAI命令调用的算法包。本文使用迁移学习算法包,因此该参数配置为固定值easy_transfer_app_ext 。
|
STRING | easy_transfer_app_ext | 无 |
mode | 是 | 使用模式。进行模型训练时,需要配置为固定值train 。
|
STRING | train | 无 |
inputTable | 是 | 输入数据,即MaxCompute中的训练集表和测试集表,两张表之间使用英文逗号(,)分隔。 | STRING | "odps://<your_project_name>/tables/<your_train_table_name>,odps://<your_project_name>/tables/<your_test_table_name>" | 无 |
firstSequence | 是 | 进行文本分类的内容在输入表中对应的列名。 | STRING | sentence | 无 |
secondSequence | 否 | 进行辅助分类的文本内容在输入表中对应的列名。如果您需要提高文本分类的准确率,可以添加另外的文本相关字段进行辅助分类。例如,文本关键词。 | STRING | keywords | 空 |
labelName | 是 | 标签在输入格式中对应的列名。 | STRING | label | 无 |
labelEnumerateValues | 是 | 标签枚举值,支持以下两种方式:
|
STRING |
|
无 |
sequenceLength | 否 | 序列整体最大长度,范围为1~512。 | INT | 128 | 128 |
checkpointDir | 是 | 模型存储路径。 | STRING | "oss://<your_bucket_name>/<path_to_your>/ckp_dir/" | 无 |
batchSize | 否 | 训练过程中的批处理大小。如果使用多机多卡,则表示每个GPU上的批处理大小。 | INT | 32 | 32 |
numEpochs | 否 | 训练总Epoch的数量。 | INT | 1 | 1 |
distributionStrategy | 否 | 分布式策略,支持以下取值:
|
STRING | "MirroredStrategy" | "MirroredStrategy" |
workerCount | 否 | 分布式服务器的数量,默认值表示1个Worker。 | INT | 2 | 1 |
workerGPU | 否 | 每个Worker下的GPU卡数量。 | INT | 2 | 1 |
workerCPU | 否 | 每个Worker下的CPU卡数量。 | INT | 2 | 1 |
optimizerType | 否 | 优化器类型,支持以下取值:
|
STRING | "adam" | "adam" |
learningRate | 否 | 学习率。 | FLOAT | 2e-5 | 2e-5 |
modelName | 否 | 模型名称。 | STRING | text_classify_bert | text_match_bert |
userDefinedParameters | 是 | 用户自定义参数,可以配置预训练模型pretrain_model_name_or_path。常用如下三种预训练模型:
|
STRING | "google-bert-base-zh" | 无 |
buckets | 是 | OSS Buckets信息,格式为oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=<your_arn>,oss://<your_bucket>.<your_host>/?role_arn=<your_arn> 。您需要将如下字段替换为实际值,其他部分使用上述的固定值:
|
STRING | oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole,oss://tongxin-demo1.oss-cn-beijing-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole" | 无 |
arn | 是 | 权限认证。您可以在PAI-Studio项目空间的左侧导航栏,选择 | ,即可查看ARN。STRING | "acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole" | 无 |
ossHost | 是 | OSS地域的Endpoint。OSS地域与Endpoint的对应关系,请参见公共云下OSS Region和Endpoint对照表。 | STRING | "oss-cn-beijing-internal.aliyuncs.com" | 无 |
步骤三:评估模型
获得训练好的模型后,您可以通过模型评估的PAI命令,一键查看模型效果(例如模型预测准确率)。模型评估的输入数据及输出数据分别如下:
- 输入:在PAI命令中,将
inputTable
参数配置为测试集tnews_bert_et_dev,将checkpointPath
参数配置为训练好的模型的路径。 - 输出:在运行日志Logview中可以查看评估结果。
pai -name easy_transfer_app_ext
-Dmode=evaluate
-DinputTable="odps://pai_online_project/tables/tnews_bert_et_dev"
-DcheckpointPath='oss://tongxin-demo1/EasyTransfer/ckp_dir/model.ckpt-2085'
-DbatchSize=64
-Dbuckets="oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole,oss://tongxin-demo1.oss-cn-beijing-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-Darn="acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-DossHost="oss-cn-beijing-internal.aliyuncs.com"
该命令涉及的主要参数如下表所示,其他参数解释请参见表 2。
参数 | 是否必选 | 描述 | 类型 | 示例值 | 默认值 |
---|---|---|---|---|---|
mode | 是 | 使用模式。进行模型评估时,需要配置为固定值evaluate 。
|
STRING | evaluate | 无 |
inputTable | 是 | 输入数据,即MaxCompute中的测试集表。 | STRING | "odps://pai_online_project/tables/tnews_bert_et_dev" | 无 |
checkpointPath | 是 |
训练好的模型的存储路径,对应模型训练PAI命令中的checkpointDir参数。但是这个参数存在如下区别:
|
STRING | “oss://tongxin-demo1/EasyTransfer/ckp_dir/model.ckpt-2085” | 无 |
步骤四:模型预测
对训练好的模型输入测试数据集或评估数据集,可以获得预测的分类结果。模型预测的输入数据和输出数据如下所示:
- 输入:在PAI命令中,将
inputTable
参数配置为测试集tnews_bert_et_dev,将checkpointPath
参数配置为训练好的模型的路径。 - 输出:在PAI命令
outpuTable
参数配置的MaxCompute表中,输出预测结果。
在DataWorks的ODPS SQL节点中,执行如下PAI命令进行模型预测。
pai -name easy_transfer_app_ext
-Dmode=predict
-DinputTable="odps://pai_online_project/tables/tnews_bert_et_dev"
-DoutputTable="odps://tongxin_demo/tables/tnews_dev_pred"
-DfirstSequence=sentence
-DsecondSequence=keywords
-DappendCols=example_id,label
-DoutputSchema=predictions,probabilities,logits
-DcheckpointPath='oss://tongxin-demo1/EasyTransfer/ckp_dir/'
-Dbuckets="oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole,oss://tongxin-demo1.oss-cn-beijing-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-Darn="acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-DossHost="oss-cn-beijing-internal.aliyuncs.com"
该命令涉及的主要参数如下表所示,其他参数解释请参见表 2。
参数 | 是否必选 | 描述 | 类型 | 示例值 | 默认值 |
---|---|---|---|---|---|
mode | 是 | 使用模式。进行模型预测时,需要配置为固定值predict 。
|
STRING | predict | 无 |
inputTable | 是 | 输入数据,即MaxCompute中的测试集表。 | STRING | "odps://pai_online_project/tables/tnews_bert_et_dev" | 无 |
checkpointPath | 是 | 训练好的模型的存储路径,与模型训练PAI命令中的checkpointDir参数取值相同。 | STRING | "oss://tongxin-demo1/EasyTransfer/ckp_dir/" | 无 |
outputTable | 是 | 预测结果输出表。 | STRING | "odps://tongxin_demo/tables/tnews_dev_pred" | 无 |
appendCols | 是 | 输入表中需要添加到输出表的列,多个列之间使用英文逗号(,)分隔。 | STRING | example_id,label | 无 |
outputSchema | 是 | 需要输出的预测值,支持输出以下三种预测值:
通常需要同时输出以上三种预测值,多个预测值之间使用英文逗号(,)分隔。 |
STRING | predictions,probabilities,logits | 无 |
步骤五:导出模型
将训练满意的模型导出至文件夹中,以便后续将模型部署为在线服务。模型导出的输入数据和输出数据分别为:
- 输入:在PAI命令中,将
checkpointPath
配置为已训练好的模型。 - 输出:在PAI命令
exportDirBase
参数配置的路径下,输出导出的模型及相关配置文件。
在DataWorks的ODPS SQL节点中,执行如下PAI命令导出模型。
pai -name easy_transfer_app_ext
-Dmode=export
-DcheckpointPath='oss://tongxin-demo1/EasyTransfer/ckp_dir/model.ckpt-2085'
-DexportType=app_model
-DexportDirBase='oss://tongxin-demo1/EasyTransfer/export/'
-Dbuckets="oss://atp-modelzoo-sh.oss-cn-shanghai-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole,oss://tongxin-demo1.oss-cn-beijing-internal.aliyuncs.com/?role_arn=acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-Darn="acs:ram::1664081xxxxxxxx:role/aliyunodpspaidefaultrole"
-DossHost="oss-cn-beijing-internal.aliyuncs.com"
该命令涉及的主要参数如下表所示,其他参数解释请参见表 2。
参数 | 是否必选 | 描述 | 类型 | 示例值 | 默认值 |
---|---|---|---|---|---|
mode | 是 | 使用模式。进行模型导出时,需要配置为固定值export 。
|
STRING | export | 无 |
checkpointPath | 是 |
训练好的模型的存储路径,对应模型训练PAI命令中的checkpointDir参数。但是这个参数存在如下区别:
|
STRING | 'oss://tongxin-demo1/EasyTransfer/ckp_dir/model.ckpt-2085' | 无 |
exportType | 是 | 导出类型,支持以下类型:
|
STRING | app_model | 无 |
exportDirBase | 是 | 导出模型的目录。 | STRING | "oss://<your_bucket_name>/<path_to_your>/export/" | 无 |
步骤六:部署模型
步骤七:调试模型服务
您可以通过如下任何一种方式调式模型服务:
通过PAI-EAS控制台在线调用服务的详细步骤如下。
编写Python脚本,通过公网地址调用模型服务,详情请参见公网地址调用。通过Python脚本批量调试服务的详细步骤如下。
步骤八:监控服务指标
调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。