1. 当AI画的架构图开始“辣眼睛”,这个四万星项目到底在解决什么
如果你最近一年用过任何主流大模型来生成架构图、流程图或者时序图,大概率经历过这样一种崩溃:你满怀期待地输入一段描述,AI 信心满满地吐出一大段 Mermaid 代码,你把它粘进渲染器,出来的图要么是节点挤成一团、连线像蜘蛛网一样交叉,要么是文字溢出框外、箭头指向莫名其妙的地方。更离谱的是,有时候它生成的语法根本跑不通,渲染器直接给你一个红色报错。这种“能跑但难看、能看但难用”的产物,圈子里现在有个很形象的说法,叫mermaid slop——AI 批量产出的、缺乏设计感的图表垃圾。
这个标题里提到的“4 万星开源项目”,核心价值就一句话:它不教你怎么写 Mermaid 语法,而是教 AI 怎么把图“画好看”。注意这个区别非常关键。市面上讲 Mermaid 语法的教程一抓一大把,但那些教程解决的是“能不能渲染出来”的问题,而这个项目解决的是“渲染出来之后能不能拿得出手”的问题。它短时间内冲上代码托管平台日榜冠军,本质上是因为戳中了一个巨大的痛点:AI 生成内容的“最后一公里”审美问题。
这篇文章适合谁看?三类人。第一类是靠 AI 辅助出图的产品经理、技术写作者、方案工程师,你们需要快速产出能直接放进文档和汇报材料的图;第二类是正在做 AI 应用、想让自己的产品输出更专业图表的开发者;第三类是被 AI 生成的丑图折磨过、想搞清楚背后门道的普通用户。我会从“为什么 AI 画的图会丑”这个根子问题讲起,一路拆到具体的提示词策略、布局参数调优、以及我在实际使用中踩过的坑。全文不涉及任何具体平台的操作教程,只讲通用的方法论和可复现的思路。
先说一个反直觉的结论:AI 画图丑,八成不是模型能力不行,而是你给它的约束太少、太模糊。大多数人给 AI 的指令是“帮我画一个电商系统的架构图”,这句话里没有任何关于布局方向、节点层级、连线风格、文字长度的信息,模型只能靠自己的“默认审美”去猜,而它的默认审美基本等于没有审美。这个开源项目做的事情,本质上是把“图表设计”这件事拆解成了一套可被 AI 理解和执行的规则体系,让模型在生成代码之前,先想清楚“这张图应该长什么样”。
2. 拆解 mermaid slop 的四种典型症状与根因
在讲解决方案之前,得先把问题看清楚。我把 AI 生成图表的翻车现场归纳成四类,每一类背后都有明确的技术根因,理解了根因,你才知道后面那些优化手段为什么有效。
2.1 症状一:节点爆炸与层级塌陷
最常见的情况是,你描述了一个稍微复杂点的系统,AI 一口气给你生成二三十个节点,全部平铺在同一层级上。渲染出来就是一张巨大的、没有任何视觉焦点的网。根因在于:大模型在处理“层级关系”时,倾向于把所有提到的实体都当成平级节点。它不会主动去判断“哪些是父级、哪些是子级、哪些应该折叠进一个分组”。Mermaid 本身是支持subgraph子图语法的,但模型除非被明确要求,否则很少主动使用。这就导致本该有清晰上下层级的架构图,变成了一盘散沙。
2.2 症状二:连线交叉与箭头迷宫
第二个高频问题是连线。当节点数量超过十个,AI 生成的连线就开始互相穿插,形成所谓的“意大利面条图”。根因有两层:一是模型在生成A --> B这类连线时,是按描述顺序线性输出的,它没有全局的“布局规划”概念;二是 Mermaid 的自动布局引擎(通常是 Dagre)虽然会做一些优化,但它的优化目标是“减少交叉”,而不是“符合人类阅读习惯”。当输入本身就没有考虑节点排列顺序时,布局引擎也无力回天。
2.3 症状三:文字溢出与标签灾难
这个症状特别隐蔽,但破坏力极强。AI 生成的节点标签经常是一整句话,比如“用户通过移动端发起下单请求并经过风控校验”,塞进一个默认宽度的矩形框里,要么被截断,要么把框撑得巨大无比,破坏整体比例。根因是模型把“描述性文字”和“标签文字”混为一谈了。在图表设计里,节点标签应该是一个名词短语,长度控制在六到十个字以内,详细说明应该放在图外的正文里,而不是硬塞进图里。
2.4 症状四:样式缺失与视觉扁平
最后一类是“能看但丑”。所有节点一个颜色、一个形状,连线全是默认的黑色细线,整张图没有任何视觉层次。根因在于模型默认只生成“结构代码”,不生成“样式代码”。Mermaid 支持classDef、style、linkStyle这些样式定义,但 AI 几乎不会主动去写,除非你在提示词里明确要求它“为不同类型的节点设置不同的颜色和形状”。
把这四类症状列成一张表,对照着看会更清楚:
| 症状 | 典型表现 | 根本原因 | 优化方向 |
|---|---|---|---|
| 节点爆炸 | 二三十个节点平铺 | 模型不主动使用子图分组 | 强制要求分层与分组 |
| 连线交叉 | 箭头互相穿插成网 | 缺乏全局布局规划 | 指定布局方向与节点顺序 |
| 文字溢出 | 标签过长撑破框 | 描述文字与标签混淆 | 约束标签长度与粒度 |
| 样式扁平 | 全图一个颜色 | 模型不主动生成样式 | 显式要求样式定义 |
理解了这四类问题,接下来的内容就有了明确的靶子。那个四万星项目之所以有效,就是因为它针对每一类问题都给出了对应的“约束策略”。
3. 让AI画出好图的核心方法论:从“描述需求”到“设计约束”
这一节是全文的核心。我要讲的是,怎么把你脑子里“我想要一张好看的图”这个模糊的愿望,翻译成 AI 能精确执行的约束条件。这套方法论不依赖任何特定工具,你在任何支持代码生成的大模型上都能用。
3.1 第一层约束:先定布局方向,再谈内容
这是最容易被忽略、但效果最立竿见影的一步。Mermaid 支持几种布局方向:TB(从上到下)、BT(从下到上)、LR(从左到右)、RL(从右到左)。不同的图适合不同的方向。流程图和架构图通常用TB,时序图和链路图通常用LR。如果你不指定,模型会随机选一个,而随机的结果往往不适合你的内容。
我的做法是在提示词开头就锁定方向,比如:“请用 Mermaid 的graph TB语法,从上到下绘制以下系统架构。”这一句话就能把后续所有节点的排列逻辑框定住。更进一步,如果你知道某个模块应该在上面、某个模块应该在下面,可以直接在描述里体现层级顺序,模型会倾向于按你描述的顺序来排列节点。
3.2 第二层约束:用子图强制分组,控制单层节点数量
解决“节点爆炸”的关键是分组。Mermaid 的subgraph语法可以把一组相关节点框在一起,形成一个视觉上的“容器”。但模型不会主动用,你得明确要求。我的经验是:任何超过八个节点的图,都应该考虑分组;任何超过十五个节点的图,必须分组。
具体怎么要求?不要只说“帮我分组”,要说清楚分组的依据。比如:“请把系统分为接入层、服务层、数据层三个子图,每个子图内的节点不超过五个。”这样模型就有了明确的约束:分几组、每组放什么、每组多少个。实测下来,加上这句话之后,生成图的可用率能从三成提升到八成以上。
3.3 第三层约束:标签粒度与命名规范
标签问题看似小,实则最影响观感。我的建议是给模型一个硬性规则:节点标签必须是名词短语,长度不超过八个汉字,禁止出现动词和完整句子。同时,对于需要补充说明的节点,可以用 Mermaid 的注释语法或者图外的文字来承载,而不是塞进节点里。
举个例子,不要写“用户提交订单后系统进行库存扣减”,而要拆成两个节点:“提交订单”和“库存扣减”,中间用箭头连接。这样不仅标签短了,图的逻辑也更清晰了。这个思路本质上是在做“信息分层”:图负责表达结构,文字负责表达细节,两者不要混在一起。
3.4 第四层约束:样式定义让图有视觉层次
最后一步是样式。Mermaid 允许你通过classDef定义样式类,然后给节点打上对应的类。比如:
graph TB classDef input fill:#e1f5fe,stroke:#0288d1,stroke-width:2px classDef process fill:#fff3e0,stroke:#f57c00,stroke-width:2px classDef storage fill:#e8f5e9,stroke:#388e3c,stroke-width:2px A[用户请求]:::input --> B[业务处理]:::process B --> C[数据存储]:::storage注意上面这段只是示意语法结构,实际使用时你要根据自己的配色方案调整。关键点是:不同类型的节点用不同的填充色和边框色,让读者一眼就能区分输入、处理、存储。这个约束同样需要你在提示词里明确提出来,比如:“请为输入类节点、处理类节点、存储类节点分别定义不同的样式类,使用柔和的填充色和清晰的边框。”
把这四层约束串起来,一个完整的提示词模板大概长这样:
请用 Mermaid 的 graph TB 语法绘制以下系统架构图。要求:第一,按接入层、服务层、数据层分为三个子图,每个子图内节点不超过五个;第二,节点标签使用名词短语,不超过八个汉字;第三,为输入、处理、存储三类节点分别定义样式类,使用不同的填充色和边框色;第四,连线使用带箭头的实线,避免交叉。
这个模板不是死的,你可以根据具体场景调整,但核心逻辑是:把“好看”这个模糊目标,拆解成布局、分组、标签、样式四个可执行的维度。
4. 实测对比:同一段需求,约束前后差距有多大
光讲方法论不够直观,我拿一个真实的例子来对比。需求是“画一个用户下单的流程”,我分别用“裸提示词”和“约束提示词”让同一个模型生成,然后把两张图放在一起看差距。
4.1 裸提示词生成的结果与问题
裸提示词就是一句话:“帮我画一个用户下单的流程图。”模型生成的结果大概是这样的:节点包括“用户浏览商品”“加入购物车”“提交订单”“系统校验库存”“库存充足”“库存不足”“生成订单”“支付”“支付成功”“支付失败”“发货”“完成”,一共十二个节点,全部平铺,没有任何分组。连线方面,“库存充足”和“库存不足”两个分支的线交叉在一起,视觉上非常混乱。标签长度参差不齐,有的四个字,有的八个字。样式全部是默认的浅紫色填充,没有任何区分。
这张图的问题很典型:信息是全的,但读起来费劲。你要花好几秒才能找到“支付”这个关键节点在哪里,分支逻辑也要顺着线去追。如果这张图放进正式文档,读者第一反应是“这什么玩意儿”。
4.2 约束提示词生成的结果与改进
同样的需求,换成约束提示词:“请用 graph TB 绘制用户下单流程图。要求:分为‘购物车阶段’‘订单阶段’‘支付阶段’三个子图,每个子图内节点不超过四个;节点标签用名词短语,不超过六个字;为正常流程节点和异常分支节点设置不同样式;主流程用粗线,异常分支用虚线。”
生成的结果明显不一样:三个子图把流程切成了清晰的三个阶段,每个阶段内的节点数量可控,读者可以一个阶段一个阶段地看。正常流程的节点是蓝色实线框,异常分支(库存不足、支付失败)是橙色虚线框,一眼就能区分主次。连线方面,因为分组之后节点排列更有规律,交叉明显减少。
4.3 差距量化与可复现的对比方法
我把两次生成的结果按四个维度打分(满分五分),做了一个对比:
| 维度 | 裸提示词 | 约束提示词 | 提升幅度 |
|---|---|---|---|
| 布局清晰度 | 2 | 4 | +100% |
| 标签可读性 | 2 | 5 | +150% |
| 视觉层次 | 1 | 4 | +300% |
| 连线整洁度 | 2 | 4 | +100% |
这个打分是主观的,但差距的方向是明确的。你可以自己复现这个对比:找一段你熟悉的业务流程描述,分别用两种提示词生成,然后让同事盲评哪张更好看。我做过好几次,结果几乎一边倒。
这里有个实操心得:约束提示词不是越长越好,而是要“精准打击”。你不需要把上面四层约束全部堆上去,而是根据你当前最头疼的问题来选。如果你最烦的是节点太多太乱,那就重点加分组约束;如果你最烦的是图太丑,那就重点加样式约束。一次解决一个核心问题,比一次性堆十个要求效果更好,因为模型对过多约束的处理能力也是有限的。
5. 进阶玩法:把图表设计规则沉淀成可复用的提示词模板
如果你经常需要出图,每次都手写约束提示词太累了。更高效的做法是把规则沉淀成模板,需要的时候直接套。这一节我分享几个我在用的模板,以及怎么根据场景微调。
5.1 架构图模板:分层分组加样式
架构图的核心是“层次感”。我的模板是这样的:
用 graph TB 绘制系统架构图。分为 [层1名称]、[层2名称]、[层3名称] 三个子图。每层节点不超过 [N] 个。节点标签为名词短语,不超过八字。为每层节点设置不同的填充色:[层1颜色]、[层2颜色]、[层3颜色]。层间连线用粗实线,层内连线用细实线。
用的时候把方括号里的内容替换成你的实际信息就行。这个模板的好处是,它把“分层”这个架构图最核心的视觉特征固化下来了。你不需要每次都想“该怎么分组”,模板已经帮你决定了。
5.2 流程图模板:主次分支加方向
流程图的核心是“主流程清晰、分支不干扰”。模板:
用 graph TB 绘制流程图。主流程节点用蓝色实线框,异常分支节点用橙色虚线框。主流程连线用粗实线,分支连线用虚线。节点标签不超过六字。如果节点超过十个,请用 subgraph 按阶段分组。
这个模板里,“主流程”和“异常分支”的区分是关键。很多流程图之所以乱,就是因为正常路径和异常路径混在一起,读者分不清哪条是主线。用颜色和线型区分之后,主线一目了然。
5.3 时序图模板:参与者精简加消息对齐
时序图和流程图不一样,它的核心是“参与者”和“消息顺序”。模板:
用 sequenceDiagram 绘制时序图。参与者不超过 [N] 个,名称用简短的角色名。消息文字不超过十字。用 alt/else 语法处理条件分支。为不同参与者的消息设置不同的颜色。
时序图最容易出的问题是参与者太多,横向拉得特别宽。我的经验是参与者控制在五个以内,超过五个就要考虑是不是该拆成两张图。另外,消息文字一定要短,因为时序图的横向空间很宝贵。
5.4 模板的维护与迭代思路
模板不是一成不变的。我建议你建一个自己的“提示词库”,每次遇到生成效果特别好的提示词,就把它存下来,标注适用场景。用了一段时间之后,你会发现某些约束是通用的(比如标签长度限制),某些是特定场景才需要的(比如时序图的参与者数量限制)。把通用的部分抽出来做成基础模板,特定的部分做成可选项,这样维护起来最省力。
还有一个技巧:把模板和实际生成结果一起存档。过一段时间回头看,你能清楚地知道哪个模板在什么场景下效果最好,哪个模板需要调整。这比凭记忆靠谱得多。
6. 踩坑记录:那些让我白忙活的错误用法
讲完了方法论和模板,得说说我踩过的坑。这些坑在官方文档里不会写,但每一个都让我浪费过不少时间。
6.1 坑一:约束堆太多,模型直接摆烂
我一开始贪心,把布局、分组、标签、样式、连线五层约束全塞进一个提示词里,结果模型生成的图反而更差了。后来才明白,模型对约束的处理是有优先级的,约束太多它会顾此失彼。比如你同时要求“节点不超过五个”和“每个节点都要有详细说明”,这两个要求本身就矛盾,模型只能随机牺牲一个。
解决办法是分批施加约束。先只加布局和分组,生成一版看看;如果标签有问题,再加标签约束重新生成;最后加样式。虽然多跑几次,但每次的结果都可控。
6.2 坑二:迷信“一键生成”,忽略手动微调
有段时间我特别追求“一句话生成完美图”,结果发现这是不现实的。AI 生成的图,能达到“八成可用”就已经很好了,剩下两成必须手动调。比如某个节点的位置不理想,你手动改一下代码里的节点顺序就能解决;某条连线交叉了,调整一下两个节点的声明顺序就能绕开。
把 AI 当成“初稿生成器”,而不是“终稿生成器”,这个心态转变之后,我的出图效率反而更高了。因为我不再纠结于“为什么它不能一次做对”,而是快速拿到初稿,然后花两分钟微调。
6.3 坑三:不同渲染器对语法的支持差异
这个坑特别隐蔽。Mermaid 的语法在不同渲染器里的支持程度是不一样的。你在 A 平台能正常渲染的代码,放到 B 平台可能就报错。比如某些样式属性、某些子图嵌套写法,不同版本的渲染引擎处理方式不同。
我的应对策略是:尽量使用 Mermaid 的核心语法子集,避免用太新或太冷门的特性。核心语法包括graph、subgraph、classDef、style、linkStyle这些,兼容性最好。如果你发现某段代码在某个平台渲染有问题,先试试简化语法,往往能解决。
6.4 坑四:忽略图的“阅读场景”
最后一个坑是心态上的。我早期只关注图“好不好看”,忽略了图“给谁看、在哪看”。一张放在手机上看的小图,和一张放在大屏汇报里的图,设计策略是完全不同的。手机上看,节点要少、字要大、颜色对比要强;大屏上看,可以承载更多信息,但要注意整体比例。
所以现在我在生成图之前,会先问自己:这张图的阅读场景是什么?如果是嵌在文档里给同事看,简洁清晰就行;如果是放在汇报材料里,就得考虑配色和视觉冲击力。这个判断会直接影响我给 AI 的约束条件。
7. 从工具到习惯:我日常出图的工作流
最后分享一下我现在的工作流,算是把前面所有内容串起来的一个实操总结。
我的流程分四步。第一步是“想清楚”:在打开任何工具之前,先在一张纸上或者脑子里把图的层级结构画出来,明确分几层、每层几个节点、主流程是什么。这一步花两分钟,能省后面二十分钟的返工。第二步是“套模板”:根据图的类型(架构图、流程图、时序图)选对应的提示词模板,把具体信息填进去。第三步是“生成加微调”:拿到 AI 生成的初稿,快速扫一眼,重点看布局和标签,有问题就手动改代码,通常两三分钟能搞定。第四步是“存档”:把最终可用的代码和对应的提示词一起存进我的提示词库,下次遇到类似场景直接复用。
这套流程跑顺之后,我出一张可用架构图的时间从原来的半小时压缩到了五分钟以内。关键不在于 AI 有多强,而在于你把多少设计决策提前做了。AI 擅长的是执行,不擅长的是决策。你把决策做完了,它执行起来就快;你让它在模糊的需求里自己猜,它就给你一堆 mermaid slop。
那个四万星项目给我的最大启发,其实不是某个具体功能,而是一个思路:AI 生成内容的质量,取决于你给它多少结构化的约束。这个思路不仅适用于画图,写文档、写代码、做方案,底层逻辑都是一样的。你给 AI 的自由度越大,它越容易跑偏;你把边界划清楚,它反而能在边界内做出不错的东西。这个认知,比任何具体的提示词技巧都值钱。