如何支持研发对CSDN个性化推荐系统重构

news2024/12/26 3:17:18

目录

    • 大地图
    • 工具构建
    • 数据治理
    • 保持发布
    • 重视测试
    • 小结

一个以内容服务为主的软件,它的推荐系统在数据侧对软件产生着举足轻重的作用。数据的三个方面决定了这个内容软件的档次。

  • 数据的质量好坏
  • 数据和用户需求的相关性好坏
  • 数据的层次体系好坏

通常,我们说的推荐,包含了两类不同的推荐

  • 内容详情页下的相关推荐
  • 软件主视图的各种推荐等信息流,属于【个性化推荐】部分

本文介绍的是我们在CSDN的软件主视图的各种推荐等信息流部分的持续改进工作。这部分在各种不同的技术浪潮下,容易发生这些问题

  • 优先级不高,整个系统处于年久失修状态
  • 推荐系统依赖的数据链路不通,数据处于不健康状态
  • 研发人员的多次转换,后面新增的代码和前人加的代码之间有矛盾和冲突的地方
  • 最可怕的是,一些策略事实上已经出错,但是也无人知晓和改进
  • 缺乏最新的构架和全局链路信息地图

本文侧重在个性化推荐系统治理中的4种重要的工程保证:

  • 梳理大地图:有持续维护的最新构架和全局链路信息地图
  • 工具构建:支持必要的数据解析和非常规的调试工具
  • 数据治理:持续梳理和简化数据侧的工作
  • 保持发布:坚决执行SMART原则,拆和推进的能上线的任务
  • 重视测试:深入细节的测试

大地图

首先我的同事介绍了在《CSDN个性化推荐系统的设计和演化》,介绍了许多在服务代码层面做的持续的重构工作。这部分工作基本上需要持续有耐心地将系统的每个部分都梳理、重构、迭代、上线。

系统治理的角度来说,服务代码的直接重构是系统中的一个最重要的环节,但不是全部。这是因为这样的系统包含对多个部分的理解:

  • 服务接口部分:下游如何使用系统的接口,下游对推荐服务的接口做了哪些进一步的加工工作后,才能和应用层对接上。
  • 服务策略部分:也就是推荐服务本身(如上文章)
  • 服务数据部分:在上述文章里构架图里的Habse的数据来自哪里?

所以,从系统治理的角度,大概构架图这样的:
在这里插入图片描述
在系统治理的过程中,需要完整的梳理3个环节是如何工作的:

  1. 聚合接口部分如何工作
  2. 个性化推荐和策略配置部分如何工作
  3. 数据源部分如何工作,和配置之间的关系(包括:定时计算服务、数据仓库的几十个计算任务、以及流式计算部分)

没有全链路信息,我们就是在盲人摸象,这是系统工程,需要严肃的工程和数据质量

在整个系统治理期间,工程上的做法是:

  • 从头到位维护一份持续更新的个推数据管道流向的文档
    • 使用分层、表格梳理的方式梳理全链路的数据流向
      • 以数据流动和朔源为驱动
        • 服务研发、测试、数据研发联合持续更新

工具构建

我们都知道,在工程上,维持开发/测试/正式三件套的完整分离的环境对于健康项目的迭代是非常重要的。但是我们也经常遇到一些系统由于历史的各种原因,并不完整的具有开发/测试/正式三件套环境。这给开发、测试和验证功能带来了很大的麻烦。

但是作为工程师,我们必须解决问题,有时候不能等着理想环境的出现(这是一个代价的问题)。因此,我们支持研发花时间构建在线上系统诊断工具。这个系统原有一些简单的线上接口调试信息获取能力。但是对于初期诊断那些疑难问题还是信息不够。这部分也是通常所的「可观测性」。

我的同事付出努力,构建了一套相对完备的易于使用的线上系统诊断 inspect 接口,这位后续的诸多问题定位解决带来了极大的便利。

其次,该推荐系统的策略配置一堆json定义的组合配置,代码中需要解析这些组合配置动态构建出策略树,本质上是一个有向无环图的数据结构。这里的问题是配置的和代码之间的映射,如果单靠看配置是很难定位和诊断问题的。旧的工程师也开发了一个可视化的工具来呈现这个有向无环图,但是

  • 一方面这些工具久无维护就失去了时效性
  • 另一方面策略多了之后,可视化工具也并不方便查看
  • 最后在节点和源代码之间的映射信息不够完全,难以直接映射

这个问题一度是研发中的瓶颈问题。这个和前一节是一样的:在系统治理中,如果没有好的工具支持对全局信息或者局部重要信息的快速定位,它就会成为解决问题的瓶颈

于是,我们写了一个策略配置的解析工具,将线性的配置,解析成符合实际代码嵌套的管道紧凑json,将有向无环图的骨架快速展示出来,便于定位和诊断,包含多种中间格式的数据。实际上这是一种复合利用文本解决问题的Unix风格做法。

在这里插入图片描述
图示是一个小的策略配置例子,具体信息对于系统研发来说有着具体的含义,这样的组合链路,如果繁杂起来但是没有便利的展示,用以快速定位到源代码中具体的类和配置,会十分费劲。

这部分,我们的经验是:投资工具,使得系统问题诊断能快速而直接,从而让研发循环周期更小。

数据治理

我们在系统治理过程中,遵循一些原则使得系统逐渐更加简单可依赖:

  • 尽可能简化服务代码层的工作,服务代码层做有技术含量的策略配置和反馈机制
  • 尽可能在数据层解决问题,因为数据层的工作在可维护上研发周期更短,小到按小时就可以解决。

这部分的工作。我们数据层的研发同事会有专门的技术博客分析,TODO:

但是我们在这个过程中,坚持持续的梳理所有的数据计算任务:

  • 清理旧的实效的数据
  • 合并冗余的策略
  • 减少特异性规则
  • 使用上AI层的新的结构化数据特征
  • 构建完备的控制api

这层工作,核心是要体现:数据驱动。

保持发布

大的系统治理,有一个麻烦的地方在于如何保持迭代周期。在工程上,有一个重要的原则是:“保持发布是硬道理”。如果某个工作,想的太多,想要改造的步伐太大,常常会导致系统在工程上不收敛,这是绝大部分研发都会遇到的问题。

不过我们通过一些策略,比较合适的规避了这样的问题。大概有这些方式:

  • 有了大地图,使得我们能比较清晰地判断:
    • “这是一个适合在数据层解决的问题”
    • “这是一个适合在策略层解决的问题”
    • “这是一个适合在聚合层解决的问题”
  • 有了工具,使得我们能在DAG部分的配置快速定位问题
    • “根据这个链路骨架,出问题的应该是这个环节”
    • “根据这个链路骨架,可以在这层加入特性解决问题”
    • “根据这个链路骨架,这两层做的事情是冲突的,应该合并到一起”
  • 有了数据层的梳理,使得我们可以快速确认
    • “快速找到数据的源头,检查数据源头是否有问题,如果能通过源头解决,中间就不要动”
    • “数据层可以做更多的事情,提供更完备信息后,策略层就可以去掉一大块原来很绕的逻辑…”

对于需要多环节配合的任务,一般的方式是:

  • 数据侧先准备数据
  • 数据层的数据ready后,策略层再跟进改进
  • 测试验证策略层接口没有问题后,先通过api发布的方式迭代上线
  • 策略层api已经ready后,再推进聚合层接口的改造…

通过多阶段的发布,避免端到端研发带来的各种弊端。

重视测试

关键的一部分,我们的测试熟悉系统每个环节的工作原理。使得测试能在每个环节的迭代中,深入细节的做白盒测试。这对于这样的系统治理来说非常关键。这部分的工作,我们的测试也会有相关的技术博客:TODO…

小结

良构的数据系统,才能带来良构的生态,从而上层目标的搭建才不会建立在一堆已经不正确工作的系统产生的数据指标之上。

–end–

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

40 # npm 的使用

npm 3n: nrm:node 中源管理工具nvm:node 中的版本管理工具npm:node 的包管理器,管理的都是 node 的模块 第三方模块 分两种: 全局模块:只能在命令行中使用,任何路径都可以本地模…

前端高频JS面试题(附答案+视频讲解)

高频前端js面试题总结 对应的视频讲解位置 2023前端高频面试题-JS高频面试题(上)_哔哩哔哩_bilibili 目录 1. var let const 的区别? 2. javascript 有哪些基础数据类型? 3. null和undefined区别 4. 与 的区别?…

二十三种设计模式第十二篇--组合模式

组合模式是一种结构型设计模式,它允许将对象组合成树形结构来表示整体-部分的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。 在组合模式中,有两种类型的对象:叶子对象和组合对象。叶子对象表示树结构中的叶子节点&…

为什么需要建设海绵城市?

海绵城市,是新一代城市雨洪管理概念,是指城市在适应环境变化和应对雨水带来的自然灾害等方面具有良好的“弹性”,也可称之为“水弹性城市”。其本质上是一种生态化的城市发展模式,其核心是将城市建设与生态环境保护相结合。 为什么…

二.《UE4奥丁》解密哈希ID

哈希表概念 1.相信大家经常在UE4或者UE5游戏逆向中遇到下面的代码段 $ > > 41:8B42 0C > mov eax,dword ptr ds:[r10C] > $4 > 3B05 AE589B04 > cmp eax,dword ptr ds:[7FF7B68B74F4] …

DeFi(去中心化金融),定义金融服务的未来

在数字化时代,区块链技术的发展引领了金融服务的全新变革。去中心化金融(DeFi)作为区块链技术的重要应用之一,正在重新定义传统金融服务的未来。本文将探讨DeFi的概念、优势以及对金融服务的影响,并展望其在未来的发展…

Linux上配置安装Nginx

Linux上安装配置Nginx 前言安装参考 前言 在前文中介绍了Nginx:Nginx入门 现在我们来试着在服务器上安装以下Nginx,以下操作使用的版本为1.20.0 下载地址为:Nginx官网下载地址 安装 先把包丢上去,我这里使用的是XFtp连接的服…

【Spring】— Spring MVC简单数据绑定(二)

接上文:【Spring】— Spring MVC简单数据绑定(一) 目录 2.3绑定POJO类型 2.3绑定POJO类型 在使用简单数据类型绑定时,可以很容易地根据具体需求来定义方法中的形参类型和个数,然而在实际应用中,客户端请求…

java学习记录之MySql二

1 mysql回顾 1.1 DDL 数据定义语言:结构  数据库database create database 数据库名称 character set 字符集 [collate 比较]; drop database 数据库名称; alter database 数据库名称 character set 字符集 …;  表 create table 表名(字段描述 , … ); 字段描述…

优雅地在高版本Android将文件保存到磁盘

Android对于文件存储的限制正在日趋严格。事实上,从Android 11(Android R)开始,那些传统的文件保存和读取方式统统失效了。 而高版本Android中存/取文件操作,百度到的内容是可行的,但是非常麻烦&#xff0c…

AIGC时代,基于云原生 MLOps 构建属于你的大模型(下)

为了满足企业在数字化转型过程中对更新迭代生产力工具的需求,灵雀云近日推出了Alauda MLOps 解决方案,帮助企业快速落地AI技术、实现智能化应用和服务。 AIGC大模型已成为企业创新引擎 随着ChatGPT的爆火,越来越多的人考虑使用AI来提升我们日…

python机器学习——回归模型评估方法 回归算法(线性回归、L2岭回归)

目录 回归模型评价方法【回归】线性回归模型1.线性模型2.线性回归3.损失函数(误差大小)4.解决方法1) 最小二乘法之正规方程2) 最小二乘法之梯度下降 5.代码实现5.模型保存与加载6.特点 实例:波士顿房价【回归】带有L2正则化的岭回归 回归模型…

C++初阶之类和对象(上)

类和对象(上) 1、面向过程和面向对象初步认识2、类的引入3、类的定义4、类的访问限定符及封装4.1 访问限定符4.2 封装 5、类的作用域6、类的实例化7、类对象模型7.1 如何计算类对象的大小 8.this指针8.1 this指针的引出8.2 this指针的特性8.3. C语言和C实…

Python开发工具PyCharm 2023.1发布,这些新功能都值得期待!

PyCharm 2023.1 现已正式发布!今年的第一个主要版本带来了对远程Jupyter Notebook的支持、对新UI的增强、改进的泛型类型推断等。 JetBrains PyCharm是一种Python IDE,其带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具。此外&#xff0…

SpringBoot 使用 Testcontainers 进行容器化集成测试

SpringBoot 使用 Testcontainers 进行容器化集成测试 容器化集成测试是测试应用程序与其依赖项之间的集成,其中依赖项以容器的形式运行。SpringBoot提供了Testcontainers来测试应用程序与依赖项之间的集成,本文将介绍如何使用Testcontainers进行容器化集…

详细解说一次性低代码和持续化低代码的关键区别在哪里

为什么很多开发团队吐槽低代码开发平台,其中大致归结了几个方面的原因: 1、使用过后会降低对技术的依赖度,工具人的倾向更加严重 2、目前大部分的低代码都是一次性的低代码,仅仅是在第一次构建模型的时候,可以生成一…

CDC介绍

CDC介绍 1 CDC Change Data Capture:定义了一种场景,即识别并捕获数据库表中数据的变更,并交付给下游进一步处理。CDC是对针对行级数据记录的。其中数据的变更信息,即 CDC 的数据结构,包括变更是什么样的操作&#x…

《JDK8特性深入讲解》学习笔记

Lambda表达式 如果不适用lambda表达式的话,可以使用匿名内部类,但是代码会显得有点多 lambda表达式其实就是匿名内部类 Lambda表达式简化了匿名内部类的使用,语法更加简单。 语法规则 (参数类型 参数名称) -> {代码体; } Lambda表达…

Unreal 5 实现Data Table 数据表格的使用

数据是一个游戏重要的组成部分,按分工,数据会交由策划去配置,所以,你的数据不可能直接写到蓝图里面,而是有一个专门的数据表格去配置。 大家通用的方式是策划在Excel内编辑完成,然后通过工具生成游戏需要使…

RabbitMQ安装以及SpringBoot整合RabbitMQ

SpringBootMQ整合Rabbit RabbitMQ安装以及SpringBoot整合 1、Docker安装RabbitMQ #拉取rabbitmq镜像 docker pull rabbitmq#启动RabbitMQ docker run -d --hostname my-rabbit --name rabbit -p 15672:15672 -p 5672:5672 rabbitmq#安装图形化插件 #进入容器 docker exec -i…