当前位置: 首页 > news >正文

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录

  • 1. 背景
  • 2. 方法
    • 2.1 OneRec框架
    • 2.2 Preliminary
    • 2.3 生成会话列表
    • 2.4 利用奖励模型进行迭代偏好对齐
      • 2.4.1 训练奖励模型
      • 2.4.2 迭代偏好对齐
  • 3. 总结

昨天面试的时候聊到了OneRec,但是由于上次看这篇文章已经是一个月之前,忘得差不多了,这里就来回顾一下。

1. 背景

在过去十余年中,推荐系统已经成为信息分发的核心技术,大量互联网平台广泛采用了**级联排序(cascade ranking)**的架构来平衡系统效率与推荐效果。这种方法通常将推荐流程拆解为多个独立的阶段,如召回、粗排、精排、重排,每个阶段对候选集进行进一步筛选与优化。这种多阶段结构虽然具备良好的工程可控性和响应速度,但由于各阶段彼此独立优化,导致信息难以全局共享,使得每个阶段的性能成为下一阶段的“天花板”,从而限制了系统整体的推荐能力。

与此同时,随着生成式模型(Generative Models)在自然语言处理、计算机视觉等领域的突破,研究者开始探索其在推荐系统中的应用——特别是“生成式检索”这一新兴范式的潜力。相比传统方法依赖向量匹配和打分机制,生成式推荐模型尝试直接以自回归方式“生成”用户感兴趣的内容,从而打破了传统推荐流程中“选择而非生成”的逻辑。然而,目前大多数生成式模型仅作为候选生成器(retrieval stage)存在,未能形成真正的端到端解决方案,其精度也未能超过多阶段精调系统,导致其仍难以在工业界大规模落地。

在这种背景下,OneRec 的提出具有明确而强烈的动机:即构建一个真正统一、端到端、生成式的推荐架构,既能打破多阶段推荐的结构限制,又具备大模型在表达能力上的优势。同时,通过引入会话级生成(session-wise generation)和偏好对齐机制(preference alignment),OneRec 试图从根本上提升推荐的上下文理解能力和用户满意度,探索推荐系统在“生成式时代”中的新形态。

在这里插入图片描述

图 1 直观展示了传统级联推荐架构(Cascade Architecture)与 OneRec 所提出的统一生成式架构(Unified Architecture)之间的本质差异。下半部分(b)展示的是目前工业界广泛采用的多阶段推荐流程:首先从海量视频库(约 1010 个候选项)中通过粗略召回选出数十万条视频,经过预排序阶段筛到数千条,最后由精排模型进一步打分排序,最终输出几十条推荐视频。整个过程尽管高效,但各阶段之间彼此独立、信息传递受限,限制了最终推荐质量的上限。

上半部分(a)是 OneRec 提出的端到端生成架构,它打破了分阶段设计的限制,直接使用一个 encoder-decoder 模型,输入用户行为序列后,一次性生成最终推荐视频列表。这种方法不仅省略了中间复杂的召回与排序流程,还能更充分地建模用户兴趣的上下文依赖,提升推荐结果的连贯性与个性化程度。图中的红色箭头“End-to-End Generation”正体现了这一转变的核心思想:从传统的“多阶段选择”迈向了“一体化生成”。

2. 方法

2.1 OneRec框架

在这里插入图片描述

OneRec 是一个端到端的单阶段生成式推荐框架,旨在替代传统的多阶段推荐流水线。其方法部分主要分为三个核心组件:特征工程会话级生成任务建模偏好对齐机制。图 2 对整体流程进行了结构化展示,展示了从用户行为建模到生成推荐列表,再到基于用户偏好进行迭代优化的完整路径。

如图 2(a) 所示,OneRec 的模型结构采用 Encoder-Decoder 架构。用户的历史行为序列被表示为语义 token(如 <a_6><b_1><c_5>),首先由 Encoder 进行表征学习,提取出序列的上下文兴趣表示 H \mathbf{H} H。Decoder 接收这一表示,并以自回归方式生成一个完整的推荐会话列表。值得注意的是,Decoder 中引入了 稀疏专家网络 MoE(Mixture-of-Experts),可通过激活少量专家节点提升模型表达力,同时保持高效推理。此外,模型训练目标是最小化一个会话级的 next-token 预测损失 L NTP \mathcal{L}_{\text{NTP}} LNTP

在图 2(b) 中,展示了 OneRec 的第二阶段——偏好对齐优化(Iterative Preference Alignment, IPA)。首先,当前训练轮次下的 OneRec 模型 OneRec t \text{OneRec}_t OneRect 通过 Beam Search 生成多个推荐会话候选。接着,一个训练好的奖励模型(Reward Model 对这些候选进行打分,选出最符合用户偏好的结果(chosen)和最差的结果(rejected),构建偏好对比对(preference pairs)。然后使用直接偏好优化(Direct Preference Optimization, DPO) 对模型进行优化,目标函数为 L DPO \mathcal{L}_{\text{DPO}} LDPO,从而进一步提高模型生成内容与用户真实偏好的契合度。

2.2 Preliminary

在 OneRec 的生成式推荐任务中,模型被设计为从用户的历史行为中直接生成一个完整的推荐列表。输入为用户与内容的交互序列 H u = v 1 h , v 2 h , … , v n h \mathcal{H}_u = {v_1^h, v_2^h, \dots, v_n^h} Hu=v1h,v2h,,vnh,其中每个 v i h v_i^h vih 表示用户曾经有效互动的视频,例如观看、点赞或转发。模型的目标是基于这些历史行为序列,生成一个长度为 m m m 的推荐列表 S = v 1 , v 2 , … , v m \mathcal{S} = {v_1, v_2, \dots, v_m} S=v1,v2,,vm,作为当前会话的推荐结果。与传统逐项预测的方式不同,OneRec 一次性输出整个推荐序列,强化了内容之间的连贯性和整体结构。

为了让模型理解每个视频的语义信息,系统为每个视频 v i v_i vi 提供了一个多模态嵌入向量 e i ∈ R d e_i \in \mathbb{R}^d eiRd,该向量整合了视频的标题、封面图、标签等内容特征,并通过预训练方法对齐用户的真实行为偏好。这些嵌入表示作为输入,有助于模型从内容层面建模用户兴趣,也为后续的序列生成提供了语义基础。

过去的生成式推荐方法通常会采用 RQ-VAE(Residual Quantized Variational Autoencoder)将嵌入向量 e i e_i ei 编码成语义 token。然而,这种方式存在“沙漏效应”:由于 token 分布严重不均,部分 token 被过度使用,而大多数 token 几乎从不出现。这种不均衡不仅限制了模型表达能力,也容易导致训练不稳定。为解决这一问题,OneRec 采用了分层残差量化机制,将每个嵌入向量通过多层 K-Means 编码,逐步生成一组离散语义 token。量化过程从 e i e_i ei 本身作为初始残差开始,第一层选择最近的中心点 c s i 1 1 c_{s_i^1}^1 csi11

r i 1 = e i , s i 1 = arg ⁡ min ⁡ k ∣ r i 1 − c k 1 ∣ 2 2 r_i^1 = e_i, \quad s_i^1 = \arg\min_k |r_i^1 - c_k^1|_2^2 ri1=ei,si1=argkminri1ck122

接着计算残差 r i 2 r_i^2 ri2 并进入下一层:

r i 2 = r i 1 − c s i 1 1 , s i 2 = arg ⁡ min ⁡ k ∣ r i 2 − c k 2 ∣ 2 2 r_i^2 = r_i^1 - c_{s_i^1}^1, \quad s_i^2 = \arg\min_k |r_i^2 - c_k^2|_2^2 ri2=ri1csi11,si2=argkminri2ck222

以此类推,直到最后一层 L L L

r i L = r i L − 1 − c s i L − 1 L − 1 , s i L = arg ⁡ min ⁡ k ∣ r i L − c k L ∣ 2 2 r_i^L = r_i^{L-1} - c_{s_i^{L-1}}^{L-1}, \quad s_i^L = \arg\min_k |r_i^L - c_k^L|_2^2 riL=riL1csiL1L1,siL=argkminriLckL22

最终每个视频都被编码为一组语义 token s i 1 , s i 2 , … , s i L {s_i^1, s_i^2, \dots, s_i^L} si1,si2,,siL,作为生成模型的输出目标。

其中,为了构建出更加平衡且高效的语义空间,OneRec 使用了一种 Balanced K-Means 聚类算法对所有视频嵌入向量进行划分。在这个过程中,整个视频集合 V \mathcal{V} V 被划分为 K K K 个等量的 cluster,每个 cluster 精确包含 w = ∣ V ∣ / K w = |\mathcal{V}| / K w=V∣/K 个视频。算法在每轮迭代中,基于欧几里得距离为每个中心点选择 w w w 个最接近的未分配视频,并据此更新中心点。当所有 cluster 达到稳定分配后,算法停止。这种方式能够确保每个 code 被均匀使用,从而克服传统 RQ-VAE 的 token 分布偏斜问题,提高生成模型的训练效率和语义覆盖能力。

在这里插入图片描述

整个算法的输入是:视频集合 V \mathcal{V} V,和聚类数量 K K K。我们希望将 V \mathcal{V} V 平均划分成 K K K 个子集,每个子集大小是 w = ∣ V ∣ / K w = |\mathcal{V}| / K w=V∣/K。下面是每一步的工作内容:

  1. 初始化阶段
    • 首先计算每个 cluster 该有多少个视频,即 w w w
    • 然后随机选择 K K K 个向量作为初始中心点,构成初始的 codebook: C l = c 1 l , c 2 l , … , c K l C_l = {c_1^l, c_2^l, …, c_K^l} Cl=c1l,c2l,,cKl
  2. 聚类迭代过程(repeat 循环)
    • 初始化一个未分配的视频集合 U = V \mathcal{U} = \mathcal{V} U=V,每轮都从这个集合里往外“抽视频”;
    • 然后对每一个 cluster k k k 做以下步骤:
      • 计算 U \mathcal{U} U 中所有视频到当前中心点 c k l c_k^l ckl 的距离;
      • 按距离从近到远排序;
      • 选择前 w w w 个最接近的视频分配给当前 cluster(记作 V k \mathcal{V}_k Vk);
      • 用这 w w w 个视频的平均值更新中心点 c k l c_k^l ckl
      • 最后把这 w w w 个已分配的视频从 U \mathcal{U} U 中移除。
  3. 终止条件
    • 当所有 cluster 的分配都不再发生变化时(也就是“收敛”了),循环结束;
    • 输出最终的均衡 codebook C l C_l Cl,用于后续的残差量化过程。

与传统 K-Means 不同的是,Balanced K-Means 会强制让每个 cluster 拿到相同数量的视频,这保证了所有 token 都能被均匀使用,不会有某些 token 被滥用、某些 token 被冷落。这种平衡性对于语义编码来说非常关键,因为后续的生成模型训练依赖这些 token 的质量和覆盖范围。

2.3 生成会话列表

在这里插入图片描述

在 OneRec 的推荐生成中,我们首先需要一种方式将每个视频转换为模型可以理解的离散语义表示。为此,论文借鉴了 RQ-VAE(Residual Quantization VAE) 的思想,对视频的多模态嵌入向量进行分层残差量化编码。每个视频原本是一个连续向量 e i ∈ R d e_i \in \mathbb{R}^d eiRd,通过 L L L 层的 K-Means 量化后,变成了 L L L 个离散 token,也就是 s i 1 , s i 2 , … , s i L {s_i^1, s_i^2, …, s_i^L} si1,si2,,siL。每个 token 表示该视频在某一语义空间中的“位置”,这使得模型能更好地建模视频的语义结构。最终,我们将用户的历史行为序列(多个视频)拼接成一个 token 序列,作为 Encoder 的输入,形式如下:

H u = ( s 1 1 , s 1 2 , … , s 1 L ) , ( s 2 1 , s 2 2 , … , s 2 L ) , … , ( s n 1 , s n 2 , … , s n L ) \mathcal{H}_u = {(s_1^1, s_1^2, \dots, s_1^L), (s_2^1, s_2^2, \dots, s_2^L), \dots, (s_n^1, s_n^2, \dots, s_n^L)} Hu=(s11,s12,,s1L),(s21,s22,,s2L),,(sn1,sn2,,snL)

Encoder 的作用是对用户的历史行为进行建模,提取用户兴趣的语义表示。在 OneRec 中,Encoder 采用了 Transformer 架构,输入就是刚才提到的 H u \mathcal{H}_u Hu,也就是视频 token 的序列。每个 token 会通过多层的自注意力(Self-Attention)和前馈网络(Feed Forward)进行编码,最终输出一个用户兴趣表示序列 H H H

H = Encoder ( H u ) H = \text{Encoder}(\mathcal{H}_u) H=Encoder(Hu)

其中,Attention 是全可见的(Fully Visible),因为我们希望模型可以自由地在历史行为之间建模上下文关系。这个 H H H 就像是一份语义“兴趣档案”,会在后续 Decoder 生成推荐列表时被引用,作为 cross-attention 的 Key 和 Value。

Decoder 的任务是根据用户兴趣向量 H H H,生成推荐 session(多个视频 token)的完整序列。Decoder 同样采用 Transformer 架构,在每一层中包含因果掩码的 Self-Attention 和对 Encoder 输出 H H H 的 Cross-Attention。在训练阶段,我们使用真实的推荐 session(例如用户确实点开的内容),将每个视频编码为一组 token s i 1 , … , s i L {s_i^1, …, s_i^L} si1,,siL,并在每个视频前添加起始标记 s [ BOS ] s_{[\text{BOS}]} s[BOS],构造 Decoder 的输入:

S ˉ = s [ BOS ] , s 1 1 , s 1 2 , … , s 1 L , s [ BOS ] , s 2 1 , … , s 2 L , … \bar{\mathcal{S}} = {s_{[\text{BOS}]}, s_1^1, s_1^2, …, s_1^L, s_{[\text{BOS}]}, s_2^1, …, s_2^L, \dots} Sˉ=s[BOS],s11,s12,,s1L,s[BOS],s21,,s2L,

Decoder 的每个 token 都依赖于前面已生成的 token,同时参考 Encoder 提供的用户兴趣向量 H H H,一步步自回归生成整个推荐序列。

整个 Encoder-Decoder 模型是通过一个标准的语言建模目标进行端到端训练,目标是最小化生成 token 序列与真实推荐 token 序列之间的差异。具体来说,训练采用的是自回归的 下一 token 预测损失,即 Next Token Prediction Loss( L NTP \mathcal{L}_{\text{NTP}} LNTP):

L NTP = − ∑ i = 1 m ∑ j = 1 L log ⁡ P ( s i j + 1 ∣ s [ BOS ] , s 1 1 , s 1 2 , … , s 1 L , s [ BOS ] , s i 1 , s i 2 , … , s i j ; Θ ) \mathcal{L}_{\text{NTP}} = - \sum_{i=1}^m \sum_{j=1}^L \log P(s_i^{j+1} \mid s_{[\text{BOS}]}, s_1^1, s_1^2, …, s_1^L,s_{[\text{BOS}]}, s_i^1, s_i^2, \dots, s_i^j; \Theta) LNTP=i=1mj=1LlogP(sij+1s[BOS],s11,s12,,s1L,s[BOS],si1,si2,,sij;Θ)

其中, s i j s_i^j sij 表示第 i i i 个视频的第 j j j 个 token, Θ \Theta Θ 表示整个模型参数(包含 Encoder 和 Decoder)。训练的目标是最大化生成下一个 token 的概率,从而保证 Decoder 能够准确地生成推荐 session 的每一个 token。这种训练方式完全类比于机器翻译任务中的 Transformer,只不过在这里,推荐 session 的 token 取代了自然语言中的词语,成为生成的目标。

2.4 利用奖励模型进行迭代偏好对齐

在这里插入图片描述

尽管 OneRec 在前期通过端到端的训练已经能够生成符合用户历史兴趣的推荐列表,但仅仅依赖历史行为序列进行建模,仍然难以保证生成的内容真正契合用户偏好。传统推荐系统通常通过点击率、停留时长等弱监督信号进行优化,但这些指标本质上并不能直接衡量用户对整个推荐 session 的满意度。因此,为了进一步提升推荐质量,OneRec 引入了“偏好对齐”(preference alignment)机制,旨在从用户行为中学习推荐结果的优劣,从而实现更细致、更个性化的推荐调整。这种优化思想受启发于自然语言处理(NLP)领域中流行的 RLHF(Reinforcement Learning from Human Feedback),即通过人类打分对生成结果进行强化学习。然而,与 NLP 不同,推荐系统中几乎不存在由人类标注的“偏好比较数据”。取而代之的,是稀疏、间接的用户行为数据。因此,OneRec 设计了一种替代方式:先构建一个奖励模型(Reward Model, RM),让其学会自动评估一个推荐 session 的“质量”,然后利用这个 RM 来对模型生成的多个候选推荐进行打分,从中选出“好”的(chosen)和“不好”的(rejected),形成偏好对比对。在此基础上,OneRec 采用了 Direct Preference Optimization(DPO) 进行训练。这种方法不依赖复杂的强化学习算法,而是通过 pairwise ranking 的方式直接优化生成策略,使得模型在未来生成中更加倾向于高偏好序列。最终,模型可以在真实用户行为的弱监督反馈中,持续进行自我迭代、自我优化,从而生成更贴合用户兴趣的内容,真正实现从“生成推荐”到“偏好对齐”的闭环。

2.4.1 训练奖励模型

在 OneRec 中,为了实现用户偏好的精准对齐,模型需要一种机制能够判断“推荐得好不好”。但推荐系统不同于 NLP 领域,后者可以通过人工标注来得到明确的偏好信号,而推荐系统中用户并不会直接告诉我们他喜欢哪些推荐。相反,我们只能通过用户在实际使用系统时留下的行为数据,来间接推断推荐的好坏。为了解决这一问题,OneRec 引入了一个奖励模型(Reward Model, RM),用来预测用户是否会喜欢某个推荐 session,并将这个预测结果作为后续优化的依据。

奖励模型的目标是,给定一个用户 u u u 和一个推荐 session S = v 1 , v 2 , … , v m \mathcal{S} = {v_1, v_2, …, v_m} S=v1,v2,,vm,输出一个分数 r r r 来表示这个 session 对该用户来说是否具有吸引力。这个分数不需要用户明确标注,而是通过用户的行为日志进行间接学习。比如,当用户完整地观看了 session 中的大多数视频、点击了其中的内容、点赞或收藏了视频时,这些行为都可以被视为“喜欢”;而如果用户快速划过这些推荐,或者根本没有互动,则说明这条推荐可能不够好。这些自然发生的行为数据就成为训练奖励模型的“真实标签”。

为了让模型具备判断能力,第一步是将用户 u u u 和推荐 session S \mathcal{S} S 建模为一组结合表示。具体来说,对于 session 中的每个视频 v i v_i vi,模型会融合用户兴趣生成一个目标感知向量:

e i = v i ⊙ u e_i = v_i \odot u ei=viu

其中 ⊙ \odot 表示一种交互操作(可以理解为加权注意力、向量点乘等),使得每个视频的表示都与用户兴趣相关联。经过融合后的所有视频表示构成一个向量集合 h = e 1 , e 2 , … , e m h = {e_1, e_2, …, e_m} h=e1,e2,,em,这就形成了该用户视角下的 session 表示。

考虑到推荐列表中的多个视频之间是有协同关系的(比如连贯性、风格一致性、多样性等),模型并不会直接使用这些向量去做判断,而是通过一个**多头自注意力模块(Self-Attention)**来让视频之间“交流信息”:

h f = SelfAttention ( h W s Q , h W s K , h W s V ) h_f = \text{SelfAttention}(hW_s^Q, hW_s^K, hW_s^V) hf=SelfAttention(hWsQ,hWsK,hWsV)

这个操作让模型能感知整个 session 的结构与互动,最终输出一个融合后的 session 表示 h f h_f hf,用于后续的打分预测。

为了全面评估推荐 session 的质量,OneRec 的奖励模型设计了多个预测任务,分别关注用户的不同偏好行为。例如:

  • r ^ swt \hat{r}^{\text{swt}} r^swt:用户是否持续观看(session watch time);
  • r ^ vtr \hat{r}^{\text{vtr}} r^vtr:用户是否点击进入观看(view through rate);
  • r ^ ltr \hat{r}^{\text{ltr}} r^ltr:用户是否点赞、收藏等行为(like-through rate);

这些行为通过不同的 MLP 模块(也称作 tower)来分别预测:

r ^ swt = Tower swt ( Sum ( h f ) ) , r ^ vtr = Tower vtr ( Sum ( h f ) ) , r ^ ltr = Tower ltr ( Sum ( h f ) ) \hat{r}^{\text{swt}} = \text{Tower}^{\text{swt}}(\text{Sum}(h_f)), \quad \hat{r}^{\text{vtr}} = \text{Tower}^{\text{vtr}}(\text{Sum}(h_f)), \quad \hat{r}^{\text{ltr}} = \text{Tower}^{\text{ltr}}(\text{Sum}(h_f)) r^swt=Towerswt(Sum(hf)),r^vtr=Towervtr(Sum(hf)),r^ltr=Towerltr(Sum(hf))

这里的 Sum ( h f ) \text{Sum}(h_f) Sum(hf) 表示对 session 中所有 token 表示做加和池化,得到整体 session 的语义表达,然后再送入每个塔进行预测。

训练过程中,系统会从用户真实行为日志中抽取是否完成观看、是否点击、是否点赞等行为,转化为二分类标签(1 表示发生,0 表示未发生)。模型的输出与这些标签进行对比,采用二元交叉熵损失函数作为优化目标:

L RM = − ∑ x ∈ swt , vtr , ltr x t r [ y x t r log ⁡ ( r ^ x t r ) + ( 1 − y x t r ) log ⁡ ( 1 − r ^ x t r ) ] \mathcal{L}_{\text{RM}} = - \sum_{x \in {\text{swt}, \text{vtr}, \text{ltr}}}^{xtr}\left[ y^{xtr} \log(\hat{r}^{xtr}) + (1 - y^{xtr}) \log(1 - \hat{r}^{xtr}) \right] LRM=xswt,vtr,ltrxtr[yxtrlog(r^xtr)+(1yxtr)log(1r^xtr)]

这个损失函数会对每一个行为目标分别求解,并指导模型学习什么样的推荐 session 更容易被用户接受、产生良好互动。最终训练完成的奖励模型就具备了自动评分能力,可以在无需人工干预的前提下判断任意一个推荐 session 的优劣,为后续的 DPO 偏好对齐提供决策依据。

2.4.2 迭代偏好对齐

在完成奖励模型(Reward Model, RM)的训练之后,我们就可以利用它对推荐结果的质量进行自动打分,并用作模型微调的依据。OneRec 并没有一次性完成训练,而是采用了一个迭代式的偏好对齐方法(Iterative Preference Alignment)。它的核心思路是:让模型自己生成多个推荐候选,然后用奖励模型打分,从中选出表现好的和差的推荐结果,作为正负样本对进行对比学习。这种方式与传统的强化学习不同,它更简单、更稳定,同时能在没有明确人工偏好标签的前提下实现推荐优化。

具体来说,给定当前时间步的 OneRec 模型 M t \mathcal{M}_t Mt,我们为每个用户 u u u 生成 N N N 个不同的推荐 session 候选,使用的是 Beam Search 采样:

S u n ∼ M t ( H u ) for all  u ∈ U , n ∈ [ N ] \mathcal{S}_u^n \sim \mathcal{M}_t(\mathcal{H}_u) \quad \text{for all } u \in \mathcal{U}, n \in [N] SunMt(Hu)for all uU,n[N]

其中, H u \mathcal{H}_u Hu 表示用户 u u u 的历史行为, S u n \mathcal{S}_u^n Sun 是模型生成的第 n n n 个推荐 session 候选。生成这些 session 后,我们使用前面训练好的奖励模型 R ( u , S ) R(u, \mathcal{S}) R(u,S) 对每个候选结果进行打分,得到该推荐 session 的偏好得分:

r u n = R ( u , S u n ) r_u^n = R(u, \mathcal{S}_u^n) run=R(u,Sun)

随后,我们从这 N N N 个候选中选出得分最高的一个 S u w \mathcal{S}_u^w Suw 和得分最低的一个 S u l \mathcal{S}_u^l Sul,构成一个偏好对比对(Preference Pair)

D t pairs = ( S u w , S u l , H u ) D_t^{\text{pairs}} = \left(\mathcal{S}_u^w, \mathcal{S}_u^l, \mathcal{H}_u\right) Dtpairs=(Suw,Sul,Hu)

也就是说,在给定用户历史 H u \mathcal{H}_u Hu 的前提下,我们知道用户更可能喜欢 S u w \mathcal{S}_u^w Suw,而不太喜欢 S u l \mathcal{S}_u^l Sul。我们希望训练一个新的模型 M t + 1 \mathcal{M}_{t+1} Mt+1,让它以后在面对相同用户历史时,更倾向于生成 S u w S_u^w Suw 这样的推荐,而不是 S u l S_u^l Sul

训练新模型使用的是 DPO(Direct Preference Optimization)损失函数,它通过比较两个推荐结果的相对概率,来实现模型偏好上的优化。具体损失如下:

L DPO = L DPO ( S u w , S u l ∣ H u ) = − log ⁡ σ ( β log ⁡ M t + 1 ( S u w ∣ H u ) M t ( S u w ∣ H u ) − β log ⁡ M t + 1 ( S u l ∣ H u ) M t ( S u l ∣ H u ) ) \mathcal{L}_{\text{DPO}} = \mathcal{L}_{\text{DPO}}(\mathcal{S}_u^w, \mathcal{S}_u^l \mid \mathcal{H}_u) = -\log \sigma \left( \beta \log \frac{\mathcal{M}_{t+1}(\mathcal{S}_u^w \mid \mathcal{H}_u)}{\mathcal{M}_t(\mathcal{S}_u^w \mid \mathcal{H}_u)} - \beta \log \frac{\mathcal{M}_{t+1}(\mathcal{S}_u^l \mid \mathcal{H}_u)}{\mathcal{M}_t(\mathcal{S}_u^l \mid \mathcal{H}_u)} \right) LDPO=LDPO(Suw,SulHu)=logσ(βlogMt(SuwHu)Mt+1(SuwHu)βlogMt(SulHu)Mt+1(SulHu))

这个公式的核心是:如果新的模型 M t + 1 \mathcal{M}_{t+1} Mt+1 在偏好的推荐上得分更高、在不偏好的推荐上得分更低,那这个偏好方向是正确的,损失就会变小;反之则会增大。 β \beta β 是一个可调的温度超参数,用于控制对比强度, σ \sigma σ 是 sigmoid 函数。

整个过程是逐步迭代进行的:从 M t \mathcal{M}_t Mt 开始,我们生成候选、打分、选出正负样本对、计算损失、更新参数,得到 M t + 1 \mathcal{M}_{t+1} Mt+1。下一个迭代又以 M t + 1 \mathcal{M}_{t+1} Mt+1 为基础继续进行。这种自我对比、自我优化的策略,使得模型能够不断地贴近用户真实偏好。

为了减轻计算负担,论文中提到实际只对 1% 的样本进行 DPO 微调(即 r DPO = 1 r_{\text{DPO}} = 1% rDPO=1),从而在效率和性能之间取得平衡。

这一迭代优化过程的最终目标,是构建出一个能持续自我进化的推荐系统,使模型不仅能根据历史行为生成推荐,还能“对比判断”哪些推荐更好,并据此不断改进。相比传统的强化学习,DPO 更简洁、稳定,特别适用于用户行为数据稀疏、偏好信号隐性的推荐场景。它使得 OneRec 不仅是一个生成模型,更是一个可以持续优化的偏好智能体。

在这里插入图片描述

图 3 展示了 OneRec 系统在真实业务中的在线部署与训练框架。整个系统由三个主要组成部分构成:DPO Server、分布式训练系统在线服务系统(Online Serving)。其中,DPO Server 包含了预训练好的奖励模型 R ( u , S ) R(u, \mathcal{S}) R(u,S) 和用于生成偏好对比对的 DPO Sample Server,它负责从当前 OneRec 模型中生成多个候选推荐,并利用奖励模型对这些候选进行打分,从中选出得分最高和最低的推荐 session,形成偏好对比对 ( S u w , S u l ) \left(\mathcal{S}_u^w, \mathcal{S}_u^l\right) (Suw,Sul)。这些样本会被送入 Offline Model Trainer,与主干的推荐模型一起进行训练,并定期将更新后的参数同步到在线推理服务(Online Infer Model)中,实现推荐效果的持续自我优化。

在这里插入图片描述

算法 2 给出了整个 Iterative Preference Alignment(IPA)过程的详细执行流程。在每一轮训练中,模型会遍历样本集合 N sample N_{\text{sample}} Nsample,对于每一个样本,根据预设概率 r DPO r_{\text{DPO}} rDPO 决定是否进行 DPO 微调。如果是,则执行如下步骤:从当前模型 M t \mathcal{M}_t Mt 中生成 N N N 个推荐候选 S u n \mathcal{S}_u^n Sun,并使用奖励模型 R ( u , S u n ) R(u, \mathcal{S}_u^n) R(u,Sun) 为它们打分,挑选得分最高的作为偏好推荐 S u w \mathcal{S}_u^w Suw,得分最低的作为反偏好推荐 S u l \mathcal{S}_u^l Sul。随后计算该样本的 DPO 损失 L DPO \mathcal{L}{\text{DPO}} LDPO 与常规的下一 token 预测损失 L NTP \mathcal{L}_{\text{NTP}} LNTP,并组合得到总损失 L \mathcal{L} L。否则,若不进行 DPO,仅使用 NTP 损失进行更新。最终,根据该损失对模型参数 Θ \Theta Θ 进行梯度更新。

3. 总结

总的来说,OneRec不仅是一种技术创新,也是快手生成式推荐的重要探索,体现了推荐系统未来的发展趋势:从“排序打分”走向“偏好理解与生成”,从“静态预测”走向“持续自我优化”。

本文提出OneRec打破传统多阶段检索排序架构的限制,首次构建一个端到端、单阶段、生成式推荐模型框架。在方法上,采用一种平衡k-means(RQ-VAE改变)将视频内容编码为离散语义token,基于用户行为的统一编码器解码器结构(解码器用了MoE技术),通过自回归生成完整的推荐session。并为进一步提升推荐质量,结合DPO以及奖励模型,进行迭代的偏好对齐,实现模型与用户真实偏好的自我对齐。整天方法不仅在离线评估中显著优于传统推荐策略,也已成功部署与真实短视频平台中。

相关文章:

快手OneRec 重构推荐系统:从检索排序到生成统一的跃迁

文章目录 1. 背景2. 方法2.1 OneRec框架2.2 Preliminary2.3 生成会话列表2.4 利用奖励模型进行迭代偏好对齐2.4.1 训练奖励模型2.4.2 迭代偏好对齐 3. 总结 昨天面试的时候聊到了OneRec&#xff0c;但是由于上次看这篇文章已经是一个月之前&#xff0c;忘得差不多了&#xff0c…...

算法——直接插入排序

目录 一、直接插入排序的定义 二、直接插入排序的原理 三、直接插入排序的特点 四、代码实现 一、直接插入排序的定义 直接插入排序是一种简单直观的排序算法&#xff0c;其基本思想是将一个元素插入到已经排好序的部分数组中&#xff0c;使得插入后的数组仍然保持有序。具…...

Linux 软件管理

文章目录 dpkg软件包管理工具APT软件包管理工具apt-get命令apt-cache Linux操作系统主要支持RPM和Deb两种软件包管理工具。 RPM&#xff08;Redhat Package Manager&#xff09;是一种用于互联网下载包的打包及安装工具。 其原始设计理念是开放的&#xff0c;不仅可以在Redhat平…...

电力实训中应注意以下安全事项

电力实训中应注意以下安全事项&#xff1a; 一、环境准备与设备检查 保持实训场地整洁通风&#xff0c;清除易燃物与杂物&#xff0c;确保操作空间充足。 电路容量需匹配设备功率&#xff0c;安装漏电保护器及空气开关。 非带电金属设备外壳应接地&#xff0c;定期检查线路…...

序列化-流量统计

新建文件夹及文件 编写流量统计的Bean对象 package com.root.mapreduce.writable; import org.apache.hadoop.io.Writable; import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; //1 继承Writable接口 public class FlowBean implements Writab…...

矩阵游戏--二分图的匈牙利算法

https://www.luogu.com.cn/problem/P1129 学习路线---https://blog.csdn.net/qq_39304630/article/details/108135381 1.二分图就是两个独立的两个集合&#xff0c;如这里是行和列 2.匈牙利匹配就是媒婆拉媒&#xff0c;没伴侣或者伴侣可以换就将当前的塞给她 3.最后true的…...

spring security解析

Spring Security 中文文档 :: Spring Security Reference 1. 密码存储 最早是明文存储&#xff0c;但是攻击者获得数据库的数据后就能得到用户密码。 于是将密码单向hash后存储&#xff0c;然后攻击者利用彩虹表&#xff08;算法高级&#xff08;23&#xff09;-彩虹表&…...

【技巧】chol分解时,矩阵非正定时的临时补救措施,以MATLAB为例

针对非正定矩阵无法进行标准Cholesky分解的解决方案及MATLAB代码实现&#xff0c;结合不同应用场景的需求分层解析 文章目录 数值修正方法修正Cholesky分解LDL分解 矩阵变换与重构特征值修正乘积法构造正定矩阵 替代分解与降维方法QR分解与SVD主成分分析&#xff08;PCA&#x…...

Hi3518E官方录像例程源码流程分析(三)

文章目录 第二阶段&#xff0c;初始化第一阶段计算好的参数SAMPLE_COMM_SYS_Init 第三阶段&#xff0c;启动VI和chn捕获SAMPLE_COMM_VI_StartVi&#xff08;&#xff09;SAMPLE_COMM_VI_StartBT656小阶段1 SAMPLE_COMM_VI_StartMIPI_BT1120&#xff08;&#xff09;小阶段1 SAM…...

37.Java 异步回调(CompletableFuture 概述、CompletableFuture 使用)

一、CompletableFuture 概述 CompletableFuture 在 Java 里面被用于异步编程&#xff0c;异步通常意味着非阻塞&#xff0c;可以使得任务单独运行在与主线程分离的其他线程中&#xff0c;并且通过回调可以在主线程中得到异步任务的执行状态&#xff0c;是否完成&#xff0c;和是…...

数学建模AI智能体(4.16大更新)

别的不说就说下面这几点&#xff0c;年初内卷到现在&#xff0c;就现阶段AI水平&#xff0c;卷出了我比较满意的作品&#xff0c;这里分享给各位同学&#xff0c;让你们少走弯路&#xff1a; 1.轻松辅导学生 2.帮助学习 3.突破知识壁垒&#xff0c;缩短与大佬的差距 4.打破…...

Python 第三节 流程控制

目录 1.分支结构 条件控制 2.循环语句 3.循环控制语句 4.嵌套循环 控制代码执行的顺序 顺序结构分支结构循环结构 1.分支结构 条件控制 让代码有自主选择的能力, 当满足某个条件的时候执行对应的操作 1.1 if语句 语法格式 if 判断条件:执行语句(当判断条件为真的时候执…...

深入探究Linux编译器gcc/g++:从基础到进阶

目录 一、编译的幕后流程 &#xff08;一&#xff09;预处理&#xff1a;宏与文件的魔法融合 &#xff08;二&#xff09;编译&#xff1a;代码规范性的严格审视 &#xff08;三&#xff09;汇编&#xff1a;迈向机器语言的关键一步 &#xff08;四&#xff09;连接&a…...

用户态网络缓冲区

用户态网络缓冲区 缓冲区作用 用于临时存储数据以便高效地进行读写操作。用户态缓冲区位于用户空间中&#xff0c;与内核空间中的缓冲区&#xff08;内核缓冲区&#xff09;相对。 用户态接受缓存区 粘包问题&#xff0c;缓存非完整数据包 生产者的速度 > 消费者的速…...

解决Flutter 2.10.5在升级Xcode 16后的各种报错

Flutter 环境 Flutter version 2.10.5Dart version 2.16.2DevTools version 2.9.2CocoaPods version 1.16.2Xcode 16.3 问题一&#xff1a;XCResult parsing error: Error: This command is deprecated and will be removed in a future release, --legacy flag is required t…...

【学习笔记】计算机网络(八)—— 音频/视频服务

第8章 互联网上的音频/视频服务 文章目录 第8章 互联网上的音频/视频服务8.1概述8.2 流式存储音频/视频8.2.1 具有元文件的万维网服务器8.2.2 媒体服务器8.2.3 实时流式协议 RTSP 8.3 交互式音频/视频8.3.1 IP 电话概述8.3.2 IP电话所需要的几种应用协议8.3.3 实时运输协议 RTP…...

OpenCv高阶(三)——图像的直方图、图像直方图的均衡化

目录 一、直方图 1、计算并显示直方图 2、使用matplotlib方法绘制直方图&#xff08;不划分小的子区间&#xff09; 3、使用opencv的方法绘制直方图 &#xff08;划分16个小的子亮度区间&#xff09; 4、绘制彩色图像的直方图&#xff0c;将各个通道的直方图值都画出来 二、…...

OpenCV 图形API(39)图像滤波----同时计算图像在 X 和 Y 方向上的一阶导数函数SobelXY()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::gapi::SobelXY 函数是 OpenCV 的 G-API 模块中用于同时计算图像在 X 和 Y 方向上的一阶导数&#xff08;即 Sobel 边缘检测&#xff09;的一…...

领麦微:电炖锅红外测温传感器应用,告别糊锅干烧

领麦微红外测温传感器在电炖锅中的应用&#xff0c;特别是在应对高温环境、实现精准测温以保留食材营养、有效防止干烧与糊锅现象&#xff0c;以及提供安全烹饪新保障等方面&#xff0c;展现出了其独特的技术优势和应用价值。以下是对这些应用特点的深入剖析&#xff1a; 一、高…...

(Linux操作系统)自定义shell的实现

讲自定义shell之前我们先看一个东西&#xff0c;那就是进程替换&#xff0c;我们想要父进程fork之后的子进程之后运行一个全新的程序那该怎么办呢&#xff1f; 这里就要用一个叫做进程替换的一个东西了&#xff0c;程序替换是通过特定的接⼝&#xff0c;加载磁盘上的⼀个全新的…...

安卓jks提取pem和pk8文件

你需要安装&#xff1a; Java Keytool OpenSSL 系统要求&#xff1a;Mac/Linux/Windows 都可以。 keytool -importkeystore -srckeystore holder-keystore.jks -destkeystore holder-keystore.p12 -srcstoretype JKS -deststoretype PKCS12 -srcstorepass yzhafzKPj4 -dest…...

人脸检测-人脸关键点-人脸识别-人脸打卡-haar-hog-cnn-ssd-mtcnn-lbph-eigenface-resnet

链接&#xff1a;https://pan.baidu.com/s/1VhGdyIW5GWuTNkfbCEc5eA?pwdz0eo 提取码&#xff1a;z0eo --来自百度网盘超级会员V2的分享 创建环境 conda create -n 环境名称python3.8 conda activate 环境名称 然后配置环境 pip install requirements.txt 运行程序&…...

Gobuster :dir、dns、vhost

Gobuster 及其相关技术知识​​必须​​用于法律明确允许的场景&#xff01;&#xff01;&#xff01; 1. dir 模式&#xff1a;目录/文件枚举 用途&#xff1a;扫描目标网站的目录和文件&#xff0c;常用于发现隐藏资源或敏感文件。 ​​关键参数​​&#xff1a; -u URL&am…...

Vue+Threejs项目性能优化

使用Vue和Three.js开发的项目&#xff0c;但运行一段时间后电脑内存就满了&#xff0c;导致性能下降甚至崩溃&#xff0c;分析内存泄漏的原因优化如下&#xff1a; 资源释放管理 手动释放Three.js资源&#xff1a; 在Vue组件的beforeDestroy或destroyed生命周期中&#xff0…...

Leetcode - 双周赛135

目录 一、3512. 使数组和能被 K 整除的最少操作次数二、3513. 不同 XOR 三元组的数目 I三、3514. 不同 XOR 三元组的数目 II四、3515. 带权树中的最短路径 一、3512. 使数组和能被 K 整除的最少操作次数 题目链接 本题实际上求的就是数组 nums 和的余数&#xff0c;代码如下&…...

[特殊字符] PostgreSQL MCP 开发指南

简介 &#x1f680; PostgreSQL MCP 是一个基于 FastMCP 框架的 PostgreSQL 数据库交互服务。它提供了一套简单易用的工具函数&#xff0c;让你能够通过 API 方式与 PostgreSQL 数据库进行交互。 功能特点 ✨ &#x1f504; 数据库连接管理与重试机制&#x1f50d; 执行 SQL…...

等离子体浸没离子注入(PIII)

一、PIII 是什么&#xff1f;基本原理和工艺 想象一下&#xff0c;你有一块金属或者硅片&#xff08;就是做芯片的那种材料&#xff09;&#xff0c;你想给它的表面“升级”&#xff0c;让它变得更硬、更耐磨&#xff0c;或者有其他特殊功能。怎么做呢&#xff1f;PIII 就像是用…...

TinyEngine 2.4版本正式发布:文档全面开源,实现主题自定义,体验焕新升级!

本文由体验技术团队李璇原创。 前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低…...

gemini讲USRP

您好&#xff01;USRP (Universal Software Radio Peripheral) 是一种软件无线电 (SDR) 设备系列&#xff0c;由 Ettus Research (现为 National Instruments 旗下公司) 开发和销售。USRP 提供了一个灵活且可配置的平台&#xff0c;用于设计、原型开发和部署各种无线通信系统。…...

智能超表面通信控制板--通道电压并行控制版

可重构智能超表面&#xff08;Reconfigurable Intelligent Surface, RIS&#xff09;技术是一种新兴的人工电磁表面技术&#xff0c;它通过可编程的方式对电磁波进行智能调控&#xff0c;从而在多个领域展现出巨大的应用潜力。超表面具有低成本、低能耗、可编程、易部署等特点&…...

Spring Task(笔记)

介绍&#xff1a; 应用场景&#xff1a; cron表达式&#xff1a; cron表达式在线生成器&#xff1a; 入门案例&#xff1a;...

YOLOv3的改进思路与方法:解析技术难点与创新突破

YOLOv3作为目标检测领域的经典算法&#xff0c;凭借其出色的速度和性能平衡获得了广泛应用。然而&#xff0c;随着计算机视觉技术的不断发展&#xff0c;YOLOv3在某些场景下的局限性也逐渐显现。本文将深入分析YOLOv3的不足之处&#xff0c;并系统介绍常见的改进策略和方法&…...

【解锁元生代】ComfyUI工作流与云原生后端的深度融合:下一代AIGC开发范式革命

## 从单机到云原生的认知跃迁 当2023年Stable Diffusion WebUI还在争夺本地显卡性能时&#xff0c;ComfyUI已悄然开启工作流模块化革命&#xff1b;当2024年AI绘画工具陷入"参数调优内卷"&#xff0c;云原生技术正重塑AI开发的基础设施层。二者的深度融合&#xff0…...

shell 编程之正则表达式与文本处理器

目录 一、正则表达式 1. 概念 2. 作用 3. 分类 二、基础正则表达式&#xff08;BRE&#xff09; grep 命令选项 三、扩展正则表达式&#xff08;ERE&#xff09; 与 BRE 的区别 四、文本处理器 1. sed 工具 2. awk 工具 五、总结 总结对比 元字符总结 工具对比与…...

Shell编程之正则表达式与文本处理器

目录 一、引言 二、正则表达式 2.1 定义与用途 2.2 基础正则表达式 2.2.1 查找特定字符 2.2.2 利用中括号 “[]” 查找集合字符 2.2.3 查找行首 “^” 与行尾字符 “$” 2.2.4 查找任意一个字符 “.” 与重复字符 “*” 2.2.5 查找连续字符范围 “{}” 2.3 元字符总结…...

TMDOG——语言大模型进行意图分析驱动后端实践

语言大模型进行意图分析驱动后端实践 项目概述 项目地址&#xff1a;https://github.com/TMDOG666/AI_Backend_Demo 该项目通过语言大模型&#xff0c;通过分析用户意图、拆分任务、构建API调用链来驱动后端实践。 以一个简单的教务系统后端为例&#xff0c;将教务系统后端…...

未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案

1. 错误原因分析 根本问题&#xff1a;当前安装的PyTorch是CPU版本&#xff0c;无法调用GPU硬件加速。当运行以下代码时会报错&#xff1a;model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1&#xff1a;验证CUDA可用性 在Pyth…...

【mysql】Mac 通过 brew 安装 mysql 、启动以及密码设置

Mac 通过 brew 安装 mysql 、启动以及密码设置 使用 brew 安装 mysqlmysql 启动mysql密码设置参考文章&#xff1a; 使用 brew 安装 mysql brew install mysqlmysql 启动 下载完毕&#xff0c;终端告诉我们mysql数据库没有设置密码的&#xff0c;我们可以直接执行 mysql -u r…...

Vue2 nextTick

核心源码位置 Vue 2 的 nextTick 实现主要在 src/core/util/next-tick.js 文件中。 完整源码结构 import { noop } from shared/util import { handleError } from ./error import { isIE, isIOS, isNative } from ./envexport let isUsingMicroTask falseconst callbacks …...

Ubuntu 安装 NVIDIA显卡驱动、CUDA 以及 CuDNN工具

文章目录 一、简介二、查看显卡设备三、安装显卡驱动四、安装CUDA工具箱五、安装CuDNN小结 一、简介 NVIDIA 驱动&#xff1a;操作系统与 NVIDIA 显卡硬件之间的桥梁&#xff0c;负责驱动显卡硬件的运行&#xff0c;显卡的“底层操作系统”&#xff0c;一切的基础。CUDA&#…...

LeetCode算法题(Go语言实现)_50

题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。 int popSmallest() 移除 并返回该无限集中的最小整数。 void addBack(int num) 如果正整数 …...

idea报错java: 非法字符: ‘\ufeff‘解决方案

解决方案步骤以及说明 BOM是什么&#xff1f;1. BOM的作用2. 为什么会出现 \ufeff 错误&#xff1f;3. 如何解决 \ufeff 问题&#xff1f; 最后重新编译&#xff0c;即可运行&#xff01;&#xff01;&#xff01; BOM是什么&#xff1f; \ufeff 是 Unicode 中的 BOM&#xff0…...

WPF依赖注入IHostApplicationLifetime关闭程序

WPF依赖注入IHostApplicationLifetime关闭程序 使用Application.Current.Shutdown();退出会报异常 应该使用 app.Dispatcher.InvokeShutdown(); Application.Current.Shutdown();app.Dispatcher.InvokeShutdown();static App app new();[STAThread]public static void Main(…...

如何在 IntelliJ IDEA 中安装通义灵码 - AI编程助手提升开发效率

随着人工智能技术的飞速发展&#xff0c;AI 编程助手已成为提升开发效率和代码质量的强大工具。在众多 AI 编程助手之中&#xff0c;阿里云推出的通义灵码凭借其智能代码补全、代码解释、生成单元测试等丰富功能&#xff0c;脱颖而出&#xff0c;为开发者带来了全新的编程体验。…...

【力扣】两两交换链表中的节点

两两交换链表中的节点 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *n…...

数据共享交换平台之文件交换

数据共享交换平台的文件交换管理功能提供部门与部门之间的文件交换通道&#xff0c;满足跨部门之间文件交换需求。文件交换需要能够按照交换业务场景对交换通道进行分类管理。文件交换管理需满足如下要求&#xff1a; 1.文件交换统计&#xff1a;支持查看本部门与其他部门之间…...

什么是全球代理?如何选择全球代理服务?

在全球化不断深化的今天&#xff0c;互联网已经成为人类沟通、工作和学习的重要纽带。而全球代理则是这一纽带上的关键技术之一&#xff0c;它赋予了我们探索不同地区网络资源的能力。今天&#xff0c;我们来聊聊什么是全球代理、它能做什么&#xff0c;以及如何选择合适的全球…...

Spring Boot整合Kafka的详细步骤

1. 安装Kafka 下载Kafka&#xff1a;从Kafka官网下载最新版本的Kafka。 解压并启动&#xff1a; 解压Kafka文件后&#xff0c;进入bin目录。 启动ZooKeeper&#xff1a;./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka&#xff1a;./kafka-server-…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB WIFI测试 #WIFI蓝牙二合一 #RTL8733BU

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——USB…...

Doip功能寻址走UDP协议

目前使用 connect()函数的UDP客户端 ,这里接收数据 解析的地方 查看一下。 如果使用 bind()、sendto()、recvfrom() 组合 那么返回值 和发送要在做调整&#xff0c;&#xff0c;根据业务需要后续在调整 其余的 和原来的 逻辑都是一样的&#xff0c;只是协议变了而已。 if serv…...