大模型辅助 “Diagram as Code” 设计范式初探
相比直接从自然语言生成代码,引入 UML 作为中间产物能带来更大优势——表达清晰、结构直观,更便于理解和验证设计。当然,UML 并非适用于所有场景,因此本文重点探讨其在复杂电商系统等适用场景中的价值。
“Diagram as Code” 设计范式的一种可能流程是:用自然语言描述需求,大模型同步生成设计图、代码、测试用例及部署脚本,从而实现高效、可控的软件开发流程。
注意:本文只是讨论一个方向以及可能的实现手段,还未形成一个体系!
一、核心逻辑:从意图到代码的双向闭环
设计范式本质:通过自然语言和UML图构建机器可理解的中间层,实现"需求→设计→代码"的自动化流转。
关键角色:
• 自然语言:人类意图的载体(如"设计一个用户登录系统")
• UML图:结构化设计表达(如时序图描述登录流程)
• 大模型:语义翻译引擎(连接意图、图表与代码)
二、自然语言 → UML图生成
1. 方法:基于 Prompt 的精准控制
自然语言可以通过 Prompt 进行精准控制,将用户的描述转换为 UML 代码。例如,输入 “用户可以创建多个订单,每个订单包含订单 ID 和总价”,经过处理后,自动生成 Mermaid 类图:
2. 关键技术:Mermaid 语法解析
Mermaid 是一种基于文本的图表绘制工具,支持多种 UML 图:
• 类图 (classDiagram):展示对象及其关系
• 时序图 (sequenceDiagram):描述对象交互过程
• 状态图 (stateDiagram-v2):表示状态转换
• 流程图 (flowchart):可视化流程控制
• 用例图 (useCaseDiagram):展示系统功能及用户角色
示例:时序图
该时序图可以用自然语言 “请根据需求:用户登录服务器并获取 Token,然后用 Token 访问受限资源,生成 mermaid 格式的时序图”向大模型提问生成:
3. 技术实现
自然语言到 UML mermaid 格式转换,依赖以下核心技术(当然目前情况看下来大模型已经具备了以下能力):
(1) 语义解析
• 语义三元组提取:将句子分解为 (主体, 动作, 客体)
• 例:“用户提交订单” →
(User, submit, Order);• 关键词匹配:识别
UML术语,如 “继承”、“包含”、“交互” 等
(2) 关系推理
根据不同语义自动识别 UML 关系,并映射到 Mermaid 语法:
• 继承 (inheritance):
User <|-- AdminUser• 依赖 (dependency):
User ..> PaymentService• 组合 (composition):
Order *-- Item• 关联 (association):
User --> Order
(3) UML 生成
• 结合
Mermaid语法规则,利用NLP技术结构化输出UML图(代码);• 采用
JSON Schema约束返回格式,确保UML代码正确;• 引入**领域知识库(如电商、银行等)**提升准确率(可以使用
RAG方案)。
(4) 模型优化(如果有更加复杂的需求)
• 训练专用大语言模型,以更精准地转换自然语言;
• 提供示例库,让用户调整
Prompt以生成符合预期的UML图。
三、基于 Mermaid 的完整工具链探讨
1. 工具链整合
| 工具类型 | 典型工具 | 功能示例 |
| IDE 插件 | VS Code Mermaid Preview | 实时渲染图表、语法高亮 |
| 协作平台 | GitLab/Markdown 原生支持 | 文档中嵌入动态图表 |
| 自动化流水线 | Jenkins/GitHub Actions 集成 Mermaid-cli | 自动转换 .mmd 文件为图表 |
| 低代码平台 | PlantUML 兼容工具链 | 通过语法驱动可视化设计器 |
2. 复杂 UML 图类型扩展
这里的扩展指使用 mermaid 语法来定义不同的 UML 图。
(1) 组件图(Component Diagram)
componentDiagram
component [认证服务] as auth
component [支付网关] as payment
component [订单服务] as order
auth --> order : 用户验证
order --> payment : 发起支付(2) 部署图(Deployment Diagram)
deploymentDiagram
deployment "AWS" as cloud {
node "Web Server" as web
node "Database" as db
}
web --> db : JDBC 连接四、UML 图生成代码
1. 映射规则表
| UML元素 | 代码映射规则 |
| 类属性 | → 类成员变量 |
| 方法 | → 类方法 |
| 时序图消息 | → 方法调用链 |
| 继承关系 | → extends 关键字 |
| 接口实现 | → implements 关键字 |
| 关联关系 | → 成员变量指向其他类 |
| 依赖关系 | → 方法参数或局部变量 |
| 组合关系 | → 内部类实例化 |
| 聚合关系 | → 通过构造函数或 setter 进行注入 |
2. 代码映射示例
| UML元素 | 代码映射 | Java示例 |
| 继承关系 | extends 关键字 | class Admin extends User |
| 接口实现 | implements 关键字 | class PDF implements Export |
| 关联关系 | 成员变量指向其他类 | class Order { User user; } |
| 依赖关系 | 方法参数或局部变量 | class Payment { void pay(User user) {} } |
| 组合关系 | 内部类实例化 | class Car { Engine engine; } |
| 聚合关系 | 构造函数或 setter 注入 | class Team { Player[] players; } |
3. 代码生成示例
利用 Mermaid 类图直接生成 Java 代码:
class User {
private int userId;
private String username; public Order createOrder() {
return new Order();
}
}
class Order {
private int orderId;
private double totalPrice;
public void calculateTotal() {}
}
3. 多类型 UML 图生成示例
用例图:
useCaseDiagram
actor User as 用户
actor Admin as 管理员 用户 --> (登录系统)
用户 --> (提交订单)
管理员 --> (审核订单)
(提交订单) .> (支付接口) : extend
活动图:
activityDiagram
start
:用户输入凭证;
if (验证通过?) then(yes)
:跳转主页;
else(no)
:显示错误提示;
endif
stop将以上信息作为问题问大模型:“根据以上两个 UML 图生成示例 Java 代码”,输出如下:
// 用户类
class User {
private String username; public User(String username) {
this.username = username;
}
public boolean login(String password) {
// 这里模拟用户登录逻辑
if ("correct_password".equals(password)) {
System.out.println(username + " 登录成功");
return true;
} else {
System.out.println("登录失败:密码错误");
return false;
}
}
public Order submitOrder(String item) {
Order order = new Order(this, item);
System.out.println(username + " 提交订单: " + item);
order.processPayment();
return order;
}
}
// 管理员类
class Admin {
private String name;
public Admin(String name) {
this.name = name;
}
public void reviewOrder(Order order) {
if (order != null) {
System.out.println(name + " 审核订单: " + order.getItem());
order.setReviewed(true);
}
}
}
// 订单类
class Order {
private User user;
private String item;
private boolean isPaid = false;
private boolean isReviewed = false;
public Order(User user, String item) {
this.user = user;
this.item = item;
}
public void processPayment() {
System.out.println("支付接口调用中...");
this.isPaid = true;
System.out.println("订单支付成功: " + item);
}
public void setReviewed(boolean reviewed) {
this.isReviewed = reviewed;
}
public String getItem() {
return item;
}
}
// 测试主类
public class Main {
public static void main(String[] args) {
User user = new User("张三");
Admin admin = new Admin("管理员");
if (user.login("correct_password")) {
Order order = user.submitOrder("商品 A");
admin.reviewOrder(order);
}
}
}
五、关键技术挑战与解决方案
| 挑战 | 解决方案 |
| 复杂业务逻辑表达 | 分层细化设计:采用 MVC(Model-View-Controller)或 DDD(领域驱动设计)架构,明确业务逻辑层、数据访问层和接口层的职责,减少模块耦合。 |
| 设计语义歧义 | 结合知识图谱进行关系消歧 |
| 多图表联动 | 引入 %% 链接注释 实现跨图关联 |