ReuseGR: Offline--Online Decoupled Generative Retrieval via Adaptive Prefix Reuse

Xujing Wang, Yufeng Chen, Boxuan Zhang, Chao Wei, Cai Xu, Jie Zhao, Weiru Zhang, Wei Zhao, Ziyu Guan · Alibaba / Xidian University · arXiv 2611.04259 · 发表 2026-11-03
12 分钟阅读时长 4516字 4.50综合分 第 1 名11-05 Generative 日报
目录 · 9 节1它到底在解决什么问题?2整体流程:离线定前缀,在线补后缀3每个搜索词该缓存几层?4在线小模型怎么补全?5为什么还要挑分支?6这套方案真的更好吗?7我认为它的局限8一个搜索团队可以怎么试9结论
相关 5新颖 4实用 4证据 5时效 5

做生成式检索上线的团队值得读:它给出了一种拆法,大模型的算力按搜索词复用,个性化留给在线小模型,并且有线上 A/B 验证。生成式检索换成更大的模型,召回更准,但在线逐个 token 解码太慢。可同一个搜索词每天被很多人搜,每次都从头生成完整的 Semantic ID 是在重复计算。ReuseGR 把活拆成两半:离线用大模型给每个搜索词先生成一批 SID 前缀,同词的请求共用;在线用小模型按当前用户的历史挑前缀,再补全剩下的 token。在一个搜索广告数据集上,假设前缀已提前缓存好,它的 HR@100 和全程在线跑大模型持平,在线延迟却低 57.7%;线上 A/B 里,点击率比原来的小模型方案相对提高 0.93%。

它到底在解决什么问题?

这篇论文的场景是搜索广告的召回:用户输入一个搜索词,系统要从 338 万个广告商品里先捞出一批候选,交给后面的排序。每个商品有一个 4 层的 SID,每层从 32 个码里选一个,前两层大致对应一个粗类目。生成式召回就是让模型读搜索词和用户最近的行为,一层一层生成 SID。

问题在于,同一个搜索词会被很多人搜。下面是一个示意:

请求(示意)搜索词用户最近行为生成的 SID
用户 A无线耳机看过运动手环12-07-19-03
用户 B无线耳机看过降噪耳机12-07-25-11
用户 C无线耳机没有历史12-07-02-30

三个请求的前两层几乎一样,因为它们主要由搜索词决定;真正因人而异的是后两层。全程在线的方案每来一个请求,都要从第一层重新解码一遍,前两层的计算是白重复的。

论文先用点击日志验证了这一点,这个分析叫 KeyProbe。它对比两种猜法,猜的都是一条点击记录在某一层的码。第一种只看同一个搜索词、前面几层码也相同的其他点击记录,取它们在这一层最常出现的码。第二种不看搜索词,取所有搜索词下同样前缀后面最常见的码。在 SID 第 1 层和第 2 层,看搜索词的猜法准确率分别高出 61.18 和 25.95 个百分点;到第 3 层只高 3.51 个点,第 4 层已经没有可靠差别。前几层主要由搜索词决定,后几层才轮到个人历史,这就是拆分的依据。

KeyProbe:每一层 SID 上,看搜索词的猜法比只看全局常见码高出多少准确率。前两层差距很大,后两层接近零,这是“前缀按搜索词共用”的依据
KeyProbe:每一层 SID 上,看搜索词的猜法比只看全局常见码高出多少准确率。前两层差距很大,后两层接近零,这是“前缀按搜索词共用”的依据
ReuseGR 的整体流程。上半部分是离线规划和在线补全,下半部分是两个小模型部件怎么训练。先看上半部分从左到右的数据流向
ReuseGR 的整体流程。上半部分是离线规划和在线补全,下半部分是两个小模型部件怎么训练。先看上半部分从左到右的数据流向

整体流程:离线定前缀,在线补后缀

阶段在哪儿跑输入产出
ReuseCut离线搜索词文本这个搜索词缓存几层前缀(0 到 3 层)
7B 规划模型离线只有搜索词每个搜索词最多 32 个前缀和它们的分数
0.5B 补全模型在线搜索词和当前用户历史从缓存前缀往下补全,给每个完整 SID 打分
BudgetCut在线打好分的候选分支最多保留 32 个分支,合并后取前 100 个 SID

关键分工是:大模型只看搜索词,算一次,所有搜这个词的人共用;小模型看个人历史,每个请求都算。缓存没命中的新搜索词,直接退回原来的 0.5B 端到端模型。其中预测深度大于 0 的搜索词会排队等离线补上缓存,预测深度为 0 的就一直走在线。请求从不等大模型。下面拆开讲三个部件。

每个搜索词该缓存几层?

缓存越深,在线要解码的层越少,可是留给个人历史挑选的余地也越小。比如一个搜索词缓存到第 3 层,在线就只剩最后一层可选。不同搜索词的合适深度差别很大,所以 ReuseCut 给每个搜索词单独定深度。

训练标签来自历史点击,算的是一种覆盖率。对某个搜索词的每条点击记录,先把这条记录拿掉,用这个词剩下的点击按点击量排出每一层的前 32 个前缀,再看这条记录点的 SID 的前缀在不在里面。在里面的记录占的比例,就是这一层的覆盖率。举个示意:一个搜索词有 20 条点击记录,第 1 层有 19 条的前缀能在别人排出的前 32 里找到,第 2 层有 15 条,第 3 层只有 6 条,覆盖率是 0.95、0.75、0.30。门槛设为 0.4,这个词的标签就是 2 层。论文实际用的是覆盖率的置信下界,点击少的搜索词会被判得更保守;记录少于 5 条的搜索词不参与深度分类器的训练。

有了标签,再训练一个很轻的分类器,只看搜索词的字符片段和长度,预测该缓存几层。这样从没出现过的搜索词也能拿到深度。

为什么不统一缓存 2 层?论文有一组直接的对照。按搜索词定深度时,候选范围里能找到的用户真实点击 SID 占 78.62%;统一 2 层时是 74.18%。更有说服力的是打乱实验:把同一批深度随机分给别的搜索词,深度的分布和平均在线步数都不变,HR@100 却掉了 3.17 个点。这说明收益来自深度和搜索词的匹配,而不是平均深度变了。

在线小模型怎么补全?

缓存里每个搜索词存三样东西:该缓存几层、前缀本身(SID 的前几个码),以及大模型给每个前缀的分数。存的是码和分数,不是模型的中间状态。

在线时,0.5B 补全模型先把搜索词和用户历史编码一次,所有分支共用这份 KV cache。然后以缓存的前缀为起点,由小模型自己往下解码到第 3 层,每一步优先展开总分最高的分支。缓存省掉的是前几层的搜索,也就是不用在线从全部码里一层层挑前缀;小模型往下生成时仍以前缀为条件,前缀的几个码要作为输入交给它。这样得到最多 64 个三层分支(论文叫 branch,就是 SID 的前三个码)。缓存深度本来就是 3 层的搜索词,直接用缓存里的前缀当分支。最后小模型一次性给每个分支下的第 4 层打分。一个完整 SID 的分数是两部分相加:离线大模型给前缀的分数,加上在线小模型对后面几层的打分。

小模型比大模型弱,所以作者用 7B 模型给它做蒸馏。做法是沿着用户真实点击的那条 SID 路径,让小模型在前缀之后那几层输出的概率分布去贴近大模型,同时保留一半权重的普通监督损失。这里有个不对称:老师只看搜索词,学生看搜索词加历史。只训练学生的 LoRA 参数,大模型和缓存都不动。这一步在延迟不变的情况下,把 HR@100 从 82.64% 提到 83.32%。

个性化到底有没有用?作者挑出 286,046 条请求,它们的用户历史和同一搜索词第一条记录的历史不同,在这些请求上,固定缓存和模型,只换历史输入。用真实历史比用同一搜索词下打乱的别人的历史,HR@100 高 1.43 个点。还有 5.67% 的请求,用户点的 SID 不在大模型只看搜索词给出的前 100 里,ReuseGR 靠个人历史把它找了回来。这说明缓存的是前缀而不是完整结果,才留出了个性化的空间。

为什么还要挑分支?

64 个分支每个下面最多 32 个叶子,全部合并后取前 100。问题是一个高分分支可能带进来一堆用户不会点的叶子,把真正相关的 SID 挤出前 100。举个示意的例子:分支 B 分数很高,但它的叶子大多没人点,合并后占掉了前 100 里的许多位置,把分支 C 里被点过的 SID 挤了出去。所以挑分支时要看合并重排后召回涨了多少,而不是只看分支自己的分数。

BudgetCut 就是学这个挑法。它的候选就是上一步那最多 64 个三层分支,每个分支下的叶子都已经打好分,它最多从中选 32 个。一个分支值不值得选,要看已经选了谁,所以它一个一个地选。每一步用一个两层 MLP 给剩下的分支打分。输入有四样:这个分支的 8 个特征,已选分支特征的平均,已经选了几个,以及还剩几个没选。8 个特征都直接取自打分结果:第 3 层这个码的原始分数和只在合法码里归一化后的对数概率,父前缀和分支本身的累计分,分支下有多少个合法叶子,以及最好那个叶子的分数、前 8 个叶子的平均分、前 8 个里有几个合法叶子。

训练分两步,都只在训练集上用点击标签。第一步先定义一个分支的召回增量:把它加进已选集合,合并所有叶子、按分数重排取前 100,看用户点过的 SID 被找回的比例涨了多少。挤掉了相关 SID 的分支,增量会是负的。在每一步,把剩下每个分支的增量直接当分数做 softmax,得到一组选择概率:增量越大概率越高,负增量的分支概率最低。策略的打分去贴近这组概率。第二步用 GRPO 直接优化整组选完后前 100 的召回。打分模型在训练时是冻结的,叶子分数可以提前存好,所以试不同组合时不需要重新生成 SID。线上推理时没有点击标签,只用训练好的 MLP 一个个挑分支。

和只按分数挑相比,BudgetCut 让 HR@100 多了 2.91 个点,延迟只多 0.42 毫秒;和不挑、全部合并相比,HR@100 高 2.50 个点,还省了 4.64 毫秒。少合并一些分支反而召回更高,因为被挤出去的往往正是相关的 SID。

这套方案真的更好吗?

离线评估用 44,225 个测试搜索词,单张 A100、批大小为 1,ReuseGR 假设前缀已经缓存好。

方法HR@100 (%)Recall@100 (%)平均延迟 (ms)
0.5B 端到端81.9945.53117.00
7B 端到端85.7150.96168.88
SmartGR(7B 蒸馏到 0.5B)83.5646.90114.20
OneRec-Think(缓存 2 层前缀)81.4844.9274.20
ReuseGR85.8246.0571.45

HR@100 和 7B 端到端持平,延迟从 168.88 毫秒降到 71.45 毫秒。和同样做前缀缓存的 OneRec-Think 比,延迟接近,HR@100 高 4.34 个点。整体方案在 HR@100 和延迟上更好,各个组件各贡献多少,要看后面分别做的对照实验。

线上在一个大型全球电商平台的搜索广告做了 14 天 A/B,两组各 10% 流量,ReuseGR 替换原来的 0.5B 端到端召回,其他召回通道和排序都不变。点击率提高 0.93%,千次请求收入提高 1.05%。

我认为它的局限

第一,HR@100 追平了 7B,Recall@100 还差得不少:46.05% 比 50.96%,还略低于 SmartGR 的 46.90%。一个搜索词平均有 15.77 个被点过的 SID,Recall 更接近召回的真实质量。

第二,收益依赖缓存命中。只给出现过的 9,276 个搜索词备缓存、其余走原模型时,整体 HR@100 是 82.38%,只比 0.5B 端到端的 81.99% 高一点。新搜索词多的场景,要靠异步补缓存追上来。

第三,线上每次点击的转化率降了 0.21%。每次请求的订单数涨了 0.78%,点击涨得更多,所以每次点击带来的订单略少。

一个搜索团队可以怎么试

  1. 先在自己的日志上做 KeyProbe 式的分析:按 SID 每层看,搜索词能多大程度决定这一层的码。如果前两层同样被搜索词主导,拆分才有基础。
  2. 从最便宜的版本开始:所有搜索词统一缓存 2 层前缀,在线小模型补全,对比原来的端到端召回。这一步看的是延迟能省多少、召回掉不掉。
  3. 有收益再加按搜索词定深度。用打乱深度的对照检查收益是否来自匹配本身。
  4. 最后再上蒸馏和分支挑选。BudgetCut 训练时打分模型冻结,可以离线反复试,成本不高。

结论

最值得带走的一点是:生成式召回里,由搜索词决定的那部分计算可以离线做一次、所有人共用,在线只为个人差异付费。

维度评价
问题重要性高。大模型生成式召回的延迟是上线的主要障碍
方法创新性中高。前缀缓存已有先例,按搜索词定深度和按召回挑分支是新的
实验证据强。有打乱深度、换历史等对照,还有 14 天线上 A/B
工程成本中。需要离线规划、缓存服务和未命中时的回退链路
是否值得尝试值得。搜索词重复度高、已有 SID 召回的团队可以先做统一深度版本

读完这篇,你觉得

点一下即可,无需登录;再点一次撤回。只统计匿名次数,不记录你是谁。

相关论文RELATED

  1. Generative · 2026-10-29PailitaoMMSearch2.0 Technical Report: Scaling Generative Retrieval to Unified End-to-End Multimodal Search淘宝拍立淘里,用户拍一件衬衫再说「找条配它的短裤」,要的是搭配而不是同款。传统做法先分意图、再分发到不同召回通道,任何一步分错后面全错。阿里这篇技术报告让一个 2B 视觉语言模型直接读原图和原话,生成商品的 Semantic ID,不需要意图标签。优秀率指前 10 个结果里被评审模型判满分的比例。「找搭配」请求的这一指标从多路召回链路的 44.2% 提到 74.3%,线上 GMV 提升 8.94%,已全量上线。
  2. Generative · 2026-07-23TSGR: Taobao Search Generative Retrieval淘宝搜索的 TSGR 在 SID 第 3 层按点击给商品排座次,并按 query 准备多套排序,让卖得好又贴合 query 的商品更容易被生成,同一模型再接打分模块做重排。离线 HR@1000 从 0.7735 提到 0.8651,线上 GMV +1.64%;但重排抬高了前 1000 命中、压低了前 20 命中。
  3. Generative · 2026-05-11UniVA: Unified Value Alignment for Generative Recommendation in Online Advertising at Tencent生成式广告推荐里,生成概率最高的广告不一定最赚钱。这篇论文找出价值流失的三处:编号只按内容分、解码只看概率、搜索浪费在投不了的广告上。编号最后一位改按商业条件和出价档位来分,解码时再加一个学出来的价值分,并且只在当前请求能投的广告里搜。在微信视频号 20% 流量上跑了 5 天,GMV 提升 1.50%。
  4. Generative · 2026-11-04Think Globally, Generate Personally: Multi-View Thinking with Adaptive Generation for Generative Recommendation做 SID 生成式推荐时,用户最近冒出来的新兴趣常被大量老行为盖住,所有用户也共用同一套输出变换。论文在 TIGER 这类模型上补这两处。生成之前,模型额外加两个专门的思考 token,一个只读用户的全部历史,一个只读最近几件物品。读出的两个向量排在解码器输入开头,生成每个码时都能参考。生成的时候,解码器输出的向量先过一组深浅不同的小适配模块,每个用户只走其中一条:看哪条路径在第一个 SID 位置给出的最高概率最大,就选哪条,不看深浅。在 Amazon Instruments 上,把所有测试用户的前 20 个推荐合在一起,出现过的不同 SID 占全部 SID 的比例从 TIGER 的 19.56% 提到 25.50%,命中率也更高。代价是三段式训练更繁琐,公开数据的历史也比线上短得多。
  5. Generative · 2026-11-02RoFiGR: Coarse Routing, Fine Refinement via Level-Adaptive Distillation in Multimodal Generative Recommendation生成式推荐逐个码地生成物品的 SID,前两层码一旦选错大分支,后面再准也找不回相关物品;而多模态推荐里的 SID 多按图文语义构建,前几个码未必反映哪些物品常被同一批用户购买。这篇论文的 RoFiGR 因此把协同信息集中用在前两层码上。建 SID 时,它让每个物品前两层码向量之和,去贴近一个冻结的序列推荐模型(MISSRec)从用户行为里学到的同一物品的 embedding;生成时再用这个模型当老师:它给每个物品打分,一个分支下所有物品的概率加起来,就是这个分支该有的概率,学生每一步向它学。在三个亚马逊数据集上,五个排序指标(HR@10、NDCG@10 等)共 15 组比较全部领先,这 15 组相对最强基线的提升平均约 9.4%。
  6. Generative · 2026-11-02PFA: Attention Can Be Progressively Focused in Long-Sequence Generative Recommendation阿里的作者发现,生成式推荐做 beam 解码时,越往后注意力越集中在少数几条历史行为上,而且哪些行为重要,前后几步基本不变。据此提出的 PFA 把挑选重要历史这件事,从每步、每条 beam 各挑一次,改成整个解码只挑一次。它在解码第一步照常看完整历史;到第二步,把各条 beam 对历史的注意力按生成概率加权汇总,排出一份共用的重要行为排名,后面每步保留的行为数按固定比例缩小。在电商广告平台的线上 A/B 中,用户历史从 128 条加长到 512 条,收入提升 3.76%。响应时间仍比直接读完整历史更短。
  7. Generative · 2026-11-02UGR: Unified Generative Ranking for Heterogeneous E-commerce Recommendation淘宝的生成式排序框架 UGR 让一个生成模型直接排出用户最后看到的那一屏:一次请求里约一千个自然内容、广告和其他业务的候选一起交给它,逐个生成最终列表,不再由各业务先各自排好、再交给混排拼接。拼接这一步正是原来的毛病:生成模型排好的列表被混排插进别的内容,位置和上下文都变了,模型学到的前后顺序就不成立了。在猜你喜欢的线上 A/B 中,成交量提升 3.29%;同一个模型只排自然内容、再交给原来的混排,成交量只涨 2.84%,差出来的部分就是统一生成本身的收益。
  8. Generative · 2026-10-29KL-MOPD: Discrepancy-Aware Multi-Objective On-Policy Distillation for Generative Recommendation把点击老师和价值老师一起蒸馏进生成式推荐时,每个 token 平分权重并不公平:在 TencentGR 上,学生生成第 1 个 token 时离价值老师的 KL 是离点击老师的 3.13 倍,而且难学的老师在后两个 token 换成了点击老师。浙大和阿里的 KL-MOPD 在训练前算一次学生离两个老师的距离,每个 token 上离得更远的老师拿更大的权重,训练时没有额外开销。线上 A/B 中,广告收入提升 1.63%,说明点击和价值两个目标一起涨了。

讨论

欢迎补充实验细节、复现经验或不同看法。需 GitHub 登录。

正在加载讨论…