Files
jcl-cobol-data-create/docs/superpowers/specs/2026-07-12-testdata-agent-design.md
2026-07-12 14:54:50 +08:00

320 lines
8.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# COBOL 测试数据生成 Agent 设计文档
## 背景
旧 COBOL 项目通过 Java 重写。需要基于 Python 新建一个测试数据生成 Agent,根据详细设计书自动生成 COBOL 程序的测试数据(JSON/SQL),通过 DeepSeek v4 Flash API 由 AI 生成具体数据内容。
---
## 架构概览
采用**线性管道架构**,模块化设计,便于后续追加规则和维护:
```
InputParser → RuleLoader → PromptBuilder → APIClient → OutputWriter
```
- **Python 侧**:负责解析结构化信息、建立映射关系、组装 prompt
- **AI 侧**:接收 prompt,根据规则生成具体的测试数据 JSON/SQL
---
## 目录结构
```
D:\jcl-cobol-data-create/
├── agent/
│ ├── __init__.py
│ ├── input_parser.py # 输入解析器
│ ├── rule_loader.py # 规则加载器
│ ├── prompt_builder.py # Prompt 构建器
│ ├── api_client.py # API 客户端(DeepSeek
│ └── output_writer.py # 输出写入器
├── rules/
│ ├── pgm_pattern/ # PGM模式规则 .md
│ │ ├── マッチング(1-1).md
│ │ ├── マッチング(1-N).md
│ │ └── ...(后续追加,无需改代码)
│ └── special_feature/ # 特殊功能规则 .md
│ └── 条件分支.md
├── layout/ # 文档模板(参考用)
│ └── JSON格式说明v2.0.md
├── output/ # 生成输出(运行时自动创建)
│ └── {プログラムID}/
│ ├── g1/
│ └── g2/
├── main.py # CLI 入口 + generate() 库函数
├── requirements.txt
└── README.md
```
---
## 模块详细设计
### 1. InputParser(输入解析器)
**职责**:解析所有输入文件,提取结构化数据。
**输入**
- `a` 詳細設計書 .md
- `b` ソース .cbl 文本文件
- `c` 文件/DB 构造 .md(文件定義書 + COPY句定義書)
- `d` COPY 存放路径
- `e` DB 结构 .md
**输出**:结构化的程序元数据对象,包含:
#### 1.1 基本情報
- プログラムID, プログラム名, PGMタイプ(メイン/サブ), PGMパターン
- 解析方法:定位 `# 行` 列 = `PGMパターン` 的行,取 `内容` 列的值
#### 1.2 使用ファイル一覧
- 每个文件的:識別子, DD名, I/O, COPY群, 媒体(PS=文件, DB=DB
- 判定输入类型:遍历 I/O="I" 的行,根据 `媒体` 列判定
- 全是 PS → 文件输入
- 包含 DB → DB 输入
- 都有 → 混合输入
#### 1.3 COPYBOOK 解析 + REPLACING 映射
- 从 .cbl 源码的 FD 块中提取 `COPY xxx REPLACING ==(A)== BY ==識別子==`
- 建立映射:`識別子(R01) → COPY名(ZAN01REC) → 替换前缀(R01-)`
- 读取 COPYBOOK 文件,应用 `(A)` → 前缀替换,得到实际字段名和 PIC 定义
- 输出示例:`R01-APPL-ID | X(8) | 8`
#### 1.4 キー項目一覧
- 排序条件、匹配键信息
#### 1.5 処理詳細
- 完整原文(不做解析,保留原样)
#### 1.6 出力レコード定義
- 输出文件的项目定义和设定元信息
#### 1.7 DB 定义(如涉及)
- 从 DB 定义书 .md 中提取表的字段定义、类型、PK 信息
---
### 2. RuleLoader(规则加载器)
**职责**:根据程序特征匹配对应的数据生成规则。
#### 2.1 PGM 模式规则匹配
PGMパターン 值到规则文件名的映射:
| PGMパターン | 规则文件 |
|------------|---------|
| マッチング(1:1) | マッチング(1-1).md |
| マッチング(1:N) | マッチング(1-N).md |
| マッチング(M:N) | (待添加) |
| レイアウト編集のみ(GETPUT) | (待添加) |
| 項目チェック | (待添加) |
| 振り分け | (待添加) |
| キーブレイク | (待添加) |
| キーブレイク(集計、集約) | (待添加) |
| DB更新 | (待添加) |
- 未找到对应规则 → 报错并列出缺失的模式名
- 读取匹配到的 .md 全文
- 从规则中解析:组数、每组用途、每组的数据生成方法
#### 2.2 特殊功能检测
扫描 `処理詳細` 文本,根据预设关键词自动检测:
| 特殊功能 | 检测关键词 | 规则文件 |
|---------|-----------|---------|
| 条件分支 | `場合`, `EVALUATE`, `IF` | 条件分支.md |
- 扩展方式:在检测表中追加行,同时在 `rules/special_feature/` 下添加对应 .md
---
### 3. PromptBuilderPrompt 构建器)
**职责**:将前两个模块的所有信息组装成结构化 API prompt。
**Prompt 结构**
```
## 程序基本情報
- 程序ID: ZAN04MAT
- 程序名: 取消マッチング処理
- PGMパターン: マッチング(1:1)
- 输入类型: 文件
## 処理詳細
(詳細設計書の処理詳細全文)
## 入力ファイル/DB 構造
### 文件R01 (DD名: ZAN04R01, COPY: ZAN01REC)
| 字段名 | PIC | 字节数 |
| R01-APPL-ID | X(8) | 8 |
| R01-EMP-ID | X(8) | 8 |
...
## DBテーブル構造(如有)
### 表名: LEAVE_RECORDS
| 字段名 | 类型 | 最大长 | KEY |
...
- 主键: APPLICATION_ID
## 出力レコード定義
(詳細設計書の出力レコード定義全文)
## データ生成ルール
(匹配到的PGM模式规则 .md 全文)
## 特殊機能ルール(如有)
(条件分支.md 全文)
## 出力形式
- 文件输入类型 → JSON格式(遵循以下规则)
- DB输入类型 → SQL INSERT语句
### 字段值规则(PIC → JSON表示)
| PIC | JSON表示 | 例 |
|-----|---------|-----|
| PIC X(n) | 左对齐 + 空格填充 | "A0000001" |
| PIC 9(n) | 右对齐 + 前补零 | "00000101" |
| PIC S9(n) COMP-3 | 十进制数字 | "1234" |
| PIC S9(n) COMP | 十进制数字 | "300" |
| FILLER(纯保留) | 有辨识性模式 | "D000...001" |
| FILLER(业务保留) | 全空格或全零 | |
- COMP/COMP-3 类型字段输出**普通十进制数字符串**,不做特殊转换
- 字段名含语义关键词时(如 DATE="日期"、NAME="姓名")生成符合实际含义的值
## 生成指示
- 需要生成的グループ数: 3
- 各グループの内容:
- g1: 两端不匹配
- g2: 反向两端不匹配
- g3: 中间不匹配
- 出力: JSON(文件输入)
```
---
### 4. APIClientAPI 客户端)
**职责**:调用 DeepSeek API,含重试逻辑。
**API 配置**
- 地址:https://api.deepseek.com/chat/completions
- 模型:`deepseek-v4-flash`
- API Key`sk-6156cccdc9c14d949cf5bfc5afc67a03`
- timeout120 秒
**请求结构**
```json
{
"model": "deepseek-v4-flash",
"messages": [
{
"role": "system",
"content": "你是COBOL程序测试数据生成专家。请严格按照规则生成测试数据。输出必须是可直接解析的JSON,不要包在markdown代码块中。"
},
{
"role": "user",
"content": "<PromptBuilder生成的完整prompt>"
}
],
"temperature": 0.3,
"max_tokens": 8192
}
```
**重试逻辑**(最多 3 次):
```
for i in 1..3:
发送请求
if 网络错误 || API返回错误:
continue # 重试
if JSON解析失败:
将错误信息追加到prompt中,重试
if 成功:
break
```
- 3 次全部失败 → 报错退出
---
### 5. OutputWriter(输出写入器)
**职责**:将 AI 返回的 JSON/SQL 保存为文件。
**输出规则**
- 文件输入 → `output/{プログラムID}/g{组号}/{プログラムID}_g{组号}.json`
- DB 输入 → `output/{プログラムID}/g{组号}/{プログラムID}_g{组号}.sql`
- 混合输入 → 同文件夹下同时输出 `.json``.sql`
**输出格式**
- JSON:遵循 `JSON格式说明v2.0.md` 规范,每个文件内含 `records` 数组
- SQL:标准 INSERT 语句
```
output/ZAN04MAT/
├── g1/
│ └── ZAN04MAT_g1.json
├── g2/
│ └── ZAN04MAT_g2.json
└── g3/
└── ZAN04MAT_g3.json
```
**验证**:写入前校验 JSON 合法性,不合法时返回错误给 APIClient 触发重试。
---
### 6. main.py(入口)
**CLI 调用**
```bash
python main.py \
--design "詳細設計書_ZAN04MAT.md" \
--source "src/ZAN04MAT.cbl" \
--cpy "cpy/" \
--db-def "DB定義書.md" \
--output "output/"
```
**库调用**
```python
from agent import generate
result = generate(
design_md="詳細設計書_ZAN04MAT.md",
source_cbl="src/ZAN04MAT.cbl",
cpy_dir="cpy/",
db_def_md="DB定義書.md",
output_dir="output/"
)
```
---
## 依赖
- Python 3.9+
- `requests` — HTTP 客户端
- `openai` 或直接用 `requests` 调用 DeepSeek 兼容 API
```
requests>=2.28.0
```
---
## 扩展指南
### 追加 PGM 模式规则
1.`rules/pgm_pattern/` 下创建新的 .md 文件
2. 文件名与 PGMパターン 值按约定匹配
3. 无需修改 Python 代码
### 追加特殊功能检测
1. 在 RuleLoader 的检测映射表中追加一行 `(关键词列表, 对应规则文件)`
2.`rules/special_feature/` 下创建对应 .md
3. 需要改一行 Python 代码(添加映射条目)