LangChain 向量检索核心解析:similarity_search_with_score 和 similarity_search_with_relevance_scores 到底有什么区别?
一、前言为什么同样是相似度搜索分数却不一样在开发 RAG 知识库系统时我们经常会看到类似代码docs vectorstore.similarity_search_with_score( query )或者docs vectorstore.similarity_search_with_relevance_scores( query )两者名字非常接近similarity_searchscorerelevance_scores很多刚接触 LangChain 的开发者会认为“它们返回的不都是相似度分数吗为什么还要设计两个方法”实际上两者最大的区别就在于分数是否经过标准化处理。二、similarity_search_with_score() 是什么1. 基本作用similarity_search_with_score()根据用户输入的 query在向量数据库中搜索最相似的文档并返回原始距离或者原始相似度分数。示例results vectorstore.similarity_search_with_score( 什么是 RAG, k3 ) for doc, score in results: print(score) print(doc.page_content)返回0.23 RAG 是一种结合搜索和大语言模型的方法 0.45 向量数据库用于存储 Embedding 0.78 机器学习基础知识三、similarity_search_with_score() 的分数有什么特点重点来了分数没有统一标准。原因不同向量数据库FAISSChromaMilvusPineconeWeaviate使用的距离算法可能不同。例如1. 欧氏距离L2 Distance公式距离越小越相似结果可能0.12 0.35 0.89这里0.12 比 0.89 更相关。2. 余弦距离Cosine Distance可能0.01 0.20 0.60通常越接近 0代表越相似。3. 内积Inner Product可能0.95 0.82 0.61可能越大越相似。所以similarity_search_with_score()返回的 score可能0-1也可能0-100甚至负数都属于正常情况。四、为什么不同数据库分数不同因为向量搜索本质上是在计算两个向量之间的距离。例如用户问题什么是人工智能Embedding[ 0.21, 0.34, 0.56, ... ]数据库中的文档[ 0.22, 0.35, 0.55, ... ]然后计算query vector | | ↓ distance calculation | | ↓ score但是距离怎么算由数据库和算法决定。五、similarity_search_with_relevance_scores() 是什么这个方法解决了一个问题不同数据库返回的 score 没有统一标准。所以 LangChain 对结果进行了相关性归一化处理。使用similarity_search_with_relevance_scores()示例results vectorstore.similarity_search_with_relevance_scores( 什么是RAG, k3 ) for doc, score in results: print(score)返回0.92 0.81 0.63六、relevance score 有什么特点它经过统一处理范围0 score 1含义分数含义0.9-1.0高度相关0.7-0.9比较相关0.5-0.7一般相关0.5相关性较低并且分数越大表示文档越相关。七、两者核心区别总结对比similarity_search_with_scoresimilarity_search_with_relevance_scores返回内容文档 原始score文档 归一化score是否标准化❌ 否✅ 是范围不固定0~1是否依赖数据库强依赖弱依赖适合场景底层调试业务判断跨数据库比较困难方便八、代码对比方法一原始scoredocs vectorstore.similarity_search_with_score( query, k5 ) for doc, score in docs: print( fscore:{score} )可能输出score:0.231 score:0.452 score:0.891问题不同数据库可能变成score:15.2 score:8.6 score:3.1代码无法统一判断。方法二relevance scoredocs vectorstore.similarity_search_with_relevance_scores( query, k5 ) for doc, score in docs: print( fscore:{score} )输出score:0.96 score:0.82 score:0.71可以直接if score 0.8: print(保留)九、RAG 项目中应该使用哪个这是很多开发者关心的问题。场景一调试向量搜索推荐similarity_search_with_score()原因可以看到底层真实距离。例如检查Embedding 是否正常向量是否生成正确数据是否入库场景二知识库问答系统推荐similarity_search_with_relevance_scores()例如RAG用户问题 ↓ 向量检索 ↓ 相关性过滤 ↓ LLM生成答案可以docs [ doc for doc, score in results if score 0.75 ]过滤低质量文档。十、实际开发中的一个坑很多新人会这样写docs vectorstore.similarity_search_with_score( query ) if score 0.8: use_document()问题如果当前数据库score 是距离例如0.2代表高度相关。那么0.2 0.8结果直接过滤掉。导致明明相关的文档却没有被召回。正确方式如果不知道底层算法使用similarity_search_with_relevance_scores()十一、底层原理简单理解可以这样理解similarity_search_with_score类似数据库 A文档 距离 0.15 B文档 距离 0.42 C文档 距离 0.89这是原始测量值。similarity_search_with_relevance_scores类似经过加工A文档 相关度 0.95 B文档 相关度 0.75 C文档 相关度 0.30变成业务更容易理解的数据。十二、总结今天我们学习了 LangChain 中两个重要方法similarity_search_with_score()和similarity_search_with_relevance_scores()核心区别一句话总结similarity_search_with_score 返回的是向量数据库原始评分不同算法和数据库结果可能不同similarity_search_with_relevance_scores 会对评分进行归一化将结果转换为 0~1 的相关性分数更适合业务判断。在实际 RAG 项目中调试检索效果 → 使用similarity_search_with_score判断文档相关性 → 使用similarity_search_with_relevance_scores做阈值过滤 → 优先使用relevance_scores掌握这两个方法的区别是理解 LangChain 向量检索机制的重要一步也是优化 RAG 系统准确率的基础。