修改了一些文件名和文件信息,增加了requirements

This commit is contained in:
2026-01-05 10:25:48 +08:00
parent c02b0aede5
commit d8eb25bd47
3 changed files with 1088 additions and 533 deletions

648
README.md
View File

@@ -1,579 +1,161 @@
# 🚀 QA生成器 - 智能问答生成工具
# YG_TDGenerator - 数据元素问答生成工具
个基于JSON数据的模型微调用问答对生成工具支持灵活配置和问题复杂度控制。项目已精简到仅**2个核心文件**
款用于企业数据治理领域的问答训练数据生成工具。基于远光数据架构表(逻辑模型表、物理模型表、元素治理模板表)生成标准化的问答对,用于训练领域专用问答系统。
## 📋 目录
## 功能特点
- [功能特性](#-功能特性)
- [快速开始](#-快速开始)
- [核心文件](#-核心文件)
- [配置说明](#-配置说明)
- [使用示例](#-使用示例)
- [数据输出](#-数据输出)
- [问答类型](#-问答类型)
- [最佳实践](#-最佳实践)
- [常见问题](#-常见问题)
- [高级技巧](#-高级技巧)
- [项目精简](#-项目精简)
- [数据质量](#-数据质量)
- **三表合并**:自动合并逻辑模型表、物理模型表、元素治理模板表
- **多种问答类型**:支持字段属性查询、定义查询、模型关联查询
- **双版本输出**:同时生成训练集和验证集(表达方式不同但语义相同)
- **一体化流程**CSV转换→JSON合并→随机抽取→QA生成一条命令完成
---
## 目录结构
## ✨ 功能特性
```
YG_TDGenerator/
├── csv2json.py # 主程序:数据处理一体化工具
├── qa_generator.py # QA问答对生成器
├── config.py # 配置文件
├── requirements.txt # Python依赖
├── Data/ # Excel源数据目录可选
├── Data_Export_CSV/ # CSV导出数据目录
├── Data_Export_Json/ # JSON中间数据目录
└── Data_QA_Outputs/ # QA生成结果目录
```
### 🎯 核心功能
- **数据驱动**基于JSON数据自动生成问答对不进行任何编撰
- **多表支持**:支持元素治理模板、物理模型、逻辑模型等多种数据表
- **格式标准**:严格按照 `{"instruct":"", "input":"", "output":""}` 格式输出
- **随机打乱**:问答对顺序随机打乱,避免训练时的位置偏好
## 安装
### 🎨 问句多样性
- **表名标识**:所有问句均包含表名信息,如"在元素治理模板中"
- **丰富前缀**10种问句前缀请告诉我、查询、请问、在、请解释等
- **多样模板**每种数据类型支持10+种不同问法
- **中英互查**:支持中英文名互查,如"中文名→英文名"、"英文名→中文名"
```bash
pip install -r requirements.txt
```
### 💬 答句自然化
- **修饰语前缀**10种回答前缀根据表记录、查询结果显示、经查询等
- **礼貌后缀**10种后缀望知悉、以上信息为准、请参考、祝您工作顺利等
- **自然表达**:让回答更接近人类语言习惯
### 依赖说明
### ⚙️ 可配置性
- **复杂程度控制**1-5级复杂度从简单到复杂渐进
- **问题数量控制**:可设置每个数据项生成的问题数量
- **多列查询比例**:可控制多列查询问题的占比
- **模板选择**:可根据复杂程度自动选择问句模板
- `pandas`: 数据处理
- `xlwings`: Excel文件读取可选用于复杂Excel格式
- `openpyxl`: Excel文件读取pandas依赖
---
## 使用方法
## ⚡ 快速开始
### 1. 准备数据
将以下三个CSV文件放入 `Data_Export_CSV/` 目录:
- `远光数据架构逻辑模型表.csv`
- `远光数据架构物理模型表.csv`
- `远光数据架构元素治理模板表.csv`
### 2. 数据处理流程
运行主程序执行完整的数据处理流程:
```bash
python csv2json.py
```
该命令会执行以下三个步骤:
1. **CSV/Excel转JSON**将源数据转换为JSON格式
2. **JSON合并**:根据字段英文名合并三张表,生成 `final.json`
3. **随机抽取**从合并结果中随机抽取3000条记录生成 `selected.json`
### 3. 生成问答对
### 方法1: 交互式运行(推荐)
```bash
python qa_generator.py
```
按提示选择配置即可。
### 方法2: 直接使用预设配置
```bash
# 简单模式(快速测试)
python -c "from qa_generator import QAGenerator, SIMPLE_CONFIG; QAGenerator(SIMPLE_CONFIG).process_all()"
生成的文件位于 `Data_QA_Outputs/` 目录:
# 普通模式(推荐)
python -c "from qa_generator import QAGenerator, NORMAL_CONFIG; QAGenerator(NORMAL_CONFIG).process_all()"
| 文件 | 说明 |
|------|------|
| `selected_QA.json` | 训练集问答对 |
| `selected_QA_验证集.json` | 验证集问答对 |
| `QA生成报告.json` | 训练集生成报告 |
| `QA生成报告_验证集.json` | 验证集生成报告 |
# 复杂模式(高质量)
python -c "from qa_generator import QAGenerator, COMPLEX_CONFIG; QAGenerator(COMPLEX_CONFIG).process_all()"
## 问答类型说明
### 1. 字段属性查询
根据字段中文名或英文名查询其他属性值:
```
Q: 请告诉我字段中文名为'客户编号'的字段英文名是什么?
A: 该字段的字段英文名为customer_id。
```
### 方法3: 生成并合并
```bash
python -c "from qa_generator import QAGenerator, NORMAL_CONFIG; g = QAGenerator(NORMAL_CONFIG); g.process_all(); g.merge_to_train()"
### 2. 字段定义查询
根据字段名查询完整定义(所有属性):
```
Q: 字段中文名为'客户编号'的定义是什么?
A: 客户编号的定义为字段英文名customer_id数据类型varchar长度32...
```
---
### 3. 模型关联查询
## 📁 核心文件
根据逻辑模型或物理模型查询关联字段仅对字段数≥3的模型生成
| 文件 | 大小 | 说明 |
|------|------|------|
| **qa_generator.py** | 29KB | 主生成器 - 整合了所有功能 |
| **config.py** | 9KB | 配置文件 - 控制生成参数 |
```
Q: 逻辑模型中文名为'客户信息模型'包含哪些字段?
A: 逻辑模型中文名为'客户信息模型'包含以下字段:客户编号、客户名称、联系方式...
```
---
## 配置选项
## ⚙️ 配置说明
### 复杂程度等级1-5级
| 等级 | 名称 | 单列模板 | 多列模板 | 多列占比 | 问句前缀 | 适用场景 |
|------|------|----------|----------|----------|----------|----------|
| 1 | 简单模式 | 3 | 0 | 0% | 3 | 快速测试 |
| 2 | 简单+模式 | 6 | 1 | 10% | 3 | 轻量训练 |
| 3 | 普通模式 | 9 | 3 | 30% | 10 | 常规训练 |
| 4 | 复杂模式 | 12 | 4 | 30% | 10 | 深度训练 |
| 5 | 最复杂模式 | 12 | 5 | 50% | 10 | 高质量训练 |
### 预设配置对比
| 配置 | 复杂程度 | 生成时间 | QA数量 | 适用场景 |
|------|----------|----------|--------|----------|
| 简单 | 1级 | ~2分钟 | ~20万 | 快速测试 |
| 普通 | 3级 | ~5分钟 | ~60万 | 常规训练 |
| 复杂 | 5级 | ~15分钟 | ~100万 | 高质量训练 |
### 自定义配置示例
编辑 `config.py` 文件可修改以下配置:
```python
from qa_generator import QAGenerator, QAConfig
# 创建配置
config = QAConfig()
config.COMPLEXITY_LEVEL = 3 # 设置复杂程度
config.MULTI_COLUMN_RATIO = 0.4 # 设置多列占比
config.OUTPUT_DIR = "MyQA_Output" # 设置输出目录
# 生成QA
generator = QAGenerator(config)
generator.process_all()
class QAConfig:
INPUT_FILE = "selected.json" # 输入文件名
INPUT_DIR = "Data_Export_Json" # 输入目录
OUTPUT_DIR = "Data_QA_Outputs" # 输出目录
RANDOM_SEED = 42 # 随机种子
SHUFFLE_OUTPUT = False # 是否打乱输出顺序
```
---
## 输出格式
## 💡 使用示例
### 示例1: 使用简单配置
```python
from qa_generator import QAGenerator, SIMPLE_CONFIG
# 创建生成器
generator = QAGenerator(SIMPLE_CONFIG)
# 生成问答对
generator.process_all()
```
### 示例2: 自定义配置
```python
from qa_generator import QAGenerator, QAConfig
# 创建自定义配置
config = QAConfig()
config.COMPLEXITY_LEVEL = 2
config.MULTI_COLUMN_RATIO = 0.2
config.BASIC_QUESTIONS_PER_ITEM = 2
# 创建生成器
generator = QAGenerator(config)
generator.process_all()
```
### 示例3: 批量生成不同复杂度的数据
```python
from qa_generator import SIMPLE_CONFIG, NORMAL_CONFIG, COMPLEX_CONFIG, QAGenerator
configs = [
(SIMPLE_CONFIG, "简单版"),
(NORMAL_CONFIG, "普通版"),
(COMPLEX_CONFIG, "复杂版")
]
for config, name in configs:
print(f"\n正在生成{name}问答对...")
config.OUTPUT_DIR = f"Data_QA_Outputs_{name}"
generator = QAGenerator(config)
generator.process_all()
```
---
## 📊 数据输出
### 输出文件结构
每个JSON文件包含多个问答对格式如下
### 训练集/验证集格式
```json
[
{
"instruct": "在元素治理模板中,「投资原因」对应的英文名是什么?",
"input": "",
"output": "根据表记录该字段的英文名为「investReas」以上信息为准。"
},
{
"instruct": "请列举元素治理模板中「投资原因」的值类型和总长度",
"input": "",
"output": "根据表记录该字段的值类型为「字符」以及总长度为500.0,望知悉。"
"问题": "请告诉我字段中文名为'客户编号'的字段英文名是什么?",
"回答": "该字段的字段英文名为customer_id。"
}
]
```
### 生成的文件
### 训练集 vs 验证集区别
```
Data_QA_Outputs/
├── 元素治理模板_QA.json (58MB, 25.8万条QA)
├── 物理模型_QA.json (396MB, 182万条QA)
├── 逻辑模型_QA.json (166MB, 73.5万条QA)
├── train.json (619MB, 282万条QA) ⭐ 训练用
└── train_stats.json (合并统计)
```
| 特性 | 训练集 | 验证集 |
|------|--------|--------|
| 问句风格 | "请告诉我"、"查询" | "请问"、"想咨询一下" |
| 答句风格 | "该字段的"、"查询结果:" | "根据查询,"、"经核实," |
| 语义 | 相同 | 相同 |
| 表达 | 基础正式 | 正式但有差异 |
### 问答类型
## 完整工作流程示例
#### 单列查询
- 问"字段A"的值类型
- 问"字段A"的长度
- 问"字段A"的英文名
- 问"字段A"属于哪个类别
#### 多列查询
- 请列举"字段A"的值类型和长度
- 请输出"字段A"的类别、业务领域和是否枚举信息
- 请查找"字段A"的英文名和说明信息
### 生成统计
| 配置模式 | 元素治理模板 | 物理模型 | 逻辑模型 | 总计 |
|----------|--------------|----------|----------|------|
| 简单模式 | ~50,000条 | ~100,000条 | ~50,000条 | ~200,000条 |
| 普通模式 | ~150,000条 | ~300,000条 | ~150,000条 | ~600,000条 |
| 复杂模式 | ~250,000条 | ~500,000条 | ~250,000条 | ~1,000,000条 |
*注:实际数量根据原始数据量而定*
---
## 📊 问答类型说明
### 单列查询示例
**问句模式:**
- "在元素治理模板中,「投资原因」对应的英文名是什么?"
- "查询物理模型中,数据元素「账套代码」的值类型是什么?"
- "「是否叶子节点」这个字段在逻辑模型中属于哪个业务领域?"
**答句模式:**
- "根据表记录该字段的英文名为「investReas」以上信息为准。"
- "查询结果显示,值类型为「字符」,望知悉。"
### 多列查询示例
**问句模式:**
- "请列举元素治理模板中「投资原因」的值类型和总长度"
- "请输出「账套代码」在元素治理模板中的类别、业务领域和是否枚举信息"
**答句模式:**
- "根据表记录该字段的值类型为「字符」以及总长度为500.0,望知悉。"
- "查询得知,该数据元素的类别为「业务」,与业务领域为「供应链-数据同步」,以及是否枚举为「否」,祝您工作顺利。"
---
## 🎯 最佳实践
### 场景1: 快速验证功能
```bash
# 使用简单配置,仅生成基础问答
python -c "from qa_generator import QAGenerator, SIMPLE_CONFIG; QAGenerator(SIMPLE_CONFIG).process_all()"
```
- 耗时约1-2分钟
- 输出约20万条问答
- 用途:功能验证、代码测试
# 步骤1数据处理CSV转JSON + 合并 + 抽取)
python csv2json.py
### 场景2: 常规模型训练
```bash
# 使用普通配置,平衡质量和效率
python -c "from qa_generator import QAGenerator, NORMAL_CONFIG; QAGenerator(NORMAL_CONFIG).process_all()"
```
- 耗时约5-10分钟
- 输出约60万条问答
- 用途:模型训练、数据集准备
### 场景3: 高质量模型训练
```bash
# 使用复杂配置,生成最丰富的问答
python -c "from qa_generator import QAGenerator, COMPLEX_CONFIG; QAGenerator(COMPLEX_CONFIG).process_all()"
```
- 耗时约15-30分钟
- 输出约100万条问答
- 用途:高质量模型训练
### 场景4: 生成多个复杂度版本
```python
# 同时生成三个版本
from qa_generator import SIMPLE_CONFIG, NORMAL_CONFIG, COMPLEX_CONFIG, QAGenerator
for config, name in [(SIMPLE_CONFIG, "Simple"), (NORMAL_CONFIG, "Normal"), (COMPLEX_CONFIG, "Complex")]:
config.OUTPUT_DIR = f"Data_QA_Outputs_{name}"
print(f"正在生成{name}版本...")
generator = QAGenerator(config)
generator.process_all()
```
---
## ❓ 常见问题
### Q1: 如何调整生成的问题数量?
A: 修改配置文件中的 `BASIC_QUESTIONS_PER_ITEM``MAX_QUESTIONS_PER_ITEM`
```python
config.BASIC_QUESTIONS_PER_ITEM = 5 # 基础问题数
config.MAX_QUESTIONS_PER_ITEM = 20 # 最大问题数
```
### Q2: 如何只处理特定的数据表?
A: 修改 `config.py` 中的 `DATA_FILES` 配置:
```python
self.DATA_FILES = [
{
"name": "元素治理模板",
"file": "元素治理模板.json",
"output": "元素治理模板_QA.json",
"enabled": True # True=处理False=跳过
},
{
"name": "物理模型",
"file": "物理模型.json",
"output": "物理模型_QA.json",
"enabled": False # 跳过物理模型
}
]
```
### Q3: 如何控制输出文件大小?
A: 使用不同复杂程度配置:
- 简单模式文件较小约20-50MB
- 普通模式文件中等约100-200MB
- 复杂模式文件较大约300-500MB
### Q4: 如何禁用打乱顺序?
A: 设置 `SHUFFLE_OUTPUT = False`
```python
config.SHUFFLE_OUTPUT = False # 保持原始顺序
```
### Q5: 如何查看生成统计?
A: 查看生成的 `QA生成报告.json` 文件,包含:
- 总问答对数量
- 各文件问答对数量
- 配置信息
- 生成特点
### Q6: 如何自定义配置?
```python
from qa_generator import QAGenerator, QAConfig
config = QAConfig()
config.COMPLEXITY_LEVEL = 3
config.MULTI_COLUMN_RATIO = 0.4
config.OUTPUT_DIR = "MyQA_Output"
generator = QAGenerator(config)
generator.process_all()
```
### Q7: 数据来源?
- 基于 `Data_Export_Json/` 目录下的JSON文件
- 严格忠于原文,未编撰
### Q8: 支持多少QA
- 简单模式:~20万条
- 普通模式:~60万条
- 复杂模式:~100万条
---
## 🔧 高级技巧
### 1. 批量生成不同配置
```python
from qa_generator import SIMPLE_CONFIG, NORMAL_CONFIG, COMPLEX_CONFIG, QAGenerator
configs = {
"Level1": SIMPLE_CONFIG,
"Level3": NORMAL_CONFIG,
"Level5": COMPLEX_CONFIG
}
for level, config in configs.items():
config.OUTPUT_DIR = f"QA_Output_{level}"
print(f"生成 {level} 级别数据...")
generator = QAGenerator(config)
generator.process_all()
```
### 2. 自定义问句模板
修改 `qa_generator.py` 中的模板函数:
```python
def generate_single_qa(self, item: Dict, template_count: int, data_type: str):
# 在这里添加自定义模板
templates = []
# 添加你的自定义模板...
return qa_pairs
```
### 3. 过滤特定数据
在生成前过滤数据:
```python
def generate_qa_for_data(self, data: List[Dict], data_type: str) -> List[Dict]:
# 过滤条件示例:只保留业务领域包含"供应链"的数据
filtered_data = [item for item in data if "供应链" in item.get("业务领域名称", "")]
# 生成QA...
```
---
## 📝 输出格式说明
### JSON格式
```json
[
{
"instruct": "问题内容",
"input": "",
"output": "答案内容"
},
{
"instruct": "问题内容",
"input": "",
"output": "答案内容"
}
]
```
### 字段说明
- `instruct`: 指令/问题内容(必填)
- `input`: 输入内容(通常为空)
- `output`: 输出/答案内容(必填)
---
## 🎉 项目精简
### 精简前后对比
#### 精简前
- ❌ 5个生成器文件 (generate_qa.py, generate_qa_v2.py, generate_qa_advanced.py, merge_qa_to_train.py, demo.py)
- ❌ 类太多,方法分散
- ❌ 功能重复,代码冗余
- ❌ 使用复杂,需要记多个文件名
#### 精简后
-**2个核心文件** (qa_generator.py, config.py)
-**1个主生成器类** (QAGenerator)
-**所有功能整合** (生成、合并、报告)
-**使用简单** (一个命令搞定)
### 精简效果
| 指标 | 精简前 | 精简后 | 改进 |
|------|--------|--------|------|
| 核心文件数 | 5个 | 2个 | ⬇️ 60% |
| 生成器类数 | 2个 | 1个 | ⬇️ 50% |
| 主要方法数 | 分散 | 集中 | ✅ 更好 |
| 使用复杂度 | 高 | 低 | ✅ 更好 |
| 代码行数 | 1000+ | ~800 | ⬇️ 20% |
### 用户收益
1. **更简单** - 只需要记一个文件名
2. **更高效** - 一条命令完成所有操作
3. **更灵活** - 支持交互式和命令行两种方式
4. **更完整** - 所有功能都在一个文件中
---
## 📈 数据质量
### ✅ 质量保证
- **数据完整性**: 100% - 所有JSON字段完整提取
- **格式标准性**: 100% - 严格遵循 `{"instruct":"", "input":"", "output":""}` 格式
- **内容真实性**: 100% - 忠于原文,未编撰
- **随机性**: ✅ - 问答对顺序随机打乱
- **多样性**: 10+种问句模板10+种答句修饰
- **可重现性**: 随机种子固定,结果可重现
### ✅ 验证结果
```python
# 验证代码
import json
with open('Data_QA_Outputs/train.json', 'r', encoding='utf-8') as f:
train_data = json.load(f)
print(f"总问答对数量: {len(train_data):,}")
print(f"数据类型: {type(train_data)}")
print(f"字段完整性: {all('instruct' in item and 'output' in item for item in train_data)}")
```
**验证结果**: ✅ 全部通过
- 总问答对数量: 2,820,519
- 数据类型: list
- 字段完整性: True
### 生成统计
- **总问答对**: 2,820,519 条
- **元素治理**: 258,579 条 (9.2%)
- **物理模型**: 1,826,268 条 (64.8%)
- **逻辑模型**: 735,672 条 (26.1%)
- **文件大小**: 619 MB
---
## ⚠️ 注意事项
### 数据要求
1. **输入JSON格式**必须是包含字典列表的JSON文件
2. **字段完整性**确保JSON中包含必要的字段如"表名"、"数据元素中文名"等)
3. **编码格式**使用UTF-8编码保存JSON文件
### 性能优化
1. **大文件处理**对于大量数据的JSON文件建议分批处理
2. **内存使用**生成的QA文件较大注意磁盘空间
3. **运行时间**:复杂模式下生成时间较长,请耐心等待
### 自定义建议
1. **复杂程度选择**
- 测试阶段:使用简单模式(复杂程度=1-2
- 训练阶段:使用普通模式(复杂程度=3
- 精细调优:使用复杂模式(复杂程度=4-5
2. **多列查询比例**
- 初次使用0.1-0.2
- 常规使用0.3
- 高质量训练0.5
---
## 📞 技术支持
### 文档资源
- 本文档 - 完整项目文档
- sample_qa.json - 模板参考
### 示例代码
```python
# 基础用法
from qa_generator import QAGenerator, NORMAL_CONFIG
QAGenerator(NORMAL_CONFIG).process_all()
# 自定义配置
from qa_generator import QAConfig, QAGenerator
config = QAConfig()
config.COMPLEXITY_LEVEL = 3
QAGenerator(config).process_all()
```
---
## 🎊 项目总结
### 成果亮点
1.**功能完整** - 从基础版到高级版,满足不同需求
2.**配置灵活** - 1-5级复杂程度控制适应多种场景
3.**数据优质** - 280万+条QA100%忠于原文
4.**文档完善** - 整合文档体系,易于理解和使用
5.**即用即跑** - 无需安装,直接运行
### 技术指标
- **代码行数**: 800+ 行
- **文档页数**: 整合版
- **支持功能**: 100% 完成
- **测试覆盖**: 100% 通过
### 用户价值
- **节省时间**: 从手动编写到自动生成效率提升1000倍
- **保证质量**: 统一格式,规范数据,减少错误
- **易于使用**: 简单命令即可生成,无需编程知识
- **高度可配**: 满足从测试到生产的各种需求
---
**感谢使用QA生成器** 🎉
**立即开始使用:**
```bash
# 步骤2生成问答对训练集 + 验证集)
python qa_generator.py
```
## 注意事项
1. 确保源数据文件编码为UTF-8或GBK
2. 字段英文名会自动转换为小写
3. 模型关联查询仅对字段数≥3的模型生成避免产生过多低价值问答
4. 训练集和验证集使用不同的表达模板,但语义完全相同
5. 随机种子固定为42保证结果可复现
## 许可证
MIT License