
很多人把画用例图当成一件纯体力活打开绘图工具拖矩形、拉箭头、对齐、改字体一张图磨半小时需求一变更又全部推翻重来。我见过太多团队在需求评审会上因为一张过期的用例图争论当初到底谁确认过这个角色。等到AI生成和文本绘图工具成熟之后我才真正意识到用例图这个东西核心价值从来不在画而在拆——把需求准确地拆成角色、用例和关系。拆明白了图只是顺带的事情。这篇文章就把我实际在项目和教学实训里反复用的一套一键生成用例图流程完整拆开讲包括工具怎么选、完整案例怎么落地、AI生成的坑怎么排。想告别手工拖拽的不管是做需求分析的产品、写毕业设计的学生还是被画图折磨的程序员应该都能直接用上。1. 从手工拖拽到文本驱动用例图生成的底层思路1.1 用例图的核心从来不是画而是关系先建立一个关键认知用例图的本质不是一张图而是一组结构化的关系数据。你可以把一张用例图拆成三张表来看参与者Actor谁在使用这个系统比如教师、学生、管理员。用例Use Case系统能提供的完整服务比如查询成绩录入成绩维护课程信息。关系Relationship参与者与用例之间、用例与用例之间的关联比如教师可以录入成绩就是一条关联关系而查询成绩被查看成绩分析包含则是一种包含关系。既然本质是关系数据那就意味着它完全可以被文本描述出来。这也正是一键生成的最底层依据只要你能用一句话说清楚谁、在什么场景下、用系统做什么一张用例图的全部信息就已经存在了剩下的只是可视化而已。我最早意识到这一点是因为在给一个学生信息管理类的实训项目做需求梳理时发现用例图改了八版每次改的都是同一块内容教师的用例从录入成绩改成成绩管理然后又拆出成绩导入导出。每次改动都是手工拖拽擦除浪费了大量时间。后来我尝试把用例关系先写成文字清单确认无误后再用脚本渲染出图整个过程从画图变成了校对文案效率完全不是一个量级。1.2 手工绘制到底卡在哪里讲清楚痛点你才知道为什么要改流程。第一痛对齐和排版消耗超过内容本身。一个矩形拉歪了一条连线穿过了另一个用例都谈不上技术含量却极其浪费时间。第二痛需求变更的连锁成本。用例图是需求分析阶段的高频修改物今天加一个用例明天拆一个角色后天改一个包含关系。手工图每次修改都要重新梳理布局一张图很容易就变成蜘蛛网。第三痛质量规格不一致。每个人画出来的风格都不同有的人把登录画成用例有的人认为登录算系统边界不画评审时大家争论的不是业务本身而是画法。这三痛叠加起来导致很多团队干脆放弃用例图直接从需求文档跳到数据库设计。但这样做的代价是遗漏角色权限边界后面做权限设计时才发现还有一位辅导员需要查看学生成绩返工成本高得多。1.3 一条可自动化的生产链路基于上面的认知我把用例图的生产链路归纳成四步需求文本输入把客户的描述、PRD中相关段落甚至一句口语化的需求说明收集起来。结构化拆解从中提取参与者、用例、关系这一步是核心智力劳动可以由人来完成也可以借助AI大模型辅助完成。生成描述文件将结构化结果写入PlantUML或Mermaid支持的文本格式中。一键渲染出图执行一条命令让工具把文本渲染成图片或矢量图。这条链路最大的特点就是第3步和第4步完全自动化第2步可以借助AI提示词大幅提速。所谓一键生成用例图实际上是一键完成第3步和第4步而第2步只需要你确认拆解结果。这已经比手工拖拽快出好几倍了。2. 工具三件套选型AI拆需求、PlantUML画图、Git管版本2.1 三个主流方案的对比市面上的工具我基本都试过一轮这里直接给结论没有哪个工具是万能的真正好用的是一个组合。先看对比方案上手难度中文支持自动化程度适用场景Visio / draw.io 手工绘制低好低纯手工一次性、简单图、对美观要求极高PlantUML 文本生成中低中需注意字体配置高命令行可批量项目文档、持续变更、团队协作Mermaid 文本生成低好高支持网页内嵌配合Markdown文档、快速原型AI直接生成图片低不稳定文字乱码概率大高但不可控只做展示素材不能当工程文档我的日常选择是AI对话工具负责第2步结构化拆解PlantUML负责第3、4步文本生成和渲染Git负责给这些文本文件做版本管理。之所以优先推荐PlantUML而不是Mermaid是因为PlantUML对用例图的语义支持更完整泛化、包含、扩展关系都有明确的语法标记看起来也更接近教科书上的标准画法。2.2 PlantUML我最常用的文本用例图语法PlantUML不是新东西但它是最适合一键生成的用例图工具之一。它用纯文本描述图的结构渲染时自动处理布局。下面是一段最基础的用例图描述startuml left to right direction skinparam actorStyle awesome actor 学生 as Student actor 教师 as Teacher actor 管理员 as Admin rectangle 学生成绩管理系统 { usecase 查询成绩 as UC1 usecase 录入成绩 as UC2 usecase 维护课程信息 as UC3 usecase 管理用户账号 as UC4 } Student -- UC1 Teacher -- UC2 Admin -- UC3 Admin -- UC4 enduml这段文本保存成score_system.puml然后执行plantuml score_system.puml -tpng一张图就生成了。整条链路没有打开过一次图形界面布局和箭头全部自动完成。改图的时候只需要改文本里的关系那一行重新执行命令新的图就出来了。这一点是手工绘图永远追不上的效率。2.3 关系语法的正确打开方式用例图里最容易出错的是关系标记。PlantUML里我常用的是这三种startuml actor 学生 actor 教师 rectangle 系统 { usecase 查询成绩 as UC1 usecase 导出成绩单 as UC2 usecase 身份验证 as UC3 usecase 查看成绩分析 as UC4 } 学生 -- UC1 教师 -- UC2 UC1 . UC3 : include UC4 . UC1 : include enduml这里约定--表示参与者与用例之间的关联也就是谁可以用这个功能。.. ... : include表示包含关系箭头从基础用例指向被包含的公共用例。比如查看成绩分析必须包含查询成绩。.. ... : extend表示扩展关系箭头从扩展用例指向基础用例。比如导出成绩单是查询成绩的可选扩展。这几个方向我踩过不少坑后面第4章细讲。2.4 为什么不推荐让AI直接画图很多人看到AI生成用例图第一反应是让AI直接输出一张图片。我试过多次效果都不理想。问题集中在AI绘图生成的文字经常乱码或者拼错英文矩形位置随机关系线歪歪扭扭关键是它生成的图片是位图改一个角色名就要重新生成一次没法做版本管理。真正靠谱的AI生成用例图是让AI生成结构化的用例清单和PlantUML代码再交给确定性的渲染工具出图。这样AI负责它擅长的语言理解和结构归纳工具负责精确排版各干各的活才是一键的正确含义。3. 实战全流程学生成绩管理系统从需求文字到用例图这一章用学生成绩管理系统做一个从头到尾的完整案例。这个场景我在软件工程实训里带过很多次属于经典中的经典用来演示拆解流程最合适。3.1 原始需求与目标拆解假设你拿到的需求是这样一段话本系统服务于学校成绩管理。管理员负责维护课程信息、管理用户账号。教师可以查看自己任教课程的选课名单录入和修改学生成绩并可以导出成绩单。学生可以查询成绩查看个人成绩的统计分析。系统要求所有操作必须登录后才能进行。这段话看起来不长但包含的信息量足够画一张规范用例图了。第一步不是去画而是把句子里的动词短语圈出来这些动词短语几乎就是要找的用例维护课程信息管理用户账号录入成绩修改成绩导出成绩单查询成绩查看成绩统计分析角色也藏在句子里管理员、教师、学生。还有一个隐藏角色是未登录用户因为所有操作必须登录后进行暗示了登录是一个独立的用例。3.2 提炼Actor和用例清单在实际操作中我会先把角色和用例放到一个表格里让所有人确认。这一步的产出物叫作用例清单是比图本身更重要的交付物。角色角色定义关联用例管理员负责系统基础数据与账号维护维护课程信息、管理用户账号教师负责任教课程的成绩处理录入成绩、修改成绩、导出成绩单学生查询本人成绩和个人分析查询成绩、查看成绩统计分析未登录用户尚未通过身份认证的访问者用户登录注意我把录入成绩和修改成绩分开列出这是AI第一次拆解时常犯的错误——它会把这两个合并成一个成绩管理。从严格的需求分析角度录入和修改虽然操作相近但涉及的权限校验、界面入口、业务规则都不同分开更清晰。如果你觉得粒度太细也完全可以在评审会上合并但前提是你要有意识地做这个决策而不是让AI替你做。3.3 梳理关系include、extend与泛化清单确认后再梳理关系。这一步我建议用文字描述而不是直接画。先说include关系。需求里写了所有操作必须登录后才能进行这意味着用户登录被几乎所有用例包含。如果把登录关系从每个用例都拉一条线图面会很乱。常规做法是抽象出一个用户登录用例让查询成绩录入成绩等用例用include指向它查询成绩 include 用户登录录入成绩 include 用户登录维护课程信息 include 用户登录再说extend关系。导出成绩单不是每一次查询成绩都必须做的它是查询成绩的可选扩展属于在特定条件教师点击导出按钮下才会执行的扩展用例。所以这一条可以记为导出成绩单 extend 查询成绩最后是泛化关系。教师和学生本质上都是用户这个抽象角色的一种具体化如果图上有多个角色共用相同的登录行为可以画一个抽象角色系统用户让教师和学生泛化自它。但对这样一个小系统我通常不画抽象角色避免过度设计。这是初学者最容易犯的问题把简单系统塞进一堆理论概念里。3.4 生成PlantUML源码上面的分析确定下来之后写成PlantUML文本就非常快了startuml left to right direction skinparam actorStyle awesome actor 管理员 as Admin actor 教师 as Teacher actor 学生 as Student actor 未登录用户 as Guest rectangle 学生成绩管理系统 { usecase 维护课程信息 as UC1 usecase 管理用户账号 as UC2 usecase 录入成绩 as UC3 usecase 修改成绩 as UC4 usecase 导出成绩单 as UC5 usecase 查询成绩 as UC6 usecase 查看成绩统计分析 as UC7 usecase 用户登录 as UC8 } Admin -- UC1 Admin -- UC2 Teacher -- UC3 Teacher -- UC4 Teacher -- UC5 Student -- UC6 Student -- UC7 Guest -- UC8 UC1 .. UC8 : include UC2 .. UC8 : include UC3 .. UC8 : include UC4 .. UC8 : include UC5 .. UC6 : extend UC6 .. UC8 : include UC7 .. UC6 : include UC7 .. UC8 : include enduml把这份文本保存成score_system.puml执行渲染命令一张关系完整、布局自动处理好的用例图就出来了。3.5 渲染成图与自查清单图生成之后不要急着交差。我带实训时会给学生一张自查清单同样适用于实际项目每个角色是否都有关联用例有没有孤立角色每个用例是否都能落到一句需求原文上有没有凭空多出来的include方向是否指向公共用例extend方向是否从可选功能指向基础功能是否需要抽象角色来减少重复连线登录/鉴权这类横切关注点是否单独抽象了对着清单检查一遍比我盯着图看十分钟有效得多。很多时候问题不在图的视觉而在思路。4. AI生成常见的五类翻车现场与修正套路AI在这个流程里最大的价值是快速给出初稿但它生成的内容不能直接照单全收。下面这五类问题是我在实际使用中反复遇到的每条都有对应的修正套路。4.1 角色遗漏隐形使用者第一次让AI拆解学生成绩管理系统时最常见的遗漏就是未登录用户。AI往往只关注需求里明写的人却忽略了登录这个行为本身就隐含了一个角色身份。修正套路很简单在提示词里明确要求AI列出显性角色和隐性角色两类隐性角色就包括未登录用户、第三方系统、定时任务等。这能显著减少遗漏。4.2 用例粒度混乱成绩管理这个用例是AI最爱的命名方式因为它看起来既概括又安全。但实际开发时成绩管理到底包含录入、修改、删除还是包含导入、导出、分析每个人的理解都不同。我建议的做法是设定粒度规则一个用例对应一个可独立描述的完整用户目标动词短语尽量具体比如录入成绩修改成绩删除成绩而不是管理成绩。在给AI的提示词里直接写死这条规则生成结果会规范很多。4.3 include和extend的滥用与误用这是关系层面的头号坑。很多人记不清箭头方向我直接给一个可判断的口诀include每次做A都必须做B说A包含B箭头从A指向B。extend有时做A之后可能会额外做C说C扩展A箭头从C指向A。用业务来验证查询成绩后不是每次都导出成绩单所以导出成绩单扩展查询成绩箭头从导出指向查询。录入成绩必须先登录所以录入成绩包含用户登录箭头从录入指向登录。AI经常会输出方向相反的图。修正时不要直接告诉AI方向错了而是给它上面的口诀让它对照重新生成。4.4 AI编造需求AI在信息不足时会基于自己的预训练知识补全这算不算需求。比如给出的需求里没提成绩导入AI可能自作主张加一个批量导入成绩用例。这在演示时看着丰满落地时却会误导开发范围。应对办法是提示词里追加一句只允许基于给定需求文本提取不能补充任何需求中未提到的功能同时在自查清单里保留逐条对应需求原文这条规则。4.5 中文字体和渲染故障这个坑属于纯粹的技术问题。PlantUML渲染中文时部分环境会显示成方块或乱码。我常用的解决办法是把字体配置写进一个公共配置文件中渲染时统一加载startuml skinparam defaultFontName Microsoft YaHei endumlWindows上我常用Microsoft YaHeimacOS上用PingFang SC或Songti SC。如果你用的是Docker版的PlantUML镜像还需要确认镜像里装没装对应中文字体这是很多人在CI环境里踩到的大坑。4.6 一套可复用的Prompt修正模板把上面的经验沉淀成提示词模板我目前用的版本是这样你是资深软件需求分析师。请基于我提供的需求文本完成以下任务 1. 列出所有参与者并区分显性角色和隐性角色各给一句话定义 2. 为每个参与者列出关联用例用例名称统一采用动词名词格式粒度控制在独立用户目标级别 3. 识别用例间的包含关系和扩展关系仅使用给定需求中明确体现的关系 4. 只允许基于需求文本提取不得补充需求中未提到的功能 5. 输出格式为PlantUML用例图代码 需求文本 ...把这段模板保存成常用提示词配合需求文本一起发给AI生成结果的质量会比裸提问高非常多。5. 进阶玩法批量生成、评审提效和实训场景的正确用法5.1 批量生成多张用例图一个真实项目往往不止一张用例图而是按子系统或业务模块拆分。比如学生成绩管理可以有成绩管理子系统课程管理子系统账号管理子系统。手工逐个画图会让人崩溃但文本驱动方式天然适合批量处理。做法是给每个子系统建一个独立的puml目录统一命名规则然后用一个简单命令批量渲染for f in diagrams/*.puml; do plantuml $f -tpng -o out done这样整个模块用例图全部一键更新。配合定时任务甚至可以在需求文档更新后自动重新渲染干完活就下班。5.2 用Git管理用例图的版本文本化带来的一个隐藏福利是可以用Git做版本管理。手工绘制的图片文件是二进制Git无法直接看内容差异。但puml是纯文本任何一次需求变更都能用git diff看到具体改动了哪一行新增了哪个用例删除了一个角色把include改成了extend这给需求评审带来了极大的可追溯性。我记得有一次客户否认自己确认过某个功能我直接用git log翻出当天评审前五分钟修改的记录谁改的、改了什么一目了然。这是传统画图方式完全做不到的。5.3 需求评审会上即时改图用例图的最大价值场景是需求评审。以前开评审会大家对着投影上的图讨论如果现场提出要增加一个用例只能记下来会后改。现在不一样了我可以当场打开puml文件加一行usecase 查看历史成绩重新执行渲染十秒钟后一张更新过的图就出现在投影上。讨论的即时感和参与感完全不同。这个能力对业务人员也很友好因为他们看到的是图不是代码。你不需要向任何人解释plantuml是什么只需要让他们看到你刚提的需求一分钟内出现在图上。信任感就是这样建立的。5.4 软件工程实训里正确借力AI最近头歌软件工程用例图这类关键词热度很高说明很多学生在做实训作业时也在找快速生成用例图的方法。我的态度是可以借力但不能跳过理解。如果你在做一个课程设计比如学生成绩管理系统正确流程是先用教科书把参与者、用例、include、extend这些概念搞明白再让AI给出初稿然后自己对照需求逐条审查把AI编造的内容删掉把遗漏的角色补上最后再生成图。用AI辅助检查你的作业思路而不是把AI的输出直接交上去这是在实训里真正能学到东西的用法也是被判定涉嫌抄袭与否的分界线。交付时还有一个通用技巧无论生成工具多方便最终文档里建议同时保留原始需求文本、用例清单表格和用例图三样东西。用例清单表格是图和需求之间的桥梁有了它任何人都能复核这张图拆得对不对。这条习惯我坚持了很多年帮我在各种评审和答辩里少挨了很多问。依赖工具但不盲信输出是这套一键生成流程能长期稳定给我提供价值的关键。你可以先从学生成绩管理系统这样的小案例练手把链路跑通再用到真实项目中很快就能感受到从画图到生成图的差别。