让检索结果更智能:为文档添加相似度分数的完整指南

76 阅读2分钟

在信息检索和自然语言处理的领域中,能够准确地评估文档与查询之间的相关性是一个重要的任务。检索器通常返回一系列 Document 对象,默认情况下这些对象不包含关于检索过程的详细信息,例如与查询的相似度分数。本文将演示如何通过修改元数据,在文档中添加相似度分数,从而提高检索结果的实用价值。

创建向量存储

首先,我们需要将一些数据填充到向量存储中。在这里,我们使用 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="科学家带回恐龙,故事充满混乱",
        metadata={"year": 1993, "rating": 7.7, "genre": "science fiction"},
    ),
    Document(
        page_content="莱昂纳多·迪卡普里奥在梦中的梦中迷失",
        metadata={"year": 2010, "director": "Christopher Nolan", "rating": 8.2},
    ),
    # 更多文档...
]

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

获取相似度分数的方案

为获取向量存储检索器中的分数,我们创建一个包装函数来使用 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")  # 使用API代理服务提高访问稳定性
print(result)

使用 SelfQueryRetriever

SelfQueryRetriever 中使用一种更复杂的方式生成查询,可以在检索结果中包括相似度分数。我们可以通过子类化 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代理服务提高访问稳定性。

总结与进一步学习资源

通过本文介绍的方法和技术,您可以对文档检索结果进行更深入的分析和处理,为各种应用场景中提升系统的智能化提供支持。对于进一步的学习,您可以参考以下资源:

参考资料

  • LangChain 文档
  • Pinecone 向量搜索 API

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

---END---