发布时间:2026/8/24 14:51:29
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/8/24 14:51:29

单词汇总(一)

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/8/24 14:46:28

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

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

2026/8/24 14:46:28

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

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

2026/8/24 16:51:49

多目标规划:从帕累托最优到NSGA-II的数学建模实战

1. 项目概述:从单目标到多目标的思维跃迁在数学建模的实战中,我们常常会遇到一个核心矛盾:现实世界的问题很少是“非黑即白”的单目标决策。比如,一个城市在规划新工业园区时,既要追求经济效益最大化(产值最…

2026/8/24 0:07:22

[光学原理与应用-521]:对光的错误理解与纠偏

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

2026/8/24 1:12:32

SIP通话转接原理与REFER方法实战解析

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

2026/8/24 8:17:29

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

2026/8/24 1:09:25

3条命令跑通LocalAI:无GPU本地AI引擎部署

3条命令跑通LocalAI:无GPU本地AI引擎部署 【免费下载链接】LocalAI LocalAI is the open-source AI engine. Run any model - LLMs, vision, voice, image, video - on any hardware. No GPU required. 项目地址: https://gitcode.com/GitHub_Trending/lo/LocalAI…

2026/8/24 1:09:25

AI推理性能测试怎么做:MLPerf Inference完整上手指南

AI推理性能测试怎么做:MLPerf Inference完整上手指南 【免费下载链接】inference Reference implementations of MLPerf inference benchmarks 项目地址: https://gitcode.com/gh_mirrors/inf/inference 同一个模型换一张卡,速度快多少你知道吗&a…

2026/8/24 13:42:17

实测才敢推 AI论文网站 2026最新测评与推荐

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。一、综…

2026/8/23 6:14:43

2026必备!AI论文网站测评:最新推荐与深度对比

2026年真正好用的AI论文网站,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

2026/8/23 4:22:01

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…