在推荐系统中,如果用户看过某个物品,就不再把物品推荐给这个用户。小红书、抖音都这样做曝光过滤,原因是实验表明重复曝光同一个物品会损害用户体验。但也不是所有推荐系统都有曝光过滤,像 YouTube 这样的长视频就没有曝光过滤,看过的可以再次推荐。 曝光过滤通常是在召回阶段做。想要做曝光过滤,需要对于每个用户,记录已经曝光给他的物品。一个用户历史上看过的物品可能会非常多,为了做到高效的曝光过滤,需要用Bloom Filter这种数据结构。
曝光过滤
Bloom Filter
Bloom Filter是一种数据结构 。
K=0的情况:
K=3的情况:
误伤概率:
即每个曝光物品需要占几个bit的存储,用户历史上有n个曝光物品,只需要m=10n bits就可以把误伤概率降低到1%以下。
把曝光物品写入kafka消息队列,用fink做实时计算,fink实时读取Kafka消息队列,计算曝光物品的哈希值,把结果写到Bloom Filter的二进制向量上。
用这样的实时更新链路,在曝光发生几秒之后,用户的Bloom Filter就会被修改,就可以避免重复曝光。但如果挂掉或者延迟较大,会失误。
曝光过滤具体用在召回完成之后,召回服务器请求曝光过滤服务,曝光过滤服务把用户的二进制向量发送给召回服务器。在召回服务器,用Bloom Filter计算召回物品的哈希值,再和二进制向量做对比,把已经曝光的给过滤。剩余的物品未曝光,发送给排序阶段。