**提升信息检索:如何为 Retriever 结果添加相似度分数**

# 引言

在使用文档检索工具时,例如从向量存储中提取文档,通常返回的是一系列 `Document` 对象,默认情况下,这些对象不包含检索过程的信息,例如与查询的相似度分数。在本指南中,我们将演示如何将检索分数添加到文档的元数据中。这将覆盖两种主要情况:从向量存储检索器和更高阶的 LangChain 检索器如 `SelfQueryRetriever` 或 `MultiVectorRetriever`。

# 主要内容

## 1. 向量存储的检索器

首先,我们需要在向量存储中添加一些数据。在这里,我们将使用 `PineconeVectorStore` 作为示例,但请注意,本指南适用于任何实现了 `similarity_search_with_score` 方法的 LangChain 向量存储。

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

docs = [
    Document(page_content="A bunch of scientists bring back dinosaurs and mayhem breaks loose", metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"}),
    # 更多文档...
]

vectorstore = PineconeVectorStore.from_documents(docs, index_name="sample", embedding=OpenAIEmbeddings())

2. 为检索结果添加分数

为了从向量存储检索器获取分数,我们将封装其 similarity_search_with_score 方法,将分数打包到关联文档的元数据中。

from typing import List
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)

通过这种方式,我们能够在文档的元数据中包含相似度分数。

3. 自定义更高阶的 SelfQueryRetriever

SelfQueryRetriever 使用大型语言模型(LLM)生成潜在结构化的查询。我们可以通过重写 _get_docs_with_query 方法来传播相似度分数。

from langchain.retrievers.self_query.base import SelfQueryRetriever

class CustomSelfQueryRetriever(SelfQueryRetriever):
    def _get_docs_with_query(self, query: str, search_kwargs: Dict[str, Any]) -> List[Document]:
        docs, scores = zip(*vectorstore.similarity_search_with_score(query, **search_kwargs))
        for doc, score in zip(docs, scores):
            doc.metadata["score"] = score
        return docs

代码示例

以下是完整的代码示例,展示了如何调用自定义检索器并获取包含相似度分数的文档:

retriever = CustomSelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info)
result = retriever.invoke("dinosaur movie with rating less than 8")
print(result)

常见问题和解决方案

  1. API 访问问题: 在某些地区,由于网络限制,开发者可能需要使用 API 代理服务来提高访问稳定性,可以在代码中配置 {AI_URL} 作为 API 端点,以便使用代理服务。

  2. 性能优化: 在处理大量文档时,确保向量存储的索引是优化的,以提高检索性能。

总结与进一步学习资源

通过本指南,我们学会了如何为文档的元数据添加检索分数,这提高了检索结果的分析能力。你可以进一步探索 LangChain 的文档,以了解更多高级功能。

参考资料

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


---END---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值