# 引言
在使用文档检索工具时,例如从向量存储中提取文档,通常返回的是一系列 `Document` 对象,默认情况下,这些对象不包含检索过程的信息,例如与查询的相似度分数。在本指南中,我们将演示如何将检索分数添加到文档的元数据中。这将覆盖两种主要情况:从向量存储检索器和更高阶的 LangChain 检索器如 `SelfQueryRetriever` 或 `MultiVectorRetriever`。
# 主要内容
## 1. 向量存储的检索器
首先,我们需要在向量存储中添加一些数据。在这里,我们将使用 `PineconeVectorStore` 作为示例,但请注意,本指南适用于任何实现了 `similarity_search_with_score` 方法的 LangChain 向量存储。
```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())
2. 为检索结果添加分数
为了从向量存储检索器获取分数,我们将封装其 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")
print(result)
通过这种方式,我们能够在文档的元数据中包含相似度分数。
3. 自定义更高阶的 SelfQueryRetriever
SelfQueryRetriever
使用大型语言模型(LLM)生成潜在结构化的查询。我们可以通过重写 _get_docs_with_query
方法来传播相似度分数。
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
代码示例
以下是完整的代码示例,展示了如何调用自定义检索器并获取包含相似度分数的文档:
retriever = CustomSelfQueryRetriever.from_llm(llm, vectorstore, document_content_description, metadata_field_info)
result = retriever.invoke("dinosaur movie with rating less than 8")
print(result)
常见问题和解决方案
-
API 访问问题: 在某些地区,由于网络限制,开发者可能需要使用 API 代理服务来提高访问稳定性,可以在代码中配置 {AI_URL} 作为 API 端点,以便使用代理服务。
-
性能优化: 在处理大量文档时,确保向量存储的索引是优化的,以提高检索性能。
总结与进一步学习资源
通过本指南,我们学会了如何为文档的元数据添加检索分数,这提高了检索结果的分析能力。你可以进一步探索 LangChain 的文档,以了解更多高级功能。
参考资料
- LangChain 官方文档: LangChain Documentation
- Pinecone 文档: Pinecone Documentation
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---