如何在LangChain的SelfQueryRetriever中获取文档相似度分数
获取SelfQueryRetriever检索结果的相似度分数
当然可行,SelfQueryRetriever底层依赖的向量存储在执行相似性检索时会计算并返回相似度分数,只是默认封装后未暴露该数据。以下是两种实现方式:
方法一:直接调用向量存储的带分数搜索接口
通过SelfQueryRetriever生成结构化查询条件,再直接调用向量存储的similarity_search_with_score方法获取带分数的结果:
# 定义你的查询内容 query = "需要检索的内容" # 获取SelfQueryRetriever构造的结构化查询 structured_query = retriever.query_constructor.invoke({"query": query}) search_text = structured_query.query filter_condition = structured_query.filter # 调用向量存储的带分数搜索方法 docs_with_scores = vectorstore.similarity_search_with_score( query=search_text, filter=filter_condition, k=5, score_threshold=0.80 ) # 遍历并展示结果 for doc, score in docs_with_scores: print(f"*相似度分数*: {score:.4f}") print(f"文档内容: {doc.page_content}") print(f"元数据: {doc.metadata}\n")
方法二:自定义带分数返回的SelfQueryRetriever子类
继承SelfQueryRetriever并重写核心方法,让检索器直接返回带分数的结果,或者将分数写入文档元数据:
from langchain.retrievers.self_query.base import SelfQueryRetriever class SelfQueryRetrieverWithScores(SelfQueryRetriever): def _get_relevant_documents(self, query): # 生成结构化查询 structured_query = self.query_constructor.invoke({"query": query}) search_kwargs = self.search_kwargs.copy() # 加入过滤条件 if structured_query.filter is not None: search_kwargs["filter"] = structured_query.filter # 调用带分数的搜索接口 docs_with_scores = self.vectorstore.similarity_search_with_score( structured_query.query, **search_kwargs ) # 可选:将分数写入文档的metadata字段,保持返回格式与原Retriever一致 for doc, score in docs_with_scores: doc.metadata["similarity_score"] = score # 返回(文档对象, 分数)的元组列表,或者返回文档列表(若已写入metadata) return docs_with_scores # 用自定义类创建检索器 retriever_with_scores = SelfQueryRetrieverWithScores.from_llm( llm=llm, vectorstore=vectorstore, document_contents=document_content_description, metadata_field_info=metadata_field_info, enable_limit=True, search_type="similarity_score_threshold", search_kwargs={"score_threshold": 0.80, "k": 5}, verbose=True ) # 使用自定义检索器 results = retriever_with_scores.get_relevant_documents("需要检索的内容") for doc, score in results: print(f"分数: {score:.4f}") print(f"内容摘要: {doc.page_content[:200]}...")
注意事项
- 确保使用的向量存储(如Chroma、Pinecone、FAISS等)支持
similarity_search_with_score方法,主流实现均兼容该接口。 - 若选择将分数写入metadata,后续可通过
doc.metadata["similarity_score"]直接读取分数值。 search_kwargs中的参数(如k、score_threshold)可直接复用原检索器的配置。
内容的提问来源于stack exchange,提问作者Emil Toft
相关产品推荐
相关产品推荐

