跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

自有文档构建 RAG 与微调数据集:Word/Excel/PPT 数据处理方案

介绍如何利用自有文档(Word、Excel、PPT 等)构建适用于 RAG 检索增强生成与大模型微调的数据集。通过智能化脚本将不同格式文件统一转换为结构化文本,结合 OCR 处理图像内容,实现文本分块、元数据提取及 JSONL 格式输出。涵盖环境搭建、分类策略、内容解析、合并处理及数据集划分全流程,提供高效的数据清洗与准备方案,提升模型训练效果。

HadoopMan发布于 2025/2/7更新于 2026/9/1065 浏览
自有文档构建 RAG 与微调数据集:Word/Excel/PPT 数据处理方案

基于自有文档构建 RAG 与微调数据集

在构建检索增强生成(RAG)系统或进行大模型微调时,高质量的数据集是核心基础。企业日常产生的办公文档(如 Word、Excel、PPT、PDF 等)往往包含大量有价值的信息,但格式杂乱,难以直接利用。

本文将介绍如何将自有文档统一转换为结构化数据集,涵盖文本提取、表格解析、图像 OCR 识别及数据合并的全流程。

处理策略对比

针对多格式文档的处理,通常有三种主流方案:

  1. 分类型提取:将文本、图片、表格分别提取。例如将 Word/PDF 转为 HTML 或 Markdown,再分离内容;图片和表格单独处理为文本。
  2. 统一 OCR 提取:将所有文档转为图像,使用 OCR 工具统一提取。此方法能保留图表与原文本的相对位置,适合复杂排版,但精度受 OCR 影响。
  3. 智能化脚本处理:编写脚本自动识别文件类型,调用对应解析库。这是最高效的方式,能保持数据结构清晰,便于后续处理。

本文重点讲解第三种方案,实现一个自动化脚本,批量处理多种办公格式并生成标准数据集。

目标数据格式

为了适配 RAG 和微调任务,我们需要将数据输出为 JSONL 格式。每条记录应包含以下关键字段:

  • block_ID: 文本块的唯一标识符
  • doc_ID: 所属文档的唯一标识符
  • content_type: 内容类型(text, table, image)
  • file_type: 源文件格式(docx, xlsx, pptx 等)
  • file_source: 原始文件名
  • text: 提取后的实际文本内容
  • metadata: 其他元数据(如创建时间、作者等)

示例结构如下:

{
  "sample_number": 1246,
  "file_source": "MSFT_FY24Q4_10K.docx",
  "text": "estimates determined by management...",
  "metadata": {
    "created_date": "2024-07-29T23:12:00Z",
    "author_or_speaker": ""
  }
}

工作流程设计

整个处理流程可分为四个核心步骤:

1. 分类 (Classification)

遍历输入目录,根据文件扩展名将文件分为文本类(Word)、表格类(Excel)、演示文稿类(PPT)及图像类(JPG/PNG)。

2. 分别处理 (Extraction)

针对不同类别调用专用解析工具:

  • 文本:直接读取内容,按语义或固定长度分块。
  • 表格:解析为 CSV 或 DataFrame 形式,转为纯文本描述。
  • 图像:使用 OCR 技术提取文字,保留坐标信息。

3. 合并到 JSON (Merging)

将同一文件的所有解析结果合并为一个 JSON 对象列表,确保每个块都有唯一的 ID 和来源标记。

4. 制作数据集 (Dataset Construction)

对合并后的数据进行清洗、去重,并按比例划分为训练集、验证集和测试集。

环境准备

建议使用 Linux 或 WSL 环境,Python 版本推荐 3.10。

  1. 创建 Conda 环境

    conda create -n rag_data python=3.10
    conda activate rag_data
    
  2. 安装依赖库 主要依赖包括文档解析库、OCR 库及数据处理库:

    pip install python-docx openpyxl pdfplumber pytesseract pandas numpy
    

关键代码实现

以下是一个通用的处理逻辑示例,展示了如何实现上述流程。实际项目中可根据具体需求封装为类或模块。

1. 文件分类与遍历

import os
from pathlib import Path

def get_file_types(directory):
    extensions = {
        'text': ['.docx', '.txt'],
        'table': ['.xlsx', '.xls', '.csv'],
        'ppt': ['.pptx'],
        'image': ['.jpg', '.png', '.pdf']
    }
    files = {'text': [], 'table': [], 'ppt': [], 'image': []}
    
    for root, _, filenames in os.walk(directory):
        for filename in filenames:
            ext = Path(filename).suffix.lower()
            for ftype, exs in extensions.items():
                if ext in exs:
                    files[ftype].append(os.path.join(root, filename))
                    break
    return files

2. 内容提取与分块

文本处理

对于 Word 文档,使用 python-docx 提取段落,并进行智能分块(Chunking),避免切断句子。

from docx import Document

def extract_text_from_docx(file_path, chunk_size=400, max_chunk_size=600):
    doc = Document(file_path)
    full_text = []
    for para in doc.paragraphs:
        text = para.text.strip()
        if text:
            full_text.append(text)
    
    # 简单分块逻辑,实际可结合 NLP 模型进行语义切分
    chunks = []
    current_chunk = ""
    for line in full_text:
        if len(current_chunk) + len(line) <= max_chunk_size:
            current_chunk += line + "\n"
        else:
            if current_chunk:
                chunks.append(current_chunk)
            current_chunk = line + "\n"
    if current_chunk:
        chunks.append(current_chunk)
    return chunks
表格处理

Excel 文件需转换为文本描述,保留行列关系。

import pandas as pd

def extract_tables_from_excel(file_path):
    tables = []
    xls = pd.ExcelFile(file_path)
    for sheet_name in xls.sheet_names:
        df = pd.read_excel(xls, sheet_name=sheet_name)
        # 将 DataFrame 转为文本行
        for idx, row in df.iterrows():
            tables.append(" | ".join([str(v) for v in row]))
    return tables
图像 OCR 处理

对于 PPT 中的截图或 JPG 图片,使用 OCR 提取文字。

import pytesseract
from PIL import Image

def run_ocr_on_image(image_path):
    img = Image.open(image_path)
    try:
        text = pytesseract.image_to_string(img, lang='chi_sim+eng')
        return text.strip()
    except Exception as e:
        print(f"OCR failed for {image_path}: {e}")
        return ""

3. 数据合并与导出

将所有提取的内容组装成字典列表,并保存为 JSONL 文件。

import json
import uuid

def build_dataset(files_dict, output_path):
    dataset = []
    block_id = 0
    
    for ftype, paths in files_dict.items():
        for path in paths:
            file_name = os.path.basename(path)
            content_list = []
            
            if ftype == 'text':
                content_list = extract_text_from_docx(path)
            elif ftype == 'table':
                content_list = extract_tables_from_excel(path)
            elif ftype == 'image':
                content_list = [run_ocr_on_image(path)]
            
            for content in content_list:
                if not content:
                    continue
                record = {
                    "block_ID": str(uuid.uuid4()),
                    "doc_ID": os.path.splitext(file_name)[0],
                    "content_type": ftype,
                    "file_type": Path(path).suffix,
                    "file_source": file_name,
                    "text": content
                }
                dataset.append(record)
                block_id += 1
    
    with open(output_path, 'w', encoding='utf-8') as f:
        for item in dataset:
            f.write(json.dumps(item, ensure_ascii=False) + '\n')
    
    print(f"Dataset saved to {output_path}, total records: {len(dataset)}")

4. 数据集划分

使用 Datasets 类或手动划分来生成训练集、验证集和测试集。

import random

def split_dataset(data, test_ratio=0.1, val_ratio=0.1):
    random.shuffle(data)
    n = len(data)
    test_end = int(n * test_ratio)
    val_end = int(n * (test_ratio + val_ratio))
    
    test_set = data[:test_end]
    val_set = data[test_end:val_end]
    train_set = data[val_end:]
    
    return train_set, val_set, test_set

最佳实践建议

  1. 元数据完整性:尽量保留文件的创建时间、修改者等信息,有助于后续溯源。
  2. 分块策略:RAG 场景下,分块大小建议在 400-600 tokens 之间,并设置重叠区(Overlap)以保证上下文连贯。
  3. 质量校验:定期抽检生成的 JSONL 文件,检查是否有乱码或截断情况。
  4. 隐私脱敏:若文档包含敏感信息,需在提取前进行正则替换或脱敏处理。

总结

通过自动化脚本将异构办公文档转化为标准化的 JSONL 数据集,可以显著提升 RAG 系统的召回率和微调模型的效果。本方案提供了从环境搭建、文件分类、内容解析到数据集生成的完整流程,开发者可根据实际业务需求调整解析逻辑和分块参数。掌握这一数据处理能力,是构建高质量 AI 应用的基础。

目录

  1. 基于自有文档构建 RAG 与微调数据集
  2. 处理策略对比
  3. 目标数据格式
  4. 工作流程设计
  5. 1. 分类 (Classification)
  6. 2. 分别处理 (Extraction)
  7. 3. 合并到 JSON (Merging)
  8. 4. 制作数据集 (Dataset Construction)
  9. 环境准备
  10. 关键代码实现
  11. 1. 文件分类与遍历
  12. 2. 内容提取与分块
  13. 文本处理
  14. 表格处理
  15. 图像 OCR 处理
  16. 3. 数据合并与导出
  17. 4. 数据集划分
  18. 最佳实践建议
  19. 总结

更多推荐文章

查看全部
  • Android 大厂面试真题解析与复习思路指南
  • AIGC 时代的网络安全威胁与应急响应机制构建
  • C++ 模板的两大特性:typename 与分离编译
  • ROS2 slam_toolbox 激光雷达建图教程
  • 字节开源 Hyper-SD:Stable Diffusion 加速模型支持 1 至 8 步推理
  • LangChain 消息处理:缓存、过滤、合并与流式输出实战
  • 大模型面试核心题库与解析
  • Java 大数据在智能家居环境监测与智能调节中的应用
  • AI 与存储的结合:智能存储的实践与挑战
  • 前端跨子域通讯深度解析:核心方案与避坑指南
  • 开源知识库 RAGFlow 从部署到实战操作详解
  • Linux 系统安装 Go 语言及环境配置指南
  • OpenClaw 开源 AI Agent 框架技术解析与实践
  • 前端高频面试题:TypeScript 核心概念与实战解析
  • 汽车雷达多径环境下幽灵目标检测算法研究
  • 算法题解:牛客 NC221681 dd 爱框框
  • AR眼镜光学镜头设计实例与核心技巧
  • Python 技术文档概览与模块索引
  • Unix/Linux 信号:原理、触发与响应机制实战
  • Python 入门与兼职接单实战指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online