现有固定槽位的填充召回策略在相关线上推荐服务中缺乏有效的相关性排序,存在较硬的排列顺序,各个策略之间互相影响,导致线上基于规则的拓扑图比较复杂,因此设计在线推理服务,通过学习用户行为完成在线排序。
1. 博客相关推荐现状
博客相关推荐现在基于固定槽位填充的方式。
1.1 召回现状
1.1.1 基于曝光搜索词召回
- 统计时间窗内搜索词pv数据,过滤无效搜索请求,通过衰减系数约束历史pv计算综合得分更新到 全量搜索词表中;
- 按照搜索词分组,根据分数倒排得到 query to blog_id 列表;
- 按照 blog_id分组,根据分数倒排得到 blog_id to query 列表;
- 步骤2和步骤3结果关联,计算 id_score * id_score 取top25用于召回;
1.1.2 基于点击行为召回
根据已经曝光的博客计算平滑后的ctr,根据ctr结果进行倒排;
1.1.3 基于专栏召回
在博客归属的专栏中根据文章阅读数进行排序,给出推荐其专栏内其他文章;
1.1.4 基于opensearch召回
调用opensearch服务 召回搜索数据
1.1.5 其他召回
- 召回博客/下载同标签下的数据
1.2 过滤
- 相关推荐的去重过滤
- 下载和学院课程资源的图片非法值过滤策略
1.3 组合
- 先插入5条点击召回资源,再插入5条曝光搜索词召回资源 ,再插入5条opensearch召回资源。
- 当召回不足的情况下增加兜底的热数据 / 或者用于代替热数据的同标签下或同专栏下内容数据
- 相关推荐内容中按照槽位增加插入原力计划云原生的内容
2 在线推理框架设计
2.1 在线推理时序图
3. 上线遇到的问题
3.1 在线推理耗时较长,增加redis缓存
小流量实验上线后经过特征服务和模型服务处理,相关推荐总耗时会增加约200ms,分析发现,特征服务异步调用blog特征、下载特征、媒资特征以及landing特征的耗时较长,所以将获取到的特征数据进行缓存;
3.2 增加异步处理逻辑,获取多源特征
特征服务异步调用blog特征、下载特征、媒资特征以及landing特征的耗时不一致,通过异步处理减少串行处理的时间;
3.3 缓存必要的特征数据,提高有效缓存个数
线上缓存数据库监控发现,资源占用较高,导致redis key 逐出率过高,通过缓存必要的特征数据,提高缓存利用率;
3.4 tf-serving服务中,拆开embedding逻辑到特征服务
模型排序依赖文本信息的embedding处理,且耗时较多,因此将向量化模块做成独立服务在特征服务模块异步调用,充分利用等待时间;
3.5 优化处理流程图
现在执行流程图中执行逻辑是先执行完第一层所有的节点,才能执行第二层节点,媒资和query特征所需时间较短,需要等待耗时最长的blog特征,并且媒资中的title和landing的query 信息需要embedding 操作,就导致时间利用不充分。通过图嵌套模式将多个子任务封装到一个大任务中,实现
如下图所示,右侧优化后能充分利用等待获取blog特征的间隙,节约出embedding的耗时:
4. 模型效果
4.1 模型重排实验离线结论:
- 标注团队标注了789个case的理想序
query_pair总数:7643
base(线上): 正序对数:4258, 逆序对数:3385, pnr: 1.2579;ndcg: 0.8249
model(重排): 正序对数:4584, 逆序对数:3059, pnr: 1.4985; ndcg: 0.89227
模型重排正序对增加 326对 - 自评 GSB=6: 5: 2
标注团队 GSB=40:50:10
4.2 胜出率情况:
第三条的胜出率最高 57.5%、Top5胜出率65%;
位置 | G | S | B | 胜出率 |
第1条 | 13 | 82 | 5 | 54.0% |
第2条 | 16 | 76 | 8 | 54.0% |
第3条 | 15 | 85 | 0 | 57.5% |
第4条 | 13 | 85 | 2 | 55.5% |
第5条 | 14 | 81 | 5 | 54.5% |
Top5整体 | 40 | 50 | 10 | 65.0% |
注:胜出率=(G+S/2)/(G+S+B)
4.3 Goodcase:
case1
原文title:常见mimeType大全
备注:左1,左2相关性差,右版明显胜出
位置 | 线上base | 排序模型 | ||
---|---|---|---|---|
首条 | weblogic安装部署以及常见问题解决 | 不相关 | 常见文件对应的MIMEType类型 | |
第2条 | MIME 文件集列表 | 弱相关 | 史上最全的mime-type大全 | |
第3条 | 常用文件的mime和mimetype.txt | MIME Type介绍 | ||
第4条 | Android MIME类型 | mime type类型详解 | ||
第5条 | MimeType对照表 | MIME type 类型大全 |
case2
原文title:程序运行报错:A JavaScript error occurred in the main process
备注:左1不相关,右版明显胜出
位置 | 线上base | 排序模型 | ||
---|---|---|---|---|
首条 | An internal error occurred during: java.lang.NullPointerExcepti... | 不相关 | 代码编译/程序运行报错:A JavaScript error occurred in the main process | |
第2条 | 打开电脑出现错误A JavaScript error occurred in the main process解决方法 | 打开电脑出现错误A JavaScript error occurred in the main process解决方法 | ||
第3条 | 如何解决一些日常的电脑弹窗故障( Error A JavaScript error occurred in the main process) | A JavaScript error occured in the main process | ||
第4条 | 代码编译/程序运行报错:A JavaScript error occurred in the main process | MongoDBCompassCommunity启动的时候出现a javascript error occurred in the main process | ||
第5条 | A JavaScript error occured in the main process | 关于安装Fiddler出现 A JavaScript error occurred in the main process 问题解决 |
4.4 Badcase:
case1
原文title:Modelsim 安装步骤详解
备注:右1,右2弱相关,没有“安装”,左3不相关,右版落败
位置 | 线上base | 排序模型 | ||
---|---|---|---|---|
首条 | Quartus II和Modelsim安装破解步骤 | ModelSim仿真实例教程 | 弱相关 | |
第2条 | quartus II modelsim 破解安装教程 | ModelSim的使用详解 | 弱相关 | |
第3条 | 计算机网络(谢希仁-第八版)第五章习题全解 | 不相关 | Modelsim的安装教程 | |
第4条 | modelsim安装步骤 | 安装ModelSim的详细步骤: | ||
第5条 | ModelSim SE 10.4安装破解教程 | 入门数字集成电路设计系列(一)——Modelsim安装及破解过程记录 |
4.5 模型选择
第一版模型选择树模型,有助于我们分析现有特征的重要度,以及模型效果分析时帮助我们问题溯源。
树结构的可视化:
5. 附录
性能
模型部署环境:docker 1C2G
测试环境:2C8G
测试工具:jemeter
线程数 | 循环次数 | 参数列表个数 | 样本个数 | 平均值 | 中位数 | 90% | 95% | 99% | 最小值 | 最大值 | 失败 | 吞吐量 | 接收KB/sec | 发送KB/sec |
100 | 100 | 10 | 10000 | 36 | 34 | 54 | 71 | 123 | 4 | 240 | 0 | 542.95 | 152.70 | 672.85 |
100 | 100 | 50 | 10000 | 154 | 115 | 289 | 338 | 985 | 4 | 2495 | 0 | 273.94 | 230.60 | 1459.33 |
100 | 10 | 10 | 1000 | 46 | 32 | 102 | 128 | 146 | 5 | 226 | 0 | 377.79 | 104.41 | 466.33 |
100 | 10 | 50 | 1000 | 54 | 43 | 119 | 170 | 184 | 5 | 193 | 0 | 374.25 | 315.41 | 1989.31 |
50 | 20 | 10 | 1000 | 35 | 25 | 75 | 82 | 124 | 5 | 165 | 0 | 342.23 | 95.25 | 422.44 |
50 | 20 | 50 | 1000 | 32 | 23 | 62 | 90 | 114 | 5 | 125 | 0 | 363.50 | 309.19 | 1930.41 |
模型部署环境:16C128G
线程数 | 循环次数 | 参数列表个数 | 样本个数 | 平均值 | 中位数 | 90% | 95% | 99% | 最小值 | 最大值 | 失败 | 吞吐量 | 接收KB/sec | 发送KB/sec |
100 | 100 | 在线推理-POST请求-50 | 1000 | 110 | 84 | 224 | 249 | 368 | 7 | 379 | 0 | 259.6053998 | 218.7885352 | 1380.16777 |
100 | 100 | 在线推理-POST请求-10 | 1000 | 103 | 56 | 324 | 415 | 457 | 4 | 470 | 0 | 312.4023743 | 86.33776554 | 385.9267612 |
50 | 20 | 在线推理-POST请求-50 | 1000 | 59 | 30 | 163 | 193 | 399 | 3 | 399 | 0 | 308.8326127 | 260.2759226 | 1644.593982 |
50 | 20 | 在线推理-POST请求-10 | 1000 | 64 | 41 | 137 | 187 | 317 | 2 | 404 | 0 | 276.0905577 | 76.8416103 | 341.0689018 |
文章作者: 李永 & 卫亮亮 & 王品