夜雨聆风学习资料网

ARTICLE · 1272497

文档解析与知识库建设:RAG 落地最耗时的环节

文档解析与知识库建设:RAG 落地最耗时的环节

AI · 文档解析 · 知识库

文档解析与知识库建设:RAG 落地最耗时的环节

做企业 RAG,真正耗时的不是写检索代码,而是把一堆脏文档变成高质量知识库——解析失败、表格稀碎、切分截断、更新不同步。管道上游是垃圾,下游全白搭。这篇讲离线管道的每个环节。

上传 → 解析 → 清洗 → 切分 → 向量化 → 入库;增量更新 = hash 比对 → 只重嵌变化部分。

这是 RAG 四部曲收官篇,先放总图:

整体管道 → 解析难度 → 切分策略 → 增量更新

01

文档解析:坑最多的一环

格式
难度
坑
Markdown/HTML
⭐
天然有结构,直接按标签切
Word (docx)
⭐⭐
样式与标题层级丢失、表格嵌套
PDF
⭐⭐⭐⭐
文字型/扫描件/双栏/页眉页脚全要处理
扫描件/图片
⭐⭐⭐⭐
必须上 OCR,精度打折

PDF 的真实坑:

— 双栏论文按文本流抽出会串行、阅读顺序错乱;

— 扫描件没有文字层,要 OCR(PaddleOCR,中文友好);

— 表格抽成纯文本就废了,尽量转 Markdown 表格保留结构;

— 页眉页脚/水印混在正文里,污染所有切片。

选型建议:Markdown 知识库能绕开解析坑就尽量用;PDF 多的企业优先 MinerU 这类深度解析方案——自己硬撸 pdfplumber,光双栏和表格就能耗掉几周。

清洗规则三件事:去页眉页脚(按位置/重复模式识别)、去水印文字;合并被硬换行打断的句子(中文常见「……软件\n工程……」);去重复段落、异常字符,过滤空切片。

02

切分策略深挖:四种怎么选

策略
原理
适用
固定长度
每 N 字切一刀
仅作 baseline,会拦腰截断句子
递归字符
按 \n\n → \n → 标点层级回退切
通用兜底方案
结构切分
按标题/章节边界切
有格式的文档,首选
语义切分
embedding 检测语义突变点
质量最高,成本也高

递归字符切分(LangChain 默认)的思想:优先按天然边界切,边界太大才降级——切出来的片段尽量是完整段落,硬切只是最后的兜底:

splitter = RecursiveCharacterTextSplitter(    chunk_size=500,    chunk_overlap=50,     # 10% 重叠,防止答案恰好在边界    separators=["\n\n", "\n", "。", ";", ",", " ", ""])

结构切分:Markdown 按标题层级切,并把标题路径存进元数据——

chunk.text = "报销需在每月 25 日前提交 OA……"chunk.meta = {  "doc_title": "财务制度",  "section_path": "报销 > 日常报销 > 提交时限",  # 标题面包屑  "page": 12,  "doc_id": "fin_2024_v3"}

好处立竿见影:回答可溯源(引用时带章节)、检索可过滤(按文档/部门权限)、上下文更完整(同章节内容优先召回)。

chunk 尺寸:300~800 token + 10%~20% 重叠起步;表格、代码块整体保留,宁大勿碎——碎表格等于没有。

03

增量更新:知识库不是一次性的

每次全量重建 = 时间 × embedding 费用双浪费。文件级 hash 比对即可覆盖大多数场景:

import hashlibdef sync_knowledge(file_path, store):    content = read_bytes(file_path)    digest = hashlib.md5(content).hexdigest()    if store.get_file_meta(file_path) == digest:        return                       # 未变,跳过    if store.exists(file_path):        store.delete_by_doc(file_path)  # 按 doc_id 级联删旧切片    chunks = parse_clean_split(content)    # 解析 → 清洗 → 切分    store.upsert(embed(chunks), meta={"doc_id": file_path, "digest": digest})

三个要点:

— 切片可级联删除:靠 doc_id 元数据把「文件 → 切片」关系存进向量库;

— 删除文件要有对应清理,否则出现「幽灵知识」被检索出来;

— 只改一行字的文档目前仍会整文件重嵌——追求极致可做切片级 diff,多数场景没必要。

上线前人肉过一遍:随机抽 20 个切片看有没有半句话、表格碎片、页眉残留;解析失败率按格式分类计数;高频问题实测 5~10 个,出处都能正确召回再上线。

扩展阅读:切分的基础要点(父子块、表格代码不可分割)见本系列第 1 篇《RAG 检索增强生成入门》;向量库选型与在线检索见第 2 篇《向量数据库与 RAG 实操》;检索精调见第 3 篇《混合检索与 Rerank》。

RAG 四部曲到此收官:《RAG 检索增强生成入门》建立认知,《向量数据库与 RAG 实操》跑通链路,《混合检索与 Rerank》调优检索,本篇搞定离线管道——从脏文档到可上线,一套打通。建议收藏成套,新朋友点个关注,从头翻起。

· END ·

码农庄园记 · 文档解析与知识库建设

相关学习资料