ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DeepSeek+Mermaid:自然语言自动生成架构图与CI集成

DeepSeek+Mermaid:自然语言自动生成架构图与CI集成 简介这份文档面向具备一定编程基础的研发人员、项目经理与数据分析师聚焦如何借助DeepSeek与Mermaid实现可视化图表的自动化生成。内容从DeepSeek大语言模型的发展历程、MoE架构与多场景应用切入系统讲解Mermaid的文本语法及流程图、时序图、甘特图等图表类型并通过电商平台开发项目实战演示从自然语言指令到Mermaid代码再到图表渲染的完整链路可应用于需求分析、系统设计、编码辅助与测试验证等环节。资源包为1个docx文档约40KB便于快速通读与查阅。目前已有393人学习适合希望提升图表绘制与文档表达效率、减少手工绘图成本的读者参考实践。1. 从手画架构图到一句话出图DeepSeekMermaid 到底在解决什么每次迭代评审前夜最耗时的往往不是改代码而是把散落在白板、聊天记录和脑子里那套服务调用关系重新画成一张能贴进文档的架构图。手动拖拽对齐半小时需求一变全部重来。DeepSeek 与 Mermaid 结合做可视化图表自动化生成解决的正是这个反复劳动你用自然语言描述结构模型输出 Mermaid 代码渲染引擎直接出图。它适合需要频繁更新技术文档、写设计说明、维护 README 的开发者也适合想把周报里的数据流固化成图表的团队。核心链路只有三步——描述、生成、渲染但每一步都有参数和边界要抠。下面按落地顺序拆开讲。2. 先搞懂 Mermaid 的语法边界再让 DeepSeek 去写2.1 Mermaid 能画什么、不能画什么Mermaid 是一套基于文本的图表描述语言用缩进和箭头表达结构渲染器把它转成 SVG。常见图类型包括流程图flowchart、时序图sequenceDiagram、类图classDiagram、状态图stateDiagram、甘特图gantt、饼图pie和柱状图xychart-beta。它擅长表达层级、流向和时序关系不擅长自由布局的拓扑图或需要精确坐标的工程图。选型时先判断你的图属于哪一类如果是「A 调用 BB 查 C」这种流向流程图最合适如果是「请求经过网关、鉴权、服务、数据库」这种带时间轴的交互时序图更清晰。Mermaid 代码对缩进和关键字大小写敏感。flowchart TD里的TD表示从上到下换成LR就是从左到右。节点 ID 一旦包含空格或特殊字符必须用引号包起来否则渲染直接报错。这些约束决定了后面给 DeepSeek 的提示词必须把图类型和方向写死不能让它自由发挥。2.2 用 DeepSeek 生成 Mermaid 代码的最小可用提示词直接让模型「画个架构图」通常得到一段无法渲染的伪代码。有效做法是把 Mermaid 的语法约束和你的结构描述一起塞进提示词。下面是我常用的模板通过 DeepSeek 开放平台的 API 调用模型选 deepseek-chat 即可。import requests DEEPSEEK_API_URL https://api.deepseek.com/v1/chat/completions API_KEY 你的API Key def generate_mermaid(description: str) - str: # 提示词把图类型、方向、节点命名规则全部锁死 prompt f你是一个 Mermaid 代码生成器。请根据下面的描述生成一段 Mermaid flowchart 代码。 要求 1. 图类型固定为 flowchart TD。 2. 节点 ID 只用英文字母和数字显示文本用中文放在方括号里。 3. 每条连线必须带箭头例如 A -- B。 4. 只输出 Mermaid 代码不要输出解释、不要用 markdown 代码块包裹。 描述{description} headers { Authorization: fBearer {API_KEY}, Content-Type: application/json } payload { model: deepseek-chat, messages: [{role: user, content: prompt}], temperature: 0.2, # 低温度减少语法漂移 max_tokens: 1024 } resp requests.post(DEEPSEEK_API_URL, jsonpayload, headersheaders, timeout60) resp.raise_for_status() return resp.json()[choices][0][message][content].strip() if __name__ __main__: desc 用户请求先到网关网关转发给鉴权服务鉴权通过后调用订单服务订单服务读写 MySQL。 print(generate_mermaid(desc))这段代码的关键在提示词里的四条约束。temperature设成 0.2 是为了让输出稳定Mermaid 语法容错低温度高了容易冒出--写成-这类错误。max_tokens给 1024 足够画一张中等复杂度的流程图超过这个量级说明描述本身太啰嗦应该先拆图。返回结果直接是 Mermaid 文本拿去渲染即可。2.3 本地渲染与在线渲染的取舍拿到 Mermaid 代码后渲染方式有两种。在线方式把代码贴进支持 Mermaid 的编辑器或文档工具适合快速验证。本地方式用mermaid-js/mermaid-cli把代码转成 PNG 或 SVG适合集成进 CI 流程。安装命令如下npm install -g mermaid-js/mermaid-cli mmdc -i diagram.mmd -o diagram.png -b transparent-i指定输入的.mmd文件-o指定输出文件-b transparent让背景透明方便贴进深色主题的文档。本地渲染的好处是可以在流水线里自动更新图表代码合并后图也跟着变不用人工重新导出。代价是需要 Node 环境首次安装会拉取 Chromium 依赖内网机器要提前配好镜像源。3. 把生成链路接进文档流水线从提示词到自动出图3.1 用脚本串起「描述→代码→图片」三步单次生成只能算玩具真正省时间的是把它接进文档构建流程。思路是维护一份结构描述文件每次构建时调用 DeepSeek 生成 Mermaid 代码再用 mermaid-cli 渲染成图片最后嵌入 Markdown。下面是一个可复现的脚本骨架。import subprocess from pathlib import Path def build_diagram(desc_file: str, out_dir: str assets): desc Path(desc_file).read_text(encodingutf-8) mermaid_code generate_mermaid(desc) # 复用上一节的函数 mmd_path Path(out_dir) / diagram.mmd png_path Path(out_dir) / diagram.png mmd_path.write_text(mermaid_code, encodingutf-8) # 调用 mermaid-cli 渲染失败时抛出异常便于 CI 捕获 subprocess.run( [mmdc, -i, str(mmd_path), -o, str(png_path), -b, transparent], checkTrue ) return png_path if __name__ __main__: build_diagram(architecture.txt)checkTrue让渲染失败时脚本直接报错退出避免 CI 里出现「图没生成但构建通过」的假成功。out_dir建议固定为assets并加入版本控制这样每次生成的图有历史记录出问题能对比。描述文件用纯文本维护改结构只改文字不碰代码。3.2 提示词里必须锁死的四个参数模型输出不稳定多半是提示词没把边界写清楚。除了图类型和方向还有四个参数值得在提示词里固定下来。第一是节点命名规则强制英文 ID 加中文标签避免中文 ID 导致的渲染异常。第二是连线样式统一用--需要虚线时明确写-.-。第三是子图分组如果结构里有「前端」「后端」「存储」这类分层要求用subgraph包起来。第四是输出格式明确「只输出代码」否则模型喜欢加一段「以下是生成的代码」的前缀直接贴进渲染器就报错。把这四条写进系统提示词比每次在用户提示词里重复更省事。DeepSeek 的 API 支持messages数组里放system角色把约束放进去用户消息只写结构描述调用更干净。3.3 批量生成多张图时的并发与限流一个项目往往需要多张图总体架构、核心时序、数据模型。逐张串行调用 API 太慢可以并发但要控制并发数。DeepSeek API 对每分钟请求数有限制具体数值以开放平台文档为准我一般把并发压在 3 到 5 之间并在脚本里加退避重试。import time from concurrent.futures import ThreadPoolExecutor def safe_generate(desc, retries3): for i in range(retries): try: return generate_mermaid(desc) except Exception as e: if i retries - 1: raise time.sleep(2 ** i) # 指数退避避免触发限流 def batch_generate(descs): with ThreadPoolExecutor(max_workers3) as pool: return list(pool.map(safe_generate, descs))max_workers3是保守值机器和账号额度充裕可以调高。指数退避的2 ** i让重试间隔按 1、2、4 秒递增比固定间隔更能扛住短时限流。批量场景下建议把每张图的描述单独存文件生成结果也单独存方便定位是哪张图出了问题。4. 避坑与排查Mermaid 渲染失败的五个高频原因4.1 现象渲染器报「Parse error」但代码看着没问题原因通常是节点文本里出现了 Mermaid 的保留字符比如圆括号、方括号、引号。Mermaid 用[]表示矩形节点文本里再出现[就会让解析器提前闭合。解决方法是把节点文本用双引号包起来写成A[订单服务(主)]或者把特殊字符替换成中文全角。生成阶段可以在提示词里加一条「节点文本避免使用英文括号和方括号」。4.2 现象图能渲染但连线方向全乱原因多半是图方向声明和实际结构不匹配。flowchart TD强制从上到下如果结构本身是横向调用链节点会被挤成一列。改成flowchart LR即可。另一个常见原因是节点定义顺序混乱Mermaid 按首次出现顺序布局把入口节点写在最前面能让图更符合阅读习惯。生成时要求模型「先定义入口节点再按调用顺序定义后续节点」。4.3 现象中文标签显示成方块或乱码本地渲染时出现方块通常是 Chromium 缺少中文字体。在 Linux 服务器上安装fonts-noto-cjk这类字体包即可。在线渲染出现乱码检查文档工具的字体设置。生成阶段不用特殊处理Mermaid 本身支持 UTF-8问题出在渲染环境的字体链。4.4 现象API 返回的代码带 markdown 代码块标记模型习惯把代码包在mermaid里直接拿去渲染会报错。解决方式有两个提示词里明确「不要用代码块包裹」或者在脚本里做一次清洗用正则去掉首尾的代码块标记。我一般两个都做提示词约束加脚本兜底双保险。import re def clean_mermaid(text: str) - str: # 去掉可能存在的 mermaid 和 包裹 text re.sub(r^(?:mermaid)?\s*, , text.strip()) text re.sub(r\s*$, , text) return text.strip()4.5 现象复杂图生成到一半被截断max_tokens设小了或者描述本身太长导致模型输出超限。先看返回的finish_reason如果是length就调大max_tokens。但更根本的做法是拆图一张图超过 20 个节点可读性已经很差应该按模块拆成多张用子图或分页表达。生成前把描述按模块分段每段单独生成一张图比硬塞进一张图更实用。5. 让图表跟着代码走把 Mermaid 生成嵌进 CI 的进阶玩法前面讲的都是手动触发真正省心的是让图表随代码自动更新。做法是在仓库里维护一份docs/diagrams/目录每个.txt文件是一段结构描述CI 流水线里加一个步骤检测到描述文件变更时调用 DeepSeek 重新生成 Mermaid 代码并渲染成图片提交回仓库。这样架构图永远不会和代码脱节。具体落地时把 API Key 放在 CI 的密钥管理里不要硬编码。生成脚本加一个--check模式只生成不提交用于 PR 阶段预览差异。合并到主分支后再跑一次正式生成并提交图片。这样评审时能看到图的变化又不会让每个人的分支都产生图片冲突。验证生成质量有个简单办法把渲染出的图和你的预期结构做一次人工比对重点看三处——入口节点是否唯一、关键分支是否齐全、有没有孤立的悬空节点。悬空节点通常是模型漏了连线在提示词里加一句「确保每个节点至少有一条入边或出边」能减少这类问题。我自己的习惯是每张自动生成的图都在文件头留一行注释写明生成时间和所用的描述文件路径。出问题时能快速回溯是哪次改动导致的。图表自动化不是一劳永逸描述文件本身也需要维护把它当成代码一样对待该评审评审该版本控制版本控制。希望帮到你。本文还有配套的精品资源点击获取
返回列表