你在使用哪种编程语言?快来投票,亲手选出你心目中的编程语言之王 了解详情
写点什么

闲鱼搜索相关性——体验与效率平衡的背后

2021 年 7 月 15 日

闲鱼搜索相关性——体验与效率平衡的背后

背景

闲鱼搜索是闲鱼 APP 最大的成交场景入口, 成交归因中搜索占一半以上,所以提高成交效率是工程和算法迭代优化的主要目标,然而只以效率为最终的衡量标准不但会影响搜索的质量阻碍成交,还会恶化整个平台的长期生态建设无法成长,所以搜索相关性和平台生态对搜索平台至关重要,其中平台生态治理(例如恶意引流、欺诈、黑产等治理)涉及运营,算法和架构等诸多因素,并不是这里讨论的重点。本文主要讨论搜索相关性,它是整个产品的基石,也是搜索技术中的核心。下文则将依次介绍闲鱼搜索相关性遇到的问题现状,优化升级方案以及后续进一步的优化方向。

问题

当前闲鱼搜索存在多种扩召回策略,典型的如 query 改写、i2i、商品图像文本抽取、同款商品文本信息扩充等。扩召回策略是必要的,但不可避免地在下游引入相关性差的 case。与此同时下游的相关性控制却十分有限,在精排阶段的相关性主要存在以下问题:



经过多轮 top 和中长尾相关性 case 分析,整理了 top 的问题类型(同一个 case 可归到多个类型),并给出了典型例子:


null

图 1.badcase 分析


总结来看,当前系统的问题主要在于相关性策略覆盖不足,语义表达不准,基础数据更新迭代慢等问题。

技术方案

针对上述基础相关性因子弱、覆盖不足的问题,闲鱼搜索相关性规划第一阶段的优化目标为建立相对完善、高覆盖的基础相关性匹配链路,第二步是在基础策略基础上探索精细化的语义匹配策略提升相关性。本文主要介绍第一阶段方案。

工程链路设计

闲鱼搜索目前的工程链路为比较经典的搜索架构:SPL 做数据中转和中间参数构造;QP 负责 query 相关理解、特征抽取;检索引擎(Ha3)中做召回、粗排、精排算分、打散;RankService 通过在线模型服务实现深度模型重排序。


而相关性匹配链路有两种选择,一个是在检索引擎(Ha3)精排算分插件中完成,另一个则是在 RankService 中实现。虽然二者各有优势,选择在检索引擎(Ha3)精排算分插件中实现可以灵活的配置召回和精排阶段的不同数量方便实验。出于效率考虑,特征则优先采用离线抽取方式:


• Query 特征通过离线抽取,增量方式导入到线上 KV 存储中,在线 QP 中请求 KV 存储获取相应特征,最后通过 SPL 传给检索引擎(Ha3)精排算分插件。

• Item 特征的离线抽取同样包括全量和增量两部分:天级别全量、15min 级别增量回流到检索引擎(Ha3)。

• 检索引擎(Ha3)精排算分插件获取 query 和 item 特征,在线计算相关性分。


null


图 2.搜索架构图

算法模型实现

搜索算法最终的 doc 排序往往是考虑多因子,而在闲鱼搜索中比较重要的因子包括成交效率因子、相关性因子和其他业务规则。简化来说可以先只讨论相关性和成交效率因子,而二者的融合方式大致有三种:


• 相关性做档位分,下游根据相关性分层排序。

• 相关性连续值 score 和效率 score 加权得到最终排序分。

• 相关性和效率目标联合优化。


为做到对相关性的绝对控制,同时尽可能少的影响效率模型排序分,算法侧的链路选择第一种方式:在对 Query、商品理解的基础上,构造各种相关性匹配特征,进而进行特征融合得到相关性档位(这里分为三档)。最后根据规则进行分档,输出给检索引擎(Ha3)精排算分插件和 RankService 重排做相关性的档位控制。


整体的相关性层次链路如下图,其中算法侧最为关键的部分包括基础理解、特征抽取以及特征融合。而特征抽取往往又依赖或包括了基础理解,因此下文将重点介绍特征构造和特征融合,并在特征构造的讨论中穿插基础理解的工作。


null

图 3.相关性链路

特征构造

搜索相关性的特征这里分为三个维度:基础特征、文本匹配特征以及语义匹配特征。基础特征主要包括 query 和 item 的统计特征,以及结构化相关的匹配特征,如类目是否匹配、关键属性(品类、品牌、型号等)是否匹配。文本匹配特征主要是字面上的匹配特征,如 term 匹配数、匹配率、带同义词策略的匹配、带 term weight 的匹配以及最基础的 BM25 分等。语义匹配特征则主要包括基于点击行为的表示匹配、文本和多模态语义匹配。


null

图 4.搜索相关性的特征


其中基础特征和文本匹配特征相对常规,不再详细展开。下面重点对语义匹配特征做进一步的介绍:

文本语义匹配

处于性能考虑,文本的语义匹配采用双塔向量匹配模型结构:基础模型使用开源的 BERT,Query 和 Item 共享相同的参数权重。同时为了适应下游的相关性分档,模型采用 Pointwise 的训练方式。篇幅原因,这里对模型细节不作展开。而相比模型结构的设计,其实闲鱼搜索中更重要的工作在于训练样本的构造。由于现阶段缺少人工标注数据的积累,所以当前该部分工作主要解决以下两个问题:


•高置信样本挖掘,缓解搜索点击日志“点击但不相关”的问题。


•定制化的负样本构造,避免模型收敛过快,只能判断简单语义相关性,而对上文提到的闲鱼场景"勉强相关"的难 case 无法区分。


针对以上问题,参考集团相关经验并结合对闲鱼搜索数据的观察分析,做了如下采样方案:


正样本:

    •充足曝光下高点击 ctr 样本(ctr 大于同 query 下商品点击率平均值)


负样本:

    •同父类目的邻居叶子类目负采样。

    •高曝光低点击类目样本:同一个 query 搜索下,根据点击过商品的类目分布,取相对超低频类目样本


作为负样本(如类目分布占比 < 0.05 的商品视为负样本)。

    •充足曝光情况下,低于相应 query 平均曝光点击率 10%以下的样本做负样本。

    •基于 query 核心 term 替换构造负样本:如对于“品牌 A+品类”结构的 Query,使用“品牌 B+品类”结构的 query 做其负样本。

    •随机构造负样本:为增加随机性,该部分实现在训练时使用同 batch 中其他样本做负样本,同时引入 batch hard sample 机制。


上述方式采样得到的训练数据,随机抽测准确率在 90%+,进一步采样后量级在 4kw+。在此基础上训练双塔模型,上线方式为离线抽取 Embedding,线上查表并计算向量相似度。


null

图 5.文本语义模型


该部分工作独立全量上线,抽测 top300 query + 随机 200query 搜索满意度+6.6%;同样文本语义向量用于 i2i 向量召回,复用到闲鱼求购场景,核心指标点击互动人次相对提升 20.45%。


定义搜索 query top10 商品完全相关/基本相关占比>80%为满意,一组 query 评测结果为满意的占比为 query 满意度。

多模态语义匹配

除了文本语义向量匹配,本次工作也尝试了多模态语义向量。模型侧使用预训练的多模态 BERT,类似工作集团已经有大量的尝试,本文主要参考过([1],[2]),并对模型和策略作了一些调整:

• 替换多图特征抽取为首图 region 特征抽取做图像特征序列(resnet pooling 前的特征序列),提升链路效率;

• 替换 Bert-base 为 Electra-small,减小模型参数(经测试 47M 的模型,下游分类任务精度损失 2 个点以内),方便与 Resnet 联合 E2E 训练。


下游的匹配任务仍使用双塔模型策略,和文本语义模型不同的是,这里直接使用 Triple Loss 的方式,主要考虑加大模型之间的差异性,使后面的模型融合有更大的空间。


null

图 6.多模态语义模型


PS: 该部分工作离线 AUC 为 0.75 相对较高,在下游特征融合 AUC 提升 1 个点以上。但在上线过程中,由于需要图像处理,增量商品特征更新回流相对其他链路延迟较大,容易造成新商品特征缺失,因此还需要进一步链路优化。

点击图表示匹配

除了上文提到的通过语义向量引入语义信息,还可以借助搜索日志中的点击行为表示 query 或 item 构造图结构引入新的语义表示。其中基于图结构的 match 算法 SWING 算法,在阿里内部应用广泛,相关的文章也有很多,这里不在阐述。针对闲鱼场景首先将<user, item>点击 pair 对改造为<item, query>点击 pair 对,这样直接沿用现有的 swing 工具,可以得到 query2query 的列表。聚合 key query 的所有相似 query,并进行分词,对所有的 term 进行加权求和,归一化后得到 key query 的表示。


其中的权重为 swing 算法输出的 score,key query 的 term 权重默认为 1。而对于行为稀疏的长尾 query 则使用上文语义向量召回最相近的头部 query,补充其语义表示。最终得到的 query 表示实例:



得到 query 表示后,item 同样做类似的归一化表示。上线时使用稀疏存储的方式,在线计算匹配 term 的加权和作为点击图表示匹配分。


特征融合

准备好必要的相关性特征后,下一步则是对众多特征的有效融合,本文则采用经典的 GBDT 模型完成该步骤。选择 GBDT 模型的好处一方面在于检索引擎(Ha3)精排算分插件中有现成的组件可以直接复用,另一方面也在于相比于更加简单的 LR 模型可以省去很多特征预处理步骤,使得线上策略更加简单。

模型的训练使用人工标注的训练数据,标注目标为四档(完全相关、基本相关、勉强相关以及完全不相关)。在训练阶段,四个档位被映射到 1、0.75、0.25 和 0 四个分位,GBDT 模型则通过回归的方式对分位进行拟合。由于该部分策略是对子特征的 ensemble,因此并不需要非常多的训练数据(这里的量级在万级别)。


null

图 7.特征融合模型


最终,经过常规的调参,GBDT 特征融合模型离线 AUC 可以达到 0.86,基本符合预期(最优单特征 AUC 为 0.76)。该策略全量上线,在文本语义向量的基础之上,不影响成交效率的前提下:随机 query 抽测(top 800w)DCG@10 相对提升 6.51%,query 搜索满意度+24%;头部 query 同样也有相应的提升,相应地搜索体感也得到有效提升。

小结与思考

闲鱼搜索相关性优化第一阶段重点在于搭建相对完整的链路作为 Baseline,为后续的进一步优化奠定基础。通过本季度的优化,基础相关性的问题得到一定的缓解,但仍存在比较大的优化空间。


而从进一步的 case 分析可以看出当前策略在细粒度属性/意图的匹配上表现不够优秀,同时也存在 goodcase 的误打压情况。因此后续的优化方向也比较明确:优化现有特征细节;增加更精细的相关性特征如 query tagging、商品结构化特征、核心词匹配等;积累更多的人工标注数据,同时探索更加细粒度的匹配模型。


最后抛出策略优化过程中的两个思考:

1、相关性与成交效率的“冲突”:工作中被挑战最多的问题,为什么相关性提升没有带来交易效率的提升?对于这个问题的几点考虑:

• 技术方案不完美是客观存在的,如上所提到的因为策略问题导致 goodcase 误打压的情况,会损失一部分交易效率。

• 相关性或者商品治理优化会将一些勉强相关但可能成交的周边产品打压,如相关性优化后搜“手机”类型的 query 不再出成交频次更高的“手机壳”、“屏幕”、“总成”等配件、零件,搜“xx 车”不再出“轮胎”、“轮毂”等配件;治理优化后“低价引流”或“欺诈”商品减少明显,但有意思的是欺诈的商品成交效率往往高于正常商品。

• 完全不相关的 query 优化后确实会提升交易效率,但和上述交易效率的损失中和后,整体的交易效率提升会变弱。

• 最后个人认为电商搜索优化的路径,应该是开始就在相对严格相关性条件下进行成交效率的优化,进而逐步放宽召回限制并同时优化相关性策略,达到相关性和成交效率同步提升。如果在一开始就在弱相关性的条件下只关注成交效率,让系统处于一个放飞的状态,突然关注体感的时候一脚刹车,难免会带来想吐的感觉。


2、体感会不会骗人:二手交易市场,本身就是“杂”的特质。而很多时候技术同学并不是闲鱼的目标用户,“我”认为的相关和体感并不一定是用户的真实需求,一刀切的治理和相关性优化是否会损失掉一部分闲鱼产品特色需求的满足(当然不是说欺诈和色情之类),真正说清楚这个问题还是需要更多的数据支持以及对产品更深层次的理解。


[1] Hao Tan and Mohit Bansal. Lxmert: Learning cross-modality encoder representations from transformers. In Proceedings of the 2019 Conference on Empirical Methods in Natural Language Processing, 2019.

[2] Jiasen Lu, Dhruv Batra, Devi Parikh, and Stefan Lee. Vilbert: Pretraining task-agnostic visiolinguistic representations for vision-and-language tasks. arXiv preprint arXiv:1908.02265, 201


本文转载自:闲鱼技术(ID:XYtech_Alibaba)

原文链接:闲鱼搜索相关性——体验与效率平衡的背后


2021 年 7 月 15 日 07:00670

评论 1 条评论

发布
用户头像
“成交效率” 的具体定义是什么呢?
2021 年 07 月 16 日 16:03
回复
没有更多了
发现更多内容

应用区块链技术打通各自为战形成的壁垒

CECBC区块链专委会

ES 终于可以搜到“悟空哥”了!

悟空聊架构

中文分词 elasticsearch 分词 ES ik

专访彩食鲜 CTO 乔新亮:CTO的“升级”秘笈

IT蜗壳-Tango

阿里巴巴研究员吴翰清采访提纲:天才少年之路

Nydia

签约计划

“湘”遇区块链 赋能新业态

CECBC区块链专委会

Zookeeper基础原理&应用场景详解

SH的全栈笔记

zookeeper 中间件 ZooKeeper原理

【Knative系列】看完这篇还不懂 Knative Serving,你来打我~(史上最详细)

Chumper

Serverless 云原生 Knative

LiteOS内核源码分析:消息队列Queue

华为云开发者社区

队列 LiteOS LiteOS内核 消息队列Queue 队列池

区块链电子合同签约,推动合同签约数字化转型

13530558032

AUC/ROC:面试中80%都会问的知识点

华为云开发者社区

机器学习 面试 mindspore roc AUC

白皮书:区块链将成隐私计算产品必选项,提供三方面助力

CECBC区块链专委会

区块链

中广协支持配合打击整治非法社会组织工作

󠀛Ferry

四月日更

python内置数据结构list、set、dict、tuple(二)

若尘

List 数据结构 set 元组 Python编程

使用 SpringBoot 的 CommandLineRunner 遇到的坑

Java小咖秀

容器 开发 springboot CommandLineRunner ApplicationRunner

【LeetCode】解码方法Java题解

HQ数字卡

算法 LeetCode 4月日更

读《乌克兰拖拉机简史》有感

箭上有毒

读书笔记 4月日更

别再问我 2050 可以干什么,Make a Movie in a Day!

阿里云视频云

电影

库存溯源之批次管理

陈俊

溯源 供应链 仓储 冷链 wms

《采访提纲:声网 Agora.io 资深 iOS 开发工程师--龚宇华》

空城机

活动专区 签约计划 4月日更

区块链电子证据的司法应用现状与展望

CECBC区块链专委会

Semaphore自白:限流器用我就对了!

王磊

Java 多线程 Semaphore

哭了!“日志注入”为什么跟想象中的不一样

华为云开发者社区

Java 参数 日志注入 log4j2框架 异常堆栈

存储成本降低80%!US3在海量数据归档存储下的成本优化技术实践

UCloud技术

存储 海量数据 存储成本

智慧平安社区建设--赋能基层治理

13530558032

网络安全传奇吴翰清采访提纲 |调查采访能力考核

清秋

网络安全 签约计划 调查采访能力考核

聪明人的训练(二十一)

Changing Lin

4月日更

实体经济与数字经济加速融合 中国经济新动能快速成长

CECBC区块链专委会

数字经济

张超 - 机锋网联合创始人 - 采访提纲:那些 3 个月就上线的产品,如何去做技术规划?

梦想橡皮擦

签约计划

源中瑞区块链农产品溯源--推动农业科技发展

13530558032

NumPy之:NumPy简介教程

程序那些事

Python 数据分析 Python3 Numpy 程序那些事

智慧党建平台建设,智慧组工干部人事管理系统开发方案

WX13823153201

围绕“三个问题”开展的网易云音乐数据基础建设

围绕“三个问题”开展的网易云音乐数据基础建设

闲鱼搜索相关性——体验与效率平衡的背后-InfoQ