feat: add A-card operations frontend and backend foundation
This commit is contained in:
@@ -0,0 +1,291 @@
|
||||
# A 卡模型运维模块后端架构与数据库设计 V0.1
|
||||
|
||||
> 状态:设计评审稿,尚未创建 ORM、迁移或接口实现
|
||||
> 日期:2026-08-31
|
||||
> 依据:当前 `develop` 工程结构、运维前端 V1.9 页面与现有三条 API 契约
|
||||
|
||||
## 1. 结论
|
||||
|
||||
采用“**同一工程、同一 MySQL、分表归属、发布后可见**”的方式:
|
||||
|
||||
- 模型平台直接写入 7 张受控源表,不通过运维平台复制一份数据。
|
||||
- 运维模块只读取状态为 `published` 的监控批次,未发布或失败批次对页面不可见。
|
||||
- 判级、复核、报告、流程、文档、Prompt 和配置由运维模块独立维护,模型平台不得写入。
|
||||
- 已发布监控数据不原地覆盖;勘误时新增修订批次,保留历史版本和审计链。
|
||||
- 首期不新增微服务、Redis或消息中间件;复用现有 Nginx、React、FastAPI、MySQL、对象存储和 MySQL Outbox。
|
||||
|
||||
这能满足“模型方直接写业务表”的效率要求,同时避免模型任务误覆盖业务处理结果。
|
||||
|
||||
## 2. 模块边界
|
||||
|
||||
### 2.1 模型平台负责
|
||||
|
||||
- 银行、模型实例、模型版本及生命周期数据的写入。
|
||||
- 月度监控原始结果、特征指标和分箱分布数据的计算与写入。
|
||||
- 写入批次的完整性校验、计数、校验和及发布。
|
||||
- 已发布数据发生错误时,以新修订批次更正,不修改旧记录。
|
||||
|
||||
### 2.2 运维模块负责
|
||||
|
||||
- 按已发布原始结果和已发布规则版本计算异常等级、监控结果等级和命中原因。
|
||||
- 模型团队初审、业务团队终审、超时默认不处理及全程留痕。
|
||||
- 监控/诊断报告生成、编辑、发送、汇总和历史修订。
|
||||
- 七阶段开发评审流程、材料、知识库、规则、Prompt、报告模板和按银行配置。
|
||||
- 工作台、模型大类、细分银行、监控明细和详情等查询 API。
|
||||
|
||||
### 2.3 明确不做
|
||||
|
||||
- 运维模块不重复建设账号、角色、权限表;只复用登录模块返回的用户、角色和工作空间。
|
||||
- 模型平台不写判级、处理、报告、流程或配置表。
|
||||
- “手工同步”不再复制数据;其含义调整为“校验最新发布批次并重建派生判级”。
|
||||
- 报告汇总、知识库和工作台不单独建冗余汇总表,首期由业务表查询生成。
|
||||
|
||||
## 3. 总体架构
|
||||
|
||||
现有部署保持不变。运维能力作为 FastAPI 后端内的新 bounded context 接入:
|
||||
|
||||
1. 浏览器继续经 Nginx 访问 React SPA 和同源 `/api/v1/*`。
|
||||
2. 模型平台模块或调度任务直接写 `ops_*` 源表。
|
||||
3. 批次发布后,运维服务计算并保存规则判级快照。
|
||||
4. 运维 API 联查源数据、判级和处理结果,返回前端 DTO。
|
||||
5. 报告生成、提醒等后台动作复用现有 MySQL Outbox 和 Schedule Executor。
|
||||
6. 报告文件、流程材料继续复用 `storage_objects` 与现有对象存储抽象。
|
||||
|
||||
配套图:
|
||||
|
||||
- `A卡模型运维模块-系统架构-V0.1.png/.svg`
|
||||
- `A卡模型运维模块-数据域关系-V0.1.png/.svg`
|
||||
|
||||
修改 YAML 后运行 `python3 docs/architecture/render_diagrams.py` 可重新生成两种格式;脚本依赖 `diagrams`、`pyyaml` 和本机 Graphviz。
|
||||
|
||||
## 4. 数据设计约定
|
||||
|
||||
- 表名前缀统一为 `ops_`,与现有模型平台表隔离。
|
||||
- 主键统一使用 ULID `CHAR(26)`;日期时间统一 `DATETIME(3)`。
|
||||
- 月份在库内用 `DATE` 且固定为当月 1 日,API 序列化为 `YYYY-MM`。
|
||||
- KS、PSI、IV、CSI、坏账率和降幅在数据库中统一存 **0~1 比率**,使用 `DECIMAL(12,8)`;API 转换为 0~100 的百分数。
|
||||
- 沿用当前仓库约定:不创建物理外键,使用 `fk_*` 逻辑索引并在服务层校验完整性。
|
||||
- 可修改业务状态表使用 `state_version INTEGER` 做乐观锁。
|
||||
- 需要删除的配置或流程数据采用 `is_deleted`、`deleted_at` 软删除;监控历史不允许删除。
|
||||
- 所有根业务表包含 `workspace_id`,避免未来多个项目空间数据串用。
|
||||
|
||||
## 5. 表清单与归属
|
||||
|
||||
### 5.1 模型平台可写源表(7 张)
|
||||
|
||||
| 表 | 用途 | 核心唯一性 |
|
||||
|---|---|---|
|
||||
| `ops_banks` | 银行主数据及无极银行标记 | `(workspace_id, bank_code)` |
|
||||
| `ops_model_instances` | 银行下的模型实例、通用模型关系、当前版本 | `(workspace_id, model_id)` |
|
||||
| `ops_model_versions` | 版本、开发指标和生命周期日期 | `(model_instance_id, version_label)` |
|
||||
| `ops_monitor_batches` | 月度写入批次、修订号、发布状态和校验和 | `(workspace_id, source_system, monitor_month, revision_no)` |
|
||||
| `ops_monitor_results` | 模型单月原始排序性、KS、PSI和样本量 | `(batch_id, model_instance_id)` |
|
||||
| `ops_monitor_feature_metrics` | 单月特征级 IV、CSI及贡献变化 | `(monitor_result_id, feature_code)` |
|
||||
| `ops_monitor_distributions` | 评分分箱或特征分箱的基准期/当期分布 | `(monitor_result_id, dimension_type, feature_code, bin_order)` |
|
||||
|
||||
`ops_model_categories` 为运维模块维护的固定字典,模型平台只有读取权限。首期种子为 `std / bai / big / afd` 四类。
|
||||
|
||||
### 5.2 运维模块独占表(15 张)
|
||||
|
||||
| 数据域 | 表 |
|
||||
|---|---|
|
||||
| 字典 | `ops_model_categories` |
|
||||
| 判级与处理 | `ops_rule_versions`、`ops_rule_items`、`ops_monitor_evaluations`、`ops_monitor_reviews` |
|
||||
| 报告治理 | `ops_reports`、`ops_report_revisions`、`ops_report_template_versions`、`ops_prompt_versions`、`ops_prompt_regression_runs`、`ops_bank_report_configs` |
|
||||
| 流程与材料 | `ops_workflows`、`ops_workflow_stages`、`ops_documents` |
|
||||
| 使用统计 | `ops_usage_events` |
|
||||
|
||||
不新增通知任务表;通知和后台报告任务复用现有 `outbox_events`。若后续需要展示逐次送达结果,再增通知投递日志表。
|
||||
|
||||
## 6. 核心表字段初稿
|
||||
|
||||
### 6.1 模型与版本
|
||||
|
||||
`ops_model_instances`
|
||||
|
||||
- `model_instance_id`、`workspace_id`、`bank_id`、`category_id`
|
||||
- `model_id`、`model_name`、`model_status`
|
||||
- `current_version_id`
|
||||
- `is_common_model`、`common_source_model_id`、`common_model_name`
|
||||
- `source_updated_at`、`created_at`、`updated_at`
|
||||
|
||||
`ops_model_versions`
|
||||
|
||||
- `model_version_id`、`model_instance_id`、`version_label`、`version_status`
|
||||
- `developer_user_ref`、`developer_display_name`
|
||||
- `development_date`、`iteration_start_date`、`last_iteration_date`、`iteration_reason`
|
||||
- `escort_start_date`、`escort_end_date`、`online_date`、`offline_date`
|
||||
- `development_ks`、`development_psi`、`max_lift`
|
||||
- `scoring_logic_storage_object_id`、`source_updated_at`
|
||||
|
||||
模型实例只保存当前版本指针,所有生命周期和开发指标按版本留存。
|
||||
|
||||
### 6.2 监控批次和原始结果
|
||||
|
||||
`ops_monitor_batches`
|
||||
|
||||
- `batch_id`、`workspace_id`、`source_system`、`source_batch_no`
|
||||
- `monitor_month`、`revision_no`
|
||||
- `batch_status`:`writing / published / failed / superseded`
|
||||
- `expected_model_count`、`written_model_count`、`feature_row_count`、`distribution_row_count`
|
||||
- `checksum_sha256`、`generated_at`、`published_at`、`failed_reason`
|
||||
|
||||
`ops_monitor_results`
|
||||
|
||||
- `monitor_result_id`、`batch_id`、`model_instance_id`、`model_version_id`、`monitor_month`
|
||||
- `ranking_result`:`matched / unmatched / not_applicable`
|
||||
- `ks_value`、`psi_value`
|
||||
- `sample_count`、`good_count`、`bad_count`
|
||||
- `source_result_json`:仅保存尚未结构化且确有追溯价值的源字段
|
||||
- `calculated_at`、`created_at`
|
||||
|
||||
源表不保存 A/B/C、异常等级、处理建议或报告状态,避免两个模块同时改一行。
|
||||
|
||||
### 6.3 判级快照
|
||||
|
||||
`ops_monitor_evaluations`
|
||||
|
||||
- `evaluation_id`、`monitor_result_id`、`rule_version_id`、`rule_item_id`
|
||||
- `ks_mom_drop_rate`、`secondary_level2_hits_6m`
|
||||
- `abnormal_level`:`normal / level1 / level2 / level3`
|
||||
- `monitor_grade`:`A / B / C`
|
||||
- `reason_code`、`reason_text_snapshot`、`action_snapshot`
|
||||
- `is_current`、`evaluated_at`
|
||||
|
||||
每次规则发布或源数据修订都新增判级记录;旧快照不覆盖。页面默认读取 `is_current=1` 的记录,历史报告仍绑定生成时的判级快照。
|
||||
|
||||
### 6.4 两段处理
|
||||
|
||||
`ops_monitor_reviews`
|
||||
|
||||
- `review_id`、`monitor_result_id`、`evaluation_id`
|
||||
- `review_stage`:`model_initial / business_final`
|
||||
- `review_status`:`pending / handled / auto_closed`
|
||||
- `decision`:`no_action / tune_or_rebuild`
|
||||
- `handling_note`(手工处理必填)
|
||||
- `due_at`、`handled_by`、`handled_at`、`auto_closed_at`
|
||||
- `state_version`、`created_at`、`updated_at`
|
||||
|
||||
唯一约束为 `(monitor_result_id, review_stage)`。模型团队阶段完成后才创建或激活业务团队阶段;超时任务通过 Outbox 执行默认“不处理”。
|
||||
|
||||
### 6.5 报告
|
||||
|
||||
`ops_reports` 保存报告主状态与绑定快照,`ops_report_revisions` 保存每次正文修改:
|
||||
|
||||
- 报告绑定 `monitor_result_id + evaluation_id + template_version_id + prompt_version_id`。
|
||||
- `ops_report_revisions` 使用 `(report_id, revision_no)` 唯一约束,正文和结构化快照均不可变。
|
||||
- 监控报告页默认只查询最新监控月份;报告汇总页查询全部历史。数据库不删除旧月份报告。
|
||||
- PDF/Excel 等文件通过 `storage_object_id` 指向现有 `storage_objects`。
|
||||
|
||||
### 6.6 流程、材料与知识库
|
||||
|
||||
- `ops_workflows`:银行、模型大类、模型实例、独立开发/复用通用模型、当前阶段、状态和计划日期。
|
||||
- `ops_workflow_stages`:1~7 阶段实例、负责人角色、开始/截止/完成时间、确认状态和停滞天数。
|
||||
- `ops_documents`:同时支持 `storage_object_id` 和 `external_url`,可关联流程、阶段、模型和版本。
|
||||
- 知识库不是新表,而是对 `ops_documents` 按银行、模型、版本、环节和通用模型标记查询。
|
||||
|
||||
## 7. 发布协议
|
||||
|
||||
模型平台每次写入必须执行以下协议:
|
||||
|
||||
1. 创建 `ops_monitor_batches`,状态为 `writing`,携带幂等的 `source_batch_no`。
|
||||
2. 幂等写入银行、模型实例和版本;插入本批次结果、特征指标和分布。
|
||||
3. 校验模型数、明细行数、必填字段、指标范围和 SHA-256 校验和。
|
||||
4. 在一个短事务内将批次改为 `published`;同月份上一修订改为 `superseded`。
|
||||
5. 写入 `monitor_batch.published` Outbox 事件,触发运维模块生成判级快照。
|
||||
6. 运维查询只允许关联 `published` 批次,并按最高修订号取当前结果。
|
||||
|
||||
失败批次保留为 `failed` 供排查。任何已发布结果、特征和分布均不得执行 `UPDATE` 或物理删除。
|
||||
|
||||
## 8. 数据库权限
|
||||
|
||||
建议生产环境至少分三类账号:
|
||||
|
||||
| 账号 | 权限 |
|
||||
|---|---|
|
||||
| `schema_migrator` | 仅部署时使用,可对全部 `ops_*` 执行 DDL |
|
||||
| `model_writer` | 读取字典;对 7 张源表执行限定的 `SELECT/INSERT/UPDATE`,无 `DELETE`,不能写运维独占表 |
|
||||
| `operations_app` | 读取全部源表;读写运维独占表;不能修改已发布源结果 |
|
||||
|
||||
若模型任务与运维 API 暂时运行在同一 FastAPI 进程,代码层仍按两个 repository 隔离;生产批处理脚本优先使用独立 `MODEL_WRITER_DATABASE_URL`,将权限边界落实到数据库。
|
||||
|
||||
## 9. API 设计
|
||||
|
||||
### 9.1 首条真实纵向链路
|
||||
|
||||
保持前端已写好的路径,不重新发明契约:
|
||||
|
||||
| 接口 | 主要数据来源 |
|
||||
|---|---|
|
||||
| `GET /api/v1/operations/models` | 模型实例 + 当前版本 + 最新已发布结果 + 当前判级 + 最近处理 |
|
||||
| `GET /api/v1/operations/models/{model_id}` | 单模型完整元数据和最新状态 |
|
||||
| `GET /api/v1/operations/models/{model_id}/monitor-results?month=YYYY-MM` | 指定月最新已发布修订 + 当前判级 |
|
||||
|
||||
所有接口返回现有 `{ data, meta? }` 包装。切换 `VITE_OPERATIONS_API_MODE=api` 前,前端 `operationsApi.ts` 需要统一附加当前 `workspace_id`,用于选择并校验数据空间。
|
||||
|
||||
### 9.2 后续资源接口
|
||||
|
||||
- 查询:`/model-categories/overview`、`/banks/overview`、`/monitor-results`、`/monitor-results/{id}/features`、`/monitor-results/{id}/distributions`
|
||||
- 处理:`/monitor-results/{id}/reviews/model-initial`、`/reviews/business-final`
|
||||
- 报告:`/reports`、`/reports/{id}`、`/reports/{id}/revisions`、`/reports/{id}/send`
|
||||
- 流程:`/workflows`、`/workflows/{id}`、`/workflows/{id}/stages/{stage}`、`/documents`
|
||||
- 治理:`/rule-versions`、`/prompt-versions`、`/report-template-versions`、`/bank-report-configs`
|
||||
|
||||
列表统一支持分页、排序和与 V1.9 筛选框一致的查询参数;Excel/PDF 导出走独立端点,不让普通列表接口返回超大数据集。
|
||||
|
||||
## 10. 登录与角色
|
||||
|
||||
- 不增加运维 RBAC 表,也不接管现有权限管理模块。
|
||||
- API 复用登录 Cookie、`Users`、`Roles` 和当前工作空间,不创建新的角色或权限数据。
|
||||
- 新增轻量 `operations_context`:校验用户已登录且可访问所选工作空间;业务角色取与 `/api/v1/auth/me`、前端 `AuthUser.role_code` 相同的登录角色来源,避免前后端角色口径不一致。
|
||||
- 角色映射约定:`admin` → 管理员;`developer/model_team` → 模型团队;`business/business_team/biz` → 业务团队。
|
||||
- 前端按角色决定页面呈现,后端仍必须按角色校验写操作,不能把前端隐藏按钮当安全边界。
|
||||
- 角色代码最终值由登录/权限模块给出,运维模块只维护一处映射常量。
|
||||
|
||||
## 11. 代码落位建议
|
||||
|
||||
沿用现有 router / schema / service 分层,每个文件不超过 500 行:
|
||||
|
||||
```text
|
||||
common/src/common/db/models/operations/
|
||||
reference.py models.py monitoring.py governance.py
|
||||
reviews.py reports.py workflows.py usage.py
|
||||
backend/src/backend/api/operations/
|
||||
__init__.py _deps.py models.py monitoring.py reviews.py
|
||||
reports.py workflows.py governance.py
|
||||
backend/src/backend/services/operations/
|
||||
queries.py evaluation.py publishing.py reports.py workflows.py
|
||||
backend/src/backend/schemas/operations/
|
||||
common.py models.py monitoring.py reports.py workflows.py governance.py
|
||||
```
|
||||
|
||||
`backend.main` 只注册一个 `operations_router`;业务规则不写进路由文件。
|
||||
|
||||
## 12. 实施顺序
|
||||
|
||||
### P0:首条真实链路
|
||||
|
||||
1. 建模型/版本/批次/结果/特征/分布及规则判级 11 张核心表。
|
||||
2. 导入一组 2026-07 样例数据并走完整 `writing → published` 协议。
|
||||
3. 实现三条既有 API,前端追加 `workspace_id` 后切到 API 模式。
|
||||
4. 验证列表、模型详情、单月监控详情数值一致。
|
||||
|
||||
### P1:业务闭环
|
||||
|
||||
实现两段复核、报告及修订、七阶段流程、材料和知识库。
|
||||
|
||||
### P2:治理与运营
|
||||
|
||||
实现规则版本、Prompt 回归、模板版本、使用统计、提醒和导出优化。
|
||||
|
||||
## 13. 开发前需共同确认的 5 项
|
||||
|
||||
以下均给出推荐默认值;未得到反对意见时可按推荐值实施:
|
||||
|
||||
1. **模型 ID 唯一性**:推荐 `model_id` 在工作空间内全局唯一,不只在银行内唯一。
|
||||
2. **指标单位**:推荐数据库存 0~1 比率,API 输出百分数;禁止两种单位混写。
|
||||
3. **批次粒度**:推荐一个来源系统每月一个全量批次,勘误整体升修订号。
|
||||
4. **工作空间范围**:推荐全部根表带 `workspace_id`,即使首期只有一个 A 卡项目空间。
|
||||
5. **模型开发材料**:推荐运维表同时支持对象存储文件和模型平台链接,避免重复上传。
|
||||
|
||||
这 5 项确认后即可开始 ORM、Alembic 迁移和首条真实接口实现。
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 438 KiB |
@@ -0,0 +1,249 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 15.1.0 (20260618.0150)
|
||||
-->
|
||||
<!-- Title: A 卡模型运维模块 · 数据域关系 V0.1
|
||||
源数据与运维状态分离,历史结果不可覆盖 Pages: 1 -->
|
||||
<svg width="2684pt" height="2160pt"
|
||||
viewBox="0.00 0.00 2684.00 2160.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1.86609 1.86609) rotate(0) translate(36 1121.5)">
|
||||
<title>A 卡模型运维模块 · 数据域关系 V0.1
|
||||
源数据与运维状态分离,历史结果不可覆盖</title>
|
||||
<polygon fill="white" stroke="none" points="-36,36 -36,-1121.5 1402.05,-1121.5 1402.05,36 -36,36"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="683.03" y="-1058.7" font-family="PingFang SC" font-size="24.00" fill="#2d3436">A 卡模型运维模块 · 数据域关系 V0.1</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="683.03" y="-1024.95" font-family="PingFang SC" font-size="24.00" fill="#2d3436">源数据与运维状态分离,历史结果不可覆盖</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_模型平台直写源数据(7 张)</title>
|
||||
<path fill="#eef5fd" stroke="#6f9ed4" d="M20,-329C20,-329 1104,-329 1104,-329 1110,-329 1116,-335 1116,-341 1116,-341 1116,-750 1116,-750 1116,-756 1110,-762 1104,-762 1104,-762 20,-762 20,-762 14,-762 8,-756 8,-750 8,-750 8,-341 8,-341 8,-335 14,-329 20,-329"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="112.75" y="-743.75" font-family="PingFang SC" font-size="15.00" fill="#2d3436">模型平台直写源数据(7 张)</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_运维判级与处理</title>
|
||||
<path fill="#f1f8f5" stroke="#74a087" d="M20,-8C20,-8 1346.05,-8 1346.05,-8 1352.05,-8 1358.05,-14 1358.05,-20 1358.05,-20 1358.05,-228 1358.05,-228 1358.05,-234 1352.05,-240 1346.05,-240 1346.05,-240 20,-240 20,-240 14,-240 8,-234 8,-228 8,-228 8,-20 8,-20 8,-14 14,-8 20,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="68.5" y="-221.75" font-family="PingFang SC" font-size="15.00" fill="#2d3436">运维判级与处理</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_报告、流程与运营</title>
|
||||
<path fill="#faf6ee" stroke="#c5a467" d="M20,-770C20,-770 1346.05,-770 1346.05,-770 1352.05,-770 1358.05,-776 1358.05,-782 1358.05,-782 1358.05,-990 1358.05,-990 1358.05,-996 1352.05,-1002 1346.05,-1002 1346.05,-1002 20,-1002 20,-1002 14,-1002 8,-996 8,-990 8,-990 8,-782 8,-782 8,-776 14,-770 20,-770"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76" y="-983.75" font-family="PingFang SC" font-size="15.00" fill="#2d3436">报告、流程与运营</text>
|
||||
</g>
|
||||
<!-- 0bc523623a544090a0d886de1f78a625 -->
|
||||
<g id="node1" class="node">
|
||||
<title>0bc523623a544090a0d886de1f78a625</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="26" y="-480.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-367.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_banks</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-352.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">银行</text>
|
||||
</g>
|
||||
<!-- 0e290213c8ea44bcb0ee9ee437a7c80b -->
|
||||
<g id="node2" class="node">
|
||||
<title>0e290213c8ea44bcb0ee9ee437a7c80b</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="205.8" y="-480.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="256.2" y="-367.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_model_instances</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="256.2" y="-352.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">模型实例</text>
|
||||
</g>
|
||||
<!-- 0bc523623a544090a0d886de1f78a625->0e290213c8ea44bcb0ee9ee437a7c80b -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>0bc523623a544090a0d886de1f78a625->0e290213c8ea44bcb0ee9ee437a7c80b</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M126.46,-430C147.55,-430 172.42,-430 194.65,-430"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="194.48,-433.5 204.48,-430 194.48,-426.5 194.48,-433.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="166.3" y="-431.15" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">1:N</text>
|
||||
</g>
|
||||
<!-- 6cdbdf2ce8de45c694548663936ffb4e -->
|
||||
<g id="node3" class="node">
|
||||
<title>6cdbdf2ce8de45c694548663936ffb4e</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="477.85" y="-480.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-367.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_model_versions</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-352.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">模型版本</text>
|
||||
</g>
|
||||
<!-- 0e290213c8ea44bcb0ee9ee437a7c80b->6cdbdf2ce8de45c694548663936ffb4e -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>0e290213c8ea44bcb0ee9ee437a7c80b->6cdbdf2ce8de45c694548663936ffb4e</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M306.42,-430C351.49,-430 418.33,-430 466.67,-430"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="466.4,-433.5 476.4,-430 466.4,-426.5 466.4,-433.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="392.23" y="-431.15" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">1:N</text>
|
||||
</g>
|
||||
<!-- 5297915299eb45eea32a0915742e54cd -->
|
||||
<g id="node14" class="node">
|
||||
<title>5297915299eb45eea32a0915742e54cd</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="477.85" y="-921.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-808.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_workflows + stages</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-793.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">七阶段流程</text>
|
||||
</g>
|
||||
<!-- 0e290213c8ea44bcb0ee9ee437a7c80b->5297915299eb45eea32a0915742e54cd -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>0e290213c8ea44bcb0ee9ee437a7c80b->5297915299eb45eea32a0915742e54cd</title>
|
||||
<path fill="none" stroke="#2f6fe0" d="M275.3,-512.65C287.84,-559.72 307.42,-618.59 335.6,-666 371.35,-726.15 427.3,-783.32 469.53,-821.93"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" points="467.17,-824.52 476.94,-828.63 471.87,-819.32 467.17,-824.52"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="392.23" y="-805.77" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">开发 / 复用通用模型</text>
|
||||
</g>
|
||||
<!-- 87e82968badc47e9aa3f20c61d45d927 -->
|
||||
<g id="node15" class="node">
|
||||
<title>87e82968badc47e9aa3f20c61d45d927</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="736.4" y="-921.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-808.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_documents</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-793.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">材料 / 知识库索引</text>
|
||||
</g>
|
||||
<!-- 0e290213c8ea44bcb0ee9ee437a7c80b->87e82968badc47e9aa3f20c61d45d927 -->
|
||||
<g id="edge15" class="edge">
|
||||
<title>0e290213c8ea44bcb0ee9ee437a7c80b->87e82968badc47e9aa3f20c61d45d927</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M287.47,-512.74C299.21,-533.43 314.93,-553.1 335.6,-565 379.22,-590.11 405.53,-590.62 448.85,-565 471.88,-551.38 459.95,-532.13 477.85,-512.25 524.86,-460.03 540.6,-443.02 607.65,-422 649.95,-408.74 674.78,-391.98 707.4,-422 764.51,-474.54 715.77,-695.19 736.4,-770 737.11,-772.58 737.89,-775.17 738.72,-777.77"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="735.35,-778.73 741.94,-787.03 741.96,-776.43 735.35,-778.73"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-518.65" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">按模型 / 版本检索</text>
|
||||
</g>
|
||||
<!-- 941939a7ca7c4dd68aa48a7d95fba6ea -->
|
||||
<g id="node5" class="node">
|
||||
<title>941939a7ca7c4dd68aa48a7d95fba6ea</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="736.4" y="-480.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-367.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_results</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-352.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">单月原始指标</text>
|
||||
</g>
|
||||
<!-- 6cdbdf2ce8de45c694548663936ffb4e->941939a7ca7c4dd68aa48a7d95fba6ea -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>6cdbdf2ce8de45c694548663936ffb4e->941939a7ca7c4dd68aa48a7d95fba6ea</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M578.41,-430C620.31,-430 680.67,-430 725.48,-430"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="725.29,-433.5 735.29,-430 725.29,-426.5 725.29,-433.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="657.53" y="-436.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">版本快照</text>
|
||||
</g>
|
||||
<!-- b4378b7b44d1441c990e5629da97e3f8 -->
|
||||
<g id="node4" class="node">
|
||||
<title>b4378b7b44d1441c990e5629da97e3f8</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="477.85" y="-681.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-568.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_batches</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528.25" y="-553.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">发布批次 / 修订</text>
|
||||
</g>
|
||||
<!-- b4378b7b44d1441c990e5629da97e3f8->941939a7ca7c4dd68aa48a7d95fba6ea -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>b4378b7b44d1441c990e5629da97e3f8->941939a7ca7c4dd68aa48a7d95fba6ea</title>
|
||||
<path fill="none" stroke="#3f9ad0" stroke-width="2" d="M578.46,-605.98C615.83,-585.75 667.44,-555.09 707.4,-521 714.38,-515.04 721.28,-508.45 727.91,-501.61"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" stroke-width="2" points="730.41,-504.05 734.71,-494.37 725.31,-499.26 730.41,-504.05"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="657.53" y="-594.91" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">published 后可见</text>
|
||||
</g>
|
||||
<!-- 6d81dd3447fe491e8c37a88de15bba21 -->
|
||||
<g id="node6" class="node">
|
||||
<title>6d81dd3447fe491e8c37a88de15bba21</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="997.2" y="-480.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-367.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_feature_metrics</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-352.22" font-family="PingFang SC" font-size="10.50" fill="#2d3436">IV / CSI / 贡献</text>
|
||||
</g>
|
||||
<!-- 941939a7ca7c4dd68aa48a7d95fba6ea->6d81dd3447fe491e8c37a88de15bba21 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>941939a7ca7c4dd68aa48a7d95fba6ea->6d81dd3447fe491e8c37a88de15bba21</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M837.09,-430C879.45,-430 940.7,-430 986.04,-430"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="985.98,-433.5 995.98,-430 985.98,-426.5 985.98,-433.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="917.2" y="-431.15" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">1:N</text>
|
||||
</g>
|
||||
<!-- 8cf5f1d27bd44ef6a43acba265f9c5f4 -->
|
||||
<g id="node7" class="node">
|
||||
<title>8cf5f1d27bd44ef6a43acba265f9c5f4</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="997.2" y="-681.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-568.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_distributions</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-553.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">评分 / 特征分箱</text>
|
||||
</g>
|
||||
<!-- 941939a7ca7c4dd68aa48a7d95fba6ea->8cf5f1d27bd44ef6a43acba265f9c5f4 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>941939a7ca7c4dd68aa48a7d95fba6ea->8cf5f1d27bd44ef6a43acba265f9c5f4</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M837.09,-468.28C880.26,-501.81 943.05,-550.57 988.62,-585.97"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="986.26,-588.56 996.3,-591.93 990.55,-583.04 986.26,-588.56"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="917.2" y="-567.14" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">1:N</text>
|
||||
</g>
|
||||
<!-- 1a651d34b0c045b88085bf40cb9c52e1 -->
|
||||
<g id="node10" class="node">
|
||||
<title>1a651d34b0c045b88085bf40cb9c52e1</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="997.2" y="-159.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-46.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_evaluations</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-31.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">判级快照</text>
|
||||
</g>
|
||||
<!-- 941939a7ca7c4dd68aa48a7d95fba6ea->1a651d34b0c045b88085bf40cb9c52e1 -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>941939a7ca7c4dd68aa48a7d95fba6ea->1a651d34b0c045b88085bf40cb9c52e1</title>
|
||||
<path fill="none" stroke="#3f9ad0" stroke-width="2" d="M837.09,-368.87C880.46,-315.07 943.63,-236.72 989.26,-180.13"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" stroke-width="2" points="991.82,-182.52 995.38,-172.53 986.37,-178.12 991.82,-182.52"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="917.2" y="-332.57" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">原始指标 → 判级</text>
|
||||
</g>
|
||||
<!-- 13501c09d5a347388b6bf1551ddd64dd -->
|
||||
<g id="node8" class="node">
|
||||
<title>13501c09d5a347388b6bf1551ddd64dd</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="26" y="-159.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-46.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_model_categories</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-31.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">固定大类字典</text>
|
||||
</g>
|
||||
<!-- 13501c09d5a347388b6bf1551ddd64dd->0e290213c8ea44bcb0ee9ee437a7c80b -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>13501c09d5a347388b6bf1551ddd64dd->0e290213c8ea44bcb0ee9ee437a7c80b</title>
|
||||
<path fill="none" stroke="#9aa2ad" d="M122.42,-191.74C145.43,-233.87 174.13,-286.15 202.82,-337.65"/>
|
||||
<polygon fill="#9aa2ad" stroke="#9aa2ad" points="199.7,-339.24 207.63,-346.27 205.81,-335.83 199.7,-339.24"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="166.3" y="-286.52" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">1:N</text>
|
||||
</g>
|
||||
<!-- 6253de4668fb4387968b2c3037eb1130 -->
|
||||
<g id="node9" class="node">
|
||||
<title>6253de4668fb4387968b2c3037eb1130</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="736.4" y="-159.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-46.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_rule_versions + items</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="786.8" y="-31.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">规则版本与矩阵</text>
|
||||
</g>
|
||||
<!-- 6253de4668fb4387968b2c3037eb1130->1a651d34b0c045b88085bf40cb9c52e1 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>6253de4668fb4387968b2c3037eb1130->1a651d34b0c045b88085bf40cb9c52e1</title>
|
||||
<path fill="none" stroke="#8b6fc4" stroke-width="1.8" stroke-dasharray="5,2" d="M837.09,-109C879.09,-109 939.66,-109 984.88,-109"/>
|
||||
<polygon fill="#8b6fc4" stroke="#8b6fc4" stroke-width="1.8" points="984.77,-112.5 994.77,-109 984.77,-105.5 984.77,-112.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="917.2" y="-115.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">按已发布规则计算</text>
|
||||
</g>
|
||||
<!-- 79d9b23ca5254f4cacb53546dfb6824e -->
|
||||
<g id="node11" class="node">
|
||||
<title>79d9b23ca5254f4cacb53546dfb6824e</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="1239.25" y="-159.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1289.65" y="-46.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_monitor_reviews</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1289.65" y="-31.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">模型初审 → 业务终审</text>
|
||||
</g>
|
||||
<!-- 1a651d34b0c045b88085bf40cb9c52e1->79d9b23ca5254f4cacb53546dfb6824e -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>1a651d34b0c045b88085bf40cb9c52e1->79d9b23ca5254f4cacb53546dfb6824e</title>
|
||||
<path fill="none" stroke="#2f6fe0" d="M1097.76,-109C1135.54,-109 1187.92,-109 1228.26,-109"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" points="1228.05,-112.5 1238.05,-109 1228.05,-105.5 1228.05,-112.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1168.63" y="-115.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">触发两段处理</text>
|
||||
</g>
|
||||
<!-- 34aca64f2cd942a883883ca8ca28adce -->
|
||||
<g id="node12" class="node">
|
||||
<title>34aca64f2cd942a883883ca8ca28adce</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="1239.25" y="-921.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1289.65" y="-808.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_reports + revisions</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1289.65" y="-793.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">报告与不可变修订</text>
|
||||
</g>
|
||||
<!-- 1a651d34b0c045b88085bf40cb9c52e1->34aca64f2cd942a883883ca8ca28adce -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>1a651d34b0c045b88085bf40cb9c52e1->34aca64f2cd942a883883ca8ca28adce</title>
|
||||
<path fill="none" stroke="#2f6fe0" d="M1075,-191.79C1087.47,-230.95 1102.53,-278.37 1116,-321 1166.69,-481.47 1225.28,-668.42 1259.52,-777.84"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" points="1256.08,-778.56 1262.41,-787.06 1262.76,-776.47 1256.08,-778.56"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1168.63" y="-626.54" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">绑定判级快照</text>
|
||||
</g>
|
||||
<!-- 80b8a0a57f5041f0b9226cdc133358f6 -->
|
||||
<g id="node13" class="node">
|
||||
<title>80b8a0a57f5041f0b9226cdc133358f6</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="997.2" y="-921.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-808.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">模板 / Prompt / 回归</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1047.6" y="-793.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">按银行报告配置</text>
|
||||
</g>
|
||||
<!-- 80b8a0a57f5041f0b9226cdc133358f6->34aca64f2cd942a883883ca8ca28adce -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>80b8a0a57f5041f0b9226cdc133358f6->34aca64f2cd942a883883ca8ca28adce</title>
|
||||
<path fill="none" stroke="#8b6fc4" stroke-dasharray="5,2" d="M1097.76,-871C1135.54,-871 1187.92,-871 1228.26,-871"/>
|
||||
<polygon fill="#8b6fc4" stroke="#8b6fc4" points="1228.05,-874.5 1238.05,-871 1228.05,-867.5 1228.05,-874.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1168.63" y="-877.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">模板 + Prompt</text>
|
||||
</g>
|
||||
<!-- 5297915299eb45eea32a0915742e54cd->87e82968badc47e9aa3f20c61d45d927 -->
|
||||
<g id="edge14" class="edge">
|
||||
<title>5297915299eb45eea32a0915742e54cd->87e82968badc47e9aa3f20c61d45d927</title>
|
||||
<path fill="none" stroke="#3f9ad0" d="M578.41,-871C620.31,-871 680.67,-871 725.48,-871"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" points="725.29,-874.5 735.29,-871 725.29,-867.5 725.29,-874.5"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="657.53" y="-877.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">阶段材料</text>
|
||||
</g>
|
||||
<!-- dd6af7440411402f8066d90862eac449 -->
|
||||
<g id="node16" class="node">
|
||||
<title>dd6af7440411402f8066d90862eac449</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="26" y="-921.4"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-808.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">ops_usage_events</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="76.4" y="-793.23" font-family="PingFang SC" font-size="10.50" fill="#2d3436">登录 / 需求 / 报告行为</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 22 KiB |
@@ -0,0 +1,56 @@
|
||||
title: "A 卡模型运维模块 · 数据域关系 V0.1\n源数据与运维状态分离,历史结果不可覆盖"
|
||||
direction: LR
|
||||
formats: [png, svg]
|
||||
theme:
|
||||
font: "PingFang SC"
|
||||
title_size: 24
|
||||
node_size: 10.5
|
||||
edge_size: 8.8
|
||||
splines: spline
|
||||
nodesep: 0.48
|
||||
ranksep: 0.8
|
||||
dpi: 180
|
||||
pad: 0.5
|
||||
size: "20,12!"
|
||||
clusters:
|
||||
- name: "模型平台直写源数据(7 张)"
|
||||
style: { bg: "#EEF5FD", pen: "#6F9ED4", margin: 18 }
|
||||
nodes:
|
||||
- { id: banks, label: "ops_banks\n银行", icon: flowdb }
|
||||
- { id: models, label: "ops_model_instances\n模型实例", icon: flowdb }
|
||||
- { id: versions, label: "ops_model_versions\n模型版本", icon: flowdb }
|
||||
- { id: batches, label: "ops_monitor_batches\n发布批次 / 修订", icon: flowdb }
|
||||
- { id: results, label: "ops_monitor_results\n单月原始指标", icon: flowdb }
|
||||
- { id: features, label: "ops_monitor_feature_metrics\nIV / CSI / 贡献", icon: flowdb }
|
||||
- { id: distributions, label: "ops_monitor_distributions\n评分 / 特征分箱", icon: flowdb }
|
||||
- name: "运维判级与处理"
|
||||
style: { bg: "#F1F8F5", pen: "#74A087", margin: 18 }
|
||||
nodes:
|
||||
- { id: categories, label: "ops_model_categories\n固定大类字典", icon: flowdb }
|
||||
- { id: rules, label: "ops_rule_versions + items\n规则版本与矩阵", icon: flowdb }
|
||||
- { id: evaluations, label: "ops_monitor_evaluations\n判级快照", icon: flowdb }
|
||||
- { id: reviews, label: "ops_monitor_reviews\n模型初审 → 业务终审", icon: flowdb }
|
||||
- name: "报告、流程与运营"
|
||||
style: { bg: "#FAF6EE", pen: "#C5A467", margin: 18 }
|
||||
nodes:
|
||||
- { id: reports, label: "ops_reports + revisions\n报告与不可变修订", icon: flowdb }
|
||||
- { id: governance, label: "模板 / Prompt / 回归\n按银行报告配置", icon: flowdb }
|
||||
- { id: workflows, label: "ops_workflows + stages\n七阶段流程", icon: flowdb }
|
||||
- { id: documents, label: "ops_documents\n材料 / 知识库索引", icon: flowdb }
|
||||
- { id: usage, label: "ops_usage_events\n登录 / 需求 / 报告行为", icon: flowdb }
|
||||
edges:
|
||||
- { from: banks, to: models, label: "1:N", type: plain }
|
||||
- { from: categories, to: models, label: "1:N", type: plain }
|
||||
- { from: models, to: versions, label: "1:N", type: plain }
|
||||
- { from: batches, to: results, label: "published 后可见", type: write, width: 2.0 }
|
||||
- { from: versions, to: results, label: "版本快照", type: plain }
|
||||
- { from: results, to: features, label: "1:N", type: plain }
|
||||
- { from: results, to: distributions, label: "1:N", type: plain }
|
||||
- { from: rules, to: evaluations, label: "按已发布规则计算", type: dep, width: 1.8 }
|
||||
- { from: results, to: evaluations, label: "原始指标 → 判级", type: write, width: 2.0 }
|
||||
- { from: evaluations, to: reviews, label: "触发两段处理", type: flow }
|
||||
- { from: evaluations, to: reports, label: "绑定判级快照", type: flow }
|
||||
- { from: governance, to: reports, label: "模板 + Prompt", type: dep }
|
||||
- { from: models, to: workflows, label: "开发 / 复用通用模型", type: flow }
|
||||
- { from: workflows, to: documents, label: "阶段材料", type: write }
|
||||
- { from: models, to: documents, label: "按模型 / 版本检索", type: plain, free: true }
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 300 KiB |
@@ -0,0 +1,206 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
|
||||
"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<!-- Generated by graphviz version 15.1.0 (20260618.0150)
|
||||
-->
|
||||
<!-- Title: A 卡模型运维模块 · 推荐系统架构 V0.1
|
||||
同一工程 / 同一 MySQL / 源表发布后可见 Pages: 1 -->
|
||||
<svg width="1513pt" height="2160pt"
|
||||
viewBox="0.00 0.00 1513.00 2160.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<g id="graph0" class="graph" transform="scale(1.26146 1.26146) rotate(0) translate(39.6 1672.7)">
|
||||
<title>A 卡模型运维模块 · 推荐系统架构 V0.1
|
||||
同一工程 / 同一 MySQL / 源表发布后可见</title>
|
||||
<polygon fill="white" stroke="none" points="-39.6,39.6 -39.6,-1672.7 1159.6,-1672.7 1159.6,39.6 -39.6,39.6"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="560" y="-1605.35" font-family="PingFang SC" font-size="25.00" fill="#2d3436">A 卡模型运维模块 · 推荐系统架构 V0.1</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="560" y="-1569.35" font-family="PingFang SC" font-size="25.00" fill="#2d3436">同一工程 / 同一 MySQL / 源表发布后可见</text>
|
||||
<g id="clust1" class="cluster">
|
||||
<title>cluster_入口层(现有)</title>
|
||||
<path fill="#f5f7fa" stroke="#aeb7c4" d="M20,-793.55C20,-793.55 136,-793.55 136,-793.55 142,-793.55 148,-799.55 148,-805.55 148,-805.55 148,-1533.1 148,-1533.1 148,-1539.1 142,-1545.1 136,-1545.1 136,-1545.1 20,-1545.1 20,-1545.1 14,-1545.1 8,-1539.1 8,-1533.1 8,-1533.1 8,-805.55 8,-805.55 8,-799.55 14,-793.55 20,-793.55"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="68.5" y="-1526.85" font-family="PingFang SC" font-size="15.00" fill="#2d3436">入口层(现有)</text>
|
||||
</g>
|
||||
<g id="clust2" class="cluster">
|
||||
<title>cluster_统一 FastAPI 工程(不新增服务)</title>
|
||||
<path fill="#eef5fd" stroke="#7fa8d8" d="M168,-254.35C168,-254.35 436,-254.35 436,-254.35 442,-254.35 448,-260.35 448,-266.35 448,-266.35 448,-1018.9 448,-1018.9 448,-1024.9 442,-1030.9 436,-1030.9 436,-1030.9 168,-1030.9 168,-1030.9 162,-1030.9 156,-1024.9 156,-1018.9 156,-1018.9 156,-266.35 156,-266.35 156,-260.35 162,-254.35 168,-254.35"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="278.38" y="-1012.65" font-family="PingFang SC" font-size="15.00" fill="#2d3436">统一 FastAPI 工程(不新增服务)</text>
|
||||
</g>
|
||||
<g id="clust3" class="cluster">
|
||||
<title>cluster_共享数据层(现有 MySQL)</title>
|
||||
<path fill="#f1f8f5" stroke="#78a88d" d="M468,-8C468,-8 736,-8 736,-8 742,-8 748,-14 748,-20 748,-20 748,-743.8 748,-743.8 748,-749.8 742,-755.8 736,-755.8 736,-755.8 468,-755.8 468,-755.8 462,-755.8 456,-749.8 456,-743.8 456,-743.8 456,-20 456,-20 456,-14 462,-8 468,-8"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="559.62" y="-737.55" font-family="PingFang SC" font-size="15.00" fill="#2d3436">共享数据层(现有 MySQL)</text>
|
||||
</g>
|
||||
<g id="clust4" class="cluster">
|
||||
<title>cluster_文件层(现有)</title>
|
||||
<path fill="#faf6ee" stroke="#c6a96d" d="M984,-518.45C984,-518.45 1100,-518.45 1100,-518.45 1106,-518.45 1112,-524.45 1112,-530.45 1112,-530.45 1112,-741.8 1112,-741.8 1112,-747.8 1106,-753.8 1100,-753.8 1100,-753.8 984,-753.8 984,-753.8 978,-753.8 972,-747.8 972,-741.8 972,-741.8 972,-530.45 972,-530.45 972,-524.45 978,-518.45 984,-518.45"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1032.5" y="-735.55" font-family="PingFang SC" font-size="15.00" fill="#2d3436">文件层(现有)</text>
|
||||
</g>
|
||||
<!-- 8e923065d05147b68fd08369fc363143 -->
|
||||
<g id="node1" class="node">
|
||||
<title>8e923065d05147b68fd08369fc363143</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/onprem/client/users.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="27.6" y="-1462.95"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-1350.8" font-family="PingFang SC" font-size="11.00" fill="#2d3436">业务团队 / 模型团队</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-1335.05" font-family="PingFang SC" font-size="11.00" fill="#2d3436">管理员</text>
|
||||
</g>
|
||||
<!-- 7302e8c0cbac47f8b0461d1c3238c1b8 -->
|
||||
<g id="node2" class="node">
|
||||
<title>7302e8c0cbac47f8b0461d1c3238c1b8</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/onprem/network/nginx.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="27.6" y="-1221.85"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-1109.7" font-family="PingFang SC" font-size="11.00" fill="#2d3436">Nginx Gateway</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-1093.95" font-family="PingFang SC" font-size="11.00" fill="#2d3436">唯一入口</text>
|
||||
</g>
|
||||
<!-- 8e923065d05147b68fd08369fc363143->7302e8c0cbac47f8b0461d1c3238c1b8 -->
|
||||
<g id="edge1" class="edge">
|
||||
<title>8e923065d05147b68fd08369fc363143->7302e8c0cbac47f8b0461d1c3238c1b8</title>
|
||||
<path fill="none" stroke="#2f6fe0" stroke-width="1.8" d="M78,-1329.93C78,-1309.56 78,-1287.55 78,-1266.62"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" stroke-width="1.8" points="81.5,-1266.83 78,-1256.83 74.5,-1266.83 81.5,-1266.83"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="100.12" y="-1286.4" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">HTTPS</text>
|
||||
</g>
|
||||
<!-- 4e2614e624784972b26a9cbc506918fd -->
|
||||
<g id="node3" class="node">
|
||||
<title>4e2614e624784972b26a9cbc506918fd</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/framework/react.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="27.6" y="-946.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-834.6" font-family="PingFang SC" font-size="11.00" fill="#2d3436">React SPA</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="78" y="-818.85" font-family="PingFang SC" font-size="11.00" fill="#2d3436">模型平台 + 运维平台</text>
|
||||
</g>
|
||||
<!-- 7302e8c0cbac47f8b0461d1c3238c1b8->4e2614e624784972b26a9cbc506918fd -->
|
||||
<g id="edge2" class="edge">
|
||||
<title>7302e8c0cbac47f8b0461d1c3238c1b8->4e2614e624784972b26a9cbc506918fd</title>
|
||||
<path fill="none" stroke="#2f6fe0" d="M78,-1088.88C78,-1057.81 78,-1022.18 78,-990.14"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" points="81.5,-990.48 78,-980.48 74.5,-990.48 81.5,-990.48"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="103.5" y="-1045.3" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">静态资源</text>
|
||||
</g>
|
||||
<!-- 62f35beca1644317a41769c903fdcc3d -->
|
||||
<g id="node4" class="node">
|
||||
<title>62f35beca1644317a41769c903fdcc3d</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/framework/fastapi.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="177.6" y="-946.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="228" y="-834.6" font-family="PingFang SC" font-size="11.00" fill="#2d3436">模型平台模块</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="228" y="-818.85" font-family="PingFang SC" font-size="11.00" fill="#2d3436">模型 / 版本 / 计算任务</text>
|
||||
</g>
|
||||
<!-- 7302e8c0cbac47f8b0461d1c3238c1b8->62f35beca1644317a41769c903fdcc3d -->
|
||||
<g id="edge3" class="edge">
|
||||
<title>7302e8c0cbac47f8b0461d1c3238c1b8->62f35beca1644317a41769c903fdcc3d</title>
|
||||
<path fill="none" stroke="#2f6fe0" d="M126.22,-1088.92C137.17,-1069.98 148.63,-1049.81 159,-1030.9 166.37,-1017.46 173.99,-1003.15 181.36,-989.09"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" points="184.45,-990.73 185.97,-980.25 178.24,-987.49 184.45,-990.73"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="191.3" y="-1045.3" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">模型平台 API</text>
|
||||
</g>
|
||||
<!-- 3cf7ac83f6764e16bfd1e5ea55c240e2 -->
|
||||
<g id="node5" class="node">
|
||||
<title>3cf7ac83f6764e16bfd1e5ea55c240e2</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/framework/fastapi.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="325.6" y="-946.75"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="376" y="-834.6" font-family="PingFang SC" font-size="11.00" fill="#2d3436">运维模块</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="376" y="-818.85" font-family="PingFang SC" font-size="11.00" fill="#2d3436">查询 / 判级 / 复核 / 报告 / 流程</text>
|
||||
</g>
|
||||
<!-- 7302e8c0cbac47f8b0461d1c3238c1b8->3cf7ac83f6764e16bfd1e5ea55c240e2 -->
|
||||
<g id="edge4" class="edge">
|
||||
<title>7302e8c0cbac47f8b0461d1c3238c1b8->3cf7ac83f6764e16bfd1e5ea55c240e2</title>
|
||||
<path fill="none" stroke="#2f6fe0" stroke-width="1.8" d="M128.03,-1148.5C177.1,-1125.01 251.66,-1083.88 302,-1030.9 313.61,-1018.68 324.01,-1004.3 333.1,-989.58"/>
|
||||
<polygon fill="#2f6fe0" stroke="#2f6fe0" stroke-width="1.8" points="335.99,-991.55 338.09,-981.17 329.97,-987.98 335.99,-991.55"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="317.89" y="-1045.3" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">运维 API</text>
|
||||
</g>
|
||||
<!-- d97ed9af3adb480abbe2376e20067521 -->
|
||||
<g id="node6" class="node">
|
||||
<title>d97ed9af3adb480abbe2376e20067521</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/onprem/compute/server.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="177.6" y="-671.65"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="228" y="-559.5" font-family="PingFang SC" font-size="11.00" fill="#2d3436">Jupyter Runtime</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="228" y="-543.75" font-family="PingFang SC" font-size="11.00" fill="#2d3436">模型开发运行时</text>
|
||||
</g>
|
||||
<!-- 62f35beca1644317a41769c903fdcc3d->d97ed9af3adb480abbe2376e20067521 -->
|
||||
<g id="edge5" class="edge">
|
||||
<title>62f35beca1644317a41769c903fdcc3d->d97ed9af3adb480abbe2376e20067521</title>
|
||||
<path fill="none" stroke="#8b6fc4" stroke-dasharray="5,2" d="M228,-813.78C228,-782.71 228,-747.08 228,-715.04"/>
|
||||
<polygon fill="#8b6fc4" stroke="#8b6fc4" points="231.5,-715.38 228,-705.38 224.5,-715.38 231.5,-715.38"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="259.88" y="-770.2" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">运行时控制</text>
|
||||
</g>
|
||||
<!-- 18c413154ae24c099f7a314c5bda70a5 -->
|
||||
<g id="node8" class="node">
|
||||
<title>18c413154ae24c099f7a314c5bda70a5</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/onprem/database/mysql.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="625.6" y="-163.2"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="676" y="-51.05" font-family="PingFang SC" font-size="11.00" fill="#2d3436">7 张模型源表</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="676" y="-35.3" font-family="PingFang SC" font-size="11.00" fill="#2d3436">模型方受控直写</text>
|
||||
</g>
|
||||
<!-- 62f35beca1644317a41769c903fdcc3d->18c413154ae24c099f7a314c5bda70a5 -->
|
||||
<g id="edge6" class="edge">
|
||||
<title>62f35beca1644317a41769c903fdcc3d->18c413154ae24c099f7a314c5bda70a5</title>
|
||||
<path fill="none" stroke="#3f9ad0" stroke-width="2.2" d="M275.95,-813.75C283.7,-805.77 292.38,-798.73 302,-793.55 325.31,-780.99 514.2,-788.5 540,-782.55 569.24,-775.8 584.1,-779.89 602,-755.8 721.98,-594.36 710.21,-344.17 692.37,-208.72"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" stroke-width="2.2" points="695.85,-208.31 691.03,-198.88 688.91,-209.26 695.85,-208.31"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="757.02" y="-495.1" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">受控 SQL 直写</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="757.02" y="-476.35" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">writing → published</text>
|
||||
</g>
|
||||
<!-- 3cf7ac83f6764e16bfd1e5ea55c240e2->18c413154ae24c099f7a314c5bda70a5 -->
|
||||
<g id="edge8" class="edge">
|
||||
<title>3cf7ac83f6764e16bfd1e5ea55c240e2->18c413154ae24c099f7a314c5bda70a5</title>
|
||||
<path fill="none" stroke="#3f9ad0" stroke-width="1.8" stroke-dasharray="5,2" d="M426.11,-893.21C512.07,-886.7 687.3,-860.55 780,-755.8 939.39,-575.7 1017.83,-432.17 893,-226.6 859.54,-171.5 789.44,-142.08 737.93,-127.26"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" stroke-width="1.8" points="739.13,-123.96 728.56,-124.69 737.28,-130.71 739.13,-123.96"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="994.18" y="-487.22" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">只读已发布修订</text>
|
||||
</g>
|
||||
<!-- 7a2b21350c4c414098e07d740ff99dad -->
|
||||
<g id="node9" class="node">
|
||||
<title>7a2b21350c4c414098e07d740ff99dad</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/onprem/database/mysql.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="477.6" y="-163.2"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-51.05" font-family="PingFang SC" font-size="11.00" fill="#2d3436">15 张运维业务表</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-35.3" font-family="PingFang SC" font-size="11.00" fill="#2d3436">判级 / 处理 / 报告 / 流程</text>
|
||||
</g>
|
||||
<!-- 3cf7ac83f6764e16bfd1e5ea55c240e2->7a2b21350c4c414098e07d740ff99dad -->
|
||||
<g id="edge9" class="edge">
|
||||
<title>3cf7ac83f6764e16bfd1e5ea55c240e2->7a2b21350c4c414098e07d740ff99dad</title>
|
||||
<path fill="none" stroke="#3f9ad0" stroke-width="2.2" d="M426.32,-890.57C494.21,-881.46 614.61,-855.46 684,-782.55 793.3,-667.71 766.17,-598.69 790,-441.95 804.38,-347.33 851.93,-299.58 790,-226.6 735.21,-162.03 676.34,-236.16 602,-195.6 597.27,-193.02 592.69,-190.02 588.28,-186.72"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" stroke-width="2.2" points="590.83,-184.29 580.88,-180.66 586.4,-189.71 590.83,-184.29"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="811.22" y="-487.22" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">业务读写</text>
|
||||
</g>
|
||||
<!-- b33cd1fa7d3641028972a6872041f8b5 -->
|
||||
<g id="node10" class="node">
|
||||
<title>b33cd1fa7d3641028972a6872041f8b5</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/database.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="477.6" y="-671.65"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-559.5" font-family="PingFang SC" font-size="11.00" fill="#2d3436">outbox_events</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="528" y="-543.75" font-family="PingFang SC" font-size="11.00" fill="#2d3436">现有异步可靠投递</text>
|
||||
</g>
|
||||
<!-- 3cf7ac83f6764e16bfd1e5ea55c240e2->b33cd1fa7d3641028972a6872041f8b5 -->
|
||||
<g id="edge10" class="edge">
|
||||
<title>3cf7ac83f6764e16bfd1e5ea55c240e2->b33cd1fa7d3641028972a6872041f8b5</title>
|
||||
<path fill="none" stroke="#e0902f" stroke-dasharray="5,2" d="M425.54,-813.92C436.76,-794.96 448.47,-774.78 459,-755.8 466.44,-742.4 474.1,-728.11 481.48,-714.06"/>
|
||||
<polygon fill="#e0902f" stroke="#e0902f" points="484.57,-715.7 486.1,-705.22 478.37,-712.46 484.57,-715.7"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="490.82" y="-770.2" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">同事务写事件</text>
|
||||
</g>
|
||||
<!-- e2ab9cb488234c80803bcdfa37522afa -->
|
||||
<g id="node11" class="node">
|
||||
<title>e2ab9cb488234c80803bcdfa37522afa</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/generic/storage/storage.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="991.6" y="-671.65"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1042" y="-559.5" font-family="PingFang SC" font-size="11.00" fill="#2d3436">对象存储 + storage_objects</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1042" y="-543.75" font-family="PingFang SC" font-size="11.00" fill="#2d3436">报告 / 流程材料 / 评分逻辑</text>
|
||||
</g>
|
||||
<!-- 3cf7ac83f6764e16bfd1e5ea55c240e2->e2ab9cb488234c80803bcdfa37522afa -->
|
||||
<g id="edge13" class="edge">
|
||||
<title>3cf7ac83f6764e16bfd1e5ea55c240e2->e2ab9cb488234c80803bcdfa37522afa</title>
|
||||
<path fill="none" stroke="#3f9ad0" d="M426.27,-891.09C551.14,-879.66 871.47,-844.86 956,-782.55 979.45,-765.26 997.17,-739.62 1010.24,-713.88"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" points="1013.33,-715.54 1014.54,-705.01 1007.03,-712.48 1013.33,-715.54"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="1018.85" y="-770.2" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">材料与报告文件</text>
|
||||
</g>
|
||||
<!-- 60e5076279b545fe957a6ff711d7e045 -->
|
||||
<g id="node7" class="node">
|
||||
<title>60e5076279b545fe957a6ff711d7e045</title>
|
||||
<image xlink:href="/private/tmp/a-card-diagrams-v01/lib/python3.14/site-packages/resources/programming/flowchart/predefined-process.png" width="100.8px" height="100.8px" preserveAspectRatio="xMinYMin meet" x="325.6" y="-409.55"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="376" y="-297.4" font-family="PingFang SC" font-size="11.00" fill="#2d3436">Schedule Executor</text>
|
||||
<text xml:space="preserve" text-anchor="middle" x="376" y="-281.65" font-family="PingFang SC" font-size="11.00" fill="#2d3436">Outbox 轮询与后台任务</text>
|
||||
</g>
|
||||
<!-- 60e5076279b545fe957a6ff711d7e045->18c413154ae24c099f7a314c5bda70a5 -->
|
||||
<g id="edge7" class="edge">
|
||||
<title>60e5076279b545fe957a6ff711d7e045->18c413154ae24c099f7a314c5bda70a5</title>
|
||||
<path fill="none" stroke="#3f9ad0" d="M422.01,-276.59C428.95,-268.34 436.63,-260.68 445,-254.35 455.43,-246.46 460.67,-249.7 473,-245.35 480.24,-242.79 595.67,-199.95 602,-195.6 607.36,-191.92 612.6,-187.78 617.66,-183.36"/>
|
||||
<polygon fill="#3f9ad0" stroke="#3f9ad0" points="619.88,-186.07 624.87,-176.72 615.14,-180.92 619.88,-186.07"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="567.9" y="-233" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">批处理结果直写</text>
|
||||
</g>
|
||||
<!-- 60e5076279b545fe957a6ff711d7e045->7a2b21350c4c414098e07d740ff99dad -->
|
||||
<g id="edge12" class="edge">
|
||||
<title>60e5076279b545fe957a6ff711d7e045->7a2b21350c4c414098e07d740ff99dad</title>
|
||||
<path fill="none" stroke="#e0902f" stroke-dasharray="5,2" d="M335.54,-276.64C332.17,-259.47 332.86,-241.92 341.5,-226.6 368.2,-179.25 423.66,-149.52 467.2,-132.55"/>
|
||||
<polygon fill="#e0902f" stroke="#e0902f" points="468.15,-135.93 476.28,-129.14 465.69,-129.37 468.15,-135.93"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="403.75" y="-233" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">判级 / 报告 / 超时任务</text>
|
||||
</g>
|
||||
<!-- b33cd1fa7d3641028972a6872041f8b5->60e5076279b545fe957a6ff711d7e045 -->
|
||||
<g id="edge11" class="edge">
|
||||
<title>b33cd1fa7d3641028972a6872041f8b5->60e5076279b545fe957a6ff711d7e045</title>
|
||||
<path fill="none" stroke="#e0902f" stroke-width="1.8" stroke-dasharray="5,2" d="M480.32,-538.67C464.34,-511.32 446.41,-480.64 429.98,-452.53"/>
|
||||
<polygon fill="#e0902f" stroke="#e0902f" stroke-width="1.8" points="433.21,-451.11 425.14,-444.24 427.17,-454.64 433.21,-451.11"/>
|
||||
<text xml:space="preserve" text-anchor="middle" x="492.23" y="-487.22" font-family="Sans-Serif" font-size="13.00" fill="#2d3436">轮询 / 重试</text>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
@@ -0,0 +1,52 @@
|
||||
title: "A 卡模型运维模块 · 推荐系统架构 V0.1\n同一工程 / 同一 MySQL / 源表发布后可见"
|
||||
direction: TB
|
||||
formats: [png, svg]
|
||||
theme:
|
||||
font: "PingFang SC"
|
||||
title_size: 25
|
||||
node_size: 11
|
||||
edge_size: 9.5
|
||||
splines: spline
|
||||
nodesep: 0.65
|
||||
ranksep: 0.85
|
||||
dpi: 180
|
||||
pad: 0.55
|
||||
size: "18,12!"
|
||||
clusters:
|
||||
- name: "入口层(现有)"
|
||||
style: { bg: "#F5F7FA", pen: "#AEB7C4", margin: 20 }
|
||||
nodes:
|
||||
- { id: users, label: "业务团队 / 模型团队\n管理员", icon: users }
|
||||
- { id: nginx, label: "Nginx Gateway\n唯一入口", icon: nginx }
|
||||
- { id: react, label: "React SPA\n模型平台 + 运维平台", icon: react }
|
||||
- name: "统一 FastAPI 工程(不新增服务)"
|
||||
style: { bg: "#EEF5FD", pen: "#7FA8D8", margin: 22 }
|
||||
nodes:
|
||||
- { id: model_api, label: "模型平台模块\n模型 / 版本 / 计算任务", icon: fastapi }
|
||||
- { id: ops_api, label: "运维模块\n查询 / 判级 / 复核 / 报告 / 流程", icon: fastapi }
|
||||
- { id: runtime, label: "Jupyter Runtime\n模型开发运行时", icon: server }
|
||||
- { id: scheduler, label: "Schedule Executor\nOutbox 轮询与后台任务", icon: process }
|
||||
- name: "共享数据层(现有 MySQL)"
|
||||
style: { bg: "#F1F8F5", pen: "#78A88D", margin: 22 }
|
||||
nodes:
|
||||
- { id: source_tables, label: "7 张模型源表\n模型方受控直写", icon: mysql }
|
||||
- { id: ops_tables, label: "15 张运维业务表\n判级 / 处理 / 报告 / 流程", icon: mysql }
|
||||
- { id: outbox, label: "outbox_events\n现有异步可靠投递", icon: flowdb }
|
||||
- name: "文件层(现有)"
|
||||
style: { bg: "#FAF6EE", pen: "#C6A96D", margin: 20 }
|
||||
nodes:
|
||||
- { id: storage, label: "对象存储 + storage_objects\n报告 / 流程材料 / 评分逻辑", icon: storage }
|
||||
edges:
|
||||
- { from: users, to: nginx, label: "HTTPS", type: flow, width: 1.8 }
|
||||
- { from: nginx, to: react, label: "静态资源", type: flow }
|
||||
- { from: nginx, to: model_api, label: "模型平台 API", type: flow }
|
||||
- { from: nginx, to: ops_api, label: "运维 API", type: flow, width: 1.8 }
|
||||
- { from: model_api, to: runtime, label: "运行时控制", type: dep }
|
||||
- { from: model_api, to: source_tables, label: "受控 SQL 直写\nwriting → published", type: write, width: 2.2 }
|
||||
- { from: scheduler, to: source_tables, label: "批处理结果直写", type: write }
|
||||
- { from: ops_api, to: source_tables, label: "只读已发布修订", type: write, style: dashed, width: 1.8 }
|
||||
- { from: ops_api, to: ops_tables, label: "业务读写", type: write, width: 2.2 }
|
||||
- { from: ops_api, to: outbox, label: "同事务写事件", type: async }
|
||||
- { from: outbox, to: scheduler, label: "轮询 / 重试", type: async, width: 1.8 }
|
||||
- { from: scheduler, to: ops_tables, label: "判级 / 报告 / 超时任务", type: async }
|
||||
- { from: ops_api, to: storage, label: "材料与报告文件", type: write }
|
||||
Reference in New Issue
Block a user