乐于分享
好东西不私藏

RAG 不该只把整篇文档压成一个向量

RAG 不该只把整篇文档压成一个向量

一句话总结:单向量检索把整篇文档压缩成一个摘要,多向量检索则保留 token 级线索;它不是免费的升级,而是一笔用索引空间换召回质量的工程交易。

关注我们,少看一点热闹,多看一点能用的判断

很多 RAG 系统的第一步,都是把一段文本变成一个向量。

这一步很有效:文档可以提前编码,查询时只要做向量相似度计算,就能从大规模库里快速找出候选。

但它也做了一件不可逆的事:把一整段文本里不同的重要信息,压缩进一个固定长度的数字数组。一个罕见的人名、一个产品编号、一条关键限制,可能和其他内容一起被平均掉。

Hugging Face 最近介绍的 MultiVectorEncoder,把另一条路线带进了 Sentence Transformers 6.0:不再为整篇文档只保留一个向量,而是为每个 token 保留一个向量,把查询与文档的精细匹配延后到打分时。

这不是所有 RAG 都需要的方案,但它很适合回答一个问题:当“文档整体大致相关”还不够时,检索系统怎样保住局部证据?

单向量的优势,正是它的限制

普通的 dense embedding 会把一段文本压成一个固定维度的向量,比如 384、768 或 1024 个数字。

这样做的好处很明确:索引小、查询快、工程链路成熟。几百万条文档都可以提前编码,查询时通过近似最近邻搜索快速缩小范围。

限制也同样明确。

如果一段文档同时包含产品型号、适用条件、例外条款和时间限制,这些信息都要争夺同一个向量里的表达空间。查询只关心其中一个稀有细节时,整体相似度可能把它淹没。

例如,用户问的是“有木质腿、圆形靠垫的绿色沙发”。一段只写“绿色沙发”的文档,可能因为整体语义相近而排在前面;真正同时包含四个条件的文档,反而可能因为被压缩得太厉害而没有获得足够分数。

多向量把匹配推迟到最后一刻

多向量模型保留每个 token 的表示,再用 MaxSim 做打分:对查询里的每个 token,找出文档中与它最相似的 token,把这些最高匹配加起来。

可以把它理解成一种“软对齐”:查询里的每个要求,都要在文档里找到一个能解释它的证据。

它不要求两个词字面相同。上下文向量可以让 live 找到 inhabit,同时又保留产品编号、函数名和罕见实体这种精确 token 的独立信号。

这就是 late interaction 的位置:

  • cross-encoder 在模型内部让查询和文档充分交互,但每次查询都要重新处理文档;
  • dense bi-encoder 几乎不交互,换来很快的预计算和检索;
  • multi-vector 让文档仍然可以独立编码、提前建索引,但把更细的 token 对齐留到打分阶段。

它在精度和成本之间,站在两者中间。

代价是索引会明显变大

质量提升并不是免费得到的。

Hugging Face 给出的示例里,4,874 个 Natural Questions 段落,用 dense 模型只需要 4,874 个向量;用 LateOn 则产生了 608,414 个 token 向量。按 float32 计算,MiniLM 索引约 7.5 MB,LateOn 约 311.5 MB,存储量大约是前者的 42 倍。

当然,量化和专用索引可以把成本压下来。相同数据经过 fast-plaid 索引后约为 92 MB,已经接近不少大维度 dense embedding 的量级。

但工程团队仍然要正视几个问题:

  • 文档越长,token 向量越多;
  • 编码和打分的计算量会上升;
  • 多向量分数不能随意跨模型比较;
  • 模型的 document_length 会决定哪些内容根本进不了索引。

如果团队没有清楚的召回问题,直接把所有文档改成多向量,可能只是把存储账单放大。

三种落地方式,不必一上来重做整套 RAG

第一种,小规模语料直接做精确打分。

几千篇文档以内,可以提前编码所有文档,查询时做完整的 MaxSim。实现简单,适合验证质量和建立基线,但规模扩大后会受到线性扫描限制。

第二种,dense 检索后用多向量重排。

先用成熟的单向量索引从大库里取出前 50 或前 100 个候选,再用多向量模型做第二阶段重排。这样既保留了第一阶段的速度,也让第二阶段重新关注局部证据,不必为整个语料库维护巨大的多向量索引。

第三种,为大规模系统使用专用 late-interaction 索引。

Qdrant、Weaviate、Vespa、LanceDB、VectorChord 等系统已经提供了不同形式的多向量存储与 MaxSim 支持;不想运行服务,也可以看 fast-plaid、PyLate 这类组件。

选择哪一种,应该由错误类型决定:如果问题是“候选根本召回不到”,重排解决不了;如果候选已经找到了,但排序总把包含关键细节的文档压到后面,多向量重排才更有价值。

多模态文档是它更容易体现优势的地方

多向量检索还有一个很重要的应用:视觉文档检索。

ColPali 一类模型可以直接把页面图像变成 token 级表示,文字查询不必先经过传统 OCR,再去匹配纯文本。对于表格、版式复杂的 PDF、扫描文档和图文混排页面,这条路线保留了更多原始布局信息。

当然,视觉检索也会增加模型、索引和评估的复杂度。它更适合那些 OCR 丢失的信息确实影响答案质量的场景,而不是为了追赶技术名词。

RAG 的下一步,不是“向量越多越好”

多向量模型提醒工程团队:检索质量的瓶颈,有时不是模型不够大,而是系统太早把信息压扁了。

但它也提醒了另一件事:每一次保留更多信息,都要付出存储、计算、延迟和运维成本。

比较稳妥的路线是先建立错误样本:哪些问题被 dense 检索漏掉?是稀有实体、多个约束、长文档,还是视觉布局?只有当错误模式与 token 级匹配有关时,再把多向量引入对应的阶段。

好的 RAG 不是选择最新的 embedding,而是知道哪些信息不能在检索链路中过早丢掉。

参考资料:Hugging Face Blog,《Multi-Vector (Late Interaction) Embedding Models with Sentence Transformers》。文中关于索引规模、MaxSim 和 Sentence Transformers 6.0 的说明均来自该技术文章。