You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何持久化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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 15:48:12