本项目提供一套完整的工具链,用于处理供应链技术PDF文档,提取有价值的内容,并生成高质量的问答对用于LLM(大型语言模型)的微调训练。
- 自动处理PDF文档并提取文本内容
- 增强型文档清洗,处理专业术语、结构化标题、图表和列表
- 自动清理引用网址,移除不应出现在正文中的参考链接
- 智能语义分段,保持内容的上下文完整性
- 增强型主题提取,准确识别段落核心技术主题
- 问答语义匹配,确保问题和答案的相关性
- 自动生成多样化、高质量的问答对
- 检测并修复问题中的特殊字符和格式问题
- 质量评估和筛选,确保最终数据的高质量
- 支持ChatGLM格式的输出,便于直接用于模型微调
- 全流程自动化处理,提高数据处理效率
- 自动依赖检查和临时文件清理
- 基于规则和算法实现,不依赖外部LLM API
- macOS系统(目前主要在macOS上测试通过)
- Python 3.8+
- 所需依赖库(特定版本):
- langchain==0.0.267
- langchain_community>=0.0.1
- langchain-text-splitters>=0.0.1
- pypdf>=3.15.1
- tiktoken>=0.5.1
- numpy>=1.24.0
- regex>=2023.8.8
- tqdm>=4.66.1
- python-dotenv>=1.0.0
pip install -r requirements.txt使用automate_pipeline.py脚本可以一键完成从PDF到高质量问答对的全过程:
python automate_pipeline.py --pdf <pdf文件路径> --output <输出目录> --skip-existing参数说明:
--pdf:指定输入的PDF文件路径--output:指定输出目录,默认为"output"--skip-existing:如果输出文件已存在,跳过相应步骤(对于每个处理阶段都适用,可以在任意阶段中断后继续处理)
如果您想单独执行某个处理步骤,可以使用对应的脚本:
- PDF内容提取:
python tunning.py --pdf <pdf文件路径> --output processed_content.txt- 增强型文档清洗(新增功能):
python enhanced_cleaner.py --input processed_content.txt --output enhanced_content.txt- 语义分段:
python segment.py --input enhanced_content.txt --output segmented_content.json- 问答对生成:
python generate_qa_pairs_improved.py --input segmented_content.json --output_dir output- 问答对修复:
python fix_qa_pairs_improved.py --input_json output/qa_instructions_robust.json --input_jsonl output/qa_instructions_chatglm_robust.jsonl --output_dir output- 高质量问答对提取:
python ensure_high_quality.py --output_dir output-
PDF文本提取:从PDF文件中提取原始文本内容,并进行基础清洗处理。
-
增强型文档清洗:进行更深层次的文本清洗,包括:
- 识别和标记文档结构(标题、段落、图表、列表等)
- 专业术语统一化处理(如WMS与"仓库管理系统"的统一表达)
- 细粒度重复内容检测与删除
- 图表内容与说明的关联加强
- 列表结构保留
- 技术概念的关联性增强
-
智能语义分段:按照语义将文本内容拆分为适当大小的段落,保持上下文关联。
-
问答对生成:基于分段内容自动生成多种类型的高质量问答对。
- 使用预定义模板生成不同难度和维度的问题
- 基于tiktoken计算token数量,确保生成内容适合模型处理
- 实现多种主题提取方法,当主要方法失败时有备选方案
- 根据段落内容智能生成答案,确保内容完整性
-
问答对修复:检测并修复问答对中的特殊字符、格式问题等。
- 处理不完整的问题或截断的内容
- 修复特殊字符和标点符号问题
- 确保问题以问号结尾,答案内容完整
-
质量评估和筛选:对问答对进行质量评估,提取高质量的子集用于最终微调。
- 详细的评分标准包括问题长度、答案长度、token数、问答相关性等
- 自动识别并记录常见问题,如问题不完整、答案过短、主题不匹配等
- 针对不同维度和难度的问题使用平衡的筛选策略
处理完成后,在输出目录(默认为"output")中将生成以下关键文件:
processed_content.txt:PDF提取的原始文本内容enhanced_content.txt:增强清洗后的文本内容segmented_content.json:分段后的内容qa_instructions_robust.json:生成的原始问答对(JSON格式)qa_instructions_chatglm_robust.jsonl:生成的原始问答对(ChatGLM格式)qa_instructions_fixed_improved.json:修复后的问答对(JSON格式)qa_instructions_chatglm_fixed_improved.jsonl:修复后的问答对(ChatGLM格式)high_quality_qa.json:最终高质量问答对(JSON格式,用于微调)high_quality_qa.jsonl:最终高质量问答对(ChatGLM格式,用于微调)cleaning_report.json:文档清洗处理报告quality_report_*.json:质量评估报告*.log:各处理阶段的详细日志文件,用于问题诊断和处理过程跟踪
新增的enhanced_cleaner.py脚本实现了以下高级清洗功能:
-
结构化内容识别与处理
- 自动识别标题并按层级分类
- 识别图表标题和相关描述
- 保留列表项的原始结构和格式
-
术语统一化处理
- 内置供应链领域常用术语词典
- 自动检测并统一术语的不同表达形式
- 保留首次定义的完整表达,后续使用统一缩写
-
改进的重复内容处理
- 句子级别的精确去重
- 跨段落的内容重复检测
- 保留语义完整性
-
参考网址清理
- 强力检测并移除文本中的引用网址、域名和站点引用(例如"onerail.com"、"businesswire"等)
- 支持多级清理,处理各种隐蔽的URL引用格式
- 优化后处理,修复清理后的标点和空格
- 识别常见引用站点名称,即使没有域名后缀也能检测
- 确保最终生成问答对不含任何参考源信息或网址
-
图表内容关联增强
- 将图表标题与说明文本关联
- 保留图表的上下文信息
-
技术概念关联性强化
- 识别技术定义段落
- 建立术语与其定义的关联
- 优化专业术语的上下文表达
每次执行增强清洗后,系统会生成一份详细的清洗报告(cleaning_report.json),包含以下信息:
- 识别的标题数量
- 处理的图表数量
- 识别的列表项数量
- 移除的引用网址数量
- 标准化处理的术语及其出现次数
- 移除的重复内容统计
为提高生成的问答对质量,我们增强了以下关键功能:
-
上下文感知的主题识别
- 精确识别段落核心技术主题,避免将子主题或属性误识别为主要主题
- 多层级模式匹配,优先从明确定义中提取,避免从引用或子描述中提取片段
- 特殊技术术语词库支持,确保专业领域名词正确识别
- 主题格式与有效性验证,避免不完整或无意义的主题
- 主题提取失败时实现多级备选机制,确保始终能获取有效主题
-
语义连贯性检查
- 验证提取的主题与段落内容的语义关联性
- 自动修正不匹配的主题,如将"责任归属"识别为"自动驾驶技术"的一部分
- 确保问题中的主题与答案内容有足够的相关性
-
语义相关性评估
- 问题与答案的关键词匹配度分析
- 问题主题与答案内容的关联性验证
- 特殊问题类型("为什么"、"定义"等)与答案格式匹配检查
-
严格筛选机制
- 提高问答相关性在质量评分中的权重
- 自动标记并过滤不相关问答对
- 确保生成的问答对逻辑一致,答案能够有效回答问题
-
问答平衡优化
- 在不同难度和维度类型之间保持平衡
- 对稀缺维度和难度的问答对适当降低筛选标准
- 综合考虑分数分布,确保最终数据集的多样性
-
提高数据质量
- 显著减少问题与答案不匹配的情况
- 消除诸如"责任归属代表了什么技术?"等主题不明确的问题
- 确保每个问题都能从答案中找到明确的响应内容
-
增强报告
- 详细的质量报告,包括问答匹配度统计
- 主题分布分析,帮助理解数据集组成
- 问题维度和难度统计,便于评估数据多样性
通过以上优化,系统能够生成更符合人类学习和问答模式的高质量数据集,显著提高微调效果。
系统使用以下标准评估生成问答对的质量:
-
问题质量评分:
- 长度范围:10-50个字符
- Token数范围:5-25个token
- 必须以问号结尾
- 不含特殊字符或非法字符
- 不与现有问题重复
-
答案质量评分:
- 长度范围:100-800个字符
- Token数范围:50-350个token
- 不含特殊字符或非法字符
- 与现有答案不高度相似
-
问答相关性评分:
- 问题关键词在答案中的出现频率
- 主题词在答案中的覆盖度
- 问题类型与答案格式匹配度
- 领域关键词匹配度
最终综合分数在85分以上的问答对被视为高质量数据,可用于模型微调。
系统实现了多层次的错误处理和回退机制:
-
文件处理回退:如果预期文件不存在,系统会:
- 在当前目录和其他可能位置查找替代文件
- 创建临时符号链接指向找到的文件
- 在处理结束后自动清理临时文件和链接
-
处理步骤回退:
- 如增强清洗失败,会自动回退到使用原始处理文本
- 文件格式错误时会尝试进行修复和转换
-
临时文件管理:
- 自动跟踪所有临时创建的文件和链接
- 使用完毕后自动清理,避免占用磁盘空间
-
详细日志记录:
- 每个处理步骤保存单独的日志文件
- 记录处理进度、警告和错误信息
- 便于问题诊断和流程优化
-
文件名不匹配问题
- 问题:脚本期望的文件名与实际生成的文件名不一致
- 解决方案:使用更新后的脚本,它会自动创建必要的符号链接
-
增强清洗失败
- 问题:文本编码或格式异常导致增强清洗失败
- 解决方案:使用
--skip-existing参数,系统会在增强清洗失败时自动回退到原始处理文本继续后续步骤
-
术语识别问题
- 问题:某些特定领域术语未被正确识别
- 解决方案:编辑
enhanced_cleaner.py中的TERMINOLOGY_MAP字典,添加特定领域术语
-
临时文件被误删
- 问题:处理过程中创建的临时文件被手动删除导致流程中断
- 解决方案:使用
--skip-existing参数重新运行,系统会重新创建必要的文件
-
内存用量过高
- 问题:处理大型PDF文件时可能导致内存不足
- 解决方案:调整
segment.py中的分段参数,减小单个段落大小
本工具的所有功能均基于规则和算法实现,不依赖外部LLM API:
- 主题提取:使用正则表达式和预定义模式识别技术主题
- 问答生成:基于模板填充和内容提取生成多样化问答对
- 质量评估:使用硬编码规则和评分标准进行质量筛选
系统使用tiktoken计算token数量,但仅用于内容长度控制,不涉及模型调用。
以下是一个处理后生成的高质量问答对示例:
{
"instruction": "结合材料,回答下面的问题: 仓库执行系统如何与其他系统协作?",
"input": "",
"output": "仓库执行系统(WES)与其他系统协作的方式主要有:1) 作为仓库管理系统(WMS)和仓库控制系统(WCS)之间的中间层,负责任务分配和资源调度;2) 与WMS系统对接,接收订单和库存信息,并提供执行状态反馈;3) 与WCS系统集成,控制自动化设备执行具体操作;4) 与ERP系统交换业务数据;5) 与智能设备和机器人系统通信,优化工作流程。WES的协作功能使其能够在整个供应链系统中发挥协调作用,提高自动化程度和作业效率。"
}准备好训练数据后,可以参考以下示例进行模型微调:
# ChatGLM模型微调示例
python finetune_chatglm.py --train_file output/high_quality_qa.jsonl --model_name ChatGLM3-6B --output_dir finetuned-model欢迎提交问题反馈或功能建议,帮助我们改进这个工具。