原力注入

大模型辅助 “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(领域驱动设计)架构,明确业务逻辑层、数据访问层和接口层的职责,减少模块耦合。
设计语义歧义结合知识图谱进行关系消歧
多图表联动引入 %% 链接注释 实现跨图关联