在线上业务的内容生产过程中,为了及时识别其中的高风险内容,PAI提供了文本内容风控解决方案。本文介绍如何基于人工智能算法,快速构建符合业务场景的风控模型,助力您快速识别高风险内容,进而对其进行拦截。

背景信息

在诸多生产内容的场景(例如评论、博客、商品介绍)中,由于生产内容的范围不受限,因此难免出现高风险内容,您需要识别这些高风险内容,并及时拦截。针对该问题,阿里云机器学习PAI提出了如下解决方案,借助人工智能算法,帮助您快速判断风险内容:
  • 解决方案
    1. 基于智能标注(iTAG)平台和PAI数据集管理,对目标场景的文本进行快捷标注和样本管理。
    2. 基于PAI提供的BERT迁移学习预训练模型,针对自己的文本风控场景,在可视化建模平台PAI-Studio上进行模型Fine-Tune,从而构建具体场景的NLP文本风控模型。
    3. 将模型进行PAI-EAS在线部署,形成完整的端到端流程,从而自动识别生产过程中的风险内容。
  • 方案架构
    文本内容风控解决方案的架构图如下所示。文本内容风控架构

前提条件

  • 已开通PAI(Studio、DSW、EAS)后付费,详情请参见开通
  • 已开通AI工作空间,并添加MaxCompute计算资源,详情请参见AI工作空间
  • 已开通MaxCompute,用于存储预测数据。关于如何开通MaxCompute,请参见通过查询编辑器使用MaxCompute
  • 已创建OSS存储空间(Bucket),用于存储原始数据、标签列表文件及训练获得的模型文件。关于如何创建存储空间,请参见创建存储空间
  • 已创建PAI-EAS专属资源组,本文训练好的模型会部署至该资源组。关于如何创建专属资源组,请参见创建资源组

操作流程

基于阿里云机器学习PAI平台,构建文本内容风控解决方案的流程如下:
  1. 准备数据

    基于智能标注(iTAG)进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。

  2. 构建文本分类模型

    在可视化建模平台PAI-Studio中,基于海量大数据语料预训练获得的NLP迁移学习模型,构建文本内容风控场景的文本分类模型。

  3. 部署及调用模型服务

    通过模型在线服务PAI-EAS,您可以将训练好的文本风控模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。

准备数据

首先基于智能标注(iTAG)进行原始数据标注,然后将获得的训练集和测试集上传到数据仓库MaxCompute中,用于后续的模型训练。

  1. 将原始数据分为训练集和测试集,分别按照iTAG的标注数据格式,生成.manifest格式的数据集。文件格式详见示例
    .manifest文件示例请参见textDemo.manifest
  2. 在PAI的数据集管理模块,通过本地上传方式将准备好的.manifest数据集上传,详情请参见通过本地上传的方式注册数据集
  3. 通过智能标注(iTAG)管理员控制台,创建标注任务,详情请参见创建标注任务
  4. 通过智能标注(iTAG)标注员控制台,进行数据标注,详情请参见标注图像(打标、质检及验收)
  5. 智能标注(iTAG)页面的任务中心页签,单击标注完成的任务操作列下的获取标注结果,得到存放在指定OSS目录下的标注结果数据集。
  6. 将获得的标注结果数据集转换为模型构建需要的训练集和测试集的CSV格式数据表。示例训练集请参见nlp_risk_train.csv,示例测试集请参见nlp_risk_dev.csv
  7. 通过MaxCompute客户端的Tunnel命令将训练数据集和测试数据集上传至MaxCompute。关于MaxCompute客户端的安装及配置请参见MaxCompute客户端(odpscmd),关于Tunnel命令详情请参见Tunnel命令。本案例使用的示例命令如下所示。
    # 建表语句。
    CREATE TABLE nlp_risk_train(content STRING, qince_result STRING);
    # 上传语句。
    tunnel upload /Users/tongxin/xxx/nlp_risk_train.csv nlp_risk_train;

构建文本分类模型

  1. 登录PAI控制台
  2. 在左侧导航栏,选择模型开发和训练 > 可视化建模(Studio2.0)
  3. 基于实验模板,创建文本分类实验。
    1. 可视化建模(Studio)页面,单击实验模板页签。
    2. 单击NLP页签。
    3. 基于BERT模型的文本分类区域,单击创建文本分类模板
    4. 新建模板对话框,先输入实验名称描述、选择绑定的AI工作空间和实验存放的位置,再单击确定即可创建实验。
  4. 进入实验,并配置组件参数。
    1. 可视化建模(Studio)页面,单击实验列表页签。
    2. 实验列表页面,选中刚才创建好的模板实验,并单击进入实验
    3. 系统根据预置的模板,自动构建实验,如下图所示。
      图像分类实验
      区域 描述
      配置实验的训练数据集,即配置读数据表组件的表名参数为MaxCompute的训练表。例如nlp_risk_train
      配置实验的评估数据集,即配置读数据表组件的表名参数为MaxCompute的评估表。例如nlp_risk_dev
      配置文本分类模型训练的参数。文本分类训练组件的配置详情请参见下文的表 1
      配置实验的预测数据集,即配置读数据表组件的表名参数为MaxCompute的预测表。例如nlp_risk_dev
      使用训练好的文本分类模型对预测数据集进行预测。通用NLP预测组件的配置详情请参见下文的表 2
      对模型预测得到的文本分类结果进行多分类评估。选择原样本结果列的qince_result标签字段和预测分类结果列的predictions进行对比评估。您可以右键单击该组件,在快捷菜单中选择查看数据,从而查看Accuracy和F1等评估指标。
      表 1. 文本分类组件配置
      页签 参数 描述 本案例使用的示例值
      字段设置 文本列选择 进行文本分类的内容在输入表中对应的列名。 content
      标签列选择 标签在输入表中对应的列名。 qince_result
      标签枚举值 标签列内容的枚举值,多个值之间使用半角逗号(,)分隔。 正常,低俗,成人,其他风险
      样本权重列 特定列样本的数据增强,非必选。 无需填写
      模型存储路径 训练得到的模型的OSS存储路径。 oss://tongxin-lly.oss-cn-hangzhou-internal.aliyuncs.com/pai/text_spam_rb/
      参数设置 模型选择 选择使用的预训练模型,支持以下取值:
      • text_classify_bert:功能强大的最新模型,推荐使用。
      • text_classify_cnn
      • text_classify_dgcnn
      text_classify_bert
      优化器选择 优化器的类型,支持以下取值:
      • adam
      • adagrad
      • lamb
      adam
      batchSize 训练过程中的批处理大小。如果使用多机多卡,则表示每个GPU上的批处理大小。 32
      sequenceLength 序列整体最大长度,取值范围为1~512。 64
      numEpochs 训练总Epoch的数量。 1
      学习率 模型构建过程中的学习率。 1e-5
      模型额外参数 用户自定义参数,可以配置预训练模型pretrain_model_name_or_path,常用如下四种预训练模型:
      • base-roberta
      • base-bert
      • tiny-roberta
      • tiny-bert

      模型精度排序:base-roberta > base-bert > tiny-roberta > tiny-bert

      模型速度排序:base-roberta = base-bert < tiny-roberta = tiny-bert

      pretrain_model_name_or_path=oss://atp-modelzoo-sh./release/easytexminer/modelzoo/nlu/text_anti_spam_tx/tiny-roberta/model.ckpt
      执行调优 指定Worker数 分布式服务器的数量,默认值表示1个Worker。 1
      指定Worker的CPU卡数 每个Worker下的GPU卡数量。 1
      指定Worker的GPU卡数 每个Worker下的CPU卡数量。 1
      分布式策略 分布式策略,支持以下取值:
      • MirroredStrategy:单机多卡。
      • ExascaleStrategy:多机多卡。
      MirroredStrategy
      表 2. 预测组件的参数配置
      页签 参数 描述 本案例使用的示例值
      参数设置 第一文本列选择 进行文本分类的内容在输入表中对应的列名。 content
      第二文本列选择 进行辅助分类的文本内容在输入表中对应的列名,非必选。 无需填写
      输出列 预测结果输出列。如果有多个列,则使用半角逗号(,)分隔。 predictions,probabilities,logits
      预测概率截断 进行预测判断时的概率阈值。 无需填写
      附加列 输入表中需要添加到输出表的列,多个列之间使用半角逗号(,)分隔。 content, qince_result
      batch Size 预测过程中的批处理大小。 32
      使用自定义模型 如果没有上游组件,可以自定义一个OSS目录中训练好的模型进行预测。本案例使用上游组件输入训练模型,因此无需填写。
      执行调优 指定Worker数 分布式服务器的数量,默认值表示1个Worker。 1
      指定Worker的CPU卡数 每个Worker下的GPU卡数量。 1
      指定Worker的GPU卡数 每个Worker下的CPU卡数量。 1

部署及调用模型服务

通过模型在线服务PAI-EAS,您可以将训练好的内容风控模型部署为在线服务,并在实际的生产环境中调用,从而进行推理实践。

  1. 进入PAI EAS模型在线服务页面。
    1. 登录PAI控制台
    2. 在左侧导航栏,选择模型部署 > 模型在线服务(EAS)
  2. 部署模型服务。
    1. PAI EAS模型在线服务页面,单击模型上传部署
    2. 资源和模型面板,配置参数(此处仅介绍与本案例相关的核心参数配置方法,其他参数的解释请参见控制台上传部署),并单击下一步
      参数 描述
      自定义模型名称 模型的名称,建议结合实际业务进行命名,以区分不同的模型服务。
      资源组种类 建议使用专属资源组部署模型服务,从而避免公共资源组资源有限时导致的服务排队。关于如何创建专属资源组,请参见专属资源组
      资源种类 如果您选择资源组种类公共资源组,则需要选择资源种类GPU
      Processor种类 选择EasyNLP
      模型类型 选择BERT文本分类
      模型文件 本案例中训练好的模型均存储在OSS中,因此选择OSS文件导入
      OSS路径选择文本分类组件模型存储路径参数配置的路径下的deployment文件夹中的模型文件夹(其中包含variables文件夹、config.json文件夹、saved_model.pbvocab.txtlabel_mapping.json)。例如,对于下图中的模型目录结构,您需要将OSS路径选择到/deployment/目录。模型文件路径
    3. 部署详情及配置确认面板,配置模型服务占用资源的相关参数。
      参数 描述
      实例数 本案例配置为1。实际应用时建议配置多个服务实例,以避免单点部署带来的风险。
      卡数 本案例配置为1。实际应用时根据情况配置。
      核数 本案例配置为1。实际应用时根据情况配置。
      内存数(M) 本案例配置为4096 MB。实际应用时根据情况配置。
    4. 单击部署,等待一段时间即可完成模型部署。
  3. 调试模型服务。
    1. PAI EAS模型在线服务页面,单击目标服务操作列下的在线调试
    2. 在调试页面的在线调试请求参数区域的Request Body处填写如下内容。
      {"id": "113","first_sequence": "很不错的,正品,很给力,男性同胞的福音,改善的效果特别的好,效果真的是不错的。是能增大2cm","sequence_length": 128}
    3. 单击发送请求,即可在调试信息区域查看预测结果,如下图所示。查看预测结果
  4. 查看模型服务的公网地址和访问Token。
    1. PAI EAS模型在线服务页面,单击目标服务服务方式列下的调用信息
    2. 调用信息对话框的公网地址调用页签,查看公网调用的访问地址Token
  5. 使用脚本进行批量调用。
    1. 创建调用模型服务的Python脚本eas_nlp_risk.py
      #!/usr/bin/env python
      #encoding=utf-8
      from eas_prediction import PredictClient
      from eas_prediction import StringRequest
      if __name__ == '__main__':
          #下面的client = PredictClient()入参需要替换为实际的访问地址。
          client = PredictClient('http://1664xxxxxxxxxxx.cn-hangzhou.pai-eas.aliyuncs.com', 'nlp_risk_cls002')
          #下面的Token需要替换为实际值。
          client.set_token('MTgxNjE1NGVmMDdjNDRkY2Q5NWE4xxxxxxxxxxxxxxxxxxxxxxx')    
          client.init()
          #输入请求需要根据模型进行构造,此处仅以字符串作为输入输出的程序为例。
          request = StringRequest('[{"id": "110","first_sequence": "想赢勇士想到 发疯?格林新发现吓呆众人","sequence_length": 128},{"id": "112","first_sequence": "骗人的,千万别买,谁买谁后悔?商家就是欺诈。垃圾商家。买了之后想退货门都没有,以各种手段不退货。买者慎重。","sequence_length": 128},{"id": "113","first_sequence": "很不错的,正品,很给力,男性同胞的福音,改善的效果特别的好,效果真的是不错的。是能增大2cm","sequence_length": 128}]')    
          for x in range(0, 50000):
              resp = client.predict(request)
              # print(str(resp.response_data, 'utf8'))
      print("test endding")
    2. eas_nlp_risk.pyPython脚本上传至您的任意环境,并在脚本上传后的当前目录执行如下调用命令。
      python3 <eas_nlp_ris.py>
      其中<eas_nlp_ris.py>需要替换为实际的Python脚本名称。
  6. 监控服务指标。
    调用模型服务后,您可以查看模型调用的相关指标水位,包括QPS、RT、CPU、GPU及Memory。
    1. PAI EAS模型在线服务页面,单击已调用服务服务监控列下的服务监控图标图标。
    2. 服务监控页签,即可查看模型调用的指标水位。
      从下面的服务监控水位图中可以看到,本案例部署的模型时延在150 ms左右。您自己的模型时延以实际为准。模型时延