个人随笔
目录
Agent学习(10):RAG 父文档检索器 学习笔记
2026-02-04 21:10:53

一、核心定义

父文档检索器是 RAG(检索增强生成) 中针对「长文档检索效率低、小文档上下文缺失」设计的 分层检索策略

核心逻辑:将长文档拆分为「父文档(完整上下文)+ 子文档(小片段/关键词块)」,先检索易匹配的子文档,再通过子文档关联回完整父文档,用父文档信息做生成,兼顾检索精准度与上下文完整性。

通俗理解:子文档做「检索入口」,父文档做「生成素材」,解决“拆太细丢上下文、拆太粗检索不准”的核心矛盾。

二、适用场景

核心场景:处理 长文本数据(论文、报告、技术文档、长对话、书籍章节等),解决传统单一片段检索的两个痛点:

  • 片段过短:检索到的内容缺乏上下文,生成时答非所问、信息残缺;

  • 片段过长:检索时匹配无关内容,精准度大幅下降。

定位:目前 RAG 处理长文档的主流优化方案之一。

三、核心工作原理(三步法)

核心:先建分层索引,再做分层检索,最后拼接完整上下文(以 LangChain 的 ParentDocumentRetriever 为例)。

步骤1:文档分层拆分(父+子)

通过两个拆分器拆分,二者为关联关系(子文档隶属于父文档):

  • 父文档拆分器:拆为中等长度完整块(如 2048/4096 token),保留完整逻辑(如一个段落、一个技术点的完整说明),是最终生成的核心素材;

  • 子文档拆分器:将每个父文档再拆为更短片段(如 256/512 token),聚焦关键词、核心句,是向量检索的匹配单元。

示例:10000 token 技术文档 → 5 个 2000 token 父文档(各对应一个技术模块)→ 每个父文档拆为 4 个 500 token 子文档 → 5 父 + 20 子,子文档标记所属父文档 ID。

步骤2:构建分层索引

  • 子文档:向量化后,将向量、内容、所属父文档 ID 存入向量数据库(Pinecone、Chroma、Milvus 等);

  • 父文档:不向量化,仅以「原始文本+唯一 ID」形式存储(本地、文档数据库、向量数据库元数据均可)。

优势:减少向量数据库存储成本和检索耗时,同时提升子文档匹配精准度。

步骤3:分层检索+拼接父文档

  1. 子文档检索:用户查询向量化,检索相似度最高的 N 个子文档(如 Top5);

  2. 关联父文档:通过子文档的父文档 ID,获取对应的完整父文档(自动去重);

  3. 拼接生成:将所有关联父文档拼接为完整上下文,传入大模型生成回答,保证信息完整、逻辑连贯。

四、核心组成(LangChain 实现)

需 5 个核心参数,开箱即用,无需从零开发分层逻辑:

  1. 父文档存储(parent_store):存储完整父文档,如 InMemoryStore(本地内存)、FAISS、ElasticsearchStore;

  2. 向量存储(vectorstore):存储子文档向量,如 Chroma、Pinecone;

  3. 父文档拆分器(parent_splitter):如 RecursiveCharacterTextSplitter,设置较大 chunk_size;

  4. 子文档拆分器(child_splitter):同上,设置较小 chunk_size;

  5. 嵌入模型(embedding):子文档和查询向量化,如 OpenAI Embedding、BGE、text2vec。

五、极简实现代码(LangChain)

  1. from langchain.storage import InMemoryStore
  2. from langchain.embeddings import OpenAIEmbeddings
  3. from langchain.vectorstores import Chroma
  4. from langchain.text_splitter import RecursiveCharacterTextSplitter
  5. from langchain.retrievers import ParentDocumentRetriever
  6. # 1. 定义拆分器(父文档2048token,子文档256token)
  7. parent_splitter = RecursiveCharacterTextSplitter(chunk_size=2048, chunk_overlap=100)
  8. child_splitter = RecursiveCharacterTextSplitter(chunk_size=256, chunk_overlap=20)
  9. # 2. 初始化存储(父文档存内存,子文档向量存Chroma)
  10. parent_store = InMemoryStore()
  11. embeddings = OpenAIEmbeddings(model="text-embedding-ada-002")
  12. vectorstore = Chroma(embedding_function=embeddings, persist_directory="./chroma_db")
  13. # 3. 初始化父文档检索器
  14. parent_retriever = ParentDocumentRetriever(
  15. vectorstore=vectorstore,
  16. docstore=parent_store,
  17. parent_splitter=parent_splitter,
  18. child_splitter=child_splitter,
  19. )
  20. # 4. 添加原始长文档
  21. raw_docs = [你的长文档1, 你的长文档2, ...]
  22. parent_retriever.add_documents(raw_docs)
  23. # 5. 检索+生成
  24. query = "RAG中父文档检索器的核心优势是什么?"
  25. retrieved_docs = parent_retriever.get_relevant_documents(query)
  26. context = "\n".join([doc.page_content for doc in retrieved_docs])
  27. prompt = f"基于以下上下文回答问题:{context}\n问题:{query}"
  28. # 调用大模型(GPT-3.5/4、Claude等)生成回答

六、关键优化点(核心重点)

  1. 拆分器参数调优(最核心):
  1. - 父文档:chunk_size 略小于大模型上下文窗口(如 8k 窗口设 4k),chunk_overlap 5%-10%;
  2. - 子文档:chunk_size 以“包含单个核心信息”为原则(256-512 token),避免过短/过长。
  1. 去重与顶数控制:自动去重同一父文档,控制子文档检索 TopN(如 Top3/5),避免上下文超模型窗口。

  2. 混合检索:结合关键词检索(BM25),先粗筛文档,再细粒度向量检索,提升精准度。

  3. 元数据过滤:拆分时为父/子文档添加元数据(文档类型、领域等),检索时过滤无关内容。

七、与其他长文档检索方案对比

方案 核心思路 优点 缺点 适用场景
父文档检索器 子文档检索+父文档生成 精准度高+上下文完整 需分层拆分,略增开发量 绝大多数长文档场景
单一片段检索 直接拆为固定大小片段 开发简单 易丢上下文/精准度低 短文档(<1000token)
多段拼接检索 检索多个小片段拼接 开发简单 片段间无逻辑,易混乱 简单长文档(无复杂逻辑)
文档压缩检索 先压缩长文档再检索 减少存储/耗时 可能丢失关键信息 超长篇文档(如书籍)
自洽检索(Self-RAG) 大模型自主判断检索结果 精准度极高 耗时久、成本高 高要求专业场景

结论:父文档检索器是性价比最高的长文档 RAG 优化方案,兼顾开发难度、效率和生成质量,工业界主流选择。

八、优势与局限性

优势

  • 兼顾精准与上下文:子文档精准检索,父文档保证生成完整连贯;

  • 降低成本:仅子文档向量化,减少存储和检索耗时;

  • 适配性强:可结合混合检索、重排序等方案优化;

  • 开发成本低:框架开箱即用,无需从零开发。

局限性

  • 拆分需人工调优:chunk_size 和 overlap 无统一标准,需结合文档和模型调整;

  • 无法跨父文档匹配:查询信息跨多个父文档时,需结合多文档融合或迭代检索;

  • 依赖拆分器:拆分切断核心逻辑时,会导致生成信息残缺。

九、实际应用延伸方案

  1. 多级父文档检索:超长篇文档拆分为「祖父(章节)→父(小节)→子(关键句)」,三级检索提升精准度;

  2. 父文档重排序:用交叉编码器对父文档与查询相似度重排序,剔除无关内容;

  3. 结合文档摘要:为父文档生成摘要,将「子文档+父文档摘要」向量化,提升检索精准度;

  4. 动态拆分:基于文档语义结构(段落、标题)拆分,而非固定 token,避免切断逻辑。

    (注:文档部分内容可能由 AI 生成)

 6

啊!这个可能是世界上最丑的留言输入框功能~


当然,也是最丑的留言列表

有疑问发邮件到 : suibibk@qq.com 侵权立删
Copyright : 个人随笔   备案号 : 粤ICP备18099399号-2