一、项目背景

在社区场景中,我们积累了丰富的用户互动数据。这些历史互动信息对CTR/CVR预估建模具有重要参考价值,用户的每次互动都反映了其特定维度的偏好特征。当前,已在多个业务实践中验证,基于用户历史互动特征进行未来行为预测是有效的。用户互动序列越长,包含的偏好特征就越丰富,但同时也带来了更大的技术挑战。

目前社区搜索领域已经在序列建模方向取得了一些应用成果,显著提升了搜索效率,但在该方向上仍有优化空间,主要体现在:

算法精排模型现状:长周期的用户互动特征尚未被充分利用,现有模型仅使用了基础标识信息,泛化能力有待提升。我们计划引入SIM方案来增强个性化序列建模能力,推动搜索效率提升。

迭代效率优化:当前互动特征优化依赖于实时数据采集链路,新增特征需要长时间数据积累(2个月以上)才能验证效果。我们计划建设用户特征离线回溯服务,降低算法优化对实时数据的依赖,加快项目迭代速度,提高实验效率。

离线回溯主要解决迭代效率问题,本文重点探讨在社区搜索场景下开发离线回溯,并做离线一致性验证过程中发现的一些问题,针对这些问题做了哪些优化措施及思考。

二、架构设计

全局架构

序列产出流程链路

※  在线流程链路

在线链路通过实时数仓提供全量表和实时流两种数据源,在特征平台下构建1w长度的实时用户画像,召回阶段SP,将画像传给SIM引擎,在引擎中完成对用户序列hard/soft search等异步加工,最终传给Nuroe,完成在线序列dump落表。

※  离线流程链路

离线链路通过仿真在线的处理逻辑,利用请求pv表和离线数仓提供的10w原始序列,模拟在线序列10w->1w->100的过程,最终产出离线回溯序列。

最终通过在线/离线全链路数据的一致性验证,确认全流程数据无diff(或diff可解释),序列流程可靠性达标,可交付算法团队用于模型训练。

序列产出全局架构

在线架构

在线侧抽象GSU模块支持社区搜索和增长搜索等多场景复用。该模块在QP(Query Processing)阶段后,通过外调基于DSearch构建的SIM引擎进行用户序列处理。SIM引擎内完成hard/soft search等用户序列加工,在精排阶段前获取topk序列特征及对应sideinfo,并将其透传给精排模块,最终实现用户序列的落表存储。

在线通用GSU模块

离线链路

数据产出三阶段

※  原始序列预处理阶段

通过收集一个用户,按照 [月初ts+1w,  月末ts] 将序列进行预处理。

※  pv表合并序列表阶段

按照user_id将画像和pv表合并,将每个request_id的数据按照request_time过滤处理。

※  用户序列加工阶段

完成hard/soft search等用户序列加工逻辑处理,包括对长期序列按照相似度过滤,对短期序列按照时间过滤等。

离线回溯链路图

三、问题与挑战

在离线回溯开发阶段,主要面临以下挑战。

挑战

※  任务执行问题

任务频繁失败或执行效率低下,数据规模达单表数TB级别,且序列分布不均,部分长尾用户序列过长导致严重数据倾斜;

※  一致性校验阶段问题

异常类型复杂多样,累计发现25+种异常原因,导致数据diff形态复杂,一致性原因分析困难。修复链路冗长,涉及问题修复、在线索引重建、数据累计和离线数据回补,单次修复周期约需一周。

四、从踩雷到填坑的实战记录

离线任务运行耗时长的问题

问题说明

初步方案运行时存在两大问题:

1.任务处理延迟显著,单个任务运行3-8小时。

2.任务处理无法运行成功频繁OOM。

任务执行慢

任务频繁OOM

解决方案

※ 方案优化

任务执行慢主要是有长尾用户打满10w长序列,出现数据倾斜问题甚至oom。

通过对链路优化,先将原始10w长序列做预处理,由于回溯一般按照一个月跑数据,可以利用pv表先统计有哪些有效用户,对有效用户按照 【月初ts+1w,  月末ts】截取原始序列,获取相对较短的预处理队列。

任务倾斜

原始序列预处理

※  ODPS任务性能调优

a. 按照 CPU : MEM =  1 : 4 调整计算和存储的比例,可以最大化利用资源,因为我们申请的资源池都是按照这个固定比例来的。

资源没有最大化使用

b. 在固化计算/存储比例参数后,可以通过xxx.split.size 和 xxx.num 共同调优。xxx.split.size可以实现输入分片大小,减少oom机会。xxx.num可以实现扩大并发数,加快任务的执行(xxx代表mapper、reducer、joiner几个阶段)。

分批次完成阶段处理

c. 减少自定义UDF使用。在离线任务中有部分逻辑比较复杂,可能需要数据平铺、聚合、再内置函数等。最好的使用原则是内置函数>“数据平铺+内置函数”>自定义UDF。由于自定义UDF运行在Java沙箱环境中,需通过多层抽象层 (序列化/反序列化、类型转换),测试发现大数据量处理过程性能相对最差。

一致性验证归因难的问题

问题说明

在线/离线全链路数据的一致性验证过程中,由于按照天级全量dump序列,需要验证15个序列,每个序列diff量在10w~50w不等,这种多序列大规模的diff问题人工核验效率太慢。

解决方案

※  整体diff率分析

通过统计全序列diff率并聚类分析高diff样本,定位共性根因,实现以点带面的高效问题修复。

※  diff归因工具

通过建立数据diff的归因分类体系(如排序不稳定、特征穿越等),并标注标准化归因码,实现对diff问题的快速定位与根因分析,显著提升排查效率。

归因码分类

※  重复度统计工具

由于在线受当时环境的影响,离线回溯无法100%复现原始序列,一致性差异在所难免。我们通过聚焦主要特征并统计其重复度,结合「diff率+重复度」双维度评估方案,为算法决策提供量化依据,有效减少无效迭代。

重复度统计

现状梳理不足的问题

问题说明

由于前期对业务场景理解不足(如用户行为模式、异常数据、测试账户等),部分潜在问题未在开发阶段充分识别,直至数据一致性验证时才集中暴露,导致需紧急调整数据处理逻辑。由于单次全链路修复需3-5天,进而对项目进度造成一定延迟。

问题case1:滑动图片:离线回溯数据分析时发现序列中大量重复且占比很高,后确定为滑动图片行为

解决方案:对滑动图片操作连续多次修改为只记录第一次

问题case2:合并下单:测试购买序列有id重复,实时数仓反馈购买有合并下单的情况,ts会相同

解决方案:为了保持离线回刷数据稳定性,将序列按照ts/id双维度排序

问题case3:异常数据:有行为时间戳超过当前时间的异常数据

解决方案:数仓对异常数据丢弃

问题case4:测试账户:数据不规范导致数据diff

解决方案:测试账户数据忽略

问题case5:query问题:取归一化后还是原始的query、空字符串问题

解决方案:query为空过滤修复

问题case6:数据穿越问题:画像原始数据request_time取neuron时间导致

解决方案:在线修改request_time获取时间,离线回溯前置3s

修复周期长的问题

问题说明

数据问题的完整修复流程包含三个阶段,全流程通常需要5-7个工作日完成。

※  Diff归因阶段(1-3日)

  • 需要定位数据差异的根本原因,区分是数据异常、处理逻辑错误还是业务规则变更导致

  • 涉及多团队协作排查(数据/算法/工程)

  • 复杂问题可能需要多次验证

※  问题修复阶段(1-3日)

  • 根据归因结果修改代码逻辑或数据处理流程

  • 可能涉及历史数据修正

※  数据迭代阶段(2-3日)

  • 在线画像引擎部署新数据

  • 累计在线数据

  • 离线画像回补数据

解决方案

受限于初期人力投入,我们在当前方案基础上通过多轮版本迭代逐步完成数据一致性验证。后续将通过工具升级(数据边界划分+自动化校验框架)和数据采样策略,实现验证到修复的阶跃式提升。

※  数据边界划分

现行方案离线链路都是算法工程来维护,排查链路太长,需要数据源有稳定的保障机制。后续将划分数据边界,各团队维护并保障数据模块在离线的一致性。

数据边界划分

※  全链路采样方案减少验证时间

离在线一致性验证方面耗时较长,主要在于数据量太大,在数仓构建、特征平台构建、累计数据等流程消耗大量的时间,如果全链路先针对少量用户走通全链路,能快速验证流程可行性。

采样方案

平台基建的问题

问题说明

首次构建序列建模体系,由于缺乏标准化基础设施,被迫采用烟囱式开发模式,导致多链路验证复杂且问题频发。

平台待建能力

  • 特征平台排序功能不足,只支持单一字段排序,不支持多字段联合排序,导致排序结果不稳定。

  • 特征平台过滤功能限制,仅支持毫秒级时间戳过滤。

  • 索引构建效率低,个性化行为序列表数据量过大(3TB),导致索引构建压力大,初始构建耗时约28小时。升级至FS3集群后,构建时间降至12小时左右,最短至7小时,但仍未达理想效率。

五、展望与总结

后续我们将深入研究行业内的优秀解决方案,并结合我们的业务特性进行有针对性的优化。

例如,我们会尝试实施离在线数据与逻辑一致性方案,这种方案包括以下几个特点:

  1. 数据一致性:离线与在线共用同一套原始画像,能够解决数据源不一致导致的差异问题。

  2. 逻辑一致性:离线与在线都调用GSU服务,实现统一的序列逻辑处理,避免逻辑差异。

  3. 技术架构复杂性:新方案带来了新的技术挑战,比如在线处理10万序列可能引发的I/O问题、离在线的sim引擎采用存算一体和存算分离架构。

综上,没有绝对完美的技术方案,最终都是在成本、性能和效率多方面权衡后的相对最优解。

离在线数据与逻辑一致性方案

本次特征回溯虽面临性能与数据对齐等挑战,但团队通过攻坚积累了经验,为特征平台后续特征回溯工具化打下基础,也期待能为后续算法模型迭代带来质的飞跃。

往期回顾

1.从 “卡顿” 到 “秒开”:外投首屏性能优化的 6 个实战锦囊|得物技术

2.从Rust模块化探索到DLB 2.0实践|得物技术

3.eBPF 助力 NAS 分钟级别 Pod 实例溯源|得物技术

4.正品库拍照PWA应用的实现与性能优化|得物技术

5.汇金资损防控体系建设及实践 | 得物技术

文 / 野雨

关注得物技术,每周更新技术干货

要是觉得文章对你有帮助的话,欢迎评论转发点赞~

未经得物技术许可严禁转载,否则依法追究法律责任。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/89984.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/89984.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/89984.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WPF——自定义ListBox

在阅读本文前,最好先看看WPF——自定义RadioButton 背景 WPF中实现单选功能通常有两种方案: - RadioButton组:传统方案,但代码冗余 - ListBox定制:通过样式改造,兼顾数据绑定和UI灵活性 需求 一组选项中…

rancher上使用rke在华为云多网卡的服务器上安装k8s集群问题处理了

报错:问题:[[network] Host [192.168.0.213] is not able to connect to the following ports: [192.168.0.213:2379]. Please check network policies and firewall rules]问题: roothwy-isms-210-66:~# gotelnet 172.17.210.66 2379 map[2379:failed] …

xformers包介绍及代码示例

文章目录主要特性安装方式主要优势使用场景注意事项代码示例xFormers是由Meta开发的一个高性能深度学习库,专门用于优化Transformer架构中的注意力机制和其他组件。它提供了内存高效和计算高效的实现,特别适用于处理长序列和大规模模型。github地址&…

CityEngine自动化建模

CityEngine学习记录 学习网址: 百度安全验证 CityEngine-CityEngine_Rule-based_Modeling-基于规则建模和输出模型 - 豆丁网 CityEngine 初探-CSDN博客 City Engine CGA 规则包_cga规则-CSDN博客 CityEngine学习记录 学习网址:百度安全验证 CityE…

Nacos+LoadBalancer实现服务注册与发现

目录 一、相关文章 二、兼容说明 三、服务注册到Nacos 四、服务发现 五、服务分级存储模型 六、查看集群服务 七、LoadBalancer负载均衡 一、相关文章 基础工程:gradle7.6.1springboot3.2.4创建微服务工程-CSDN博客 Nacos服务端安装:Nacos服务端…

事务并发-封锁协议

事务并发数据库里面操作的是事务。事务特性:原子性:要么全做,要么不做。一致性:事务发生后数据是一致的。隔离性:任一事务的更新操作直到其成功提交的整个过程对其他事务都是不可见的,不同事务之间是隔离的…

大气波导数值预报方法全解析:理论基础、预报模型与误差来源

我们希望能够像天气预报一样,准确预测何时、何地会出现大气波导,其覆盖范围有多大、持续时间有多长,以便为通信、雷达等应用提供可靠的环境保障。 目录 (一)气象预报 1.1 气象预报的分类 1.2 大气数值预报基础 1.2…

关于JavaWeb的总结笔记

JavaWeb基础描述Web服务器的作用是接受客户端的请求,给客户端响应服务器的使用Tomcat(最常用的)JBossWeblogicWebsphereJavaWeb的三大组件Servlet主要负责接收并处理来自客户端的请求,随后生成响应结果。例如,在处理用…

生成式引擎优化(GEO)核心解析:下一代搜索技术的演进与落地策略

最新统计数据声称,今天的 Google 搜索量是 ChatGPT 搜索的 373 倍,但我们大多数人都觉得情况恰恰相反。 那是因为很多人不再点击了。他们在问。 他们不是浏览搜索结果,而是从 ChatGPT、Claude 和 Perfasciity 等工具获得即时的对话式答案。这…

网编数据库小练习

搭建服务器客户端,要求 服务器使用 epoll 模型 客户端使用多线程 服务器打开数据库,表单格式如下 name text primary key pswd text not null 客户端做一个简单的界面:1:注册2:登录无论注册还是登录,…

理解 PS1/PROMPT 及 macOS iTerm2 + zsh 终端配置优化指南

终端提示符(Prompt)是我们在命令行中与 shell 交互的关键界面,它不仅影响工作效率,也影响终端显示的稳定和美观。本文将结合 macOS 上最流行的 iTerm2 终端和 zsh shell,讲解 PS1/PROMPT 的核心概念、常见配置技巧&…

Laravel 原子锁概念讲解

引言 什么是竞争条件 (Race Condition)? 在并发编程中,当多个进程或线程同时访问和修改同一个共享资源时,最终结果会因其执行时序的微小差异而变得不可预测,甚至产生错误。这种情况被称为“竞争条件”。 例子1:定时…

83、形式化方法

形式化方法(Formal Methods) 是基于严格数学基础,通过数学逻辑证明对计算机软硬件系统进行建模、规约、分析、推理和验证的技术,旨在保证系统的正确性、安全性和可靠性。以下从核心思想、关键技术、应用场景、优势与挑战四个维度展…

解决 Ant Design v5.26.5 与 React 19.0.0 的兼容性问题

#目前 Ant Design v5.x 官方尚未正式支持 React 19(截至我的知识截止日期2023年10月),但你仍可以通过以下方法解决兼容性问题: 1. 临时解决方案(推荐) 方法1:使用 --legacy-peer-deps 安装 n…

算法与数据结构(课堂2)

排序与选择 算法排序分类 基于比较的排序算法: 交换排序 冒泡排序快速排序 插入排序 直接插入排序二分插入排序Shell排序 选择排序 简单选择排序堆排序 合并排序 基于数字和地址计算的排序方法 计数排序桶排序基数排序 简单排序算法 冒泡排序 void sort(Item a[],i…

跨端分栏布局:从手机到Pad的优雅切换

在 UniApp X 的世界里,我们常常需要解决一个现实问题: “手机上是全屏列表页,Pad上却要左右分栏”。这时候,很多人会想到 leftWindow 或 rightWindow。但别急——这些方案 仅限 Web 端,如果你的应用需要跨平台&#xf…

华为服务器管理工具(Intelligent Platform Management Interface)

一、核心功能与技术架构 硬件级监控与控制 全维度传感器管理:实时监测 CPU、内存、硬盘、风扇、电源等硬件组件的温度、电压、转速等参数,支持超过 200 种传感器类型。例如,通过 IPMI 命令ipmitool sdr elist可快速获取服务器传感器状态,并通过正则表达式提取关键指标。 远…

Node.js Express keep-alive 超时时间设置

背景介绍随着 Web 应用并发量不断攀升,长连接(keep-alive)策略已经成为提升性能和资源复用的重要手段。本文将从原理、默认值、优化实践以及潜在风险等方面,全面剖析如何在 Node.js(Express)中正确设置和应…

学习C++、QT---30(QT库中如何自定义控件(自定义按钮)讲解)

每日一言你比想象中更有韧性,那些看似艰难的日子,终将成为勋章。自定义按钮我们要知道自定义控件就需要我们创建一个新的类加上继承父类,但是我们还要注意一个点,就是如果我们是自己重头开始造控件的话,那么我们就直接…

【补充】Linux内核链表机制

专题文章:Linux内核链表与Pinctrl数据结构解析 目标: 深入解析Pinctrl子系统中,struct pinctrl如何通过内核链表,来组织和管理其多个struct pinctrl_state。 1. 问题背景:一个设备,多种引脚状态 一个复杂的…