从 PDF / Word 到知识库:文档导入完整流程
这是《知识库建设完全指南》的配套实操篇,专门讲清楚:一份 PDF 或 Word 文档,从"双击打开"到"能在问答里被召回",中间到底经历了什么。聚焦导入阶段——接入、解析、清洗、结构化、切分、元数据,再衔接向量化入库。配完整 Python 代码与流程图。
01为什么要把"文档导入"单独拎出来讲
知识库 8 成以上的质量问题,源头都在"解析"这一步。PDF / Word 是知识库最典型、也最棘手的数据源:它们不是纯文本,而是带版式、可能带图片/表格/扫描页的二进制容器。解析不准,后面切得再好、模型再强也白搭。
📕PDF:版式优先
本质是"打印稿",保的是样子不是结构。文本可能在任意坐标,还有扫描页、加密、表格跨页。
📘Word:结构优先
.docx 是 zip + XML,标题/段落/表格有标记;但旧 .doc 是二进制,图片内嵌,样式乱。
🧨坑都在细节
扫描件没 OCR、表格丢了结构、页眉页脚混进正文、加密文档打不开——任一处都会污染知识。
02导入完整流程:从文件到可被召回
下面 7 步是"一份文档进知识库"的标准动作。前 6 步属于离线导入侧,最后一步衔接《知识库总览》里的在线检索与生成。
03第一步:接入与格式识别
在解析之前,先搞清楚"这是什么文件、能不能读、怎么读"。这一步决定后面走哪条解析路径。
📥接入方式
手动上传、对象存储(S3/OSS)监听、网盘/CRM Webhook、定时爬虫、数据库导出。企业里常见"共享文件夹 → 监听变更自动入库"。
🔍格式识别
按扩展名 + MIME + 魔数(magic bytes)双重确认。PDF 要看是否加密、是否有可读文本层;Word 要区分 .docx(OOXML)与老 .doc(二进制)。
关键判断:PDF 是"文本型"还是"扫描型"?
这是 PDF 解析的分水岭。文本型 PDF 能直接提取文字;扫描型(本质是图片)必须先 OCR。判断方法:
- 尝试抽取文本:用解析库抽一页,如果有效文字极少(如 < 20 字符),大概率整本是扫描件。
- 检查字体资源:PDF 里没有 /Font 对象,或页面只有一张大图,基本是扫描件。
- 用户标注:上传时让用户勾选"是否为扫描件",可省一次探测。
04第二步:PDF 解析 —— 两条路线
路线 A · 文本型 PDF:直接抽文字 + 版式
文本型 PDF 已经内嵌文字,关键是在"抽干净"的同时保留结构信息(标题层级、段落、表格位置、阅读顺序)。
⚡PyMuPDF (fitz)
速度快、能拿文本块坐标和阅读顺序,适合大批量。缺点:表格需配合其它库。
📊pdfplumber
基于 pdfminer,表格抽取(线条/单元格)能力强,适合报表、合同。
🧠版面模型
LayoutLMv3 / Detectron2 / 云服务(Azure、Textract):把"标题/段落/表格/图片"当目标检测,结构还原最好。
路线 B · 扫描型 PDF:渲染 + OCR
扫描件本质是图片。先按页渲染成高清图(300 DPI 起步),再走 OCR 把像素变文字。中文首选 PaddleOCR(识别准、自带版面),英文/通用可上 Tesseract 或云 OCR。
05第三步:Word(.docx) 解析
.docx 比 PDF 友好得多——它是一个 ZIP 包,里面是一堆 XML。文字、标题样式、表格、批注都有标记,结构天然清楚。
用 python-docx 能拿到什么
- 段落(Paragraph):含文字、样式名("Heading 1/2/3" 可直接当层级)。
- 表格(Table):按行列遍历单元格,转成 Markdown 表格保留结构。
- 图片(InlineShape):可提取另存;若要进知识库,建议 OCR 或让多模态模型生成描述。
- 样式 / 大纲级别:用来还原章节树,是 Word 切分的最大优势。
06第四步:清洗与结构化
解析出来的是"原始文本",还夹着大量噪声。清洗决定知识纯度。这一步把"能读"变成"好检索"。
🧹去噪
删页眉页脚、页码、水印、目录里的"......3"、重复的版权声明、乱码与多余空行。可用正则 + 版式位置规则。
📐表格结构化
把表格转成 Markdown / HTML,保留行列关系,别拍平成一坨文字,否则"某行某列"的信息全丢。
🖼️图片处理
图里的关键信息(流程图、截图文字)要么 OCR 提取,要么用多模态模型生成文字描述,否则这块知识"失明"。
🔤统一归一
统一编码(UTF-8)、全半角、空白符;合并被连字符断开的单词;规范标点。
# 标题、| 表格 |、。后面的切分能直接"按标题层级"切,比纯文本聪明得多。一句话对比:PDF 清洗 vs Word 清洗
| 维度 | Word | |
|---|---|---|
| 结构来源 | 靠解析/版面模型推断 | XML 原生标记,最准 |
| 表格 | 需 pdfplumber / 版面模型 | python-docx 直接遍历 |
| 标题层级 | 靠字号/位置猜 | 样式名直接给 |
| 典型噪声 | 页眉页脚、扫描乱码 | 样式混乱、隐藏文字 |
07第五步:智能切分 Chunking
清洗后的长文本要切成适合检索的"块(Chunk)"。切错了,检索必漏——这是导入阶段第二个关键决策点。
核心参数与重叠
每个 Chunk 大小(常见 300–800 token)和 overlap 重叠(10–20%)是两个旋钮。重叠让"被切断的语义"在相邻块里都能完整出现。
四种切分策略对比
| 策略 | 做法 | 优点 | 缺点 |
|---|---|---|---|
| 固定长度 | 按 token/字符硬切 | 简单、均匀 | 割裂语义 |
| 按标题层级 | 按 Markdown/样式章节切 | 保结构、上下文完整(Word 最佳) | 块大小不均 |
| 语义切分 | 按句向量聚类找断点 | 语义连贯最优 | 计算成本高 |
| 父子分块 | 小块检索 + 大块喂模型 | 召回准、上下文足 | 存储翻倍 |
08第六步:元数据抽取
每个 Chunk 不能只存文字,还要带元数据——它是后面"过滤、溯源、权限"的基础设施。这一步常被忽略,却是生产级知识库的命脉。
📎来源类
文件名、路径、文档类型(PDF/Word)、原始 URL、上传者。
📍位置类
页码、章节标题、在文档内的偏移,方便"答案回到原处"。
🔐权限类
部门 / 角色标签、密级,用于检索时的元数据过滤隔离。
🕒时间类
文档创建/更新时间、入库时间,支撑"新鲜度"与失效回收。
🏷️语义类
自动打的标签 / 摘要(可选 LLM 生成),加速粗筛。
🆔关系类
父块 ID(父子分块用)、文档 ID,便于回溯整篇。
dept = 当前用户部门 就能防泄露。09第七步:向量化与入库(衔接总览篇)
到这里,文档已变成"干净的 Chunk + 元数据"。最后这步把它变成"可被语义检索"的形态,正式进入《知识库建设完全指南》的检索侧。
🔢Embedding 选型
中文优先 bge-large-zhBGE-M3;海外/合规宽松可用 text-embedding-3。入库与查询必须同一模型。
🗄️向量库选型
原型 Chroma;单体 pgvector;规模大 Qdrant / Milvus。必须支持元数据过滤(权限/时间/来源)。
10实战代码:PDF + Word 统一导入
下面是一段可运行骨架,演示如何把 PDF 和 Word 走通"解析 → 清洗 → 切分 → 向量化 → 入库"全过程(用 PyMuPDF、python-docx、LangChain 切分、本地 bge 向量、Qdrant 存储)。
11工具选型对比
PDF 解析工具
| 工具 | 擅长 | 短板 | 部署 |
|---|---|---|---|
| PyMuPDF | 快、坐标/顺序好 | 表格弱 | 本地 pip |
| pdfplumber | 表格抽取强 | 速度一般 | 本地 pip |
| PaddleOCR | 中文 OCR 准 | 需 GPU 更佳 | 本地 / 服务 |
| Azure / Textract | 版面+OCR 一体、省心 | 上云、按页计费 | 云 API |
Word 解析 / 转换
| 工具 | 用途 | 备注 |
|---|---|---|
| python-docx | 读 .docx 段落/表格/样式 | 不支持 .doc |
| LibreOffice 无头 | 批量 .doc → .docx | 服务器装 soffice |
| Mammoth | .docx → HTML/Markdown | Web 端友好 |
12常见坑(导入阶段避坑清单)
13导入流程检查清单(照着勾)
- 格式识别:确认 PDF/Word 类型、是否加密、是否扫描件。
- PDF 解析:文本型用 PyMuPDF/pdfplumber;扫描型渲染 + OCR;表格单独处理。
- Word 解析:python-docx 提取段落/标题/表格;老 .doc 先 LibreOffice 转 docx。
- 清洗:去页眉页脚/水印/页码/乱码,表格转 Markdown,图片 OCR 或描述。
- 结构化:输出带标题/表格标记的中间格式(Markdown),保留层级。
- 切分:定 chunk_size / overlap;优先按标题层级 + 父子分块。
- 元数据:补来源、页码、章节、部门、时间、父块 ID。
- 向量化:选中文 Embedding(bge/BGE-M3),入库与查询同模型。
- 入库:向量 + 原文 + 元数据写支持过滤的向量库(pgvector/Qdrant/Milvus)。
- 增量同步:文档更新触发重解析重索引,旧 Chunk 失效回收。
- 抽检验证:随机抽样,确认解析保真、切分合理、可溯源。