
目录一、多个知识库文件怎么整合成一份文本1常见文件解析工具伪代码逻辑Python二、RAG 预处理到底是做什么✅预处理主要做的事情生产环境实际步骤预处理前后对比三、完整链路文件 → RAG 向量入库四、两种工程实现方案简易预处理示例代码片段五、关键注意点场景本地一堆 PDF、Word、Markdown、TXT、HTML要喂给 RAG第一步就是文件解析→合并成原始文本→文本预处理→分块 (chunk)。一、多个知识库文件怎么整合成一份文本流程文件读取解析 → 提取每个文件正文 → 拼接 / 组装成大文本保留元数据1常见文件解析工具文件类型工具PDFPyPDF2、pdfplumber、Unstructured、PyMuPDF(fitz)Word(.docx)python‑docx、UnstructuredMarkdown直接 read 读取TXT直接 read 读取HTMLBeautifulSoup、Unstructured⚠️不要直接二进制拼接要解析出人类可读正文不能把 pdf 二进制流拼在一起。伪代码逻辑Pythonpythonimport os from unstructured.partition.auto import partition all_docs [] folder_path ./knowledge_base for fname in os.listdir(folder_path): file_path os.path.join(folder_path, fname) # 解析文件输出文本块 elements partition(filenamefile_path) file_text \n.join([str(elem) for elem in elements]) # 带上元数据来源文件名后续RAG溯源用 all_docs.append({ source: fname, raw_text: file_text }) # 方式1全部合并成一个超大字符串不推荐丢失来源 # full_text \n文档分割\n.join([d[raw_text] for d in all_docs]) # 方式2保留每个文档独立文本元数据工程推荐用于后续分块 # 后续直接对all_docs做预处理、分块重点不要把所有文件无脑拼成一个大长文本丢给向量化。保留每个文档的来源元数据检索后可以实现「引用溯源」告诉大模型这段内容来自哪个文档。二、RAG 预处理到底是做什么原始解析出来的 raw_text 会有大量噪声换行乱码、页眉页脚、页码、广告、重复内容、多余空格、表格乱解析符号、脚注、目录、水印文字。预处理目标清洗噪声保留有效业务语义提升召回质量减少无效 token降低向量库垃圾数据。✅预处理主要做的事情生产环境实际步骤空白字符归一化多个换行\n\n\n、制表符\t、大量空格压缩把\r、零宽字符、不可见特殊 unicode 删掉。示例 原始大模型\r\n\n\n RAG\t\t技术 。 清洗后大模型\nRAG 技术。去除无效噪声片段页眉、页脚、页码、文档水印、版权声明、目录、脚注、参考文献PDF 解析经常会出现的乱码字符、OCR 识别错字。文本去重同一文档内部重复段落多份文档重复拷贝的内容避免向量库大量重复向量导致检索结果重复。格式规整表格解析后乱码修复把无意义的分割符号、多余特殊符号清理保留有语义的换行段落之间换行保留段落内部多余换行删掉。过滤过短垃圾片段过滤单字符、只有标点、只有页码的无效片段。❗预处理不做的事不要做语义改写、摘要、翻译RAG 预处理尽量保留原文改写会丢失原始事实造成幻觉。预处理前后对比原始 raw_text混杂页码、页眉、大量空行、水印文字、重复脚注预处理后干净的段落文本语义完整噪声被剔除适合下一步分块。三、完整链路文件 → RAG 向量入库多文件(PDF/docx/md) ↓ 文件解析提取正文文本带上source元数据 ↓ 【文本预处理】清洗噪声、归一化、去无效片段、去重 ↓ 文档分块Chunking固定大小/语义分块重叠overlap ↓ 每个chunk带上元数据(source, page, chunk_id) ↓ Embedding向量化 ↓ 存入向量数据库很多新手踩坑跳过预处理直接分块。PDF 解析出来一堆页码水印全部进向量库检索时经常召回一堆页码、版权文字答案质量极差。四、两种工程实现方案轻量自研自己写正则做预处理适合内部简单知识库成熟库Unstructured、LlamaIndex 的 DocumentTransformers、LangChain TextCleaner内置很多预处理规则。简易预处理示例代码片段pythonimport re def preprocess_text(raw: str) - str: # 1. 替换多个换行、制表符 text re.sub(r\n, \n, raw) text re.sub(r\t, , text) text re.sub(r , , text) # 2. 删除页码类简单模式示例复杂文档需要更复杂规则 text re.sub(r^\s*第?\d\s*页\s*$, , text, flagsre.MULTILINE) # 3. 去除零宽不可见字符 text re.sub(r[\u2000-\u200F], , text) return text.strip()五、关键注意点元数据非常重要预处理不要丢掉来源、页码后续 RAG 回答溯源、文档版本归档依赖元数据。不要过度清洗不要把短标题、列表项删掉业务专有符号不要乱删。预处理≠分块预处理是清洗文本分块是把长文本切为小片段两个步骤分开。OCR 扫描版 PDF解析出来噪声会更多预处理工作量更大。