Shopify以数据为中心构建基于机器学习的自动客服系统


Shopify Inbox是一款单一的商务聊天应用程序,可在一个地方管理所有 Shopify 商家的客户通信。
在我们构建产品时,我们必须了解商家的客户如何使用聊天应用程序。他们是否在寻求产品推荐?想知道一件物品是否会运送到他们的目的地?还是他们只是打招呼?有了这些信息,我们可以帮助商家确定将转化为销售的响应的优先级,并指导我们的产品团队下一步构建什么功能。然而,由于每月在 Shopify Inbox 中交换数百万条独特的消息,这将是一项具有挑战性的自然语言处理 (NLP) 任务。 

不过,我们的团队不需要从头开始:现成的 NLP 模型可供所有人广泛使用。考虑到这一点,我们决定应用一种新流行的机器学习过程——以数据为中心的方法。我们希望专注于根据我们自己的数据微调这些预训练模型,以产生最高的模型准确性,并为我们的商家提供最佳体验。

我们将分享我们通过应用以数据为中心的方法为 Shopify Inbox 构建消息分类模型的过程。从定义我们的分类分类到仔细训练我们的标注者,我们深入研究了以数据为中心的方法,加上最先进的预训练模型,如何产生我们现在正在运行的非常准确的预测服务在生产中。

为什么采用以数据为中心的方法?
机器学习的传统开发模型从获取训练数据开始,然后依次尝试不同的模型架构来克服任何不良数据点。
相比之下,以数据为中心的方法侧重于迭代地使训练数据更好地减少不一致,从而为一系列模型产生更好的结果。

由于任何人都可以下载性能良好的预训练模型,因此获得高质量的数据集是能够产生高质量系统的关键区别。在 Shopify,我们相信更好的训练数据会产生可以更好地为我们的商家服务的机器学习模型。

我们的第一个原型
我们的第一步是构建一个可以快速交付的内部原型。为什么?我们想建立一些东西,使我们能够理解买家在说什么。它不必是完美的或复杂的,它只需要证明我们可以交付具有影响力的东西。之后我们可以迭代。 
对于我们的第一个原型,我们不想在探索上花费大量时间,因此我们不得不在资源有限的情况下构建模型和训练数据。我们的团队选择了 TensorFlow Hub 上可用的预训练模型,称为Universal Sentence Encoder。该模型可以输出整个句子的嵌入,同时考虑单词的顺序。这对于理解意义至关重要。例如,下面的两条消息使用相同的一组词,但它们的情绪却截然不同:

  • “Love! More please. Don’t stop baking these cookies.”
  • “Please stop baking more cookies! Don't love these.”

为了快速构建我们的训练数据集,我们试图使用各种降维和聚类技术(包括UMAPHDBScan )来识别具有相似含义的消息组。在手动将主题分配给大约 20 个消息集群后,我们应用了一种半监督技术。
这种方法需要少量的标记数据,结合大量的未标记数据。我们手工标记了一些有代表性的种子来自每个主题的消息,并使用它们来查找类似的其他示例。
如,给定一条“你能帮我订购吗?”的种子信息,我们使用嵌入来帮助我们找到类似的信息,例如“如何订购?” 和“我怎样才能得到我的订单?”。然后我们从这些样本中进行采样以迭代地构建训练数据。

我们使用这个数据集来训练一个简单的预测模型,该模型包含一个嵌入层,然后是两个完全连接的密集层。我们的最后一层包含要预测的类数的 logits 数组。

这个模型给了我们一些有趣的见解。例如,我们观察到很多聊天消息都是关于订单状态的。这有助于我们决定构建订单状态请求作为 Shopify Inbox 的即时答复常见问题解答功能的一部分。但是,我们的内部原型还有很大的改进空间。总体而言,我们的模型达到了 70% 的准确率,并且只能对 35% 的高置信度消息进行分类(我们称之为覆盖率)。虽然我们使用嵌入来标记消息的杂乱无章的方法很快,但标签并不总是每条消息的基本事实。显然,我们有一些工作要做。


创建一个新的分类
首先,我们深入挖掘了用于训练原型的主题和消息集群。我们发现了几个广泛的主题,其中包含数百个将不同语义含义混为一谈的示例。例如,询问到各个目的地的运输可用性(购买前)的消息与询问订单状态(购买后)的消息被分组在同一主题中。
其他主题的例子很少,而大量的消息根本不属于任何特定的主题。难怪在如此高度不平衡的数据集上训练的模型无法实现高精度或覆盖率。

我们需要一个新的标签系统,它对我们的商家来说是准确和有用的。它还必须明确且易于注释者理解,以便一致地应用标签。对每个人来说都是双赢的!
这让我们思考:谁能帮助我们进行分类定义和注释过程?幸运的是,我们有一群才华横溢的同事。我们与拥有 Shopify Inbox 领域专业知识的员工内容设计师和产品研究员合作。我们还能够从一组深入了解 Shopify 和我们的商家(以及他们的买家)的支持顾问那里获得兼职帮助。
在两个月的时间里,我们开始筛选数百条消息,并提出了一个新的分类法。我们在电子表格中列出了每个新主题,以及详细描述、交叉引用、消歧和示例消息。该文档将作为项目中每个人(数据科学家、软件工程师和注释者)的真实来源。
在分类工作的同时,我们还研究了最新的预训练 NLP 模型,目的是根据我们的需要微调其中一个模型。Transformer系列是最受欢迎的系列之一,我们已经在我们的产品分类模型中使用了该架构。我们选择了DistilBERT,这是一个承诺在性能、资源使用和准确性之间取得良好平衡的模型。从我们新生的分类法构建的小型数据集上进行一些原型设计非常有希望:该模型的性能已经优于 1.0 版,因此我们决定加倍努力获得高质量的标记数据集。
我们的最终分类包含 40 多个主题,分为五类: 

  • 产品
  • 预购
  • 购买后
  • 店铺
  • 各种各样的

我们通过思考注释者如何从买家的角度对消息进行分类,从而得出了这个层次结构。首先要确定的是:当消息发送时,买家在购买过程中处于什么位置?他们是否询问了产品的细节,比如颜色或尺寸?或者,买家是否在询问付款方式?或者,也许产品坏了,他们想要退款?识别类别有助于在注释过程中缩小我们的主题列表。

更多点击标题