在信息检索和自然语言处理的领域中,能够准确地评估文档与查询之间的相关性是一个重要的任务。检索器通常返回一系列 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---