报名「音视频前端技术创新实践专场」,听腾讯云技术专家揭秘音视频相关技术>> 了解详情
写点什么

阿里 1688 直播推荐算法实践

  • 2021 年 4 月 30 日
  • 本文字数:7966 字

    阅读完需:约 26 分钟

阿里1688直播推荐算法实践

近年来,电商呈现内容化的趋势,以直播和短视频为首,内容化提升了用户体验,增加了平台收益。作为电商的重要流量入口,推荐算法除了应用于商品,现在也被应用于直播场景。我们将以阿里的 B 类电商网站 1688 为例,分享直播推荐相比于商品推荐所面临的核心问题和难点。今天的分享围绕四个方面:


  • 核心问题介绍

  • 直播排序模型迭代

  • 多目标学习

  • Debias

  • 总结

核心问题介绍

推荐系统从推荐的物料量级来说,分为百万级的召回,万级的粗排和千级的精排,本文主要聚焦于三个精排中的核心问题:

  • 异构行为的建模。在电商网站中,用户的主要行为是在商品上的行为,直播的内容行为数据比较稀疏,因此商品行为应与直播行为结合来优化直播推荐。

  • 多目标学习,直播推荐的效能类指标和满意度指标很多,包括用户看到直播间的点击率,进入直播间的停留时长,转化率,关注率,留言率等。

  • 减少偏差,position bias 与 selection bias 会影响模型的准确性,增强马太效应,损害腰部、尾部主播的利益。

直播排序模型迭代

1688 的直播推荐排序模型迭代了三次,共有四个版本。


V1:基于特征工程与机器学习的排序模型

第一版模型是一个基于推荐特征工程和机器学习的排序模型,重点在于实时特征和打点体系的建立。


① 直播排序特征

我们用到的特征包括了推荐系统中非常经典的三方面的一些特征体系,也就是 item 侧,用户侧,用户和 item 侧交叉的特征体系。

  • 直播侧

第一是直播的实时和历史的统计特征,包括实时以 30 分钟,3 天,7 天,15 天为窗口的开播次数,曝光数,点击数,CTR,CVR 等特征。第二是内容侧特征,包括封面图和标题的 embedding。第三是商家画像特征,静态信息有商家等级和店铺交易数据,B 类信息有商家工厂能力。

  • 用户侧

用户侧特征里,我们一方面采用了网站的用户画像,包括网站的身份,等级,来访频次等,另一方面采用直播画像,包括偏好,访问天数,下单数,RFM 等特征。

  • 直播用户交叉

用户和直播的交叉特征,以非常好地反映用户对直播的偏好程度。我们分别用到了用户在 item 的序列和用户在 live 序列在不同的时间和次数窗口上与直播间的商品,以及直播间本身的一些交叉的次数,点击率和转化率的特征。


② 模型与结果

第一版中,我们采用的模型是一个以 CTR 为目标的 GBDT point-wise 模型,因为我们的业务要同时兼顾转化率,停留时长等多目标,我们也基于转化率和停留时长 的样本,对其做了基于样本权重的赋权。模型上线之后,转化率和停留时长分别增长了 10%和 30%

V2:深度模型时代:异构行为序列 Attention 模型

① Embedding+MLP 深度学习时代的范式

在第一版模型得到非常好的效果验证之后,也得益于我们在商品推荐上积累的一些深度学习的经验,我们正式进入深度学习模型时代。第二版模型为基于异构行为序列的 Attention 模型。深度学习做推荐排序的范式为 Embedding 加 MLP。其中 Embedding 是将用户行为序列的 ID 特征以及商品的 ID 特征经过 Embedding 层变成一个稠密的向量,拼接后基于多层的全连接神经网络做对应的任务,比如 CTR 任务的预估。在深度学习推荐模型的迭代中,YouTube 的 DNN 和 DIN 是两个非常经典的工作。


② 模型启发


  • Youtube DNN(Recsys’ 16)

YouTube 的 DNN 为 Recsy16 年的一篇文章,它首次提出加入用户行为序列的特征。在将用户看过看过的一些视频的 ID 变为 Embedding 后,取 Average Pooling,即平均池化,将其变为一个固定长度的向量来表征用户行为序列建模的向量,再与一些统计特征包括播放次数等做归一化、log 处理,之后与 Embedding 做拼接,最后加入到 MLP 中做 CTR 预估。总之,Youtube 的 DNN 模型首次建模了用户的行为,但方法比较简单粗暴,仅仅使用平均池化,用一个向量来表达用户的一个兴趣。但用户的行为是非常多样性的,仅用一个向量来表示不够准确,在这样的背景下,阿里巴巴在 18 年提出了 DIN 深度模型。

  • DIN(Deep Interest Network KDD‘18)

在对候选品做预估时,我们应该只关注与该候选品相关的用户行为,因此我们引入推荐系统中非常重要的 target attention 概念。我们以候选打分的产品为 Query,去跟用户行为序列的每一个 item 计算一次 Attention 的权重。得出的结果再经过该用户多个行为 attention 的 sum pooling,针对不同候选品,我们将得到不同的用户行为序列建模的表征,这样得到的表征与品相关性更强,能预测出更高的点击率。DIN 首次引用了 Target attention 的概念,建模用户对不同品的基于行为的兴趣。


③ 电商直播场景:异构双序列 Attention 模型



  • 行为异构性:商品序列、直播序列

受 DIN 的启发,我们迭代了第一版深度学习模型,因为直播推荐模型是异构双序列模型,异构双序列指我们需要建模的用户的行为序列在电商直播里包含两种,一种是用户在商品上的序列,第二种是用户在直播上的序列。因此我们采用了两个 Target Attention 的结构,分别基于用户在 Item 上的序列与当前直播正在讲解的商品做一个 Attention。也就是说,如果用户的 Item 序列与当前直播的商品匹配程度比较高,模型即可捕捉对应的兴趣。第二是我们会基于用户历史点过直播的序列与直播间的 ID 做一个 Attention。用户如果历史看的直播与当前直播间比较相似,模型也能捕捉到用户对应的兴趣,来提升预测 CTR 准确度。

  • 直播实时性:大量实时统计特征

第二,直播推荐里面有大量统计特征,在输入进模型前需要繁琐的特征归一化,否则训练的时候梯度就会不太稳定。我们采用了 GBDT Embedding 的方法。首先基于统计特征和机器学习版的数据去训练一棵 GBDT 树,然后在线上预测时,将统计特征的样本输入到整个 GBDT 树里,即可获得每个 GBDT 树上的叶子节点的 ID,再将 id 经过 Dense 层或者 Max Pooling Dense 层,输入到 DIN 的模型里。这样既实现了统计特征的特征归一化,另一方面也完成了特征交叉的工作,我们也可以利用上机器学习时代所遗留下来的统计征。值得一提的是,如果将全连接层(Dense 层)换成单层 sigmoid,即退化为 GBDT+LR 模型。,这样的异构双序列的 Attention 模型得到了非常好的效果,上线后,UV 点击率(CTR)又提升了 5%,这也是我们深度学习时代的第一版模型。


④ 思考

第一版模型上线后,我们也对其有着一些思考。对于 1688 电商网站,大量的用户只有关于商品(item)的行为,缺少直播相关的行为。因此用户直播的序列的 Attention 结构就不会生效,只剩下用户商品行为序列和当前直播间讲解的商品做对应的 Attention。而只用直播间当前讲解的一个商品来表征直播的信息是不太准确的,因为直播的商品是很多变的,我们希望用历史的商品和未来商品共同表征直播的信息,于是我们希望可以实现从用户的商品行为序列来直接做到直播(live)的信息的激活,也就是希望能将直播和商品表征到同一向量空间,即可用商品行为序列直接预测对直播的兴趣。

V3:HIN 异构网络建模

我们采用的方案为直播异构网络 Heterogeneous Information Network (HIN) ,因为在我们的直播业务中有着“直播-用户-商品”的丰富异构网络。包括用户点击直播,用户点击商品,直播间播放一些商品,商品和商品,直播和直播之间也有一些相关的关系,构建了一个非常丰富的网络,我们可以在这样的网络中学习到每个节点的表征,并把这些表征预训练加入到我们的排序模型里,形成 item sequence 到 live 的 Attention 结构。


图表征的方法在同构图中有 DeepWalk、Line、Node2vec、GCN、GAT,异构图的方法主要为 Metapath2vec,也是我们采用的方法。Metapath2vec 的主要思想为先指定游走元路径,基于元路径指导图上节点的游走,采样出序列后,经过 skip-gran 生成 Metapath 语义下的表征,最后对表征做一个融合,得到节点的最终表征。具体来说,Metapath 融合网络建模分为四个步骤。


① 构建图

首先第一步构建电商直播的图。



② Metapath 选取

第二部分是 Metapath 的选取,分为两种方案:

  • 人工指定语义

例如 User-Item-User(user CF)或者 Item-user-item(item CF),item-user-item 相当于一个用户同时点了两个商品,这两个商品就会较为相似。但对于节点类型多,metapath 比较长的序列,效果不好,可解释性较差。


  • 集合中取最优

第二种方案是我们使用的方案,就是在集合中取最优的方法。首先在图中做 random walk,采样出不同的序列,再做一些规则筛选,比如要求至少要覆盖两种不同的节点的类型。所以再用打分公式做一个打分,打分公式核心关注该 metapath 被采样出了多少条不同的 ID 组合序列,条数越多说明这样的 metapath 在图中共性越高,同时我们会更关注核心节点,比如直播节点的出现次数,依此制定打分公式来选出对应三到五条 metapath 做采样学习。


③ 图游走采样


第三部分为基于选出的 metapath 在图中做游走采样,再用 Skip-Gram 训练出 metapath 语义下的 Embedding。


④ Embedding 融合

第四部分是构建融合多个 Metapath Embedding 的语义网络,具体训练任务为 link prediction,采用负采样 loss。使用方法上,融合了一些 GCN 类的想法,加入一些临界节点的信息,分别基于 Average Pooling 和 self attention 做最终融合,最后基于负采样 loss 来训练出整个融合的网络,我们因此可以得到图中每个节点的表征,形成 item sequence 到 live 的结构。


⑤ 结果

模型上线后在日常的 CVR 和停留时长分别提升了 2.5%和 3.9%,大促的转化率提升了 10%,这也是因为在大促中新人用户更多,直播行为缺失。同时异构图上的表征也可以用于直播召回,包括 user2live,item2live,live2live,作为副产物提升召回效果。

V4:直播 Transformer 异构行为建模

V3 的模型仍存在一些问题,其一它不是端到端模型,其二,T+1 更新无法表征实时商品。于是我们采用的新方案:直播 transformer,一方面可以让 HIN 融合多个商品表征,另一方面可以引入实时直播正在讲解的多个商品的信息。


① Transformer 模型



Transformer 方案中,直播表征为 m 个历史核心商品加 k 个实时讲解商品的集合序列,这 m 个商品是基于历史销售数据得出的核心商品。用户的商品足迹为用户行为序列。三组序列进行拼接输入进 Transformer 后即可用来对任意用户商品行为足迹到直播间核心品或实时品进行建模。Transformer 层包括四部分:

  • Embedding:输入的 Embedding 包括 Type Embedding 和 Position Embedding

  • Multi head Self Attention:任意用户足迹与直播商品表征的交叉

  • Feed Forward Layer:加强模型的非线性能力

  • Pooling Layer:直播 Item 表征为不定长,Average&Max pooling


② 输入 Embedding



再 Transformer 模型中,Embedding 的构建十分关键。输入的 Embedding 不仅包含了商品的 ID Embedding,还包含 Type 和 Position Embedding。


  • Type Embedding

Type Embedding 表征 self attention layer 中每个 token 的类型,比如用户序列,直播间历史品,或是实时品。同时用户序列的商品分为点击,加购,下单商品三种类型。


  • Position Embedding

Position Embedding 用来表征一个序列时间或者空间上的先后顺序,此处我们建模了三种不同的条件:一是用户行为序列长度,时间由近到远,编号由 0 到 n-1;二是直播历史核心商品,重要程度由强到弱,编号由 0 到 m-1;三是直播实时讲解商品,当前商品为 0,下一个商品为 1,一直到 k-1。同时,position embedding 都是端到端的学习。重要性强的位置交叉,给予模型更强的信号。例如用户某个最近的历史行为与当前直播的商品有较强的相关性,模型信号将会更强。


③ 结果

Transformer 方案使线上转化率提升了 4.8%,但整体响应时间(RT)较高,相对增加了 13 毫秒,仍在可接受范围内。

小结


直播用户行为的建模如图示,分为三部分,首先商品行为到候选直播的异构兴趣,我们将其拆成了商品序列,直播历史核心序列和直播实时商品的序列,经过 transformer 进行交叉建模。对于用户直播行为序列,我们采用 Target attention 结构做兴趣建模。对于统计特征和内容特征,我们采用 GBDT Embedding 变成向量后再加入模型。后续经过全连接网络来预测 CTR 或多目标任务。

多目标学习

第二部分是关于直播的目标学习框架,首先直播是一个非常经典的多目标学习的场景,优化目标包括直播背景页面的点击(CTR)、进入直播间后的停留时长(Stay Time)、转换率(CVR)、互动率(CMR)、关注率(FLR)。业务往往需要同时优化多个目标,因此多目标学习是非常重要的技术。


1. Baseline Model


多目标学习的第一版模型是 Baseline 模型,是基于 shared bottom 的工业界标配模型,多目标之间底层共享,顶层各个目标由 MLP 分开。相比于每个任务学习一个模型有以下三个优点:


  • 可实现多目标辅助学习,解决某些目标稀缺性

  • 相比每个 task 一个模型,参数量大大减少

  • 线上 serving,一次计算多个目标


在 1688 直播实战里,我们以 CTR、CVR、Staytime 为三个目标构建了第一版多目标的模型,我们也发现将单目标的模型升级为多目标模型的效果提升明显,因为加入了很多新的 label 信息。在线上实验中,UV 点击率、转化率和停留时长分别增长了 2%, 5%和 17%。Shared Bottom 模型在工业界得到了广泛应用,但仍存在一个缺点,即当需要优化的多个目标方向不一致时,效果并没有那么好。在这样的背景下,谷歌在 18 的 KDD 中提出了 MMOE 模型。

2. MMOE Model



MMOE 的前生是 Mixture-of-experts(MOE)模型,在 input 之后,shared bottom 改进为了多个 expert 专家网络和一个 gate 网络,基于用户的不同来为每个专家网络分配权重,但这个网络仍存在缺点,对于不同的任务,输入还是相同的,多目标之间的输入没有任何区别。谷歌于是进行了下一步优化,得到 MMOE 网络。MMOE 网络仍有多个专家网络,不同的是对于每一个 target 都有一个 gate 网络来学习不同的权重,从而每个 task 都可以通过各自的 gate 获取差异化的输入。同时 gate 网络的参数量很小,可以说 MMOE 采用了一个轻量级的 gate 网络即实现了多目标输入的差异性。实验验证中,点击率、转化率、关注率和停留时长的多任务的离线指标都是正向的,线上多目标平均提升 0.5%。MMOE 模型也是 1688 目前线上服务的多目标模型。

3. 实战分析

下面介绍一下多目标的实战经验。分为 Label 处理,Loss 和线上打分三个部分。


① Label 处理

第一就是 Label 的处理,因为在做多目标学习时,我们往往会优化一个重要指标:用户的停留时长,而停留时长作为数值型的回归目标,数值波动较大,不易学习,据统计一般符合对数正态分布。因此我们通常对其取 log 处理,使其数值更稳定且提高回归拟合效果。


② Loss

第二,多目标学习的 loss 为各个目标的 loss 加权求和。



比如上图公式中,我们把点击率,转化率和关注率的交叉商损失函数利率与停留时长 MSE 损失函数做一个加权的求和。不同的权重会影响模型的效果,代表训练对不同任务的侧重程度。一个任务的 loss 权重越大,模型更新的一个梯度就越受它影响。冲着优化它的方向来去优化整个模型的参数,对于别的任务可能会有所伤害。


我们的调参经验为:第一点将多目标收敛 loss 加权到同一量级,一定程度避免梯度的支配,保证多目标的同时优化。第二点提高核心任务的权重。第三点可以参考 19 年 Recsys 提出的基于帕累托最优的 PE-LTR 框架,以及 CVPR18 年的基于任务的不确定度确认 loss 权重。


③ 线上打分

第三,多目标模型训练完成并上线时需要排序分数将多目标分数整合,常用方法为拍公式和权重。排序公式如图所示主要为点击率乘转化率、停留时长等的加权求和。



权重中人工给定多组参数,再根据业务优先级选择合适参数。

直播排序 Debias

第三部分工作为直播排序的 Debias。Position Bias 是直播场景中最突出的 Bias,代表着位置越靠前的直播点击率越高,rank 模型越趋向于给热门主播打高分,进而获得更大流量,形成 feedback loop 即数据循环。数据会造成两个后果,一是模型预估不准确,用户看到的结果都比较偏向于热门,二是马太效应增强,头部主播流量进一步增强,腰尾部逐步减少,造成主播流失。直播业务背后是真人主播,考虑平台的长期发展,更应该重视模型的 debias。因此我们的目标为解决 position bias,不损失效能 (CTR、CVR) 下提升个性化程度、降低马太效应。



于是我们引入两个 Metrics,一是个性化指标,让用户间排序 top-L 的差异化占比越大越好。二是马太效应指标,头部 T 个主播总曝光流量占比越小越好。为了优化这两个指标,我们尝试了几种不同的方法,分别为 as feature/ as model/ 多塔模型方案。

1. As feature 方案

第一版方案,Position as feature,是业界经典方案,主要做法为将 position 当作 feature 加入模型,模型即可学习到不同位置的偏置,线上预测时,将 position 取默认值(如 0),不同 item 在相同位置可得到对比,达到去偏的效果。线上实验结果显示该方法对于热门直播去偏能力很强,但线上效能有下降。


2. As Model 方案


于是我们更新到第二版模型,position as model。训练阶段加入 Biasnet,估计出每个 position 的 bias logits。主网络负责目标任务,例如 CTR 预测。两个网络的结果求和后经过 sigmoid 计算点击率 loss。该模型优点在于 Biasnet 学习偏置,实现了主网络的无偏效果。


Biasnet 建模中也加入了系统、场景 id 等特征,建模不同区块展示样式的 bias。线上预测时我们可以摘除 Biasnet,只保留无偏主网络。线上效果符合预期,个性化提高、马太效应降低,效能也有提升(预估更准)。待改进点为 Biasnet 认定每个 position 的 bias 为一个定值,无关于与用户的相关性。

3. 多塔模型

因此,我们就提出了第三版模型,多塔位置敏感模型。该模型的出发点为建模不同相关性的直播,在不同位置的位置 bias 的差异性,进而优化全局的排序效果。


① 特点

我们依此建模出的多塔模型有以下特点:

  • 多塔预测多个 position 上的 CTR

  • 每个塔样本来自同样位置,没有 bias;

  • 用上所有的用户与直播的交叉特征,拟合出每个位置对应的 CTR 分布与 CTR delta;

  • 多目标学习范式,底层共享表征



② 建模方法



在具体的建模方法中,我们将 position 1~9 作为 9 个塔,position 大于 10 的作为第十个塔。同时由于每条样本只属于一个 position,我们将每个塔的 loss 传入 loss mask,保证只有对应的塔的梯度回传。在线上服务中,多塔模型可以预测出商品在每一个位置的点击率,可使用贪心选择每个位置 CTR 最高的直播,构成推荐 list。


③ 模型优化探索

同时我们对于多塔模型也有一些优化和探索,首先它是一个多目标范式,因此可以做一些多目标优化。第二就是我们也希望强化建模不同塔对应 position 的 CTR 分布(如 KL loss)。第三除贪心法外,我们也可以使用 list-wise 或者组合优化的推荐列表生成。


④ 1688 直播线上效果与原因

CVR 增加了 3.6%,staytime 增加了 3%,但个性化和马太效应持平甚至负向,不符合预期。分析后原因有以下三点:


  • 数据分布

多塔模型消除了 position bias,但引入更严重的 selection bias,头部训练数据多为热门主播,冷门主播训练不够充分,点击率不够高。可以考虑引入随机样本、样本单边采样等方法解决。

  • 召回不丰富

直播场景推荐物料较少,召回个性化较弱, 而对于短视频/商品推荐等召回丰富的场景,多塔模型预期效果更好。

  • 展示 Bias



直播 Feeds 卡片会展示在线人数、热度等,用户更倾向于点热度高的,这也加重了直播域的 Selection bias。


然后目前我们仍致力于解决这些问题,还在做一些技术的迭代。

总结

今天分享了基于用户直播易构行为建模的排序模型迭代,线上采用的是 Target Attention 加 Transformer 的方案,多目标学习的 shared bottom 和 MMOE 模型,和直播排序 Debias 的 As Feature,As Model,多塔模型。


我们的最终模型如上图所示。在用户行为建模层,我们基于 transformer 建模 item 序列的异构兴趣。对于用户的直播序列,我们采用 target attention。对于其他特征,我们采用 GBDT encoding。将三个结果进行 Embedding 和拼接,传入顶层二分模型。一部分是无偏的 CTR 预估模型,在训练中加入 Biasnet 并在线上预估时去掉达到 debias 效果。另一部分针对点击后目标,包括停留时长、转化率等,使用 MMOE 做多目标学习,同时我们也会将 CTR 任务加入模型作为辅助模型,但是线上并不使用。最后融合多个目标结果得出排序结果。以上就是分享的全部内容。


分享嘉宾:

王修充

阿里巴巴 | 算法专家

王修充,阿里巴巴算法专家,硕士毕业于北京航空航天大学,先后在京东推荐算法、阿里巴巴 CBU 技术部推荐算法团队工作,目前工作方向为直播、短视频推荐算法在电商场景的应用。


本文转载自:DataFunTalk(ID:dataFunTalk)

原文链接:阿里1688直播推荐算法实践

2021 年 4 月 30 日 08:001332

评论

发布
暂无评论
发现更多内容

对比一下,你的简历是不是也写成了这样,能拿高薪才怪了

小Q

Java 学习 架构 面试 简历

践行新基建,共建城市智能体,为数字经济发展提供新动能

Geek_987812

云计算 大数据

iptables 端口转发

田振宇

架构训练营-week8-数据结构与算法,网络,IO

于成龙

极客大学架构师训练营 架构训练营

要求自愿降薪,员工内心普遍满意:“服从”是如何发生的?

脑极体

年末十家手机银行数字化升级大盘点:谁家开发更全面?谁家建设更到位?

Geek_987812

疫情 银行 手机银行

重拳出击!平台经济反垄断,互联网巨头市值蒸发千亿

Geek_987812

小额贷款 反垄断

浅谈程序员的“内卷化”

数据社

LeetCode题解:剑指 Offer 22. 链表中倒数第k个节点,使用栈,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

第八周作业

Geek_4c1353

极客大学架构师训练营

腾讯WeMap,一颗“孢子”的数智化之旅

脑极体

我终于拥有自己的独立博客了。

彭宏豪95

GitHub 写作 博客 IT

当Nginx遇上Tomcat集群,又是一场负载均衡的爱恨情仇

小Q

nginx tomcat 学习 架构 面试

第七周作业

Geek_4c1353

极客大学架构师训练营

搞微服务用阿里开源的 Nacos 真香啊!

阿里巴巴 开源 编程

从应用开发角度认识K8S

LorraineLiu

云原生 容器技术 k8s入门

SpringBoot启动原理

编程门槛 框架设计 spring Boot Starter】

奈学教育荣获“中关村高新技术企业”认证

古月木易

教育 IT

科技助力餐饮,普渡送餐机器人在餐博会上被众人围观!

DT极客

阿里首发MySQL“完美日记”,基础+优化+事务+集群+锁+主从复制+安全备份

Java架构追梦

Java MySQL 数据库 架构 面试

面试官问我redis数据类型,我回答了8种

数据库 学习 面试

《我想进大厂》之Java基础夺命连环16问

艾小仙

Java 面试 编程语言

11.11 程序员的 1111 种死法

京东科技开发者

程序员 程序人生

当Tomcat遇上Netty,我这一系列神操作,同事看了拍手叫绝

小Q

Java 学习 程序员 架构 面试

与第三方系统打通的N种进阶方式

棒锤🐮

架构

CloudQuery v1.2.1 版本发布

CloudQuery社区

数据库 开发者 运维 工具 开发工具

奈学教育荣获“中关村高新技术企业”认证

奈学教育

奈学教育

腾讯云直播全解析,双11怎么买才不亏?

腾讯云音视频

腾讯云 阿里云 云直播 直播 视频

【涂鸦物联网足迹】涂鸦云平台接口列表—万能红外遥控器

IoT云工坊

人工智能 云计算 物联网 API 红外遥控器

「架构师训练营」第 4 周作业

小黄鱼

极客大学架构师训练营

Java批量导入去除重复数据并返回结果,我差点就被放倒了

小Q

Java 学习 程序员 架构

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

阿里1688直播推荐算法实践-InfoQ