# 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. PromptBuilder(Prompt 构建器) **职责**:将前两个模块的所有信息组装成结构化 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. APIClient(API 客户端) **职责**:调用 DeepSeek API,含重试逻辑。 **API 配置**: - 地址:https://api.deepseek.com/chat/completions - 模型:`deepseek-v4-flash` - API Key:`sk-6156cccdc9c14d949cf5bfc5afc67a03` - timeout:120 秒 **请求结构**: ```json { "model": "deepseek-v4-flash", "messages": [ { "role": "system", "content": "你是COBOL程序测试数据生成专家。请严格按照规则生成测试数据。输出必须是可直接解析的JSON,不要包在markdown代码块中。" }, { "role": "user", "content": "" } ], "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 代码(添加映射条目)