用ChatGPT生成植物UML图表

791 阅读8分钟

用ChatGPT生成PlantUML图表

使用ChatGPT生成图表提供了一种精简和有效的方式来直观地表示复杂的系统、流程和关系。通过将自然语言提示转换为详细的图形表示,ChatGPT使用户能够快速创建各种图表,如UML图、流程图等。此外,这种方法应该可以改善团队成员之间的沟通,简化文档,并增强对被建模的基本概念或系统的整体理解。

在这篇文章中,我们将重点介绍PlantUML的图示。PlantUML是一个强大的工具,可以帮助你使用简单的基于文本的语法创建图表和可视化。结合ChatGPT和PlantUML的力量,你可以通过简单的纯文本描述来生成图表。

在这篇文章中,我们将探讨如何使用ChatGPT从各种来源生成PlantUML图,如代码片段、描述,甚至真实世界的Kubernetes集群配置。我们将涵盖以下类型的PlantUML图:类图、序列图、活动图、部署图等等。

先决条件:

  1. 对PlantUML语法的基本了解
  2. 访问ChatGPT(例如,通过OpenAI API)。
  3. PlantUML渲染工具(如plantuml.jar或在线服务)。

理解PlantUML基础知识

在使用ChatGPT生成PlantUML图之前,熟悉一下PlantUML语法是非常有用的。官方文档(https://plantuml.com/)是了解你可以创建的不同类型的图和它们的语法的一个伟大资源。然而,你应该能够跟随这篇文章,而不需要有基本的了解。

基本流程

为PlantUML设置ChatGPT

要为PlantUML使用ChatGPT,你将向ChatGPT发送文本提示,描述你要创建的图表。例如,如果你想创建一个类图,你可以发送一个提示,比如:

生成一个有三个类的PlantUML类图:人,学生,和教师。学生和教师类应该继承于个人类。

处理ChatGPT输出

当你发送提示时,ChatGPT将根据你的描述返回一个PlantUML代码片段。比如说

@startumlclass Person {  +display_info(): void}class Student {  +calculate_grade(): void}class Teacher {  +Students: List<Student>}Person <|-- StudentPerson <|-- TeacherTeacher "1" -- "many" Student: teaches@enduml

渲染图表

现在你可以使用你喜欢的工具渲染生成的PlantUML代码。你可以使用PlantUML命令行工具(plantuml.jar)或在线服务,如www.plantuml.com/plantuml/。要渲染你的图,只需将PlantUML代码粘贴到渲染工具中,它就会生成相应的图。

image.png

对结果进行迭代

使用ChatGPT响应来改进和迭代图表。ChatGPT会记住你之前说过的话,所以迭代过程效果非常好。你不需要在前面提供所有的细节,你可以边做边说。

一些改进或扩展上述模型的例子提示:

  • "为PlantUML图中的Person、Student和Teacher类添加一个名为'display_info()'的方法。"
  • "在学生类和教师类之间添加一个关系,表明一个教师可以有多个学生。"

你也可以通过提供一个新的提示来纠正生成的图中的错误,并说明如何解决这个问题。例如,如果图中缺少一个特定的方法,你可以提供一个提示,如:

  • "在PlantUML图中的学生类中添加一个'calculate_grade()'方法。"

生成不同类型的图

在本节中,我们将探讨如何使用ChatGPT来生成另外两种类型的PlantUML图,特别是序列图和活动图。

顺序图:

顺序图用于可视化对象之间在时间顺序上的相互作用。你可以用ChatGPT生成一个序列图,只要提供一个提示,描述你想表达的互动关系。

示例提示:

生成一个有参与者 "用户"、"服务器 "和 "数据库 "的PlantUML序列图。用户 "向 "服务器 "发送一个请求,"服务器 "查询 "数据库 "并将结果返回给 "用户"。

ChatGPT输出:

@startumlparticipant Userparticipant Serverparticipant DatabaseUser -> Server: RequestServer -> Database: QueryDatabase --> Server: ResultServer --> User: Response@enduml

并呈现为图像:

image.png

活动图:

活动图被用来表示系统内的行动和决策流。它们对于可视化复杂的过程和工作流程非常有用。要用ChatGPT生成一个活动图,请提供一个提示,描述系统中的行动和决策流程。

示例提示:

生成一个代表简单登录过程的PlantUML活动图。这个过程从 "输入凭证 "开始,然后是检查凭证是否有效的决定。如果有效,就进入 "登录成功",否则就进入 "显示错误信息 "并循环到 "输入凭证"。

ChatGPT输出:

@startumlstart:Enter Credentials;if (Credentials are valid) then (yes)  :Login Successful;  stopelse (no)  :Show Error Message;endif-> Enter Credentials;@enduml

视觉上看起来如下:

image.png

从代码中生成图表

使用ChatGPT以代码为输入创建图表,为软件系统或数据模型的结构和逻辑提供了一种强大的可视化方式。通过解释和转换代码片段为图形表示,ChatGPT允许开发人员更容易地与业务专家沟通业务流程。此外,直接从代码中生成图表的能力确保了代码库和可视化表示之间更高水平的一致性,同时也简化了随着代码的发展保持图表更新的过程。

当然,只要你相信ChatGPT能正确理解你的代码。

考虑一下下面的Python代码。这包含了创建用户账户,执行数据库查询,以及在OTP尝试失败过多时更新用户账户状态的功能。

import sqlite3def create_user_table():    conn = sqlite3.connect('example.db')    c = conn.cursor()    c.execute('''CREATE TABLE IF NOT EXISTS users                 (id INTEGER PRIMARY KEY, username TEXT UNIQUE, password TEXT, active INTEGER, failed_attempts INTEGER)''')    conn.commit()    conn.close()def create_user(username, password):    conn = sqlite3.connect('example.db')    c = conn.cursor()    c.execute("INSERT INTO users (username, password, active, failed_attempts) VALUES (?, ?, 1, 0)", (username, password))    conn.commit()    conn.close()def find_user_by_username(username):    conn = sqlite3.connect('example.db')    c = conn.cursor()    c.execute("SELECT * FROM users WHERE username=?", (username,))    user = c.fetchone()    conn.close()    return userdef verify_password(user, password):    return user[2] == passworddef is_active(user):    return user[3] == 1def update_failed_attempts(user):    conn = sqlite3.connect('example.db')    c = conn.cursor()    c.execute("UPDATE users SET failed_attempts=? WHERE id=?", (user[4] + 1, user[0]))    conn.commit()    conn.close()def lock_account(user):    conn = sqlite3.connect('example.db')    c = conn.cursor()    c.execute("UPDATE users SET active=0 WHERE id=?", (user[0],))    conn.commit()    conn.close()def authenticate(username, password):    user = find_user_by_username(username)    if user is None:        return 'User not found'    if not verify_password(user, password):        return 'Invalid password'    if not is_active(user):        return 'User account is inactive'    login_attempts = 0    while login_attempts < 3:        otp = generate_otp()        send_otp(user, otp)        entered_otp = input("Enter the OTP: ")        if entered_otp == otp:            return 'Authenticated'        else:            login_attempts += 1            update_failed_attempts(user)            if login_attempts == 3:                lock_account(user)                return 'Max OTP attempts reached'    return 'Error'

例子提示:

根据以下带有数据库交互的复杂Python代码片断生成一个PlantUML活动图:(包括上面的Python代码片断)

ChatGPT输出:

image.png

诚然,这个图还是相当低级的,不那么容易阅读。但我们可以解决这个问题。记住,使用ChatGPT,迭代是你的朋友。额外的提示:

让PlantUML图的层次更高一些,以显示概念,而不是一行一行地看代码。

和结果:

image.png

这使得非程序员也能读懂应用程序的流程,更有效地弥合了从开发人员到业务专家之间的差距。

Kubernetes集群的图示

在这个例子中,我们将探讨如何使用ChatGPT来生成基于Kubernetes集群配置的PlantUML部署图。要做到这一点,请向ChatGPT提供Kubernetes集群组件的简要描述,并请求生成相应的部署图。

Kubernetes集群描述的例子:

我们有一个Kubernetes集群,由两个节点组成:Node1和Node2。有三个pod在集群上运行:Pod1、Pod2和Pod3。Pod1和Pod2在Node1上运行,而Pod3在Node2上运行。Pod1包含两个容器:容器1A和容器1B。Pod2有一个容器:容器2。Pod3有一个容器:Container3.

示例提示:

根据以下Kubernetes集群描述,生成一个PlantUML部署图:(包括上面的Kubernetes集群描述)

ChatGPT输出:

@startuml!define AWSPUML https://raw.githubusercontent.com/awslabs/aws-icons-for-plantuml/v15.0.0/AdvancedUseCase/AWSCommon.puml!includeurl AWSPUMLactor Node1actor Node2artifact Pod1 {  component [Container1A]  component [Container1B]}artifact Pod2 {  component [Container2]}artifact Pod3 {  component [Container3]}Node1 -- Pod1Node1 -- Pod2Node2 -- Pod3@enduml

不幸的是,上述输出不能被解析,因为提到的URL不可用。一个简单的提示可以解决这个问题:

它说无法打开AWSPUML的网址

这就导致了下面的图片:

image.png

我相信包括Kubernetes的正确图标之类的东西会改善这张图。我要求ChatGPT修改他的答案,但不幸的是他只是提供了另一个无效的URL。

实时Kubernetes集群的图示

手动描述集群会很快变得令人厌烦。为了从一个实际的Kubernetes集群中创建一个包含集群描述的提示,你可以使用kubectl 命令行工具来查询集群的所需信息。一旦你有了这些信息,你就可以创建一个描述集群的字符串,并将其作为ChatGPT的输入。

下面是一个Python脚本样本,它使用subprocess 模块来运行kubectl 命令并收集所需信息。然后该脚本构建一个集群描述字符串,并提示ChatGPT。该脚本仅限于节点、pod和容器,当然需要扩展以包括Kubernetes集群的全部视图,但它提供了基本概念。

import subprocessdef get_nodes():    output = subprocess.check_output(["kubectl", "get", "nodes", "-o", "jsonpath='{.items[*].metadata.name}'"])    return output.decode('utf-8').strip("'").split(' ')def get_pods(namespace):    output = subprocess.check_output(["kubectl", "get", "pods", "-n", namespace, "-o", "jsonpath='{.items[*].metadata.name}'"])    return output.decode('utf-8').strip("'").split(' ')def get_namespaces():    output = subprocess.check_output(["kubectl", "get", "namespaces", "-o", "jsonpath='{.items[*].metadata.name}'"])    return output.decode('utf-8').strip("'").split(' ')def get_containers(pod_name, namespace):    output = subprocess.check_output(["kubectl", "get", "pod", pod_name, "-n", namespace, "-o", "jsonpath='{.spec.containers[*].name}'"])    return output.decode('utf-8').strip("'").split(' ')def get_cluster_description():    nodes = get_nodes()    namespaces = get_namespaces()    description = f"We have a Kubernetes cluster consisting of {len(nodes)} nodes: {', '.join(nodes)}."    pod_descriptions = []    for namespace in namespaces:        pods = get_pods(namespace)        for pod in pods:            if pod:  # Ensure pod name is not empty                containers = get_containers(pod, namespace)                pod_description = f"{pod} in namespace {namespace} contains {len(containers)} containers: {', '.join(containers)}."                pod_descriptions.append(pod_description)    description += f" There are {len(pod_descriptions)} pods running on the cluster: {', '.join(pod_descriptions)}"    return descriptioncluster_description = get_cluster_description()chatgpt_prompt = f"Generate a PlantUML deployment diagram based on the following Kubernetes cluster description: {cluster_description}"print(chatgpt_prompt)

该脚本假设你在系统上配置了kubectl ,并通过了Kubernetes集群的认证。

一旦你有了chatgpt_prompt 字符串,你就可以用它作为ChatGPT的输入,根据实际的Kubernetes集群生成一个PlantUML部署图。示例提示:

根据以下Kubernetes集群描述,生成一个PlantUML部署图:(包括集群描述字符串)

上面的脚本只是为了展示基本思路。我在一个相当大的集群上运行了它,它的输出结果在ChatGPT 4上绝对是可用的(在删除无效的URL后),但ChatGPT 3.5甚至没有尝试。不管怎么说,我可以想象你可能很快就会遇到ChatGPT的最大输入或回答限制,在这一点上,你可能最好直接生成一个PlantUML规范,而不是通过ChatGPT。但你的情况可能有所不同。

总结

本文展示了ChatGPT在基于各种类型的输入,如纯文本描述、代码片段和Kubernetes集群规范,生成广泛的PlantUML图的能力。通过反复完善结果,你可以获得准确和有意义的概念或系统的视觉表现。使用ChatGPT从代码或其他结构化输入创建图表,可以大大简化你的文档流程,节省你的时间,使其成为软件开发人员、工程师和其他经常使用图表的专业人士的宝贵工具