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。

相关新闻

基于SpringBoot的图书馆管理系统(源码+讲解视频+LW)

基于SpringBoot的图书馆管理系统(源码+讲解视频+LW)

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

2026/8/24 14:50:25 阅读更多 →
直播中控场控沟通记录怎么留存?秒档导出助手 直播间实时协同场景完整操作指南

直播中控场控沟通记录怎么留存?秒档导出助手 直播间实时协同场景完整操作指南

摘要 一场抖音直播的成败,往往取决于主播、场控、中控、运营在后台群里的实时配合。上架节奏、憋单话术、库存调整、违规预警、突发状况处置——这些转瞬即逝的沟通一旦不留存,复盘时无从追溯、纠纷时无法举证、团队交接时难以对齐。本文从直播间执行视角…

2026/8/24 14:50:25 阅读更多 →
关于桌面端Codex一进对话掉登录的解决办法

关于桌面端Codex一进对话掉登录的解决办法

个人在网上搜索到的几种方法,解决了,可能对遇到同样问题的人有帮助。 方法一 退出旧版Codex桌面应用。 在ChatGPT网页中,登出所有当前注册的Codex设备。 也请登出ChatGPT网页版。 将Codex桌面应用更新到最新版本。 再次登录。 方法二 …

2026/8/24 14:50:25 阅读更多 →

最新新闻

如何用 skills 做网页情感分析?从几百条评论到一份看得懂的结论

如何用 skills 做网页情感分析?从几百条评论到一份看得懂的结论

如何用 skills 做网页情感分析?从几百条评论到一份看得懂的结论 【免费下载链接】skills Browserbases official collection of agent skills to access the web. 项目地址: https://gitcode.com/GitHub_Trending/skills23/skills 面对几百条网页评论、用户评…

2026/8/24 18:03:07 阅读更多 →
嵌入式开发调试难题:IAR无法连接MSP430 USB调试接口的完整解决方案

嵌入式开发调试难题:IAR无法连接MSP430 USB调试接口的完整解决方案

1. 项目概述:当调试器“失联”时 作为一名在嵌入式开发一线摸爬滚打了十多年的老工程师,我敢说,调试器连接失败绝对是每个开发者都绕不开的“必修课”。最近,我在一个基于TI MSP430系列MCU的老项目维护中,就遇到了一个…

2026/8/24 18:03:07 阅读更多 →
SpringBoot @Value注解默认值设置:原理、实践与避坑指南

SpringBoot @Value注解默认值设置:原理、实践与避坑指南

1. 项目概述:为什么我们需要关注Value的默认值? 在SpringBoot项目的日常开发里,配置管理是个绕不开的话题。从数据库连接串到第三方服务的API密钥,再到业务开关,这些配置项散落在 application.yml 或 application.p…

2026/8/24 18:03:07 阅读更多 →
SurrealDB图形数据库指南:告别JOIN

SurrealDB图形数据库指南:告别JOIN

SurrealDB图形数据库指南:告别JOIN 【免费下载链接】surrealdb A scalable, distributed, collaborative, document-graph database, for the realtime web 项目地址: https://gitcode.com/GitHub_Trending/su/surrealdb SurrealDB是一个用Rust构建的多模型数据库&#…

2026/8/24 18:03:07 阅读更多 →
ncmdump:三步完成NCM文件解密转换

ncmdump:三步完成NCM文件解密转换

ncmdump:三步完成NCM文件解密转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump ncmdump 是运行在 Windows 上的 NCM 解密工具。网易云音乐下载的 .ncm 是加密格式,只能在自家客户端里播放,ncmdu…

2026/8/24 18:03:07 阅读更多 →
OPC UA设置事件节点

OPC UA设置事件节点

参考链接:Question about Python OPCUA session timeout and client. import asyncio, json from asyncua import Client, ua, Node from asyncua.common.events import Event from datetime import datetime####################################################…

2026/8/24 18:02:06 阅读更多 →

日新闻

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践

前端内容安全与依赖审计实践 前端安全依赖分层防护。没有任何单一配置能替代输出编码、权限校验和依赖更新。 把不可信内容当作数据 默认使用框架的转义能力;确需渲染 HTML 时,先在服务端或可信的客户端库中进行白名单过滤。避免把用户输入直接赋给 inne…

2026/8/24 1:08:15 阅读更多 →
Windows登录密码存储机制全解析:从哈希算法到安全加固实战

Windows登录密码存储机制全解析:从哈希算法到安全加固实战

1. 项目概述:Windows登录密码的“黑匣子”每次你按下CtrlAltDel,输入密码,然后看到那个熟悉的桌面,这背后发生了一系列复杂而精密的操作。作为一名长期与Windows系统打交道的从业者,我经常被问到:“我的密码…

2026/8/24 1:08:15 阅读更多 →
AI面试系统安全挑战与解决方案

AI面试系统安全挑战与解决方案

1. 项目概述:AI面试系统的安全挑战去年参与某跨国企业AI面试系统部署时,遇到一个典型案例:候选人在视频面试中无意提到竞争对手产品名称,系统竟自动将该信息关联到企业知识库并生成竞品分析报告。这个看似"智能"的功能&…

2026/8/24 1:08:15 阅读更多 →

周新闻

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

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

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

2026/8/24 0:06:02 阅读更多 →
SIP通话转接原理与REFER方法实战解析

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

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

2026/8/24 0:20:20 阅读更多 →
Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

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

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

2026/8/24 0:14:11 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/23 18:47:06 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/23 12:10:44 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/24 11:20:22 阅读更多 →