RAG 实战教程(三):PDF、Word、Markdown 多文档知识库实战——文档解析、清洗与智能索引

发布时间:2026/10/23 11:50:57

RAG 实战教程(三):PDF、Word、Markdown 多文档知识库实战——文档解析、清洗与智能索引 RAG 系列第三篇。本篇将在第二篇「Python Qdrant 搭建第一个 RAG 知识库」的基础上继续升级实现一个更加接近真实企业场景的知识库系统。我们将支持PDF 文档Word 文档Markdown 文档HTML 网页文档清洗Metadata 管理增量索引多格式统一入库最终实现企业文档 | | ↓ PDF / Word / Markdown / HTML | ↓ Document Loader | ↓ 文本清洗 | ↓ 结构化 Chunk | ↓ Embedding | ↓ Qdrant 向量数据库 | ↓ RAG 问答系统一、为什么真实 RAG 最难的是数据而不是模型很多人在第一次接触 RAG 时会认为RAG 的核心就是调用大模型。实际上真正落地之后你会发现模型往往不是最大的问题。企业真正困难的是我的资料在哪里 如何读取 如何切分 如何保持结构 如何避免垃圾内容进入知识库 如何知道答案来自哪一页例如一个企业知识库可能包含产品文档 ├── 产品介绍.pdf ├── API 接口文档.md ├── 用户手册.docx ├── 售后规则.html ├── 内部培训 PPT └── 数据库说明文档这些文件有几个共同问题1. 文件格式不同PDF文字 图片 表格 扫描页 页眉页脚Word标题 正文 列表 表格 图片Markdown标题层级 代码块 列表 链接HTML标签 脚本 广告 导航如果直接丢给 Embedding效果通常不会很好。2. 文档结构容易丢失例如原始 PDF第三章 用户退款规则 3.1 普通退款 用户购买后 7 天内可以申请退款。 3.2 特殊情况 超过 7 天需要人工审核。如果简单提取可能变成第三章 用户退款规则 3.1 普通退款 用户购买后7天内可以申请退款 3.2特殊情况 超过7天需要人工审核标题关系丢失。Embedding 不知道普通退款属于用户退款规则3. 企业需要引用来源一个真正可用的 RAG不是答案 可以退款。而应该答案 用户购买后 7 天内可以申请退款。 来源 用户协议.pdf 第 18 页 第三章 用户退款规则所以我们必须保存{content:...,metadata:{source:用户协议.pdf,page:18,title:退款规则}}二、第三篇最终目标这一篇完成之后我们的 RAG 架构数据接入层 PDF | Word | Markdown | HTML ↓ Document Loader ↓ Text Cleaner ↓ Smart Chunk ↓ Embedding ↓ Qdrant ↓ 用户问题 ↓ Query Embedding ↓ Vector Search ↓ Context ↓ LLM ↓ 答案 来源三、项目结构升级第二篇项目rag-demo/升级rag-enterprise/ ├── data/ │ │ ├── pdf/ │ ├── word/ │ ├── markdown/ │ └── html/ │ ├── loaders/ │ │ ├── pdf_loader.py │ ├── word_loader.py │ ├── markdown_loader.py │ └── html_loader.py │ ├── processors/ │ ├── cleaner.py │ └── splitter.py ├── index/ │ ├── embedding.py │ └── vector_store.py ├── pipeline/ │ └── index_pipeline.py ├── app.py ├── requirements.txt └── README.md这就是一个更加接近生产环境的结构。四、安装依赖创建requirements.txt内容openai qdrant-client python-dotenv pymupdf python-docx beautifulsoup4 markdown安装pipinstall-rrequirements.txt五、统一 Document 数据结构这是整个系统非常重要的一步。不要让不同 Loader 返回不同格式。例如PDF 返回{text:...,page:1}Word 返回{content:...,}后面一定会混乱。所以我们定义统一格式{content:,metadata:{source:,type:,page:None,title:}}创建models.py代码fromdataclassesimportdataclassfromtypingimportOptionaldataclassclassDocument:content:strsource:strdoc_type:strpage:Optional[int]Nonetitle:Optional[str]Nonedefmetadata(self):return{source:self.source,type:self.doc_type,page:self.page,title:self.title}以后所有 Loader都返回Document六、PDF 文档解析PDF 是企业 RAG 中最常见的数据来源。安装pipinstallpymupdfPyMuPDF 导入importfitz创建loaders/pdf_loader.py代码importfitzfrommodelsimportDocumentdefload_pdf(path):pdffitz.open(path)documents[]forpage_number,pageinenumerate(pdf,start1):textpage.get_text()ifnottext.strip():continuedocuments.append(Document(contenttext,sourcepath,doc_typepdf,pagepage_number))returndocuments测试fromloaders.pdf_loaderimportload_pdf docsload_pdf(data/pdf/example.pdf)fordocindocs:print(doc.page)print(doc.content[:200])输出1 RAG 是一种检索增强生成技术... 2 Embedding 可以把文本转换成向量...七、PDF 最大的问题扫描件现实中很多 PDF不是文字 PDF。例如扫描合同.pdf 扫描发票.pdf 扫描说明书.pdf打开你能看到文字。但是程序page.get_text()返回空原因里面其实是图片。需要OCR流程PDF ↓ 图片 ↓ OCR ↓ 文字 ↓ Chunk常见方案PaddleOCR Tesseract Azure OCR Google Vision后续企业版 RAG 会专门讲 OCR。八、Word 文档解析Word 使用python-docx安装pipinstallpython-docx创建loaders/word_loader.py代码fromdocximportDocumentasDocxDocumentfrommodelsimportDocumentdefload_word(path):docDocxDocument(path)texts[]forparagraphindoc.paragraphs:textparagraph.text.strip()iftext:texts.append(text)content\n.join(texts)return[Document(contentcontent,sourcepath,doc_typeword)]测试docsload_word(data/word/manual.docx)print(docs[0].content)九、Markdown 文档解析Markdown 在技术知识库里非常常见。例如GitHub Wiki 技术博客 API 文档 项目 README创建loaders/markdown_loader.py代码frommodelsimportDocumentdefload_markdown(path):withopen(path,r,encodingutf-8)asf:contentf.read()return[Document(contentcontent,sourcepath,doc_typemarkdown)]但是 Markdown 有一个优势它有结构。例如# RAG ## 什么是 RAG 内容... ## 什么是 Embedding 内容...我们后面可以根据# ## ###进行智能切分。十、HTML 网页解析很多企业知识来自官网 帮助中心 API 文档 博客HTML 需要清理删除script style 导航 广告安装pipinstallbeautifulsoup4创建loaders/html_loader.py代码frombs4importBeautifulSoupfrommodelsimportDocumentdefload_html(path):withopen(path,r,encodingutf-8)asf:htmlf.read()soupBeautifulSoup(html,html.parser)fortaginsoup([script,style]):tag.decompose()textsoup.get_text(\n)return[Document(contenttext,sourcepath,doc_typehtml)]十一、统一 Loader 接口现在PDFload_pdf()Wordload_word()Markdownload_markdown()HTMLload_html()虽然可以工作。但是项目越来越大后调用会很乱。所以统一创建loaders/__init__.py代码fromloaders.pdf_loaderimportload_pdffromloaders.word_loaderimportload_wordfromloaders.markdown_loaderimportload_markdownfromloaders.html_loaderimportload_htmldefload_document(path):ifpath.endswith(.pdf):returnload_pdf(path)ifpath.endswith(.docx):returnload_word(path)ifpath.endswith(.md):returnload_markdown(path)ifpath.endswith(.html):returnload_html(path)raiseException(f不支持文件类型:{path})以后新增格式只需要增加ifsuffix:returnloader()即可。十二、文档清洗原始文本通常很脏。例如PDF第 1 页 公司名称 正文内容 第 2 页 公司名称 正文内容页眉重复。需要清洗。创建processors/cleaner.py代码importredefclean_text(text):# 删除多余空白textre.sub(r\s, ,text)# 删除特殊字符textre.sub(r[^\w\s\u4e00-\u9fa5。,.!?],,text)returntext.strip()测试text RAG 是一种技术。 print(clean_text(text))输出RAG 是一种技术。十三、为什么清洗非常重要因为 Embedding 不是理解人类格式。它看到RAG RAG RAG 123456 公司名称这些垃圾内容。会影响向量质量最终导致搜索不准所以好的 RAG首先需要好的数据。未完下一部分继续写智能 Chunk、Metadata 索引、多文档入库、增量更新、完整企业级 Pipeline。
延伸阅读

更多相关文章

2026/10/24 6:02:09

单词汇总(一)

1.Embedded System 嵌入式系统2.IC ‌Integrated Circuit‌ 集成电路3.stack栈 heap堆4.welcome to board 欢迎加入5.TTS Text to speech 文字转换成语音6.designer 设计师7.co-work 合作8.FPGA Field Programmable Gate Array 现场可编程门阵列,是一种用户可编程的半导体集成…

2026/10/23 14:13:37

美团:元Harness优化长程智能体设计

📖标题:AutoDesign: Meta-Harness Optimization for Long-Horizon Agentic Design 🌐来源:arXiv, 2608.13560v1 🛎️文章简介 🔸研究问题:如何将多模态源转化为结构化输出时,使系统能…

2026/10/22 18:19:22

基于SpringBoot德育家校共建平台系统(源码+讲解视频+LW)

联系博主 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 …

2026/10/24 8:43:48

H.264整数DCT变换原理:从浮点DCT到整数变换的工程取舍

简介:这份文档聚焦H.264视频编码标准中的整数DCT变换编码与量化过程,面向视频编解码学习者、算法工程师及多媒体方向研究者,帮助理解44块无乘法整数变换的原理与实现细节。资源为单个doc文档,压缩包约194KB,内容源自北…

2026/10/24 8:43:48

插入排序算法原理与实现详解

1. 插入排序算法概述插入排序(Insertion Sort)是一种简单直观的排序算法,它的工作原理类似于我们整理扑克牌的过程。想象一下,当你手中已经有一部分牌按顺序排列,每次拿到新牌时,你都会将它插入到已排序牌组…

2026/10/24 8:43:48

单机测试明明合格,多轴控制为什么还是会抖?

在工业控制和机器人项目中,单机测试通过并不意味着整套控制系统已经具备稳定运行的能力。一个在空载环境下运行良好的实时 Linux 系统,接入多个伺服驱动器、启动 EtherCAT 周期通信、运行运动学计算,再叠加上位机通信、日志记录和状态监测之后…

2026/10/24 8:43:48

游戏多开用什么软件 游戏多开软件推荐

很多玩家会受限于本地设备性能,玩游戏多开几个账号就容易发热闪退,很难稳定挂机养号。游戏多开不必硬扛硬件压力,建议试试无界趣连2.0,依托云手机能力,不用本地高配置设备,就能托管多个游戏账号&#xff0c…

2026/10/24 8:43:48

mac好用的软件推荐 mac远程软件推荐无界趣连2.0

mac好用的软件一直是苹果设备用户持续寻找的目标,尤其是需要跨设备远程操控的人群,合适的工具并不多。mac好用的软件里,远程工具很容易踩坑,要么收费高昂,要么和跨平台设备适配差,无界趣连2.0就很适合mac用…

2026/10/23 22:56:35

金融AI落地指南:从调研报告到技术选型与工程实践

简介:这份PDF报告聚焦2025年金融服务业中国AI现状与趋势,面向金融科技从业者、AI战略规划人员及关注行业数字化转型的研究者,帮助读者把握生成式AI在银行、支付、交易等场景中的落地路径与投资方向。资源包内含1个PDF文件,大小约1…

2026/10/24 0:02:40

MATLAB缩进快捷键与批量格式化实战指南

1. 被自动缩进折磨的那些年如果你写过MATLAB代码,大概率经历过这种场景:从某个文档、网页或者聊天记录里复制了一段代码,粘贴进编辑器之后,每一行前面都带着莫名其妙的空格,有的行首是四个空格,有的是一个T…

2026/10/24 0:02:40

用Poco实现Qt风格信号与槽的跨平台C++方案

简介:本资源是一份面向C中级开发者的技术实践工程,聚焦于在非Qt框架环境下模拟实现Qt核心通信机制——信号与槽,借助Poco网络库的事件系统完成解耦式对象通信。适用于需在跨平台C项目中引入松耦合回调机制、但受限于无法集成Qt依赖的开发场景…

2026/10/24 0:02:40

ESXi裸机虚拟化安装指南:从硬件兼容到虚拟机部署

1. 为什么还要折腾ESXi:从一台闲置机器说起手里攒了几台淘汰下来的迷你主机,配置不算差,i5加16G内存,扔了可惜,装个桌面系统又觉得浪费。这种场景下,ESXi就成了一个绕不开的选择。它是一套裸机虚拟化平台&a…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑