Press "Enter" to skip to content

如何通过向量相似度搜索推动消费支出结果

在大型语言模型、向量和向量搜索方面引起了很大的关注,重要的是要退一步,了解这些人工智能技术进步如何转化为组织和最终客户的结果。

问题

今天,我们与促销团队会面。他们希望我们帮助他们在客户广告、优惠和优惠券方面做出更明智的决策。目前,促销主要基于地理市场。因此,发送给一个城市的促销活动与发送给另一个城市的促销活动是不同的。因此,这些活动必须提前计划好。

问题在于,市场部门正向他们施加压力,要求他们提供更具战略性的客户定位方法,而不考虑地理区域。其想法是,根据客户的购买历史,特定的客户可能更有可能利用某些优惠。如果我们能够以实时的方式提供这些优惠,比如购物车中的相关产品打9折,我们可能能够推动一些额外的销售。

首先,我决定查看一下我们在他们的Apache Cassandra集群中的一些匿名订单数据。很明显,数据中确实存在一些模式,一些客户以一定的规律购买相同的物品(主要是杂货产品)。也许我们可以利用这些数据?

改善体验

我们有一个优势:我们的客户倾向于通过多个渠道与我们互动。有些人使用网站,有些人使用移动应用程序,还有些人仍然走进我们约1,000家实体店中的任何一家。而在店内的顾客中,有一半以上同时使用移动应用程序。

另一个有趣的观点是:如果我们按照家庭地址而不仅仅是客户ID来汇总物品销售数据,我们会看到更加固定的购物模式。从几个不同的来源汇总数据后,我们可以开始描绘出这些数据的真实形象。

例如:一对夫妇有一只狗。通常,一方的配偶买狗粮。但有时候,另一方也会买。这些个别客户层面的事件并没有太多的模式。

但是,当在家庭层面上汇总在一起时,就会有模式。实际上,他们每周一次购买超过一卷6磅的“HealthyFresh——鸡肉生狗食”。根据推荐的食用量,他们可能有六只小狗或一只大狗,很可能是后者。

每个客户频繁光顾的商店在这里也起到作用。例如,我们的客户玛丽可能因工作而出差,并可能访问她从未去过的商店之一。如果该商店距离她经常光顾的商店有很大的距离,我们可以假设玛丽可能正在购买与她旅行有关的特定物品。在这种情况下,她的正常购物习惯不适用(她可能不会购买狗粮),我们也不需要向她提供促销活动来鼓励她消费。

然而,如果玛丽在她经常光顾的商店之一,激活她的移动设备上的促销活动可能是有意义的。如果我们鼓励顾客用手机扫描商品,我们将知道他们实体购物车中的哪些商品。然后,我们可以呈现与购物车中已有产品相补充的类似产品。

计算向量以寻找相似产品

寻找相似产品意味着我们需要为我们的产品计算相似性向量。我们可以通过几种方式来做到这一点。为了组装一个最小可行产品,我们可以仅关注产品名称,并基于“词袋”方法构建自然语言处理(NLP)模型。

在这种方法中,我们从所有产品名称中提取每个单词,并为每个唯一单词分配一个条目。这就是我们的词汇表。我们创建和存储的相似性向量与每个产品一起,变成了一个由1和0组成的数组,指示当前产品名称是否具有该单词,如下表1所示。我们可以使用类似TensorFlow的平台来构建和训练我们的机器学习(ML)模型。

表1:宠物用品类别下产品名称的“词袋”NLP词汇表,展示了如何组装每个向量。

“词袋”方法的一个问题是向量中的0比1多。这可能导致模型训练时间和预测时间更长。为了解决这些问题,我们将为每个主要产品类别构建一个独特的词汇表。向量在不同类别之间不能共用,但这没关系,因为我们可以在查询时按类别进行过滤。

接下来,我们可以在Apache Cassandra集群中创建一个表来支持每个特定类别的向量搜索。由于我们的词汇包含14个单词,因此我们的向量的大小也需要是14:

为了使向量搜索功能正常运行,我们需要在表上创建一个存储附加二级索引(SASI):

CREATE CUSTOM INDEX ON pet_supply_vectors(product_vector) USING 'StorageAttachedIndex';

然后我们可以将ML模型的输出加载到Cassandra中。有了数据后,下一步是添加一个新的服务,该服务使用以下查询执行向量搜索:

这将使用存储在当前产品中的向量运行近似最近邻(ANN)算法。由于使用了LIMIT 2子句,它将返回当前产品和最接近的下一个邻居(最近邻)。

在上面的查询中,我们使用了“健康鲜食 – 鸡肉生狗粮”产品的向量,假设客户刚刚将其添加到购物车中或用手机扫描了它。我们处理此事件并组成以下消息:

  • customer_id:a3f5c9a3
  • device_id:e6f40454
  • product_id:pf1843
  • product_name:“健康鲜食 – 鸡肉生狗粮”
  • product_vector:[1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0]

然后,我们将此消息发送到Apache Pulsar主题。我们从主题中消费并使用上述数据调用Promotions微服务上的getPromotionProduct端点。这将运行上面指定的查询,返回两种“健康鲜食”口味。我们忽略与100%匹配的product_vector的数据(我们已经拥有的产品),并在他们的设备上触发了“健康鲜食 – 牛肉”口味的促销活动:

结论和下一步

在实施了这个逻辑几周后,我们的促销团队联系我们,并报告说我们的方法大约触发了额外销售的25%。虽然这很诱人,可以称之为“胜利”,但我们肯定还有一些其他方面可以改进的地方。

我们选择了“词袋”NLP方法,只是为了尽快推出一个初始(软件)产品。我听说过一些关于不同NLP算法如“Word2Vec”的好事情,这可能是一个更好的长期方法。我们的模型也只关注构建由产品名称组成的词汇表。也许扩展我们的模型输入以包括其他产品细节(例如大小,颜色,品牌)可能有助于微调一些东西。

在即将发布的一篇文章中,我们将展示如何使用向量搜索来帮助我们的运输服务团队提高其交付路线的效率。

Leave a Reply

Your email address will not be published. Required fields are marked *