# YG_TDGenerator - 数据元素问答生成工具

一款用于企业数据治理领域的问答训练数据生成工具。基于远光数据架构表（逻辑模型表、物理模型表、元素治理模板表）生成标准化的问答对，用于训练领域专用问答系统。

## 功能特点

- **三表合并**：自动合并逻辑模型表、物理模型表、元素治理模板表
- **多种问答类型**：支持字段属性查询、定义查询、模型关联查询
- **双版本输出**：同时生成训练集和验证集（表达方式不同但语义相同）
- **一体化流程**：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生成结果目录
```

## 安装

```bash
pip install -r requirements.txt
```

### 依赖说明

- `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. 生成问答对

```bash
python qa_generator.py
```

生成的文件位于 `Data_QA_Outputs/` 目录：

| 文件 | 说明 |
|------|------|
| `selected_QA.json` | 训练集问答对 |
| `selected_QA_验证集.json` | 验证集问答对 |
| `QA生成报告.json` | 训练集生成报告 |
| `QA生成报告_验证集.json` | 验证集生成报告 |

## 问答类型说明

### 1. 字段属性查询

根据字段中文名或英文名查询其他属性值：

```
Q: 请告诉我字段中文名为'客户编号'的字段英文名是什么？
A: 该字段的字段英文名为customer_id。
```

### 2. 字段定义查询

根据字段名查询完整定义（所有属性）：

```
Q: 字段中文名为'客户编号'的定义是什么？
A: 客户编号的定义为：字段英文名：customer_id，数据类型：varchar，长度：32...
```

### 3. 模型关联查询

根据逻辑模型或物理模型查询关联字段（仅对字段数≥3的模型生成）：

```
Q: 逻辑模型中文名为'客户信息模型'包含哪些字段？
A: 逻辑模型中文名为'客户信息模型'包含以下字段：客户编号、客户名称、联系方式...
```

## 配置选项

编辑 `config.py` 文件可修改以下配置：

```python
class QAConfig:
    INPUT_FILE = "selected.json"      # 输入文件名
    INPUT_DIR = "Data_Export_Json"    # 输入目录
    OUTPUT_DIR = "Data_QA_Outputs"    # 输出目录
    RANDOM_SEED = 42                  # 随机种子
    SHUFFLE_OUTPUT = False            # 是否打乱输出顺序
```

## 输出格式

### 训练集/验证集格式

```json
[
  {
    "问题": "请告诉我字段中文名为'客户编号'的字段英文名是什么？",
    "回答": "该字段的字段英文名为customer_id。"
  }
]
```

### 训练集 vs 验证集区别

| 特性 | 训练集 | 验证集 |
|------|--------|--------|
| 问句风格 | "请告诉我"、"查询" | "请问"、"想咨询一下" |
| 答句风格 | "该字段的"、"查询结果：" | "根据查询，"、"经核实，" |
| 语义 | 相同 | 相同 |
| 表达 | 基础正式 | 正式但有差异 |

## 完整工作流程示例

```bash
# 步骤1：数据处理（CSV转JSON + 合并 + 抽取）
python csv2json.py

# 步骤2：生成问答对（训练集 + 验证集）
python qa_generator.py
```

## 注意事项

1. 确保源数据文件编码为UTF-8或GBK
2. 字段英文名会自动转换为小写
3. 模型关联查询仅对字段数≥3的模型生成，避免产生过多低价值问答
4. 训练集和验证集使用不同的表达模板，但语义完全相同
5. 随机种子固定为42，保证结果可复现

## 许可证

MIT License
