--- name: model-design-generator description: 根据数据需求技术规范文档生成模型设计技术规范文档 --- # 模型设计技能 (Model Design Skill) ## 技能描述 本技能根据用户输入的**数据需求技术规范文档**,自动生成对应的**模型设计技术规范文档**,包含 SQL 编排步骤、目标表属性信息、目标表字段信息等完整设计内容。 ## 输入输出 ### 输入 - **输入类型**:MD 文件路径(数据需求技术规范文档的文件路径)或目录路径 - **输入来源**: - 用户传入具体文件路径:直接使用该文件 - 用户传入目录路径:自动选取文件名中日期最新的 `REQ-DATA-*.md` 文件 - **输入示例**: - 文件路径:`202604/skills_design/v2/data/REQ-DATA-20260409142709-001.md` - 目录路径:`202604/skills_design/v2/data/` → 自动选取 `REQ-DATA-20260409142709-001.md`(最新的) ### 输出 - **输出类型**:Markdown + JSON 格式文本(模型设计技术规范文档) - **输出内容**: 1. 编排目标表生成流程(SQL 编排步骤)- Markdown 表格 2. 目标表属性信息 - JSON 格式 3. 目标表字段信息 - JSON 格式 --- ## 可配置参数 以下参数按**输出模板的表结构**组织,方便后续统一修改: --- ### 表 1:编排目标表生成流程 - 字段规则与配置 输出模板字段:`步骤序号 | sql 编排内容解释 | 输入源表 | 加工字段口径 | 输出表名 | 输出表字段` | 输出字段 | 填写规则 | 默认值/配置项 | 说明 | |----------|----------|---------------|------| | 步骤序号 | 按 `step01`, `step02`, `step03`... 顺序编号,步骤数根据加工复杂度决定 | 无,按步骤生成 | 标识处理步骤顺序 | | sql 编排内容解释 | 根据加工逻辑自然语言描述 | 无,AI 生成 | 描述该步骤的加工目的和操作 | | 输入源表 | 从需求文档"所用数据源及字段"表提取 | 无,从输入提取 | 该步骤依赖的源表列表 | | 加工字段口径 | 从需求文档"输出表字段 - 字段加工逻辑"提取并整理 | 无,从输入提取 | 字段的加工规则说明 | | 输出表名 | 临时表:`${db_tmp_env}.${temp_table.prefix}${temp_table.suffix}`
目标表:`${db_eda_env}.${target_table.prefix}_xxx` | `db_tmp_env`(**保留占位符**)
`db_eda_env`(**保留占位符**)
`temp_table.prefix=tmp_prj004_ads_rpt`(**展开为实际值**)
`temp_table.suffix=_01,_02...`(**展开为实际值**)
`target_table.prefix=prj004_ads_rpt`(**展开为实际值**) | 最后一步输出目标表,中间步骤输出临时表;**输出时内部变量需展开,外部变量保留** | | 输出表字段 | 从需求文档"输出表字段"提取,逗号分隔 | 无,从输入提取 | 该步骤产出的字段列表 | --- ### 表 2:目标表属性信息 - 字段规则与配置 输出模板字段:`数据目录 | 数据源 | 表编码 | 描述 | 数据源类型 | 表名称 | 数据归口条线 | 是否已上传至集团 | 是否可共享 | 技术人员 | 技术人员电话 | 维护人员 | 维护人员电话 | 管理人员 | 管理人员电话 | 增量/全量 | 是否有敏感信息` | 输出字段 | 填写规则 | 默认值/配置项 | 说明 | |----------|----------|---------------|------| | 数据目录 | 从需求文档"输出表名 - 数据目录"提取,或按业务类型匹配 | `table_attr.data_catalog=指标层 - 客户服务` | 可选值:`指标层 - 客户服务`、`明细层 - 投诉`、`汇总层 - 业务` 等 | | 数据源 | 从需求文档"所用数据源及字段"涉及的源表归纳 | 无,从输入提取 | 描述数据来源,如"投诉工单、组织机构" | | 表编码 | 从需求文档"输出表名 - 表英文名称"提取 | 无,从输入提取 | 输出表的英文表名 | | 描述 | 从需求文档"输出表名 - 表描述"提取 | 无,从输入提取 | 表的业务含义描述 | | 数据源类型 | 固定值或从需求文档提取 | `table_attr.data_source_type=paimon` | 可选值:`paimon`、`hive`、`mysql` 等 | | 表名称 | 从需求文档"输出表名 - 表中文名称"提取 | 无,从输入提取 | 输出表的中文表名 | | 数据归口条线 | 从需求文档"需求提出方"映射 | `table_attr.business_line=客户服务部` | 业务归属部门 | | 是否已上传至集团 | 固定默认值 | `table_attr.is_uploaded=否` | `是`/`否` | | 是否可共享 | 固定默认值 | `table_attr.is_shareable=是` | `是`/`否` | | 技术人员 | 默认配置 | `table_attr.tech_name=张三` | 技术负责人姓名 | | 技术人员电话 | 默认配置 | `table_attr.tech_phone=13800138000` | 技术负责人电话 | | 维护人员 | 默认配置 | `table_attr.maint_name=李四` | 数据维护人员姓名 | | 维护人员电话 | 默认配置 | `table_attr.maint_phone=13900139000` | 数据维护人员电话 | | 管理人员 | 默认配置 | `table_attr.mgr_name=王五` | 数据管理人员姓名 | | 管理人员电话 | 默认配置 | `table_attr.mgr_phone=13700137000` | 数据管理人员电话 | | 增量/全量 | 从需求文档"运行频次"映射 | `table_attr.load_type=增量` | `增量`/`全量`,日/周/月频次→增量 | | 是否有敏感信息 | 固定默认值 | `table_attr.has_sensitive=否` | `是`/`否` | --- ### 表 3:目标表字段信息 - 字段规则与配置 输出模板字段:`字段编码 | 字段名称 | 字段类型 | 字段分类 | 排序 | 是否自增 | 是否需脱敏 | 描述` #### 3.1 各输出字段规则总览 | 输出字段 | 填写规则 | 默认值/配置项 | 说明 | |----------|----------|---------------|------| | 字段编码 | 从需求文档"输出表字段 - 输出字段英文名"提取 | 无,从输入提取 | 字段英文名,snake_case 格式 | | 字段名称 | 从需求文档"输出表字段 - 输出字段中文名"提取 | 无,从输入提取 | 字段中文名 | | 字段类型 | 按"3.2 字段类型映射"转换 | 见下方 3.2 节 | 需求类型→数据库类型 | | 字段分类 | 按"3.3 字段分类规则"自动识别 | 见下方 3.3 节 | 维度/标识/指标/扩展/分区 | | 排序 | 从 1 开始自增 | `field.sort_start=1` | 连续递增,无跳号 | | 是否自增 | 固定默认值 | `field.auto_increment=否` | `是`/`否` | | 是否需脱敏 | 固定默认值 | `field.mask_required=否` | `是`/`否` | | 描述 | 从需求文档"字段业务含义"+"加工逻辑"整理 | 无,AI 生成 | 字段含义 + 加工规则说明 | #### 3.2 字段类型映射配置 | 需求文档类型 | 目标数据库类型 | 配置项 | 说明 | |--------------|----------------|--------|------| | string | `STRING` | `type_map.string=STRING` | 字符串类型 | | bigint | `BIGINT` | `type_map.bigint=BIGINT` | 大整数 | | int | `INT` | `type_map.int=INT` | 整数 | | timestamp | `TIMESTAMP` | `type_map.timestamp=TIMESTAMP` | 时间戳 | | date | `STRING` | `type_map.date=STRING` | 日期(格式 yyyy-MM-dd) | | double/decimal | `DECIMAL(18,2)` | `type_map.decimal=DECIMAL(18,2)` | 小数 | #### 3.3 字段分类规则配置 | 字段分类 | 识别特征(字段名/业务含义) | 配置项 | 示例 | |----------|----------------------------|--------|------| | 标识字段 | 含 `id`、`code`、`nbr`、唯一标识类 | `class.identifier.keys=id,code,nbr` | `idx_nbr`、`complaint_id`、`org_id` | | 维度字段 | 名称类 (`name`)、类型类 (`type`)、描述类 | `class.dimension.keys=name,type,desc` | `dept_name`、`bureau_name`、`complaint_type` | | 指标字段 | 数值类、统计类、含 `num`/`amt`/`value`/`cnt` | `class.metric.keys=num,amt,value,cnt` | `complaint_accept_num`、`idx_value` | | 分区字段 | 含 `day_id`、`stat_date`、`dt`、`date` | `class.partition.keys=day_id,stat_date,dt,date` | `day_id`、`stat_date` | #### 3.4 预置字段配置(可选追加) **说明**:默认不追加预置字段,目标表字段与需求文档"输出表字段"保持一致。如需追加运维或分区字段,可通过以下配置项控制: | 预置类型 | 配置项 | 默认值 | 说明 | |----------|--------|--------|------| | 运维字段 | `preset.etl.enabled` | `false` | 是否追加 `etl_time`、`etl_remark` | | 分区字段 | `preset.partition.enabled` | `false` | 是否追加 `day_id` | | 分区字段名 | `preset.partition.field` | `day_id` | 分区字段名称 | --- ## 处理流程 ### Step 1: 解析输入并提取信息 **1.1 输入文件处理** - 如果用户传入的是**文件路径**:直接读取该文件 - 如果用户传入的是**目录路径**: - 列出目录下所有 `REQ-DATA-*.md` 文件 - 按文件名中的日期时间戳排序(YYYYMMDDHHMMSS 部分) - 自动选取最新的文件 **1.2 读取并解析需求文档** 读取 MD 文件,从数据需求技术规范文档中提取以下信息: 1. **需求基础信息**:需求编号、需求描述、需求提出方等 2. **输出表信息**:表名(中/英文)、数据目录、表描述 3. **输出字段信息**:字段名、字段类型、加工逻辑、来源表 4. **数据源信息**:库名、表名、字段信息 **1.3 与用户确认关键信息(多轮对话)** 在生成模型设计文档前,**必须**与用户确认以下关键信息: ``` 请确认以下关键信息是否正确: 【输入文件】 - 文件路径: - 需求编号:<需求编号> 【输出表信息】 - 目标表名:<表英文名称> - 表中文名称:<表中文名称> - 数据目录:<数据目录> 【字段信息】 - 字段总数: 个 - 分区字段: - 运行频次:<日/周/月等> 以上信息是否正确?如无误请回复"正确"或"继续",如有问题请指出需要修改的内容。 ``` **等待用户确认后才能继续生成。** **输出文件命名规则**: - 直接从输入文件名转换,将前缀 `REQ` 替换为 `MDDS`(Model Design Document Specification) - 输入文件名:`REQ-DATA-YYYYMMDDHHMMSS-XXX.md` - 输出文件名:`MDDS-DATA-YYYYMMDDHHMMSS-XXX.md` - 示例: - 输入文件:`REQ-DATA-20260316142709-001.md` - 输出文件:`MDDS-DATA-20260316142709-001.md` ### Step 2: 生成编排步骤(对应表 1) **在用户确认关键信息后**,根据字段加工逻辑和数据依赖关系,生成 SQL 编排步骤: ``` 编排规则: 1. 识别数据依赖链:来源表 → 中间处理 → 目标表 2. 按处理复杂度拆分步骤,每步一个明确目标: - 简单场景(2 步):step01 清洗关联 → step02 补全写入 - 中等场景(3~4 步):增加中间聚合、多表关联等步骤 - 复杂场景(5~6 步):多层嵌套加工、多次关联转换等 3. 每步骤包含:编排内容解释、输入源表、加工字段口径、输出表名、输出表字段 4. 临时表命名:`${db_tmp_env}.${temp_table.prefix}${temp_table.suffix}` - `${db_tmp_env}` 保留占位符格式,不展开 - `${temp_table.prefix}` 展开为实际值:`tmp_prj004_ads_rpt` - `${temp_table.suffix}` 展开为实际值:`_01`, `_02`... - 示例输出:`${db_tmp_env}.tmp_prj004_ads_rpt_01` 5. 目标表命名:`${db_eda_env}.${target_table.prefix}_xxx` - `${db_eda_env}` 保留占位符格式,不展开 - `${target_table.prefix}` 展开为实际值:`prj004_ads_rpt` - `_xxx` 从需求文档"输出表名 - 表英文名称"提取(去掉库名后的表名部分) - 示例输出:`${db_eda_env}.prj004_ads_rpt_kfb_idx_rt` ``` **字段填写说明**: - 步骤序号:按 `step01`, `step02`, `step03`... 顺序编号,步骤数根据加工复杂度决定 - sql 编排内容解释:AI 根据加工逻辑自然语言描述 - 输入源表:从需求文档"所用数据源及字段"表提取 - 加工字段口径:从需求文档"输出表字段 - 字段加工逻辑"提取并整理 - 输出表名:最后一步输出目标表,中间步骤输出临时表 - 临时表格式:`${db_tmp_env}.tmp_prj004_ads_rpt_01`(`${db_tmp_env}`保留,内部前缀和 suffix 展开) - 目标表格式:`${db_eda_env}.prj004_ads_rpt_xxx`(`${db_eda_env}`保留,内部前缀和表名展开) - 输出表字段:从需求文档"输出表字段"提取,逗号分隔 ### Step 3: 生成目标表属性(对应表 2) **在用户确认编排步骤后**,根据需求文档的表信息和默认配置生成: ``` 映射规则: - 数据目录 ← 需求文档"数据目录"字段(或 table_attr.data_catalog 默认值) - 数据源 ← 需求文档涉及的源表业务主题(从输入提取) - 表编码 ← 输出表英文名(从输入提取) - 描述 ← 需求文档表描述(从输入提取) - 数据源类型 ← table_attr.data_source_type - 表名称 ← 输出表中文名称(从输入提取) - 数据归口条线 ← table_attr.business_line - 是否已上传至集团 ← table_attr.is_uploaded - 是否可共享 ← table_attr.is_shareable - 技术人员/电话 ← table_attr.tech_name/tech_phone - 维护人员/电话 ← table_attr.maint_name/maint_phone - 管理人员/电话 ← table_attr.mgr_name/mgr_phone - 增量/全量 ← 根据运行频次映射 (table_attr.load_type) - 是否有敏感信息 ← table_attr.has_sensitive ``` ### Step 4: 生成目标表字段(对应表 3) **在用户确认目标表属性后**,根据需求文档的字段信息进行转换: ``` 映射规则: 1. 字段编码 ← 输出字段英文名(从输入提取) 2. 字段名称 ← 输出字段中文名(从输入提取) 3. 字段类型 ← 按"3.2 字段类型映射"转换 4. 字段分类 ← 按"3.3 字段分类规则"自动分类 5. 排序 ← 从 field.sort_start 开始自增 6. 是否自增 ← field.auto_increment 7. 是否需脱敏 ← field.mask_required 8. 描述 ← 字段业务含义 + 加工逻辑说明(AI 整理) 9. 预置字段(默认不追加): - 运维字段:当 preset.etl.enabled=true 时追加 etl_time、etl_remark - 分区字段:当 preset.partition.enabled=true 时追加 day_id ``` --- ## 输出模板结构 生成的模型设计文档遵循以下结构: ```markdown # 模型设计需求模板 ## 1. 编排目标表生成流程 | 步骤序号 | sql 编排内容解释 | 输入源表 | 加工字段口径 | 输出表名 | 输出表字段 | |----|----|----|----|----|----| | step01 | ... | ... | ... | ... | ... | ## 2. 目标表属性信息 ```json { "${target_table_name}": { "data_catalog": "指标层 - 客户服务", "data_source": "投诉工单、组织机构", "table_code": "prj004_ads_rpt_xxx", "description": "表描述", "data_source_type": "paimon", "table_name": "表中文名称", "business_line": "客户服务部", "is_uploaded": "否", "is_shareable": "是", "tech_name": "张三", "tech_phone": "13800138000", "maint_name": "李四", "maint_phone": "13900139000", "mgr_name": "王五", "mgr_phone": "13700137000", "load_type": "增量", "has_sensitive": "否" } } ``` ## 3. 目标表字段信息 ```json { "${target_table_name}": [ { "field_code": "字段英文名", "field_name": "字段中文名", "field_type": "STRING", "field_category": "维度", "sort_order": 1, "is_auto_increment": "否", "mask_required": "否", "description": "字段业务含义和加工规则说明" } ] } ``` --- ## 版本信息 - **技能版本**:v2.1 - **创建日期**:2026-04-08 - **更新日期**:2026-04-10 - **适用场景**:电信数据仓库 ADS 层模型设计 - **输入模板版本**:数据需求技术规范文档 v5 - **输出模板版本**:模型设计技术规范文档 v1 - **新增功能**: - 支持目录路径输入,自动选取最新日期的需求文档 - 多轮对话引导,分步确认关键信息 --- ## 使用示例 ### 调用方式 **场景 1:用户传入具体文件路径** ``` 用户:请根据 202604/skills_design/v2/data/REQ-DATA-20260409142709-001.md 生成模型设计文档 ``` **场景 2:用户传入目录路径,自动选取最新文件** ``` 用户:请根据 202604/skills_design/v2/data/ 目录下的需求文档生成模型设计 ``` ### 多轮对话流程示例 ``` 【Step 1】技能解析输入文件后,输出关键信息请用户确认: --- 请确认以下关键信息是否正确: 【输入文件】 - 文件路径:202604/skills_design/v2/data/REQ-DATA-20260409142709-001.md - 需求编号:REQ-DATA-20260409142709-001 【输出表信息】 - 目标表名:prj004_ads_rpt_kfb_idx_rt - 表中文名称:投诉处理地投诉受理量表 - 数据目录:上海电信/大数据中心 - 数据安全团队/大数据中心 - 数据安全团队应用层 【字段信息】 - 字段总数:34 个 - 分区字段:day_id - 运行频次:日 以上信息是否正确?如无误请回复"正确"或"继续",如有问题请指出需要修改的内容。 --- 【用户】正确 【Step 2】技能生成编排步骤后,请用户确认: --- 编排步骤已生成,共 2 步: - step01: 关联投诉源表与组织架构维表... - step02: 补全指标表标准字段格式... 以上编排步骤是否正确? --- 【用户】正确 【Step 3-4】技能继续生成目标表属性和字段信息,最终输出完整文档 ``` ### 输出示例 技能将输出完整的模型设计技术规范文档,包含编排步骤、表属性、字段设计等。 --- ## 注意事项 1. **多轮对话确认**:生成过程中必须分步与用户确认关键信息,用户确认后才能继续下一步 - Step 1 后:确认输入文件和输出表信息 - Step 2 后:确认编排步骤 - Step 3 后:确认目标表属性和字段信息 2. **自动选取最新文件**:当用户传入目录路径时,按文件名中的 `YYYYMMDDHHMMSS` 部分排序,选取最新的 `REQ-DATA-*.md` 文件 3. **环境变量占位符**:输出表名中的 `${db_tmp_env}` 和 `${db_eda_env}` 需保留占位符格式,运行时由外部环境替换 4. **内部配置变量展开**:`${temp_table.prefix}`、`${temp_table.suffix}`、`${target_table.prefix}` 需展开为实际值输出 - `temp_table.prefix` → `tmp_prj004_ads_rpt` - `temp_table.suffix` → `_01`, `_02`...(按步骤序号) - `target_table.prefix` → `prj004_ads_rpt` 5. **输出表名示例**: - 临时表正确输出:`${db_tmp_env}.tmp_prj004_ads_rpt_01` ❌ 错误:`${db_tmp_env}.${temp_table.prefix}${temp_table.suffix}` - 目标表正确输出:`${db_eda_env}.prj004_ads_rpt_kfb_idx_rt` ❌ 错误:`${db_eda_env}.${target_table.prefix}_kfb_idx_rt` 6. **输出文件命名**:直接从输入文件名转换,将 `REQ` 前缀替换为 `MDDS` - 输入文件:`REQ-DATA-20260316142709-001.md` → 输出文件:`MDDS-DATA-20260316142709-001.md` 7. **字段排序**:从 1 开始连续自增,确保无跳号 8. **命名规范**:所有表名、字段名使用 snake_case 格式 9. **字段一致性**:目标表字段默认与需求文档"输出表字段"保持一致,不追加额外字段 10. **预置字段**:如需追加运维字段 (etl_time、etl_remark) 或分区字段 (day_id),需将对应配置项设为 `true` ---