西宁的一位 35 岁的男性用户,在某一天深夜搜索了“专业设备”,他指向的究竟是抵御极寒的户外服饰,还是追求高性价比的数码产品。

一个善解人意的的搜索系统,应该能从这些蛛丝马迹中推理出:它想要的是一把专业的羽毛球拍,而且是一把 YONEX 品牌的专业定制羽毛球拍。

听起来匪夷所思,绝大多数搜索引擎做不到这一点。它们只会做一件事——关键词匹配。就是你搜"羽毛球拍",它就给你返回所有标题里包含"羽毛球拍"的商品,至于你到底想要什么类型的、什么价位的、什么品牌的,它一概不知 —— 除非你添加了筛选或者排序。

这就是快手 联合 中科大 在人工智能顶会 WWW 2026 上发表的论文要解决的核心问题:
如何让电商搜索引擎从"关键词匹配"进化到"意图深度理解"?

这篇论文提出了一个叫做 CRS(Context-aware Reasoning-enhanced generative Search)的框架,赋予了搜索系统一种前所未有的能力——情境感知的推理能力

接下来,让我们一步步拆解这篇论文,我尽量写的清楚点,让只有点高数基础的大学生也能看懂。


一、现有搜索系统为啥做不到啊

当前的搜索系统在工程上主要采用了以下的方式:

1.1 只看"字面意思" 的 匹配式搜索

最经典的搜索方法,比如 TF-IDFBM25,本质上是数词频,看你搜的词在商品标题里出现了几次?出现越多,相关性越高。

TF-IDFBM25《在 Spring 体系中做 RAG,可以不单独引入向量数据库——用 ES 就够了》中详细讲过。

BM25 vs TF-IDF 的关键差异:早期常用的 TF-IDF 中词频对权重的影响是线性增长的——一个关键词在“商品A中”出现了 100 次,那 A 在该关键词上的相关性就是“关键词只出现了 10 次的商品B”的 10 倍,这明显对于那种长文和常用词汇(如“的”等词)的处理并不够合理。
BM25 引入了 词频饱和 机制,更符合直觉,核心思想为:

  1. 词频(TF):一个词在文档中出现越多,这个词对该文档越重要——但有上限(饱和曲线)
  2. 逆文档频率(IDF):一个词在所有文档中出现越普遍(如"的"、“是”),它的区分度越低,权重越低
  3. 文档长度归一化:长文档天然占优势,所以会适当降低权重

后来,深度学习进一步带来了语义匹配方法(如 BGE、DPR 等),它们不再只数词频,而是把查询和商品都映射到一个向量空间中,通过向量距离来衡量语义相似度

比如搜索“绿水鬼”会搜索出“劳力士潜航者系列腕表”、搜“手机保护套”能搜出“手机壳”,因为他们在意思上、即向量距离上是相近的。

但无论是 TF-IDF 还是深度语义匹配,都有一个根本性的缺陷:它们把每一次搜索都当作孤立的事件。系统只知道你当前搜了什么,完全不知道你是谁、你之前搜过什么、你在哪里、你偏好什么品牌。

1.2 语义转编码 的 生成式搜索

近两年,一种新的范式——生成式检索(Generative Retrieval)开始兴起。它的核心思路是:不再从候选池里"挑选"商品,而是让模型像写作文一样,直接生成目标商品的标识符。

比如这样流程:

  1. 系统给每个商品分配一个"语义 ID"(Semantic ID, SID),像 <a_23> <b_1> <c_124> <d_0> 这样的一串编码,每个编码分别代表:电子 游戏机 任天堂 Switch2
  2. 然后训练一个语言模型让它可以将查询转换成对应的“语义 ID”编码。
  3. 我搜索“任天堂去年最畅享游戏机”,经过语言模型的理解将其转化为<a_23> <b_1> <c_124> <d_0> ,就直接匹配到了Switch2这个商品。

本质上是把问题从"检索问题"变成了"序列生成问题",是直接生成商品,而不是搜索商品。

但生成式检索亦有缺陷,现有的方法(如 DSI、GENRE 等)仍然主要依赖当前的查询文本的信息,对更多的上下文信息(用户画像、历史行为、时空信息等)利用还是不足。

1.3 主要短板:缺推理

无论是 1.1 提到的“匹配式搜索”还是 1.2 提到的“生成式搜索”,主要的短板都在于推理

现在的电商公司收集了丰富的用户上下文,是不缺素材的,只是缺少推理能力。

用户搜索'专业设备'

搜索系统如何理解?

匹配式方法
只看关键词
不懂上下文

生成式方法
能生成商品ID
但不会推理

❌ 缺失的关键能力
情境感知 + 推理

结果:搜到一堆电子设备、登山装备、健身器材
无关你真正想要的

而这篇论文提出的 CRS 就是为了补上这块短板,它的核心理念是:

让大语言模型不仅"读懂"搜索词,还能"理解"搜索场景——通过显式的推理链条,从丰富的上下文中推断出用户真正想要什么,然后直接生成最匹配的商品。


二、CRS 框架全览:三大核心模块

CRS 框架由三个紧密协作的模块组成:

模块三:R-GRPO 去偏强化学习

多级奖励设计

排序感知的
奖励聚合

去偏的GRPO优化

模块二:自进化后训练

SFT: 监督微调
利用正确样本

RL: 强化学习
探索错误样本

模块一:上下文表征与对齐

异构信号统一
→ 结构化文本

商品→语义ID(SID)
残差K-Means量化

预训练对齐
Item-SID映射
Context→SID预测

三、模块一:上下文表征与对齐 —— 定义一下表达方式然后让大模型能初步整明白

3.1 核心思想:全都给我转成文本

CRS 的第一个关键创新是:把所有异构的上下文信号统一转化为结构化文本

为什么这么做?
因为大语言模型(LLM)擅长,就这么简单。
LLM都是在海量文本上预训练的,它最擅长的就是理解和推理文本。

如果我们把用户画像、历史行为、商品信息等上下文都塞进特征向量里,那 LLM 的"知识理解和推理"就浪费了——它很难理解那些数字向量。

具体来说,CRS 将两类上下文分别序列化:

用户上下文(按时间顺序排列):

{
  "user_profile": {"age": "31-40", "resident_area": "northwest, Xining"},
  "history": [
    {
      "text": "badminton bag",
      "time": "06/15 18:28:58",
      "location": "Xining",
      "clicked_items": [{"title": "Yonex Badminton Backpack...", "brand": "YONEX", ...}],
      "non_clicked_items": [{"title": "Waterproof Badminton Bag...", "brand": "none", ...}]
    },
    ...
  ],
  "current_query": {"text": "customized badminton rackets", "time": "06/16 18:42:20", "location": "Xining"}
}

商品上下文

{
  "title": "Yonex Professional Badminton Racket...",
  "brand": "YONEX",
  "category": "Badminton Racket",
  "price": "299.0",
  "gmv": "5800.0",
  "SID": "<a_60><b_95><c_95><d_0>"
}

你可能注意到,商品上下文里有一个特殊的字段 “SID”——这就是接下来要讲的核心概念。

3.2 语义 ID(SID):颁发商品身份证

在 1.2 提到的生成式检索中,模型需要直接生成目标商品。但商品数量动辄上百万,总不能让模型一个一个去试吧?

解决方案是:给每个商品分配一个紧凑的语义化编码,把商品的诸多信息都压缩成一个短的编码,称之为语义 ID(Semantic ID, SID)。
并且系统中构建一个编码词表,每次构建SID时,从编码词表中拿出有限个数的编码,并组合成SID,即可定位到一个具体商品。

CRS 是使用 残差 K-Means 量化 来生成 SID。这是一个分层逐层细化的过程。
原文用于示例只分了 4 层 = 3 层语义编码层(K=3)+ 1 层去重层
实操中可以根据实际请款改变这个分层数 K。

语义编码层(前三层)首先工作
第一步:获取商品向量

首先,用预训练的文字转化向量的模型(bge-small-zh-v1.5)把每个商品的 JSON 文本描述转成一个向量 e i 0 \mathbf{e}_i^0 ei0。这样,所有商品就组成了一个初始嵌入集合

E 0 = { e 1 0 , e 2 0 , ⋯   , e I 0 } E^0 = \{\mathbf{e}_1^0, \mathbf{e}_2^0, \cdots, \mathbf{e}_I^0\} E0={e10,e20,,eI0}

其中 I I I 是商品总数。

这一步本质上就是把商品信息"浓缩"成一个高维向量。你可以把它想象成把一本商品说明书压缩成一组数字指纹——虽然丢失了一些细节,但核心语义被保留了。

没有做过相关研究的朋友们可能好奇为啥叫”初始嵌入“,其实“嵌入”不熟悉,"Embedding"应该就熟悉了。
它是一个机器学习专有名词,特指将离散的、符号化的数据(如文字、商品ID、图片)映射到连续的、低维的向量空间中的过程。
大家把初始嵌入理解成向量就好了,为保留原文的逻辑性,后面我也叫他"初始嵌入"了。

第二步:残差 K-Means 量化

这是生成 SID 的核心步骤。论文给出了如下公式:

C l = { c 1 l , c 2 l , ⋯   , c N l } = KMeans ( E l , N ) C^l = \{\mathbf{c}_1^l, \mathbf{c}_2^l, \cdots, \mathbf{c}_N^l\} = \text{KMeans}(E^l, N) Cl={c1l,c2l,,cNl}=KMeans(El,N)

s i l = arg ⁡ min ⁡ k ∥ e i l − c k l ∥ 2 2 s_i^l = \arg\min_k \|\mathbf{e}_i^l - \mathbf{c}_k^l\|_2^2 sil=argkmineilckl22

e i l + 1 = e i l − c s i l l \mathbf{e}_i^{l+1} = \mathbf{e}_i^l - \mathbf{c}_{s_i^l}^l eil+1=eilcsill

E l + 1 = { e 1 l + 1 , e 2 l + 1 , ⋯   , e I l + 1 } E^{l+1} = \{\mathbf{e}_1^{l+1}, \mathbf{e}_2^{l+1}, \cdots, \mathbf{e}_I^{l+1}\} El+1={e1l+1,e2l+1,,eIl+1}

这四个公式看起来吓人,但逻辑非常清晰。我们逐个解释:

公式 (1a) C l = KMeans ( E l , N ) C^l = \text{KMeans}(E^l, N) Cl=KMeans(El,N)

  • 这是在第 l l l 层对所有商品嵌入做 K-Means 聚类(非常经典的分类算法,就是把众多目标聚集成多个类别),把 I I I 个商品分成 N N N 个簇,每个簇有一个中心点 c k l \mathbf{c}_k^l ckl
  • 为什么要聚类? 因为我们要把上百万个商品映射到有限的 N N N 个类别中。就像图书馆把书分成 N N N 个大区,先知道在哪个区,再在区内细找。

公式 (1b) s i l = arg ⁡ min ⁡ k ∥ e i l − c k l ∥ 2 2 s_i^l = \arg\min_k \|\mathbf{e}_i^l - \mathbf{c}_k^l\|_2^2 sil=argminkeilckl22

  • 对每个商品 i i i,找到离它最近的聚类中心,记录其编号 s i l s_i^l sil
  • 这里的 ∥ ⋅ ∥ 2 2 \|\cdot\|_2^2 22 是欧氏距离的平方, arg ⁡ min ⁡ \arg\min argmin 表示"取让距离最小的那个 k k k"。
  • 这个聚类中心 s i l s_i^l sil 就是商品 i i i 在第 l l l 层的编码。

公式 (1c) e i l + 1 = e i l − c s i l l \mathbf{e}_i^{l+1} = \mathbf{e}_i^l - \mathbf{c}_{s_i^l}^l eil+1=eilcsill

  • 这是**“残差”**的关键:用原始嵌入减去被分配到的聚类中心,得到残差嵌入。
  • **什么是残差?**通常指在数学模型中观测值与模型预测值之间的差异
  • 为什么要求残差? 因为第一层聚类只捕捉了最粗粒度的信息(大类),残差部分包含了"被忽略的细节"。下一层再对残差做聚类,就能捕捉更细粒度的差异。
  • 这就像:第一层告诉你"这是一本书"(大类),残差告诉你"这是一本数学书"(中类),再下一层的残差告诉你"这是一本线性代数教材"(细类),是逐步精细的过程。

公式 (1d) E l + 1 = { e 1 l + 1 , ⋯   , e I l + 1 } E^{l+1} = \{\mathbf{e}_1^{l+1}, \cdots, \mathbf{e}_I^{l+1}\} El+1={e1l+1,,eIl+1}

  • 把所有商品的残差嵌入组成新的集合,作为下一层的输入,这一层就结束了。

每一层聚类是都在上一层"遗漏的细节"上继续细分,从粗到细、逐层逼近。

去重层(最后一层)中间工作

论文没有详细展开去重层的具体实现,但最终的 SID 是四个编码拼接,所以可知去重层也产生了编码。

我猜测去重层很可能是对这个最终残差再做一次聚类或编号,使得前三层前缀相同的物品在第四层获得不同的编码。

从论文示例中 <d_0> 的下标为 0 来看,去重层的码本规模可能较小(即需要区分的冲突项通常不多),编号从 0 开始递增。

合并编码收尾工作

最终, 将商品 i i i "在每一层通过公式 (1b) 计算的聚类中心 s i l s_i^l sil 拼接起来,就是该商品的SID: s i 1 ∥ s i 2 ∥ s i 3 ∥ s i 4 s_i^1 \parallel s_i^2 \parallel s_i^3 \parallel s_i^4 si1si2si3si4
例如 <a_23><b_1><c_124><d_0>

流程图如下

所有商品嵌入 E⁰

第1层 K-Means
N=512 个簇
→ 得到第1层编码 a_xxx

残差嵌入 E¹
= E⁰ - 聚类中心

第2层 K-Means
N=256 个簇
→ 得到第2层编码 b_xxx

残差嵌入 E²
= E¹ - 聚类中心

第3层 K-Means
N=256 个簇
→ 得到第3层编码 c_xxx

去重层
→ 得到第4层编码 d_x

最终 SID
例: <a_23><b_1><c_124><d_0>

为什么不用 RQ-VAE?

论文特别提到,他们选择了残差 K-Means 而非更常见的 RQ-VAE(残差量化变分自编码器),我把主要概念和原因都简单解释下。

码本:理解成前面提到过的编码词表就行,当有一个新的商品向量进来时,系统会在这个“词典”里找到与它最相似的那个“标准向量”,并用这个标准向量的编号(索引)来代表原来的商品向量。

关键就在于这个“码本”咋来的,以及它会不会失效。

RQ-VAE 是一种通过“训练”来得到码本的方法,其简单的例子是比如你教AI画画,给它看很多名画(商品向量,训练数据),告诉它:“请学习总结出512种最具代表性的画法(码本向量)。”

AI通过训练,慢慢调整这512个“画法模板”,让它们能最好地“复现”或“代表”所有训练数据。

但在训练过程中,一个常见的问题是,AI可能“偷懒”或陷入局部最优。最终,这512个模板里,可能只有几十个甚至几个被频繁使用,而其他几百个模板几乎从来用不上,变成了“僵尸”或“死亡”状态。

这就叫**“码本坍塌”**,这意味着你名义上有512个编码,但实际上有效的只有几十个。编码效率急剧下降,无法精细地区分百万级的不同商品。

K-Means 是一种“非参数化”的经典聚类算法,简单说就是它不需要“训练”来学习码本。它的工作方式是“统计归纳”而非“学习拟合”,硬生生地分成多个堆(簇)。”

由于是硬性划分,这512个中心点每一个都必然会“管”着一批向量,没有中心点会“失业”。这天然保证了码本全覆盖,每个编码都物尽其用。

3.3 上下文对齐:让 LLM 学会"电商语言"

有了 SID 之后,CRS 把这些四层编码注册为 LLM 词表中的新特殊 token

但问题来了:LLM 的预训练语料里从来没有见过这些 token,它怎么知道 <a_23> 代表什么?

这就需要对LLM进行对齐预训练。CRS 设计了两个辅助任务,用于对LLM的训练:

任务一:Item–SID 映射(双向映射)

  • 正向:给定商品上下文 → 生成 SID(item_context → SID
  • 反向:给定 SID → 重建商品上下文(SID → item_context

这个双向设计确保模型既能"从商品找到编码",也能"从编码回忆起商品"。
就像学英语时,既能从中文翻英文,也能从英文翻中文。

任务二:Context2SID 预测

  • 给定用户上下文 → 直接预测目标商品的 SID(user_context → SID
  • 这个任务让模型初步学会"从搜索语境推断目标商品",为后续的深度推理打下基础。

注意,这个阶段不要求模型显式推理,只要能直接预测 SID 就行。推理能力是后面模块二和模块三来培养的。

经过对齐预训练后,我们得到了模型 M align M_{\text{align}} Malign,它是后续所有训练的起点。


四、模块二:自进化后训练——让模型自教自学如何推理

4.1 核心难题:电商场景没有"标准推理答案"

在数学推理或问答任务中,我们有明确的推理过程可以作为监督信号——比如解题步骤、思维链(Chain-of-Thought)等。

但在电商搜索场景中,几乎不存在高质量的推理轨迹标注

你可能会想:那让更强的大模型(如 GPT-4)来生成推理轨迹,然后让小模型去学,不就行了?这就是所谓的知识蒸馏

确实是个方法,但论文指出了使用蒸馏方法蒸馏大量上下文的两个致命缺陷:

数据先验偏差(Data-prior Bias):通用大模型对电商平台上成千上万的商品一无所知。
为了让它生成合理的推理,你不得不把目标商品的信息"喂"给它——这就等于考试前把答案告诉了考生。
训练时模型"看"到了答案,推理时却看不到,导致训练和推理的分布严重不一致。

模型容量偏差(Model-capacity Bias):大模型和小模型的推理能力差距巨大。
小模型硬去模仿大模型的推理过程,就像让小学生抄博士的论文——抄得再像,也不理解,换个题目就不会了。

4.2 自进化范式:探索与利用的交替循环

为解决上述问题,CRS 提出了一个极富创意的解决方案——自进化后训练(Self-evolving Post-training,SFT)。

核心思想是:不依赖外部教师,让模型在"探索"和"利用"之间交替循环,逐步提升推理能力。

具体流程如下:

初始化:M₀ˢᶠᵗ
用少量蒸馏数据做 SFT
学习基础推理格式

探索阶段:RL 训练
只训练模型做错的样本
鼓励自我修正

利用阶段:SFT 训练
用 RL 模型做对的样本
巩固正确推理

是否达到
最大迭代次数?

最终模型

首先,在之前预训练过的模型 M a l i g n M_{align} Malign 基础上,使用从更强模型(Qwen3-30B)蒸馏出来的少量上下文分析轨迹进行监督微调,得到 初始 SFT 模型 M 0 s f t M0_{sft} M0sft
这一步主要提升模型的指令遵循和“慢思考”推理能力。

然后开始迭代,形式化地,第 i i i 轮迭代可以表示为:

D r l i = Sample ( Incorrect ( D train , M s f t i ) ) D_{rl}^i = \text{Sample}(\text{Incorrect}(D_{\text{train}}, M_{sft}^i)) Drli=Sample(Incorrect(Dtrain,Msfti))

M r l i = RL ( D r l i , M s f t i ) M_{rl}^i = \text{RL}(D_{rl}^i, M_{sft}^i) Mrli=RL(Drli,Msfti)

D s f t i = Correct ( D train , M r l i ) D_{sft}^i = \text{Correct}(D_{\text{train}}, M_{rl}^i) Dsfti=Correct(Dtrain,Mrli)

M s f t i + 1 = SFT ( D s f t i , M r l i ) M_{sft}^{i+1} = \text{SFT}(D_{sft}^i, M_{rl}^i) Msfti+1=SFT(Dsfti,Mrli)

让我们逐行解读:

前两行公式为RL阶段,探索正确的方法。

第一行 D r l i = Sample ( Incorrect ( D train , M s f t i ) ) D_{rl}^i = \text{Sample}(\text{Incorrect}(D_{\text{train}}, M_{sft}^i)) Drli=Sample(Incorrect(Dtrain,Msfti))

  • 让当前 SFT 模型 M s f t i M_{sft}^i Msfti 跑一遍训练集 D train D_{\text{train}} Dtrain只挑出它做错的样本作为 RL (强化学习)训练集 D r l i D_{rl}^i Drli
  • 为什么只训练错题? 因为做对的题再训练一遍没有新信息。这就像你复习考试,应该集中精力攻克薄弱环节,而不是把会的题再做一遍。这一策略灵感来自 DAPO 算法的过滤策略。

第二行 M r l i = RL ( D r l i , M s f t i ) M_{rl}^i = \text{RL}(D_{rl}^i, M_{sft}^i) Mrli=RL(Drli,Msfti)

  • 在错题集上做强化学习,让模型自由探索,尝试发现新的推理策略来攻克之前做不对的样本。
  • RL 的优势在于:它不要求模型模仿某个固定答案,而是通过奖励信号引导模型自己找到正确的推理路径。

后两行为SFT阶段,巩固正确的方法。

第三行 D s f t i = Correct ( D train , M r l i ) D_{sft}^i = \text{Correct}(D_{\text{train}}, M_{rl}^i) Dsfti=Correct(Dtrain,Mrli)

  • 让 RL 模型跑一遍训练集,收集它做对的样本以及生成的推理轨迹,作为新一轮 SFT 的训练数据。
  • 为什么要收集对的样本? 因为 RL 探索出来的正确推理轨迹是宝贵的学习材料,SFT 阶段可以让模型更好地"消化"这些经验。

第四行 M s f t i + 1 = SFT ( D s f t i , M r l i ) M_{sft}^{i+1} = \text{SFT}(D_{sft}^i, M_{rl}^i) Msfti+1=SFT(Dsfti,Mrli)

  • 用正确的推理轨迹做监督微调,巩固 RL 阶段获得的知识,得到更稳定的 SFT 模型。

通俗理解:这就像学骑自行车——RL 阶段你自由摸索,摔倒了很多次(做错的样本),但终于找到了保持平衡的方法;SFT 阶段你反复练习那些成功保持平衡的动作,让身体形成肌肉记忆。两阶段交替,骑得越来越稳。

4.3 为什么需要"交替"而不是只用 RL 或只用 SFT?

论文做了一个消融实验,发现只用迭代 SFT(不加 RL)的模型始终不如完整框架。这是因为:

  • 只用 SFT:模型只能模仿已有数据,永远跳不出训练数据的分布,泛化能力有限。就像只会做课本例题的学生,换个问法就懵了。
  • 只用 RL:虽然探索空间大,但训练不稳定,容易出现性能波动。RL 发现的策略可能不够稳健。
  • SFT + RL 交替:RL 负责"拓展边界",SFT 负责"巩固阵地",两者互补,形成良性循环。

五、模块三:R-GRPO 排序感知的去偏强化学习 —— 优化一下模型整得好咋奖励它的方法

这是论文最有技术创新的模块,也是我最懒得写的部分,有点复杂,可以慢慢看慢慢理解

5.1 先理解 GRPO:CRS 的 RL 基石

在讲 R-GRPO 之前,我们需要先理解它基于的算法——GRPO(Group Relative Policy Optimization)。

GRPO 是 DeepSeek 团队提出的一种强化学习算法,专门用于大语言模型的推理能力训练。它的核心思想非常简洁:

对于同一个问题,让模型生成 G G G 个不同的回答,用奖励函数给每个回答打分,然后在组内进行相对比较——比平均分高的回答被"鼓励",比平均分低的回答被"抑制"。

具体来说,优势函数(Advantage)的计算方式为:

A i = r i ∗ − mean ( { r 1 ∗ , r 2 ∗ , … , r G ∗ } ) std ( { r 1 ∗ , r 2 ∗ , … , r G ∗ } ) A_i = \frac{r_i^* - \text{mean}(\{r_1^*, r_2^*, \ldots, r_G^*\})}{\text{std}(\{r_1^*, r_2^*, \ldots, r_G^*\})} Ai=std({r1,r2,,rG})rimean({r1,r2,,rG})

这里的 r i ∗ r_i^* ri 是第 i i i 个回答的奖励, mean \text{mean} mean std \text{std} std 分别是这 G G G 个奖励的均值和标准差。

为什么不用绝对奖励而用相对优势? 因为奖励的绝对值很难校准——一个奖励为 0.5 的回答到底是好还是坏?
但如果我们知道组内平均是 0.3,那 0.5 就明显优于平均,应该被鼓励。这种组内相对比较更加稳健。

GRPO 的另一个关键特性是:不需要单独的价值函数(Critic 网络)。传统的 PPO 算法需要训练一个额外的网络来估计状态价值,而 GRPO 直接用组内平均奖励作为基线,大大减少了计算开销。

5.2 搜索场景中 GRPO 的有两个严重问题

论文指出,直接把 GRPO 搬到搜索推荐场景中,会出现两个严重问题:

缺陷一:优化目标错位

搜索推荐本质上是一个排序问题(Ranking),用户满意度取决于整个推荐列表的质量,而不只是排第一的那个商品。

但 GRPO 的标准做法是:生成一条推理轨迹 + 一个商品预测,然后根据这一个预测的好坏来给整条轨迹打分。这就像考试只看第一道题对不对,完全不管后面做得怎样。

结果就是:模型可能把所有精力都放在"猜中第一名"上,而忽视了其他候选商品的排序质量。
但现实中,第二名、第三名的排序同样重要——用户不一定会买第一个推荐的。

缺陷二:奖励估计偏差

在基于规则的奖励体系下,两条推理轨迹可能得到相同的奖励,即使它们的排序质量天差地别。

举个例子:假设两条轨迹的 Top-1 预测都是错的,那它们的 SID 准确性奖励可能都是 0。
但轨迹 A 把正确答案排在了第 2 位,轨迹 B 把正确答案排在了第 100 位——显然轨迹 A 更好,但 GRPO 无法区分它们。

这就像两个学生考试都没拿满分,但一个考了 90 分,一个考了 30 分,标准 GRPO 对他们一视同仁,这显然不合理。

5.3 R-GRPO 的解决方案

R-GRPO(Ranking-aware GRPO)从两个层面改造了 GRPO:

改造一:解耦 Rollout——推理与生成分离

​Rollout:强化学习中的一个核心术语,指的是模型根据当前策略完整“执行”或“生成”一个回答的过程

标准 GRPO 的 rollout 是"一条推理 + 一个预测"绑定一起的。R-GRPO 将其解耦为两个阶段:

  1. 推理轨迹生成:给定上下文 q q q,模型生成 G G G 条推理轨迹 { o i } i = 1 G \{o_i\}_{i=1}^G {oi}i=1G
  2. 商品束搜索:对每条推理轨迹,独立执行束搜索(Beam Search),得到 K K K 个候选商品,形成一个排序表

这样总共产生 G × K G \times K G×K 个 rollout。

束搜索(Beam Search) 是一种序列生成策略。
简单来说:在每一步生成时,不是只保留概率最高的 1 个候选,而是保留概率最高的 K K K 个候选( K K K 就是束宽),然后基于这 K K K 个候选继续扩展。
最终得到 K K K 条完整的候选序列,按概率排序。
这比贪心搜索(每步只选最优)更有可能找到全局较优解。

改造二:排序感知的奖励聚合

这是 R-GRPO 的核心创新。对于每条推理轨迹 i i i,它不是只看 Top-1 预测的奖励,而是把整个排序表的信息都纳入考量。

具体来说,先选出每条轨迹中奖励最高的那个预测:

o i ∗ = o i arg ⁡ max ⁡ ( { r i j } j = 1 K ) o_i^* = o_i^{\arg\max(\{r_i^j\}_{j=1}^K)} oi=oiargmax({rij}j=1K)

然后,计算一个排序感知的加权奖励(理解为会收到排序影响的奖励):

r i ∗ = 1 W ∑ n = 1 K r i n 1 + log ⁡ n , W = ∑ n = 1 K 1 1 + log ⁡ n r_i^* = \frac{1}{W} \sum_{n=1}^{K} \frac{r_i^n}{1 + \log n}, \quad W = \sum_{n=1}^{K} \frac{1}{1 + \log n} ri=W1n=1K1+lognrin,W=n=1K1+logn1

让我们仔细拆解这个公式:

  • r i n r_i^n rin 是第 i i i 条推理轨迹下,排序表中第 n n n 个商品的奖励
  • 1 + log ⁡ n 1 + \log n 1+logn 是一个折扣因子,排名越靠后( n n n 越大),奖励的受到的折扣越大,即奖励越低
  • W W W 是归一化常数,确保权重之和为 1

    归一化常数:是一个数学缩放因子,用于将一个加权和调整为总和为1的标准形式

为什么用 1 1 + log ⁡ n \frac{1}{1+\log n} 1+logn1 作为权重?

这个设计借鉴了信息检索中 NDCG 指标的思想:排名靠前的结果对用户体验的影响更大,所以应该赋予更高的权重。

但不像简单的线性衰减那么激进,对数衰减更加温和,确保排名靠后的结果也有一席之地。

这个公式解决了什么问题?

它让两条"Top-1 都错了"的轨迹有了区分度——如果轨迹 A 把正确答案排在第 2 位,轨迹 B 排在第 10 位,那么轨迹 A 的排序感知奖励会明显高于 B,因为第 2 位的权重远大于第 10 位。

用一个具体例子来理解:

排名 n n n 轨迹 A 奖励 轨迹 B 奖励 权重 1 1 + log ⁡ n \frac{1}{1+\log n} 1+logn1
1 0.0 0.0 1.000
2 0.8 0.0 0.631
3 0.5 0.0 0.500
4 0.3 0.2 0.431
5 0.1 0.6 0.391

轨迹 A 的排序感知奖励 ≈ 0.0×1.0 + 0.8×0.631 + 0.5×0.5 + 0.3×0.431 + 0.1×0.391 ≈ 0.97(未归一化)

轨迹 B 的排序感知奖励 ≈ 0.0×1.0 + 0.0×0.631 + 0.0×0.5 + 0.2×0.431 + 0.6×0.391 ≈ 0.32(未归一化)

即使两条轨迹的 Top-1 奖励都是 0,轨迹 A 仍然因为更好的整体排序质量获得了更高的奖励!

最终优化目标

R-GRPO 的最终优化目标如下:

J R-GRPO ( θ ) = E [ 1 G ∑ i = 1 G 1 ∣ o i ∗ ∣ ∑ t = 1 ∣ o i ∗ ∣ { min ⁡ [ r t ( θ ) ⋅ A i ,  clip ( r t ( θ ) , 1 − ϵ , 1 + ϵ ) ⋅ A i ] − β D K L [ M ∥ M r e f ] } ] J_{\text{R-GRPO}}(\theta) = \mathbb{E}\left[\frac{1}{G}\sum_{i=1}^{G}\frac{1}{|o_i^*|}\sum_{t=1}^{|o_i^*|}\left\{\min\left[r_t(\theta)\cdot A_i,\ \text{clip}(r_t(\theta), 1-\epsilon, 1+\epsilon)\cdot A_i\right] - \beta D_{KL}[M\|M_{ref}]\right\}\right] JR-GRPO(θ)=E G1i=1Goi1t=1oi{min[rt(θ)Ai, clip(rt(θ),1ϵ,1+ϵ)Ai]βDKL[MMref]}

其中,奖励 r i ∗ r_i^* ri 的计算方式,如上文进行了优化,从单点奖励变成了排序感知的加权奖励:

r i ∗ = 1 W ∑ n = 1 K r i n 1 + log ⁡ n , W = ∑ n = 1 K 1 1 + log ⁡ n r_i^* = \frac{1}{W} \sum_{n=1}^{K} \frac{r_i^n}{1 + \log n}, \quad W = \sum_{n=1}^{K} \frac{1}{1 + \log n} ri=W1n=1K1+lognrin,W=n=1K1+logn1

剩下的子公式就是原 GRPO 的标准形式了,简单解释各部分:

r t ( θ ) = M θ ( o i , t ∗ ∣ q , o i , < t ) M old ( o i , t ∗ ∣ q , o i , < t ) r_t(\theta) = \frac{M_\theta(o_{i,t}^*|q, o_{i,<t})}{M_{\text{old}}(o_{i,t}^*|q, o_{i,<t})} rt(θ)=Mold(oi,tq,oi,<t)Mθ(oi,tq,oi,<t)

A i = r i ∗ − mean ( { r 1 ∗ , … , r G ∗ } ) std ( { r 1 ∗ , … , r G ∗ } ) A_i = \frac{r_i^* - \text{mean}(\{r_1^*, \ldots, r_G^*\})}{\text{std}(\{r_1^*, \ldots, r_G^*\})} Ai=std({r1,,rG})rimean({r1,,rG})

  • r t ( θ ) r_t(\theta) rt(θ)新旧策略的概率比,衡量策略更新幅度
    • 比如你改进投篮姿势,概率比 = 新姿势做出某个动作的概率 ÷ 旧姿势做出相同动作的概率,衡量“改变有多大的”,1表示趋于旧姿势,
  • clip ( ⋅ , 1 − ϵ , 1 + ϵ ) \text{clip}(\cdot, 1-\epsilon, 1+\epsilon) clip(,1ϵ,1+ϵ)截断机制,防止策略更新过大导致训练不稳定
  • A i A_i Ai优势函数,衡量第 i i i 条轨迹相对于组内平均的好坏
    • 在班级考试中,你的相对排名。
  • D K L [ M ∥ M r e f ] D_{KL}[M\|M_{ref}] DKL[MMref]KL 散度正则项,约束新策略不要偏离参考策略太远
    • ​M:当前正在训练的新策略(新投篮姿势)。
    • M r e f M_{ref} Mref​​:参考策略/旧策略(原来的投篮姿势)。
    • KL散度:衡量新策略偏离旧策略的程度。值越大,偏离越远。
  • β \beta β 是正则化系数
    • 用来调节“追求高奖励”和“保持稳健”之间的平衡的,越大越守旧,越小越放纵

5.4 多级奖励设计

除了排序感知的奖励聚合,CRS 还设计了精细的多级奖励函数。总奖励由四个部分组成:

(1) 推理结构奖励 r structure r_{\text{structure}} rstructure

r structure = { 0 , if  ⟨ think ⟩ , ⟨ / think ⟩  tags exist − 1 , otherwise r_{\text{structure}} = \begin{cases} 0, & \text{if } \langle\text{think}\rangle, \langle/\text{think}\rangle \text{ tags exist} \\ -1, & \text{otherwise} \end{cases} rstructure={0,1,if think,/think tags existotherwise

  • 这是一个格式检查:模型必须按照"先推理、后输出"的结构生成回答,用 <think ></think > 标签包裹推理过程。
  • 格式正确的给 0 分(不奖不罚),格式错误的罚 1 分。
  • 为什么不奖只罚? 因为格式正确只是基本要求,不应该因此获得额外奖励;但格式错误必须被惩罚,否则模型可能跳过推理直接输出答案。
(2) 推理长度奖励 r length r_{\text{length}} rlength

r length = min ⁡ ( 1 , len ( ans ) L ) r_{\text{length}} = \min\left(1, \frac{\text{len}(\text{ans})}{L}\right) rlength=min(1,Llen(ans))

  • 推理轨迹越长(思考越深入),奖励越高,但上限为 1。
  • L L L 是最大允许长度。
  • 为什么鼓励长推理? 研究表明,“慢思考”(即更多的推理步骤)往往能带来更好的推理质量。DeepSeek-R1 的成功也验证了这一点。但需要设上限,防止模型"过度思考"——写了一堆废话反而降低了效率。
(3) SID 准确性奖励 r sid_acc r_{\text{sid\_acc}} rsid_acc

r sid_acc = ∑ i = 1 K w i ⋅ I ( SID pred i = SID target i ) r_{\text{sid\_acc}} = \sum_{i=1}^{K} w_i \cdot \mathbb{I}(\text{SID}_{\text{pred}}^i = \text{SID}_{\text{target}}^i) rsid_acc=i=1KwiI(SIDpredi=SIDtargeti)

  • 利用 SID 的层级结构,逐层比较预测和目标的编码是否一致。
  • I ( ⋅ ) \mathbb{I}(\cdot) I() 是指示函数,条件成立为 1,否则为 0。
  • w i w_i wi 是各层权重,通常高层(粗粒度)权重更大,因为分对大类更重要。
  • 为什么用部分匹配而不是全对/全错? 如果预测的 SID 是 <a_60><b_95><c_100><d_0>,目标是 <a_60><b_95><c_95><d_0>,前两层都对,说明模型至少找到了正确的大类和中类。部分匹配奖励提供了更密集的学习信号,而不是只看最终结果。
(4) SID 有效性奖励 r sid_val r_{\text{sid\_val}} rsid_val

r sid_val = { 1 , if SID pred  exists in item set 0 , otherwise r_{\text{sid\_val}} = \begin{cases} 1, & \text{if SID}_{\text{pred}} \text{ exists in item set} \\ 0, & \text{otherwise} \end{cases} rsid_val={1,0,if SIDpred exists in item setotherwise

  • 检查预测的 SID 是否对应一个真实存在的商品
  • 因为模型可能"编造"一个不存在的 SID,就像幻觉问题一样。这个奖励就是惩罚"幻觉"。

总结起来就是奖励:

  1. 格式对不对(结构奖励)
  2. 想得够不够深(长度奖励)
  3. 猜得准不准(准确性奖励)
  4. 猜的是不是真东西(有效性奖励)。

五、推理阶段

上述的训练完成后,CRS 在推理时采用两步推理策略,而非直接在推理 token 和 SID token 上同时做束搜索。

束搜索:一种在序列生成任务中寻找全局较优解的策略。​
它不完全等同于贪心搜索,后者“目光短浅”,只看当前单步最优,容易陷入局部最优。
而束搜索则通过保留多个候选,进行更广泛的探索,最终选取其中概率最高的序列作为结果。

第一步:情境感知推理

给定用户上下文,模型生成一条深度推理轨迹,反映其对用户意图的内部理解。

第二步:推理增强生成

将用户上下文与生成的推理轨迹拼接,然后进行束搜索来预测目标 SID,同时用**前缀树(Prefix Trie)**约束生成过程,确保只产生合法的 SID 序列。

为什么要分两步?
如果在推理 token 和 SID token 上同时做束搜索,搜索空间会极其庞大。
模型既要在推理空间中"想",又要在 SID 空间中"选",两者耦合在一起计算代价极高。
拆成两步后,第一步专注"思考",第二步专注"选择",既高效又准确。

前缀树约束
CRS 预先把所有合法 SID 构建成一棵前缀树。
在束搜索的每一步,模型只能沿着前缀树中存在的路径继续生成。
这样就能100% 保证输出的 SID 一定是真实存在的商品,彻底杜绝了"幻觉"问题。

用一个图来直观理解两步推理:

第二步:推理增强生成

用户上下文 + 推理轨迹

束搜索 Beam Search
根据语义ID(SID)生成
并受前缀树约束

生成目标 SID
<a_60><b_95><c_95><d_0>
对应 YONEX 专业羽毛球拍

第一步:情境感知推理

用户上下文
年龄: 35岁, 地区: 西宁
历史: YONEX羽毛球背包
当前搜索: '专业设备'

LLM 生成推理轨迹
「用户是35岁西宁男性,
深夜搜索'专业设备',
结合其 YONEX 品牌历史,
推断其真正想要的是
YONEX专业定制羽毛球拍。」


六、实验结果

6.1 数据集与基线

论文基于快手电商平台的真实搜索日志记录,构建了三个数据集:

数据集 用户数 商品数 查询数 平均查询/用户 平均点击/用户
All-100K 99,683 1,072,791 362,859 6.55 1.81
All-50K 49,967 632,196 202,436 6.54 1.81
Fashion-27K 27,219 323,481 103,812 6.77 1.47

为什么要有 Fashion-27K?
Fashion-27K是专门从服饰类抽取的子集,服饰类商品有一个显著特点:同质化严重——同一类别下大量商品长得很像,仅靠关键词和基础语义很难区分。这是对模型细粒度意图理解能力的终极考验。

基线模型(用来对比的参照物)覆盖了两大阵营:

  • 匹配式方法:TF-IDF、BM25、BGE、Qwen3-Embedding
  • 生成式方法:GENRE、DSI、LTRGR、LatentR3

6.2 评估指标解读

论文使用了两个核心指标,我们先通俗地解释一下:

HR@N(Hit Rate,命中率)

e x t H R @ N = e x t 命中次数 e x t 总查询次数 ext{HR@N} = \frac{ ext{命中次数}}{ ext{总查询次数}} extHR@N=ext总查询次数ext命中次数

含义:在推荐的前 N N N 个商品中,至少有一个是用户真实点击的目标商品的比例。
HR@1 就是最推荐的那个商品是否命中,HR@10 就是前 10 个里有没有命中。

NDCG@N(归一化折损累积增益)

e x t D C G @ N = ∑ i = 1 N e x t r e l i log ⁡ 2 ( i + 1 ) ext{DCG@N} = \sum_{i=1}^{N} \frac{ ext{rel}_i}{\log_2(i+1)} extDCG@N=i=1Nlog2(i+1)extreli

e x t N D C G @ N = e x t D C G @ N e x t I D C G @ N ext{NDCG@N} = \frac{ ext{DCG@N}}{ ext{IDCG@N}} extNDCG@N=extIDCG@NextDCG@N

含义:不仅看有没有命中,还看命中的位置。排在第 1 位的命中比排在第 10 位的命中"更值钱"。NDCG 是 DCG 除以理想情况下的 DCG(IDCG),归一化到 [ 0 , 1 ] [0,1] [0,1] 区间(简单理解为把值压缩到[0,1]区间)。

通俗理解:HR 回答"找没找到",NDCG 回答"找到得好不好"。两个指标配合使用,能全面评估搜索质量。

6.3 主实验结果

数据集 指标 最强基线 LatentR3 CRS 相对提升
All-100K HR@10 0.2303 0.2419 5.06%
All-100K NDCG@10 0.1438 0.1612 12.10%
All-50K HR@10 0.2197 0.2570 17.02%
All-50K NDCG@10 0.1340 0.1678 25.22%
Fashion-27K HR@10 0.1690 0.2498 47.86%
Fashion-27K NDCG@10 0.1152 0.1617 40.36%

在大规模综合数据集上,CRS 取得了 3%~11% 的稳健提升;但在服饰类数据集上,CRS 实现了高达约 47% 的相对性能飞跃

为什么服饰类提升如此巨大?

因为服饰类商品同质化严重,传统方法很难仅凭查询词区分用户到底想要哪款。

CRS 的显式推理机制可以深入挖掘用户偏好(品牌、价格、风格),在"模糊查询 + 高度相似候选"的困难场景中优势被放大。

6.4 R-GRPO 消融实验

论文对比了 R-GRPO 与标准 GRPO 在三轮 RL 迭代中的表现:

迭代 方法 HR@1 HR@10 NDCG@5 NDCG@10
第1轮 GRPO 0.0746 0.1631 0.1208 0.1379
第1轮 R-GRPO 0.0766 0.1657 0.1229 0.1390
第2轮 GRPO 0.0828 0.1753 0.1310 0.1491
第2轮 R-GRPO 0.0838 0.1773 0.1327 0.1508
第3轮 GRPO 0.0851 0.1845 0.1364 0.1539
第3轮 R-GRPO 0.0863 0.1873 0.1390 0.1568

R-GRPO 在每一轮迭代、每一个指标上都优于标准 GRPO,平均提升约 1~2%。
虽然绝对数值看起来不大,但考虑到这已经是在一个训练良好的模型上做的微调,每一个百分点的提升都弥足珍贵。

6.5 冷启动场景:上下文越少,推理越重要

论文还考察了用户历史行为不足的场景(冷启动),将用户按历史查询数量分成三组:

  • ≤5 次查询:极度冷启动
  • 6~8 次查询:中等上下文
  • ≥9 次查询:上下文丰富

结果显示:

CRS 在冷启动场景下实现了 8.55% 的相对性能提升——上下文越少,CRS 的推理能力就越显珍贵。
因为当显式线索匮乏时,模型更需要通过推理从有限的蛛丝马迹中"推断"用户意图,这正是 CRS 的强项。

相比之下,匹配式方法 BGE 在三组用户上表现几乎不变,说明它根本"看不见"上下文信息——无论你搜过什么,它只看当前查询词。

6.6 模型规模扩展性

CRS 的效果随模型规模增长而持续提升:

模型规模 HR@1 HR@10 NDCG@5 NDCG@10
0.6B 0.0713 0.1690 0.1040 0.1152
1.7B(+3.4%) 0.0737 0.1716 0.1051 0.1172
4B(+5.5%) 0.0752 0.1766 0.1107 0.1214

这说明 CRS 框架具有良好的规模扩展性——给它更强的"大脑",它就能做出更好的推理。
这对于工业部署非常重要,意味着可以根据算力预算灵活选择模型规模。


七、一个完整的推理案例

论文给出了一个非常直观的案例,让我们看看 CRS 是如何"思考"的:

输入(简化版):

用户画像:31-40 岁,居住地西北西宁

历史搜索:

  • 搜索"iphonewatch 表带" → 未点击"兼容苹果手表编织磁扣表带"(品牌:无,价格 28.8)
  • 搜索"羽毛球包" → 点击 YONEX 羽毛球双肩包(品牌:YONEX,价格 189.0);未点击"防水羽毛球拍包"(品牌:无,价格 39.99)
  • 搜索"羽毛球服" → 点击 YONEX 羽毛球服(品牌:YONEX,价格 35.0);未点击"李梓嘉比赛级短袖套装"(品牌:无,价格 88.0)

当前查询:“定制羽毛球拍”,时间 06/16 18:42,地点 西宁

CRS 的推理输出

🤔 用户为31-40岁男性,表明较强的消费能力和对高端科技产品的偏好,倾向于选择功能强大且可靠的产品……

用户基于历史搜索行为,对"羽毛球装备"和"智能手表配件"等品类表现出持续兴趣,尤其是对 YONEX 品牌的产品有较高的点击频率。这表明较高的品牌忠诚度和选择知名品牌或畅销产品的倾向……

用户展现出较强的购买力,倾向于在预算内选择性价比明确、功能清晰、品牌信誉好的产品……

对于当前查询"定制羽毛球拍",预测目标品牌为 YONEX,因为用户在历史搜索中对该品牌产品有明确的偏好……

因此,目标产品名称应包含"新款"“专业”"进阶"等关键词,并反映较高的销量……

最终输出<a_60><b_95><c_95><d_0> → 对应一款 YONEX 专业羽毛球拍


八、总结与思考

8.1 CRS 回顾

总的来说,CRS 框架的核心贡献和创新点主要是在训练层面进行了系统性的优化。

  • 没有改变模型的基础神经网络架构(例如,仍使用标准的Qwen或mT5作为骨干)。
  • 没有改变任务的终极形式(输入上下文,输出商品SID)。

训练方面

模块 解决的问题 核心方法 关键公式/设计
上下文表征与对齐 异构信号难以统一利用 万物皆文本 + 残差 K-Means 量化 SID e i l + 1 = e i l − c s i l l \mathbf{e}_i^{l+1} = \mathbf{e}_i^l - \mathbf{c}_{s_i^l}^l eil+1=eilcsill
自进化后训练 缺乏推理轨迹标注 SFT 与 RL 交替循环 D r l i = e x t I n c o r r e c t ( D e x t t r a i n , M s f t i ) D_{rl}^i = ext{Incorrect}(D_{ ext{train}}, M_{sft}^i) Drli=extIncorrect(Dexttrain,Msfti)
R-GRPO 优化目标错位 + 奖励估计偏差 排序感知的奖励聚合 r i ∗ = 1 W ∑ n = 1 K r i n 1 + log ⁡ n r_i^* = \frac{1}{W}\sum_{n=1}^{K} \frac{r_i^n}{1+\log n} ri=W1n=1K1+lognrin

模块三:R-GRPO 去偏强化学习

多级奖励设计

排序感知的
奖励聚合

去偏的GRPO优化

模块二:自进化后训练

SFT: 监督微调
利用正确样本

RL: 强化学习
探索错误样本

模块一:上下文表征与对齐

异构信号统一
→ 结构化文本

商品→语义ID(SID)
残差K-Means量化

预训练对齐
Item-SID映射
Context→SID预测

推理方面: 1. 生成推理轨迹。 2. 预测 SID。

8.2 技术路线

关键词匹配时代
你搜什么 → 我找什么

语义检索时代
你说的 → 我理解的

语境推理时代
你想要的 → 我推断的

从这几年的技术路线来看,CRS 代表的"文本化上下文理解 + 强化学习推理优化"范式,具有很强的可迁移性——不局限于电商搜索,理论上可以推广到任何需要理解用户意图的场景:内容推荐、广告投放、智能客服……

8.3 局限与展望

论文也坦诚指出了 CRS 的一些局限:

  • 推理轨迹中偶尔出现重复或不一致的问题——模型有时会"绕圈子",自相矛盾
  • RL 训练过程中可能出现暂时的性能下降——探索是有风险的,模型偶尔会"走弯路"
  • 目前仅在离线数据上验证,在线 A/B 测试的结论还有待补充

未来可能的方向包括:排序阶段的强化学习优化、模型的实时更新机制、以及在推荐和广告等多业务场景中的落地验证。


论文信息

标题:Towards Context-aware Reasoning-enhanced Generative Searching in E-commerce

作者:Zhiding Liu, Ben Chen, Mingyue Cheng, Enhong Chen, Li Li, Chenyi Lei, Wenwu Ou, Han Li, Kun Gai

单位:中国科学技术大学 × 快手技术团队

会议:WWW 2026(ACM Web Conference 2026)

论文链接:arxiv.org/abs/2510.16925

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐