You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 12:07:36