如何持久化LangChain的ParentDocumentRetriever完整结构?
替换InMemoryStore实现父文档持久化方案
当然可以替换InMemoryStore,LangChain提供了多种内置的持久化文档存储类,能实现父文档的本地持久化,和你已有的ChromaDB子块存储配合,程序重启后无需重复执行add_documents步骤。以下是两种实用方案:
方案1:文件系统存储(FileSystemStore)
适合简单的本地持久化场景,父文档会被序列化后存储在指定目录的文件中。
实现代码
from langchain.retrievers.parent_document_retriever import ParentDocumentRetriever from langchain.vectorstores import Chroma from langchain.embeddings import HuggingFaceEmbeddings from langchain.text_splitter import NLTKTextSplitter from langchain.storage import FileSystemStore # 初始化嵌入模型 embeddings = HuggingFaceEmbeddings(model_name="BAAI/bge-large-en-v1.5") # 初始化子块向量库(复用你已有的持久化配置) vectorstore = Chroma( collection_name="child_chunks", embedding_function=embeddings, persist_directory="./chroma_db" ) # 初始化父文档持久化存储 parent_store = FileSystemStore("./parent_documents") # 初始化文本分割器 child_splitter = NLTKTextSplitter(chunk_size=500, chunk_overlap=50) # 构建检索器 retriever = ParentDocumentRetriever( vectorstore=vectorstore, docstore=parent_store, child_splitter=child_splitter, )
效果说明
父文档会被自动序列化存储在./parent_documents目录下。后续重启程序时,只要保持FileSystemStore的路径和ChromaDB的persist_directory与之前一致,就能直接使用检索器查询,无需重新添加文档。
方案2:SQLite数据库存储(SQLiteStore)
适合需要结构化存储、查询更高效的场景,父文档会存储在指定的SQLite数据库文件中。
实现代码
from langchain.storage import SQLiteStore # 替换FileSystemStore为SQLiteStore parent_store = SQLiteStore( db_path="./parent_docs.db", collection_name="parent_documents" ) # 其余检索器初始化逻辑和方案1完全一致
效果说明
父文档数据会持久化到./parent_docs.db文件中。重启程序时加载该数据库文件,即可恢复所有父文档数据,无需重复执行add_documents。
关键注意事项
- 必须保证每次初始化时,存储类的路径/数据库文件、ChromaDB的持久化目录与首次存储时完全一致,否则无法加载已有的数据。
- 如果需要适配其他数据库(如MongoDB、PostgreSQL),可以继承
BaseStore类自定义实现,但上述两种内置方案已能满足绝大多数本地持久化需求。
内容的提问来源于stack exchange,提问作者David Makovoz
相关产品推荐
相关产品推荐

