本文讨论一个非常有意思的问题:电商搜索(广告)业务中的个性化、实时化。
包括电商搜索在内的搜索业务对个性化的要求,相对于推荐而言是要低一些的,因为搜索关键词能够强烈的指示用户意图,即使没有个性化技术,搜索结果一般仍然是可以接受的。由于对个性化要求稍低,搜索也对实时性要求稍低,用户搜索跟昨天一样的关键词,今天返回同样的结果,是可以接受的,甚至应该如此,如果用户搜索同样关键词返回结果却每一次都不一样,反而可能令用户困惑。
尽管如此,在搜索广告场景中引入个性化,经验表明仍然是有帮助的。
精排个性化与实时化
首先,最为人所熟知的个性化方法,是在精排模型也即 pCTR, pCVR 模型中引入用户侧特征,特别是用户行为序列特征。这方面为最著名的工作是阿里的 DIN. 不过,DIN 模型原 paper 是用在推荐系统上的,应用在搜索系统上时,搜索系统的 pCTR 模型还会有 query, item 统计特征,以及 query-item 交叉特征,这些交叉特征会占据更大的权重,用户特征以及用户行为序列有帮助,但重要性没有推荐系统中那么大。
搜索结果实时化
当今由于移动电商大部分流量来自于移动客户端,导致搜索结果带有了信息流的特质。用户输入关键词之后,可能会在搜索结果页面一直向下刷很久,并且可能点击一些 item 之后继续返回搜索界面继续刷。传统的搜索引擎在用户输入关键词、发出请求之后,搜索结果就确定了,用户向下刷时只是把固定的结果加载出来。但这样的做法就忽略了非常有价值的用户行为信息。
于是,为了更好地利用这些用户行为特征,我们在搜索(广告)场景上也可以进行实时化。也即,用户每向下刷一定数量的商品之后,就会重新计算后续搜索结果,然后从新结果中去除掉已经曝光的商品,展示新的商品。这主要是个工程问题:如果系统原本是有缓存的,去掉这个缓存可能会给整个搜索链路带来巨大的压力,甚至流量负载翻倍。
这就需要比较精细的区分哪些计算是必要的,哪些是不必要的。首先,召回阶段,多路召回中,很多召回方法可能是没有没有实时特征的,没有必要重新计算,可以缓存结果。精排阶段有两种选择:
- 可以只对新召回的商品重新打分,然后跟缓存的上一轮打分结果归并排序
- 可以对缓存的物品、新召回的物品全部重新打分排序
在算力允许的前提下,全部重新打分然后归并排序效果会更好,因为精排模型在实时特征发生变化后打分可能会发生变化。
另外,一个重要的优化是,用户可能在下刷过程中没有新的行为,用户特征没有变化,则搜索结果是不会变化的,重新运行召回、精排完全是浪费。因此可以检测用户有没有新行为,如果没有新行为,直接使用缓存结果即可。
召回个性化与实时化
最后,召回阶段也可以引入用户特征,包括实时用户行为。
流行的向量化召回 vector recall(也称 knn recall),比如 DSSM 等模型,很容易加入这些特征,跟精排阶段相似,只是 KNN 不方便较早的进行特征交叉。
另一种召回方法则是在推荐系统中较为常见的 U2I2I 召回。也即,使用用户行为序列作为 Trigger, 直接召回相似物品。这类方法在「Swing 方法在搜索召回中的应用」一文中有介绍,也类似于 Q2I2I 一文中介绍的方法。
在我们的实际应用中,U2I2I 召回有奇效,特别是带来了极大的 CVR 提升,即使没有链路的实时化支持,也能取得较大收益。推测可能的原因包括,
- 用户行为确实是对用户意图非常强的指示
- 搜索系统中,大部分召回方法是基于 Query 的,而这种方法却不依赖 Query, 能够得到较多新结果
- 生成 I2I 序列的 Swing 算法能够较好的捕捉用户点击行为之间的关联