首页 / 文章

当RAG以0.89的相似度检索到错误文档时:接近度与相关性之争。

为何RAG会在0.89的相似度下检索到错误文档:距离不等于相关性,嵌入空间结构会扭曲信息,而混合搜索与重排序机制能起到辅助作用。

发布者:REACTAPP.TOP阅读约 10 分钟2204 词

来源: *What if Your RAG Retrieves the Wrong Document — Even When the Similarity Score Looks Perfect?*

在检索增强生成中常见的场景是:先将文本块进行嵌入和索引,用户提出问题后,对该问题进行嵌入处理,再通过余弦相似度筛选出排名靠前的k个文本块,这些文本块会被加入提示词中,最终由大语言模型给出答案。得分最高的文本块得分为0.89,看似相当可靠,但答案依然错误。

凡是部署过多个RAG系统的人都会遇到这种情况。这类问题频繁出现,无论对文本块的分割方式做多少调整或更换嵌入模型,都无法解决它。因此,关键问题在于该系统衡量的是内容相关性还是仅仅是几何上的接近度。

2026年8月发表在《Symmetry》期刊上的一篇关于RAG技术的综述将这种矛盾视为该领域存在的四种结构性矛盾之一,并称之为“几何-语义不匹配”。需要明确这一称谓的具体含义:它并非指向量搜索已经失效,也不是关于几何学功能的有力定理,而是一种用于描述在各种不同的检索场景中都会出现的局限性的表述方式。

流程简述

去掉相关工具后,RAG实际上由两个阶段组成。

  • 在索引阶段,文档会被分割成多个片段,每个片段通过编码器转换为密集向量,这些向量随后被存储到FAISS或HNSW之类的索引中。
  • 在查询阶段,问题同样通过相同的编码器进行嵌入处理,计算其与每个片段向量的相似度,选出相似度最高的k个向量作为上下文传递给大语言模型。

有一个核心假设支撑着整个体系:向量空间中的距离反映了语言中的语义相关性。含义相似的文本应该彼此靠近,而含义不同的文本则应相距较远。

大多数情况下这一假设都足够准确,因而能够发挥实际作用,这也是密集检索能够生效的原因。问题往往出现在边缘情况,而在实际应用中这类边缘情况出现的频率比预期要高。每当检索系统给某个内容赋予较高排名时,它实际上是在判断该内容在向量空间中与目标内容的接近程度,而非判断其是否能解答问题。通常这两种判断结果是一致的,有趣的情况则是二者不一致的时候。

相似性不等于相关性

余弦相似度用于衡量两个向量指向同一方向的接近程度。它并不能直接判断某段文本是否能回答问题。虽然两者存在足够的重叠度,使得密集检索能够真正发挥作用,但它们仍是不同的概念,许多检索失败案例都源于这种差异。

这一现象早已被注意到。2020年发表的引入DPR的论文给出了一组具有参考价值的数据:其密集双编码器检索器在Natural Questions任务上的前20名准确率为78.4%,而在SQuAD任务上则降至63.2%,而普通的BM25方法在SQuAD任务上的准确率为68.8%。作者将此归因于训练数据分布的偏差:SQuAD任务中的问题与对应答案文本存在大量重复词汇,这种特征使得基于词汇匹配器的模型比在更广泛数据上训练的密集编码器表现更好。

单个数据点无法确立普遍规律。但它确实清楚地表明,在相同的评估标准与相同的检索器下,语义相似性与词汇精确性仍可能存在差异。《Symmetry》一文的综述总结了这一规律:为相似含义优化的机制并不必然适用于最关键的那个词,反之亦然。这一规律是否适用于所有检索场景,最好视为一种工作假设。不过它确实符合许多实践者的经验。

几何结构的局限

更深层次的问题在于几何结构本身。密集检索技术将文本映射到连续的向量空间中,由于点积和余弦相似度都基于欧几里得空间,因此这类空间几乎总是欧几里得空间。欧几里得空间擅长判断两个对象在某些维度上是否相似,但对于实际文本中常见的至少三种模式则处理得不够好。

  • 层次结构。狗是哺乳动物,而哺乳动物属于动物。平面向量空间本身没有“属于”或“包含”的概念,用直线距离来近似树结构时,层次越深,扭曲程度就越大。
  • 同义词与近义词。“便宜”和“廉价”应该属于相近的词。不过“便宜”和“质量差”按理说不应如此,但在训练数据中它们经常同时出现,以至于它们的向量距离可以被拉得比其实际含义所允许的更近。
  • 时间。根据句子的写作时间,一家公司的CEO可能是不同的人。静态嵌入模型没有用于表示过时事实的维度,除非有上游机制对这类事实进行编码。

文献中提出的一种解决方案是使用双曲空间而非欧几里得空间。在双曲空间中,距离会呈指数级向外增长,因此树状层次结构在表示时失真更小,能够自然映射到多级结构。有研究显示,双曲密集检索方法在概念层次结构任务上具有更好的泛化能力。不过这仅是一种权衡手段而非根本解决方案——计算成本会上升,相关工具也远不成熟,且层次结构只是三种模式之一,因此以同义关系或时间变化为主的语料库可能无法从改变几何结构中获益。

这正是这种不匹配所揭示的问题:不同的几何假设会影响到哪些语义关系能够得到良好表示。若选择欧几里得几何,层次结构的表现往往会受到影响;若倾向于使用双曲几何,则需要付出更高的计算成本以及不成熟的工具支持,同时同义关系和时间相关问题仍无法得到解决。无论选择哪种空间模型,这一选择都会隐含地决定检索系统能够较好处理的关系类型,以及那些它更容易判断错误的关系类型。

带有文档的示例

想象有一套产品文档,其中有一个问题:如何重置我的API密钥?

检索结果中有一段内容标题为“如何重置账户密码”,其余弦相似度为0.87。这一数值相当高,因为“重置”“API密钥”和“密码”都属于身份验证与账户管理范畴。而关于API密钥轮换的内容位于另一个板块,使用的词汇较为具体,相似度为0.81。

首先返回的是错误的文档,其相似度甚至超过了任何简单的相关性阈值。嵌入空间虽然正确识别出这两者都与账户安全相关,但由于它们属于同一个语义簇中的关联内容,因此无法区分二者各自的具体操作流程。

同样的模式也适用于因单个否定词而不同的合同条款、因患者亚组而不同的用药说明,以及因财政年度而不同的财务条款。在这些情况下,向量之间的相似度反映了它们所涉及的主题的共性,却无法说明其答案是否一致。

检索系统仅对候选项进行排序,不会给出最终判定

许多RAG流程默认将排名靠前的1个或k个结果视为信息所在位置的答案。实际上,这些结果应被视为仍需在提示语中证明自身价值的候选项。

那种为 API 密钥相关问题返回密码页面的检索器并不一定完成了它的任务。严格来说,它的职责只是进行一次成本较低的初步筛选:将海量候选项缩减为少数几个看似合理的选项。其缺陷在于设计上直接将第一个结果视为正确答案而不再进一步验证。这个流程并不一定非得是“查询、检索器、前1名候选、大语言模型”这样的顺序,也可以先进行查询,再用低成本但召回率较高的检索器筛选候选项,接着对候选集使用速度较慢但精度更高的重排器,选出最佳候选后再由大语言模型处理。

检索失败与生成失败虽有关联但彼此独立,将二者混为一谈会使得问题显得比实际更严重。一旦排序出现偏差,单次抽取的顶级1结果流程就无法挽回局面。而那种将检索视为候选结果生成,并将真正的相关性判断交由第二阶段处理的流程,则有机会发现那些近乎正确的结果——即在向量空间中足够接近而看似合格,但在实质内容上又有足够差异以至于不可用的文档。

为何生产环境会注意到这一问题

这并非单纯的学术概念。接近度与相关性之间的差距会引发实际且代价高昂的故障。

  • 幻觉的隐性放大效应。大型语言模型无法识别某段内容虽与主题相关但内容错误。它会基于错误的来源生成流畅且看似可靠的答案,而这种看似可靠实则错误的答案,对于几乎所有后续应用而言,都比直接表示不知情更为糟糕。
  • 分层知识库下的精度下降。诸多案例与研究都表明,知识库的结构越复杂、层级越深,包含嵌套规则、不同版本的规范或组织结构图等,向量搜索的效率就越低。该研究提出了一种正式的诊断方法,用于衡量随着层级深度增加精度是如何下降的。这一指标仅作为参考使用,并非固定不变的曲线,而且最好根据实际使用的知识库来测量,而非凭假设行事。
  • 在产生实际成本之前,它在评估集中是不可见的。诸如针对通用问题对的recall@k这类标准基准测试,并不会像真实领域语料库那样强调层次关系或近义区分。系统在内部测试中能够通过,但在投入使用的第三周会出现密码与API密钥对比类的问题。
  • 缓解措施

    这些情况并不意味着密集检索技术已经失效,只是说明针对真实语料库而言,仅依靠单一检索机制的设定不够完善。以下缓解措施是按照各方案对架构要求的程度大致排序的。

    混合检索,即词汇检索与密集检索相结合。例如可以并行运行BM25检索和密集检索,然后通过互反排名融合等方法将两种检索的结果整合起来,这是一种常见且简单的方案。该方法能够直接弥补词汇重叠带来的缺陷,同时不会影响嵌入模型本身的性能。

    # Minimal hybrid retrieval sketch: dense + BM25 fused via RRF
    from rank_bm25 import BM25Okapi
    import numpy as np
    
    def reciprocal_rank_fusion(dense_ranked_ids, bm25_ranked_ids, k=60):
        scores = {}
        for rank, doc_id in enumerate(dense_ranked_ids):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        for rank, doc_id in enumerate(bm25_ranked_ids):
            scores[doc_id] = scores.get(doc_id, 0) + 1 / (k + rank + 1)
        return sorted(scores.items(), key=lambda x: -x[1])# dense_ranked_ids  = [doc_id, ...] from your vector store's top-k search
    # bm25_ranked_ids   = [doc_id, ...] from bm25.get_top_n(query_tokens, doc_ids, n=k)
    fused = reciprocal_rank_fusion(dense_ranked_ids, bm25_ranked_ids)
    

    交叉编码器重排序。先使用密集检索以较低成本生成50到100个高召回率的候选项,然后再通过同时考虑查询和文档的交叉编码器对这些候选项进行重排序。虽然每对数据的处理成本更高,但在处理主题相近但事实错误的情况时效果更好,因为它不依赖每段文本的固定向量。

    查询重写或分解。RQ-RAG就是一个例子:该系统在进行任何搜索之前就会被训练来重述那些模糊或多部分的查询。当匹配失败是由于查询描述不充分而非语料库中的结构问题时,这种方法能起到帮助作用。

    GraphRAG风格的结构感知检索。对于组织结构图、从句依赖关系或产品分类法这类具有明显层级或关联性的内容,应将其结构以图形形式明确表示出来,而非强行将其压缩到平面结构中。这样一来,就无需再与几何结构作斗争,只需避免其干扰即可。

    针对特定领域的嵌入模型。利用该组织自身的语料库中的反例对编码器进行微调,这些反例指的是意义相近但作为答案却不正确的近义词对。实验结果表明,虽然无法完全消除差异,但确实能够显著缩小差距。

    这些方法各自仅能解决特定问题,却无法根除背后的矛盾,这一点值得坦诚承认。

    更宏观的研究问题

    如果不同的几何结构能够很好地表示不同的事物,那么接下来的自然问题是:表示空间的形状是否可以随查询或语料库而变化,而非事先固定不变。

    《Symmetry》这篇综述指出了这一方向,并将其视为对称性破缺:选择欧几里得、双曲或混合度量,意味着要决定放弃哪种语义对称性。该文提出的方向是混合几何空间学习,即系统根据语料库中每个点所编码的关系来调整其度量结构,而不为整个索引固定一种全局几何结构。这只是一个综述论文中提出的方向,尚无配套的基准测试的实际技术。它是一个值得关注的假设,而非目前可以依托的基础。

    它真正起到作用的是改变了需要提出的问题。人们不再纠结于哪种嵌入模型最好,而是思考数据中的语义关系实际上呈现为何种形态,以及检索架构是否具备表示这种形态的机制。

    核心要点

    在实际应用中,较高的余弦相似度与正确的检索结果往往高度一致,两者之间的差异几乎难以察觉。设计工作应集中在那些由于主题相似而非答案相似而导致向量彼此接近,却出现差异的情况上。

    更好的嵌入模型也无法解决这个问题,没有任何一种架构能够做到。无论选择哪种平面几何空间,其实都在隐含地判断语料库中哪些关系最为重要,正因如此才有了混合检索、重排序以及结构感知索引技术——没有人能在不采取规避措施的情况下做出这样的判断。嵌入模型本身并非糟糕,只是几何空间被要求执行它原本并未被完全设计用于的语义推理任务,而在它无法继续工作的那一刻之前,它已经完成了相当出色的工作。