简介:这份文档面向具备一定编程基础的研发人员、项目经理与数据分析师,聚焦如何借助DeepSeek大语言模型将自然语言指令转化为Mermaid代码,再由Mermaid渲染为流程图、序列图、甘特图等可视化图表,从而提升需求分析、系统设计、编码实现与测试验证各环节的制图效率。资源以单个docx文件交付,压缩包约40KB,内容围绕DeepSeek的发展历程、技术架构与多场景应用,Mermaid的基础语法与图表类型展开,并通过一个电商平台开发项目实战演示二者结合的具体流程。目前已有393人学习浏览。读者可从中获得从自然语言到图表的完整实现思路、可复用的Mermaid语法示例与项目级演练案例,便于在技术文档撰写、项目管理与系统设计中快速落地自动化制图。
1. 从手画架构图到一句话出图:DeepSeek+Mermaid 到底解决了什么
周五下午四点,产品经理在群里甩来一句「把刚才评审的订单状态机画成图,下班前发我」。你打开 draw.io,拖了六个矩形、连了八条箭头、对齐调了二十分钟,导出 PNG 发过去,对方回一句「这个分支改一下,再加个超时回滚」。于是你又拖了十分钟。这个场景几乎每个后端、数据、运维都经历过——图不是难画,是改起来要命。
DeepSeek 与 Mermaid 结合实现自动化图表生成,本质是把「画图」这件事从鼠标操作变成文本生成:你用自然语言描述结构,DeepSeek 负责把它翻译成 Mermaid 语法,Mermaid 负责把这段文本渲染成流程图、时序图、ER 图、思维导图。整条链路里没有图形编辑器,只有一段可版本管理的纯文本。改需求时你改的是文字,不是像素。
它适合三类人:一是经常要交付架构图、流程图却不想学绘图工具的后端和运维;二是写技术文档、需要图表跟着代码一起进 Git 的工程师;三是想把「文档配图」这一步塞进 CI 流水线、实现可视化图表自动化生成的团队。不适合追求精细排版、要出版级视觉效果的场景——Mermaid 的定位是「结构清晰」,不是「好看」。
2. DeepSeek 出 Mermaid 代码:提示词、参数与三种调用姿势
2.1 为什么让模型写 Mermaid 而不是直接生成图片
很多人第一反应是「让模型直接画图」。这条路走不通,原因是图像生成模型输出的是像素,不是结构。你没法 diff 两张 PNG 看出哪个节点被删了,也没法让 CI 去校验一张图的语法。Mermaid 的价值在于它是文本中间层:模型只需要产出符合语法的字符串,渲染交给确定性的解析器。这样整条链路可测试、可回滚、可进版本库。
DeepSeek 在这条链路里扮演的是「自然语言 → Mermaid DSL」的翻译器。它的强项是理解中文业务描述里的层级和分支关系,比如「订单创建后如果支付超时就走取消,否则进入待发货」这种带条件的句子,能比较稳地映射成flowchart里的判断节点。选它而不是别的模型,主要看两点:中文语义理解够用,以及 API 价格在批量生成场景下扛得住。
2.2 三种调用姿势:网页版、API、本地部署
网页版最快,适合临时出图。打开对话,把下面的提示词模板贴进去即可。缺点是每次要手动复制,没法进流水线。
API 调用是自动化的主力。下面是 Python 最小可跑示例,用 OpenAI 兼容协议调 DeepSeek:
from openai import OpenAI client = OpenAI( api_key="你的_DEEPSEEK_API_KEY", # 从控制台获取,不要硬编码进仓库 base_url="https://api.deepseek.com" # DeepSeek 的兼容端点 ) SYSTEM_PROMPT = """你是一个 Mermaid 图表生成器。 规则: 1. 只输出 Mermaid 代码,不要任何解释文字,不要 markdown 代码围栏。 2. 节点文字用中文,节点 ID 用英文短横线命名。 3. 默认使用 flowchart TD,除非我明确要求时序图或 ER 图。 4. 遇到条件分支必须用菱形判断节点。""" def gen_mermaid(desc: str) -> str: resp = client.chat.completions.create( model="deepseek-chat", # 对话模型,适合结构化输出 messages=[ {"role": "system", "content": SYSTEM_PROMPT}, {"role": "user", "content": desc}, ], temperature=0.2, # 低温度,减少语法乱造 max_tokens=1500, ) return resp.choices[0].message.content.strip() if __name__ == "__main__": code = gen_mermaid("画一个订单状态机:创建→待支付→已支付→待发货→已发货→已完成,待支付超时30分钟转取消,已支付可退款转已退款") print(code)逻辑说明:base_url指向 DeepSeek 的兼容端点,用官方 SDK 就能调,不用另装包。temperature=0.2是关键参数——Mermaid 是强语法格式,温度高了模型会自创节点写法导致渲染失败。max_tokens给 1500 足够覆盖大多数流程图,复杂 ER 图可以调到 3000。
参数说明:model选deepseek-chat而不是推理模型,因为结构化翻译不需要长链推理,对话模型更快更便宜。如果你要生成带大量注释的复杂图,可以换推理模型,但延迟会明显上升。
本地部署适合数据不能出内网的场景。用 vLLM 起一个 OpenAI 兼容服务,把base_url换成http://localhost:8000/v1即可,代码一行不用改。Jetson Orin 这类边缘设备也能跑量化版本,但吞吐有限,适合低频出图。
2.3 提示词里必须钉死的四条约束
模型默认输出会带一堆「好的,以下是代码」和 markdown 围栏,直接喂给渲染器就报错。上面SYSTEM_PROMPT里的四条约束是血泪经验:只输出代码、中文节点、英文 ID、默认方向。其中「节点 ID 用英文」这条最容易被忽略——Mermaid 允许中文 ID,但一旦节点名里有空格或特殊符号,解析器就会翻车,用英文 ID 加中文标签是最稳的写法。
3. 把 Mermaid 接进工作流:VS Code、Typora 与 CI 渲染
3.1 本地预览:VS Code 插件与 Typora 的版本坑
拿到 Mermaid 代码后第一件事是看它能不能渲染。VS Code 里装 Mermaid 预览插件,新建.mmd文件粘贴代码,Ctrl+Shift+P调出预览即可。这一步能挡掉八成语法错误。
Typora 用户要注意版本问题:Typora 内置的 Mermaid 版本偏旧,新版语法(比如mindmap、部分flowchart特性)会渲染失败。遇到「代码没错但显示不出来」,先怀疑渲染器版本,而不是代码。解决办法是升级 Typora,或者改用支持指定 Mermaid 版本的预览工具。离线场景可以用 Mermaid 离线编辑器,把代码粘进去本地渲染,不依赖网络。
3.2 用命令行批量渲染成 SVG/PNG
文档要交付时通常需要图片。用@mermaid-js/mermaid-cli批量转:
# 安装(需要 Node 环境) npm install -g @mermaid-js/mermaid-cli # 单个文件转 SVG mmdc -i order.mmd -o order.svg -t neutral -b transparent # 批量:把 docs 下所有 .mmd 转成 png,宽度 1600 for f in docs/*.mmd; do mmdc -i "$f" -o "${f%.mmd}.png" -w 1600 -b white done逻辑说明:-i输入、-o输出,扩展名决定格式。-t neutral指定主题,-b transparent出透明背景,方便贴进 PPT。-w控制输出宽度,太窄会导致节点文字换行错乱。
参数说明:批量脚本里${f%.mmd}是 shell 的字符串截断,把后缀去掉再拼.png。如果 CI 里跑,记得先npm install装依赖,并给容器装 Chromium——mermaid-cli 底层用无头浏览器渲染,缺浏览器会直接报错。
3.3 塞进 CI:让文档配图跟着代码一起更新
把.mmd源文件和代码放同一个仓库,CI 里加一步渲染,产物推到文档站点。这样每次改状态机代码,顺手改.mmd,流水线自动出新图,彻底告别「图过期了没人知道」。关键是把.mmd当源码管理,.svg当构建产物,不要反过来。
4. 避坑与排查:Mermaid 生成最常见的五类翻车
4.1 现象:渲染报「Parse error」,但代码看着没问题
原因:九成是节点文字里带了 Mermaid 的保留字符,比如括号、引号、冒号。A[订单(已支付)]里的圆括号会被当成语法。
解决:给含特殊字符的标签加引号,写成A["订单(已支付)"]。养成习惯——只要标签里有非中文非字母的符号,一律加双引号。
4.2 现象:模型输出带 markdown 围栏,程序解析失败
原因:模型没严格遵守「只输出代码」,把结果包在```mermaid里了。
解决:两层防护。提示词里明确禁止;代码里再做一次清洗,用正则剥掉围栏:
import re def clean(code: str) -> str: code = re.sub(r"^```(?:mermaid)?\s*", "", code.strip()) code = re.sub(r"\s*```$", "", code) return code.strip()逻辑说明:第一个正则去掉开头的围栏和可能的mermaid标识,第二个去掉结尾围栏。参数上re.sub默认替换所有匹配,这里配合^$锚点只处理首尾,不会误伤中间内容。
4.3 现象:节点太多,图挤成一团看不清
原因:Mermaid 自动布局在节点超过 20 个时会失控,连线交叉严重。
解决:拆图。一张图只讲一个维度,状态机一张、部署拓扑一张。或者在flowchart里用subgraph分组,把相关节点圈在一起,布局会明显改善。别指望一张图讲完整个系统。
4.4 现象:中文节点显示成方块或乱码
原因:渲染环境缺中文字体,尤其是 Docker 容器里。
解决:容器里装中文字体包(如fonts-noto-cjk),或者渲染时指定字体。本地一般不会遇到,CI 里是高频坑。
4.5 现象:API 调用偶发超时或返回空
原因:DeepSeek API 在高峰期有波动,或者max_tokens设太小被截断。
解决:加重试逻辑,指数退避;max_tokens给足余量。如果返回内容为空,先打印原始响应看是不是被截断,而不是直接怀疑提示词。
5. 进阶:让图表生成真正自动化的三个技巧
第一个技巧是模板化提示词。把常见图类型(状态机、时序图、ER 图)各写一套 system prompt 存成文件,调用时按类型加载。这样输出稳定性比每次现写提示词高一个档次。ER 图尤其明显——不约束的话模型经常把关系基数写反。
第二个技巧是语法自校验。生成后不要直接渲染,先用 mermaid-cli 的解析能力做一次 dry run,失败就把错误信息回喂给模型让它自我修正,最多重试两次。这个「生成-校验-修正」闭环能把成功率从七成拉到九成五以上。
import subprocess, tempfile, os def validate(mermaid_code: str) -> bool: with tempfile.NamedTemporaryFile("w", suffix=".mmd", delete=False, encoding="utf-8") as f: f.write(mermaid_code) path = f.name try: # -o 输出到临时文件,只关心退出码 subprocess.run(["mmdc", "-i", path, "-o", path + ".svg"], check=True, capture_output=True, timeout=30) return True except subprocess.CalledProcessError: return False finally: for p in (path, path + ".svg"): if os.path.exists(p): os.remove(p)逻辑说明:把代码写进临时.mmd,调mmdc渲染,退出码非零即语法错误。timeout=30防止复杂图卡死。finally里清理临时文件,避免堆积。参数上check=True让非零退出码抛异常,正好用来判断成败。
第三个技巧是把图当代码评审。.mmd文件进 PR,reviewer 能直接看出「这个分支被删了」「这个状态没连上」,比看图片 diff 靠谱得多。我现在的习惯是:任何涉及状态流转、服务依赖的改动,PR 里必须带.mmd的 diff,否则打回。坚持半年后,团队里再没人问「最新架构图在哪」——因为图就在代码旁边,永远是最新的。
希望帮到你。
本文还有配套的精品资源,点击获取