【论文分享】告别思维链内耗:为什么检索不需要“做题家逻辑”?腾讯微信 ACM MM 2026 新作 RIME 深度拆解

在大模型时代,思维链(Chain-of-Thought, CoT) 几乎成了提升模型智能的“灵丹妙药”——无论是数学题、写代码,还是通用推理,让模型先在 <think> 里走一遍“心路历程”,最后再给出 <answer> 结论,模型能力往往能得到质的飞跃。

当这股浪潮席卷到多模态向量检索(Multimodal Embedding & Retrieval)领域时,学术界也顺理成章地涌现出了一批 “生成式向量模型”:在生成图文、视频的向量特征前,先逼着大模型推导一通,再拿总结句的隐藏状态做 Embedding。

然而,当工程师真正把这套逻辑搬进线上检索系统(如视频搜索、图搜、相册检索、多模态 RAG)时,却遭遇了残酷的现实毒打:

  1. 废话冗余(Thinking Redundancy):搜一张“小狗在草坪玩球”的图,大模型却在草稿纸上洋洋洒洒推导了 400 多个字,算力吃紧、延迟爆炸;
  2. 强行下结论反而误导检索(Target Ambiguity):检索不是单选题!画面明明包含了人物、服饰、动作、道具和环境,CoT 却在最后强行总结了一句狭隘的结论,反而把原本丰富的多维语义“以偏概全”给阉割了;
  3. 线上高并发彻底趴窝:面对用户几十毫秒级的高并发搜索请求,每次检索让大模型先吐几百个字,线上集群成本直接失控。

难道在向量检索的世界里,思维链真的是一剂“方向错误”的猛药?

近日,来自腾讯微信视觉团队(WeChat Vision)、浙江大学、清华大学等机构的研究人员在多媒体顶会 ACM MM 2026 发表了一篇反思之作,给出了颠覆性的新范式:

《Beyond Chain-of-Thought: Rewrite as a Universal Interface for Generative Multimodal Embeddings》 (arXiv:2604.22280)
GitHub 源码:https://github.com/PeppaWu/RIME
Hugging Face 权重:leafyseay/RIME-7B | leafyseay/RIME-2B

作者一针见血地指出:向量检索不需要“解题式推导”,而是需要“客观结构化的事实重构”! 论文提出了全新的 RIME(Rewrite-driven Multimodal Embedding) 框架:

  • 坚决丢弃 <answer> 总结标签,用模态感知的 结构化客观重写(Rewrite) 替代主观 CoT;
  • 独创 跨模式对齐(CMA) 机制,打通离线高精度重写与线上 0 延迟秒搜;
  • 配合 精炼强化学习(Refine-RL) 以判别式特征为基准底线,砍掉约 50% 的思考长度,并在权威基准 MMEB-V2、视频基准 UVRB 上全面刷新开源 7B 模型的最高纪录!

本文将为你深度拆解 RIME 的核心痛点诊断、三大数学创新机制、官方源码实现,以及对实际工业级视频/图文搜索系统的落地指导。

论文题目:Beyond Chain-of-Thought: Rewrite as a Universal Interface for Generative Multimodal Embeddings
作者团队:Peixi Wu, Ke Mei, Feipeng Ma, Bosong Chai, Zhibin Lan, Chenxi Zhao, Shannan Yan, Jie Chen, Zhangchi Hu, Yansong Peng, Bo Lin, Junjie Zhou, Dacheng Yin, Tianyi Wang, Fengyun Rao, Jing Lyu, Hebei Li, Xiaoyan Sun(腾讯微信团队、浙江大学、清华大学、合肥综合性国家科学中心等)
论文链接:https://arxiv.org/abs/2604.22280
开源代码:https://github.com/PeppaWu/RIME
核心领域:多模态表征学习、向量检索、查询重写、强化学习、视频搜索


01. 寻根溯源:为什么“做题家思维(CoT)”在检索里会帮倒忙?

要理解 RIME 的革新,首先要看懂向量检索的演进路线。

在多模态检索中,我们的目标是给多模态数据(文本、图像、视频、PDF文档)发一张高维的 “数字身份证(Embedding)”,使得语义相近的内容在向量空间里的余弦距离越近越好。

目前业界主要存在两大流派:

1
2
3
4
5
路线 A:传统判别式 (Discriminative)
输入 (图/文/视) ──────► 基础编码 ──────► 直接抠取最后一层隐藏向量 (快速,但表层语义易丢失)

路线 B:传统思维链生成式 (CoT Generative)
输入 (图/文/视) ──────► <think>长篇推导...</think> ──────► <answer>确切结论</answer> ──────► 向量 (慢、冗余、易偏)

很多团队原以为路线 B 引入了推理,必定全方位吊打路线 A。然而在真实的通用多模态检索任务中,CoT 模式暴露出了三大深层次“内耗”:

1. 推理过程严重冗余(Reasoning Redundancy)

数学和逻辑推理需要步步为营的推演,但多模态检索(例如从相册里搜“公园草地上的一只柴犬”)本质上是多特征快速模式匹配。让大模型慢吞吞地输出几百字的“心路历程”,除了徒增 Token 消耗与算力成本,对判别核心特征毫无实质贡献。

2. 强行下结论带来语义畸变(Target Ambiguity & Semantic Bias)

这是本篇论文最具洞察力的论点:检索任务的目标往往是开放、多粒度、非唯一的,它不是单选题!

  • 举个例子:一段 10 秒的视频里,主角在白板前讲解系统架构,同时窗外在下雨,桌上有一杯冒着热气的咖啡。
  • 如果让传统 CoT 去推理,模型往往会在结尾给出一个聚焦的结论:<answer>结论:一名讲师在分析微服务架构</answer>。
  • 灾难随之而来:一旦模型给出了这一句单一维度的答案,Embedding 向量就会被高度固化在“讲师/架构”上。如果用户搜索“下雨天的办公室环境”或“白色马克杯”,这个视频切片就会因为过度归纳带来的特征阉割而彻底漏检!

3. 线上吞吐与延迟不可承受(Inference Inefficiency)

大规模工业检索系统(如微信搜一搜、小红书图搜、电商搜同款)对 P99 延迟的要求往往在几十毫秒以内。每次搜索如果都要大模型自回归解码吐出 400 多个 Token,哪怕使用算力集群也无法承受高并发的 QPS 压力。


02. 破局之道:RIME 结构化重写(Rewrite-Driven Joint SFT)

面对上述矛盾,腾讯微信团队提出:把模型的关注点从“主观推断结果(Reasoning)”,转移到“客观结构化重述(Recaption & Expansion)”上!

1
2
输入多模态数据 ────► 模态感知结构化重写 ────► 提取 <gen_emb> 向量
(主体/背景/时序/图文) (坚决不写 <answer> 总结)

1. 模态感知的结构化重写(Modality-Aware Rewrite)

RIME 针对不同输入模态,设计了专门的重写指导:

  • 针对纯文本:消歧义、挖掘隐含常识、提取关键实体与逻辑关系;
  • 针对图像:客观描述主体、外观衣着、动作、背景环境细节与可见文本(OCR),保持客观中立;
  • 针对视频:详细记录主体动作的时间轴演进(先发生什么、后发生什么)、场景运镜切换与字幕台词对齐;
  • 针对图文混合/问答:解析图文互补信息,不做多余的内心戏猜测。

最关键的设计在于:坚决砍掉 <answer> 标签! 允许保留丰富细节,让特征空间覆盖多维属性,不做单一维度的强制压缩。

2. 重写与检索的联合端到端优化(Joint SFT)

在阶段一训练中,作者放弃了传统的“先用外部模型重写、再喂给检索模型”的脱节做法,而是让同一个多模态大模型进行端到端联合训练。

模型由两部分损失函数共同驱动:

LJoint=λ⋅LRewrite+LCM_InfoNCE\mathcal{L}_{\text{Joint}} = \lambda \cdot \mathcal{L}_{\text{Rewrite}} + \mathcal{L}_{\text{CM\_InfoNCE}}

  • LRewrite\mathcal{L}_{\text{Rewrite}}(自回归语言建模损失):保证模型能写出语法通顺、客观准确的结构化描述;
  • LCM_InfoNCE\mathcal{L}_{\text{CM\_InfoNCE}}(跨模式对比学习损失):拉近正样本向量、推开负样本向量;
  • λ\lambda(平衡因子):论文消融实验表明,当 λ=1.0\lambda = 1.0 时,生成质量与特征判别力达成最佳共振。

03. 工业落地的神来之笔:跨模式对齐(CMA)机制

如果每次检索都要跑一遍重写,延迟问题依然无法彻底解决。为此,论文引入了最值得工程团队借鉴的核心模块:跨模式对齐(Cross-Mode Alignment, CMA)。

传统的 Embedding 系统中,“直接算出来的极速向量(Disc)”与“重写生成的深度向量(Gen)”由于训练分布不同,处于完全不同的高维几何空间,无法混用。

CMA 在训练中引入了模态内互对比损失(Lintra\mathcal{L}_{intra}):

Lintra=−1N∑i=1Nlog⁡exp⁡(fθ(qi)⋅fθ(ti,oti)/τ)∑j=1Nexp⁡(fθ(qi)⋅fθ(tj,otj)/τ)−1N∑i=1Nlog⁡exp⁡(fθ(qi,oqi)⋅fθ(ti)/τ)∑j=1Nexp⁡(fθ(qi,oqi)⋅fθ(tj)/τ)\begin{aligned} \mathcal{L}_{intra} = & -\frac{1}{N}\sum_{i=1}^{N}\log\frac{\exp\left(\mathbf{f_\theta(q_i) \cdot f_\theta(t_i, o^{t_i})} / \tau\right)}{\sum_{j=1}^{N}\exp\left(f_\theta(q_i) \cdot f_\theta(t_j, o^{t_j}) / \tau\right)} \\ & -\frac{1}{N}\sum_{i=1}^{N}\log\frac{\exp\left(\mathbf{f_\theta(q_i, o^{q_i}) \cdot f_\theta(t_i)} / \tau\right)}{\sum_{j=1}^{N}\exp\left(f_\theta(q_i, o^{q_i}) \cdot f_\theta(t_j) / \tau\right)} \end{aligned}

总对比损失为:

LCM_InfoNCE=Ldisc+Lgen+Lintra\mathcal{L}_{\text{CM\_InfoNCE}} = \mathcal{L}_{disc} + \mathcal{L}_{gen} + \mathcal{L}_{intra}

CMA 带来的工程革命:Disc-Gen 混合检索

通过 Lintra\mathcal{L}_{intra} 的强制拉齐,判别式空间与生成式空间被无缝缝合在同一个坐标系下。这使得线上部署可以采用一种极具性价比的混合检索模式(Disc-Gen):

1
2
3
4
5
6
7
8
9
10
【离线建库端 (Target)】                     【在线搜索端 (Query)】
海量视频/图片/文档 用户实时搜索词
│ │
▼ (离线计算,不赶时间) ▼ (线上并发,毫秒级响应)
调用 RIME Gen 模式 调用 RIME Disc 模式
(完整结构化重写,生成高质量 gen_emb) (0 token 生成开销,直接输出 disc_emb)
│ │
▼ ▼
存入向量数据库 ◄────────── 向量点乘检索 ─────────┘
(如 MyScaleDB)

在论文 Table 6 的消融实验中,这种 Disc-Gen 混合模式在 Query 端生成 Token 数为 0 的前提下,检索综合分直接从纯判别式的 55.8 飙升至 57.0!用几乎为零的在线延迟开销,稳稳赚取了离线深度特征的精度红利。


04. 告别废话:精炼强化学习(Refine-RL)

在第一阶段(SFT)训练完成后,模型虽然学会了客观重写,但有时候依然会有说套话、生成较长冗余文本的问题。

作者设计了第二阶段训练:基于 GRPO(群组相对策略优化)的精炼强化学习(Refine-RL)。

巧妙的奖励函数设计(Reward Engineering)

模型针对一个 Query 采样 K=8K=8 个重写 Rollout,并由三个裁判进行联合打分:

R(o)=RFormat(o)+RGap(o)+RProcess(o)\mathcal{R}(o) = \mathcal{R}_{\text{Format}}(o) + \mathcal{R}_{\text{Gap}}(o) + \mathcal{R}_{\text{Process}}(o)

  1. 格式奖(RFormat\mathcal{R}_{\text{Format}}):判断输出是否严格遵守规定的重写模板;
  2. 区分度奖(RGap\mathcal{R}_{\text{Gap}}):计算重写生成后,正样本与负样本之间的向量相似度分差:

    RGap(o)=E[fθ(q,o)⋅fθ(t+,ot+)]−E[fθ(q,o)⋅fθ(t−,ot−)]\mathcal{R}_{\text{Gap}}(o) = \mathbb{E}\left[f_\theta(q,o) \cdot f_\theta(t^+, o^{t^+})\right] - \mathbb{E}\left[f_\theta(q,o) \cdot f_\theta(t^-, o^{t^-})\right]

  3. 过程增益奖(RProcess\mathcal{R}_{\text{Process}},最精髓的一环):

    RProcess(o)={1,若 RGap(o)>(fθ(q)⋅fθ(t+)−fθ(q)⋅fθ(t−))⏟不思考时的判别式基准区分度0,否则\mathcal{R}_{\text{Process}}(o) = \begin{cases} 1, & \text{若 } \mathcal{R}_{\text{Gap}}(o) > \underbrace{\left(f_\theta(q) \cdot f_\theta(t^+) - f_\theta(q) \cdot f_\theta(t^-)\right)}_{\text{不思考时的判别式基准区分度}} \\ 0, & \text{否则} \end{cases}

设计玄机:传统的强化学习很难给检索步骤打过程分。RIME 极为聪明地把“未经重写、直接算出来的向量区分度”当成了底线基准!如果你大模型噼里啪啦写了几百字,最后算出来的正负样本差距还不如你没思考的时候,增益奖直接判 0 分!这一招“拿判别式当底线锚点”的策略,逼着模型彻底戒掉无意义的空话,把思考长度从传统模型的 475 tokens 硬生生腰斩至 212~232 tokens。


05. 战力大阅兵:权威基准全方位对比

作者基于 Qwen2-VL-7B-Instruct 与 Qwen2-VL-2B-Instruct 训练了 RIME 模型,并在四大公开基准上进行了系统盲测。

1. 全能多模态评测:MMEB-V2(78 个子数据集终极考验)

模型名称 模型底座 图像综合分 (36任务) 视频综合分 (18任务) 文档图表分 (24任务) 全任务总分 (78任务)
VLM2Vec-7B Qwen2-VL 65.5 34.0 46.4 52.3
GME-7B 56.0 38.6 75.2 57.8
CAFe-7B LLaVA-OV 67.6 42.4 63.9 60.6
UME-R1-7B (此前 SOTA 推理模型) Qwen2-VL 71.3 47.5 67.1 64.5
RIME-7B (本文模型) ⭐ Qwen2-VL 73.4 49.4 75.6 68.6(断层第一)

在 7B 开源参数量下,RIME-7B 取得了 68.6 分的惊艳战绩,高出此前同量级最强的推理检索模型 UME-R1 整整 4.1 分!

2. 视频检索专项大考:UVRB(16 个视频数据集)

在考验连续动作、时序演进与长视频理解的 UVRB 评测中,RIME 展现出统治级的时序辨识能力:

  • 时序与动作敏感度(Temporal):RIME-7B 达到 43.6 分,在所有开源对比模型中位列第一;
  • 长视频理解(Long-Context):得分高达 81.6 分,甚至超越了额外使用大量未公开数据的专用视频模型。

3. 重写 vs 思维链消融对比(数据说话)

论文 Table 4 揭示了极具启发的实验事实:

1
2
3
4
5
6
7
评测模式                     MMEB-V2 综合分      平均思考 Token 数
─────────────────────────────────────────────────────────────
传统 CoT (带总结答案) 59.1 475
传统 CoT (去掉了总结答案) 60.5 (+1.4) 417
RIME 结构化重写 (带总结答案) 61.2 246
RIME 结构化重写 (纯客观无总结) 63.5 (+2.3) 212
RIME (重写 + Refine-RL) 64.1 (+5.0) 232

从数据可以清晰得出结论:

  1. 拿掉强行总结,分数必然上升:无论是 CoT 还是重写,只要去掉总结答案,分数都会直接上涨,坐实了“检索任务中强行下结论确实会劣化向量”的论断;
  2. 重写天然比推理更紧凑:纯重写仅用 212 tokens 就把基准分推到了 63.5,证明高质量事实描述才是提升多模态特征密度的正道。

06. 源码解密:官方是如何抠出 <gen_emb> 向量的?

很多同学好奇,一个多模态对话大模型(Qwen2-VL)究竟如何在代码里同时完成“生成文本”和“抽取向量”?

查看作者开源在 GitHub 上的 demo/video_gen_embed_demo.py 源码,其实现逻辑异常干净:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from qwen_vl_utils import process_vision_info
import torch

# 1. 注入包含特殊标记的指示词
PROMPT = (
"\n<disc_emb>\n"
"Given the above input text, images, videos, or any combination of the three. "
"First output the thinking process in <think> </think> tags. "
"Then, use the <gen_emb> embedding tag to summarize both the thinking process and all the input given."
)

def encode_gen(model, processor, messages):
text = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
image_inputs, video_inputs = process_vision_info(messages)
inputs = processor(text=[text], images=image_inputs, videos=video_inputs, return_tensors="pt").to(model.device)

# 2. 正常调用 generate,但开启 output_hidden_states=True
out = model.generate(
**inputs,
max_new_tokens=2048,
output_hidden_states=True, # 关键:保留生成过程中的每一层特征
return_dict_in_generate=True,
use_cache=True
)

gen_ids = [o[len(i):] for i, o in zip(inputs.input_ids, out.sequences)]
emb_token_id = processor.tokenizer.get_vocab()["<gen_emb>"]

# 3. 找到 <gen_emb> 特殊 Token 所在的生成步数位置
idx = -1
for j in range(len(gen_ids[0]) - 1, -1, -1):
if gen_ids[0][j] == emb_token_id:
idx = j + 1
break

# 4. 提取大模型在生成 <gen_emb> 瞬间最后一层隐藏状态,并做 L2 归一化
emb = out.hidden_states[idx][-1].squeeze(1)
emb = torch.nn.functional.normalize(emb, p=2, dim=-1)

return emb # 输出 3584 维检索向量!

而在极速判别式模式(encode_disc)下,模型完全不执行自回归循环,直接通过一次前向传播(Forward)提取 <disc_emb> 处的隐藏状态,耗时仅几毫秒,做到了纯粹的秒级推理。


07. 工业工程落地启示:对视频搜索/多模态检索系统的实战建议

对于正在搭建或优化视频检索、以图搜图、多模态 RAG 系统的团队,RIME 提供了极其宝贵的设计指导:

  1. 果断抛弃“单一主旨式”视频标注:在做长视频切片索引时,切忌让大模型打单一标签(例如“主旨:科技讲座”)。视频包含复杂的时空信息,必须采用类似 RIME 的分块描述模版:[主体与连续动作] + [场景环境与可见文字] + [时序演进过程] + [音画对应],只有全维度无损描述,才能保证后续任意长尾 Query 的精准召回。
  2. 离线与在线解耦(Disc-Gen 范式):
    • 离线入库:对于切分好的数万段视频切片,在后台调用高精度的重写生成式模式(Gen),将蕴含丰富语义的 3584 维向量写入向量数据库(如 MyScaleDB、Milvus);
    • 在线检索:用户请求到来时,直接走不带长思考的极速模式(Disc),毫秒级算出 Query 向量直接下发数据库,兼顾高 QPS 与高精度召回。
  3. 两步走实施路线:
    • 快速验证:可以直接从 Hugging Face 拉取开源权重 leafyseay/RIME-7B 进行视频检索效果实测;
    • 现有架构平替:如果业务绑定了现有的向量模型(如 Qwen3-VL-Embedding),可以在离线切片时,用通义千问或开源 LLM 严格按照无总结重写 Prompt 提炼出富文本,再将“富文本+关键帧”喂给现有 Embedding 模型,也能零算力成本白嫖绝大部分语义重构收益。

08. 零微调实操指南:不修改 Qwen3-VL + Qwen3-VL-Embedding,如何工程复现 RIME 收益?

在许多实际工程团队中,算法资源往往有限:既没有 32 张 A800 GPU 去跑 Joint SFT 和 Refine-RL,也不想维护一个私有修改了词表(增加 <gen_emb>)的定制模型。大家更希望基于官方开源的原生 Qwen3-VL(负责生成) 与 Qwen3-VL-Embedding(负责特征提取) 开箱即用。

我们完全可以通过 “工程解耦流水线(Pipeline Engineering)”,零代码修改、零模型微调,完整复刻 RIME 的全部核心收益!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
【原始视频切片】 (关键帧 + ASR字幕)
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 步骤 1:调用原生 Qwen3-VL (Instruct 对话模型) │
│ · 作用:担任 RIME 重写引擎 (Rewrite Engine) │
│ · 运行特定的“无总结、多维度客观重述”Prompt │
│ · 输出:结构化客观富文本 (Rich Caption) │
└──────────────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 步骤 2:调用原生 Qwen3-VL-Embedding (专用向量模型) │
│ · 作用:担任 RIME 向量编码器 (Embedding Encoder) │
│ · 输入:【重写后的富文本 + 视频关键帧】 │
│ · 输出:融合了视觉像素与展开语义的高质量稠密向量 (Dense Vector) │
└──────────────────────────────┬──────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 步骤 3:写入向量数据库 (如 MyScaleDB) │
│ · 向量列:存入 Qwen3-VL-Embedding 生成的向量 │
│ · 标量列:顺便存入重写富文本,直接解锁 BM25 全文检索能力! │
└─────────────────────────────────────────────────────────────┘

1. 为什么“解耦双模型”能达到与 RIME 几乎相同的效果?

RIME 论文之所以能够战胜传统 CoT,其核心原因并不是 <gen_emb> 隐藏层本身有多么神奇,而是其数据表征机制的根本胜利:

  1. 展开了高维特征:视频画面里的主体、光影、时序动作、屏幕文字等原本在单张图像里是“隐式、低密度”的,通过大模型重述,被强制翻译成了显式的语义概念;
  2. 避开了以偏概全:坚决不写 <answer> 强行总结,保留了所有的多维度线索;
  3. Qwen3-VL-Embedding 天生支持多模态输入:阿里的 Qwen3-VL-Embedding 本身就是为了将“文本 + 图片”联合映射到度量空间而预训练的。只要你喂给它的文本不再是短短一句干瘪的字幕,而是一段经过 Qwen3-VL 展开后的无偏见、高质量客观重述,它所输出的向量质量便会产生质的飞跃!

2. 离线入库端:针对原生 Qwen3-VL 的重写 Prompt

在视频切片完成(例如使用 Qwen3-8B 完成镜头边界检测,获得 5~15 秒片段)后,对每个切片抽取出 1~3 帧代表性关键帧,并附带该时段的 ASR 字幕,直接调用未微调的 Qwen3-VL-Instruct:

1
2
3
4
5
6
7
8
9
10
11
12
13
[系统提示词]
你是一个视频内容客观特征解构助手。请仔细观察提供的视频关键帧,并结合同期字幕,按照统一规范对该视频片段进行结构化的客观重写。

[重构规范]
1. 【主体与动作】:详细指出画面中出现的关键主体(人物、动物、交通工具、标志物等)及其外观特征,并描述其核心连续动作;
2. 【场景与环境】:描述镜头所处的物理空间(如会议室、雪地、街道、机房)、光线氛围、背景陈设,以及画面中清晰可见的文字、牌匾、UI图表(OCR);
3. 【时序演进】:按时间先后顺序,记录动作或场景的变化过程(“首先……随后……最后……”);
4. 【图文互补】:说明画面动作与字幕台词之间的关联性(如有)。

[强制约束]
- 严禁揣测人物的主观心理、意图或虚构未发生的情节;
- 严禁在结尾输出任何类似于“本片段总结为:XXX”或“核心主旨是:XXX”的归纳性答案;
- 请直接输出结构化文本本身,保持客观中立。

Qwen3-VL 实际生成的客观重述样例:

【主体与动作】:一名身穿灰色连帽卫衣、戴黑色手套的年轻男子,在覆雪的院落中弯腰捡起一个红色橡胶飞盘,随即向右前方抛掷。一只中型金毛寻回犬迅速起跑追逐飞盘。
【场景与环境】:室外开阔庭院,地面覆盖约10厘米积雪,背景有一排落叶后的枯树与木质白色篱笆,光线为阴天柔和漫反射。篱笆右侧隐约可见一辆黑色轿车车尾。
【时序演进】:男子先弯腰拾物,金毛犬在侧方等待;男子扬手抛出飞盘后,金毛犬立即起步冲入雪地,雪花飞溅;最后男子直立看向犬奔跑方向。
【图文互补】:同期字幕台词“快去捡回来,好狗”与男子挥手抛飞盘的动作完全同步。


3. 向量提取端:直接调用 Qwen3-VL-Embedding 生成复合特征

拿到上述展开后的客观重写富文本后,将 “重写文本” 与 “关键帧图片” 一起喂给官方原生的 Qwen3-VL-Embedding。

完整的 Python 端到端极简调用代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import torch
from transformers import AutoModel, AutoProcessor, Qwen2VLForConditionalGeneration

# ----------------- 1. 初始化两个官方原生模型 -----------------
# 负责生成的通用多模态模型 (生成客观描述)
rewrite_model = Qwen2VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen3-VL-8B-Instruct",
torch_dtype=torch.bfloat16,
device_map="cuda:0"
)
rewrite_processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-8B-Instruct")

# 负责提取向量特征的专用向量模型 (官方原生,无需微调)
embed_model = AutoModel.from_pretrained(
"Qwen/Qwen3-VL-Embedding",
torch_dtype=torch.bfloat16,
device_map="cuda:1",
trust_remote_code=True
)
embed_processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-Embedding", trust_remote_code=True)

def rime_style_pipeline(video_frames, subtitles):
"""
零微调复现 RIME 收益的双模型工程流水线
"""
# ----------------- 步骤 A: Qwen3-VL 生成客观重述 -----------------
prompt_text = (
"你是一个视频特征解构助手。请仔细观察视频帧并结合字幕进行客观重构:"
f"字幕内容:『{subtitles}』。\n"
"请按【主体与动作】【场景与环境】【时序演进】【图文互补】展开客观描述,严禁输出总结结论。"
)

messages = [{
"role": "user",
"content": [
{"type": "image", "image": frame} for frame in video_frames
] + [{"type": "text", "text": prompt_text}]
}]

chat_text = rewrite_processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
inputs = rewrite_processor(text=[chat_text], images=video_frames, return_tensors="pt").to(rewrite_model.device)

with torch.no_grad():
out = rewrite_model.generate(**inputs, max_new_tokens=512)

# 提取重构富文本 (Rich Caption)
rewrite_text = rewrite_processor.batch_decode(out[:, inputs.input_ids.shape[1]:], skip_special_tokens=True)[0]

# ----------------- 步骤 B: Qwen3-VL-Embedding 生成最终稠密向量 -----------------
# 将重构富文本作为 Prompt 文本,与图像关键帧一同喂入向量模型
embed_inputs = embed_processor(
text=[rewrite_text],
images=video_frames,
return_tensors="pt"
).to(embed_model.device)

with torch.no_grad():
# 获取 Embedding 模型的归一化特征向量
embeddings = embed_model(**embed_inputs)
# 取池化或最后一层特征向量 (取决于 Qwen3-VL-Embedding 官方接口规范)
feature_vector = embeddings.last_hidden_state[:, -1, :]
normalized_vector = torch.nn.functional.normalize(feature_vector, p=2, dim=-1)

return {
"vector": normalized_vector.cpu().squeeze(0).tolist(), # 存入 MyScaleDB 的向量
"rich_caption": rewrite_text # 存入 MyScaleDB 的全文检索字段
}

4. 数据库存储与在线检索协同(MyScaleDB 双重红利)

采用这种工程解耦方案,你不仅获得了与 RIME 相当的高精度向量,还顺便获得了一个巨大的副产物——极度详尽的客观结构化文本(rich_caption)。

在写入 MyScaleDB 时,你可以建立真正的多模态双路召回系统:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-- 1. 创建 MyScaleDB 表:同时支持向量检索与文本全文检索 (BM25)
CREATE TABLE video_knowledge_repo (
video_id String,
chunk_id UInt32,
start_time Float32,
end_time Float32,
subtitles String,
rich_caption String, -- 保存 Qwen3-VL 生成的重述,建立文本倒排索引
feature_emb Array(Float32), -- 保存 Qwen3-VL-Embedding 生成的复合向量
CONSTRAINT check_len CHECK length(feature_emb) = 1536
) ENGINE = ReplacingMergeTree()
ORDER BY (video_id, chunk_id);

-- 2. 建立向量索引 (MSTG)
ALTER TABLE video_knowledge_repo ADD VECTOR INDEX v_idx feature_emb TYPE MSTG('metric_type=Cosine');

-- 3. 对 rich_caption 建立全文分词索引
ALTER TABLE video_knowledge_repo ADD INDEX txt_idx rich_caption TYPE ngrambf_v1(4, 1024, 2, 0);

在线用户查询(线上秒级响应):

当线上用户发起搜索(如:“找一下雪地里扔飞盘的片段”)时:

  1. 0 延迟向量化:直接把搜索词喂给 Qwen3-VL-Embedding,在 5~10 毫秒 内提取出 Query 向量;
  2. 混合 SQL 检索:利用 MyScaleDB 强大的向量与标量联合能力,同时结合向量相似度与关键词打分:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    video_id,
    start_time,
    end_time,
    rich_caption,
    distance(feature_emb, {query_vector}) AS vector_dist
    FROM video_knowledge_repo
    WHERE (rich_caption LIKE '%飞盘%' OR rich_caption LIKE '%雪地%') -- 快速候选粗筛
    ORDER BY vector_dist ASC -- 精确向量重排
    LIMIT 10;

方案总结对比:

方案路径 模型是否需微调 算力门槛 离线建库耗时 在线响应延迟 额外收益
RIME 原生单模型 需要 Joint SFT + RL 极高 (32×A800) 单次模型前向 毫秒级 (Disc 模式) 论文原版最佳对齐度
Qwen3-VL 双模型解耦流水线 (推荐) 完全无需微调 (开箱即用) 零门槛 两次前向 (离线异步可接受) 毫秒级 (极速向量编码) 额外获得 BM25 全文索引,直接实现“向量+文本”双路高召回

对于绝大多数没有海量算力微调基础大模型的业务团队而言,这套双模型解耦流水线,就是工程落地 RIME 思想性价比最高、最优雅的工业级方案。


参考文献与资源