Skip to content

RAG 中如何计算文本相似度?常见算法有哪些? ​

  • 标签:RAG、相似度计算

🏛 业务架构师 ​

RAG 中计算文本相似度的方式与常见算法:

核心流程:文本→Embedding 模型→高维向量→距离/相似度计算→排序取 Top-K。

常见算法与业务含义:

  1. 余弦相似度(文本场景默认):向量夹角,衡量语义方向一致性,与文本长度无关(模长常被长度干扰)——Embedding 训练时多按余弦优化,匹配使用效果最好。取值 -1~1;
  2. 欧几里得距离(L2):空间直线距离,同时受方向和模长影响——关心"绝对差异量级"的场景(某些图像特征、归一化后等价于余弦);向量库的默认度量之一;
  3. 曼哈顿距离(L1):各维差值绝对和,对异常值更鲁棒——高维文本场景少用;
  4. 点积(内积):不归一化时综合方向与模长——部分模型(对比学习带温度的)训练时用点积,要与模型推荐度量一致;
  5. BM25(非向量):词频-逆文档频率的关键词相关性——混合检索的另一半,补语义检索对精确词(型号、单号)的盲区。

生产要点:度量方式要与 Embedding 模型的训练目标匹配(看模型文档推荐,文本默认余弦);入库前是否归一化(L2 归一化后余弦与点积等价,可简化计算);多路结果融合用 RRF(倒数排序融合)消除不同度量的分数量纲差异。

选型一句话:文本语义检索——余弦+混合 BM25,是 2026 年知识库场景不需要犹豫的默认答案。

🏗 系统架构师 ​

RAG 文本相似度计算我按检索漏斗分层讲(不同层的算法不同):

第一层:向量语义相似度(召回主力):

  • 算法:Embedding 模型(双塔)编码 query 与 chunk → 余弦相似度(归一化后与欧氏等价);生产用 ANN 索引(HNSW/IVF)加速——百万级库毫秒返回;
  • 特点:语义泛化好("退款"≈"售后");精度有限(双塔不交互);构建度量必须与 Embedding 模型训练度量一致;

第二层:词汇相似度(混合检索的另一半):

  • 算法:BM25(词频 × 逆文档频率 × 长度归一)——精确词匹配的业界标准;ES/OpenSearch 原生;
  • 特点:专有名词、型号、错误码的精确命中(向量盲区);与向量路 RRF 融合互补;

第三层:交互式精排(Rerank):

  • 算法:Cross-Encoder(query+doc 联合编码打分)——token 级语义交互,精度最高;只用于 Top 50 内精排;
  • 变体:ColBERT(延迟交互,向量级交互折中)、LLM-as-Reranker;

其他相关算法:编辑距离/Jaccard(去重与精确匹配)、句向量 MRL 截断(降本)、多向量(HyDE、ColBERT multi-vector)。

架构组合(生产标配):双塔召回(向量+BM25 混合,RRF 融合)→ Cross-Encoder 精排 Top 3~5 → 阈值过滤进 LLM。

工程要点:相似度分数跨路不可比(融合用 RRF 而非分数相加);阈值要按分布标定(每库跑分数分布,取 P90 做过滤线);评测用 recall@K 与 nDCG——相似度算法选错,后面全链路调优都在补窟窿。

💻 全栈开发专家 ​

RAG 中的文本相似度计算,我按「离线/在线」两侧讲:

核心算法:

  1. 余弦相似度(绝对主力):cos(A,B)=A·B/(|A||B|),看方向不看长度——语义相似的标准度量。归一化后等价点积,向量库默认支持;
  2. 点积(内积):归一化向量的余弦等价物,计算最快;
  3. 欧氏距离(L2):空间直线距离,图像 embedding 常用;文本场景与余弦高度相关(归一化后单调等价);
  4. BM25:词频-逆文档频率的词面相关性——专有名词、型号精确匹配的兜底,与向量互补;
  5. Cross-Encoder 相关性:query-doc 拼接过模型打分——精排用(rerank 本质)。

工程实现链路:

python
# 在线:query 向量化 → ANN 检索 → 距离排序
q = embedder.embed_query("退货政策")
hits = vectorstore.similarity_search_by_vector(q, k=10)
# 多路融合:RRF(只看排名,规避量纲差异)
def rrf(lists, k=60):
    return sorted(docs, key=lambda d:
        sum(1/(k+r) for ranks in lists for r in [rank_of(d)]))

关键注意事项(踩坑向):

  • 度量一致性:建索引和查询用同一个(vector_cosine_ops vs vector_l2_ops 索引不通用);
  • 阈值要按模型校准:余弦 0.8 在 bge 和 OpenAI 模型上的「相似强度」不同——上线前用业务数据画分数分布定阈值;
  • 归一化:入库前 L2 归一化统一空间(部分模型输出未归一化);
  • 词面+语义混合(RRF 融合 BM25)解决「型号 WSS-4500」这类词面精确需求。

一句话:粗排用余弦/ANN(快),精排用 Cross-Encoder(准),词面场景 BM25 兜底——单一算法打天下是新手设计。