1. 从一条 GitHub 热榜说起:archify 到底解决了什么痛点
第一次在 GitHub 趋势榜上刷到 archify 这个项目时,我的反应是"这不就是我团队里那个天天被吐槽的活儿吗"。做过后端或者系统设计的朋友都懂,每次架构评审之前,最耗时间的往往不是写代码,而是画那张架构图。产品经理要一张给客户看的,技术负责人要一张给新人看的,运维还要一张标注部署拓扑的。同一套系统,画三遍,改五遍,最后还没人愿意维护,因为代码一改,图就过期了。
archify 这个项目的定位很直接:它是一个技能模块,挂载在 AI 代理之上,让代理能够根据你的描述或者现有代码,自动生成可交互的架构图。注意这里有两个关键词,一个是"自动生成",一个是"可交互"。前者省掉的是手工拖拽的时间,后者解决的是静态图片无法下钻、无法联动、无法实时更新的问题。传统的架构图工具,比如 draw.io、Excalidraw、PlantUML,本质上还是"你告诉它画什么,它画什么",而 archify 走的是"你告诉它系统长什么样,它自己理解并画出来"的路子。
那它适合谁用?我梳理了一下,大致是三类人。第一类是独立开发者和小团队,没有专职的架构师,画图全靠自己,时间成本极高;第二类是技术负责人和架构师,需要频繁输出架构文档,且文档要跟着代码演进;第三类是技术博主和讲师,做教程、写文章、录视频时需要大量示意图,手工画图效率太低。如果你属于这三类中的任何一类,archify 值得花半小时研究一下。
需要先说明的是,archify 本身不是一个独立的绘图软件,它更像是一个"能力插件"。你得先有一个能跑起来的 AI 代理环境,然后把 archify 作为技能加载进去,代理才具备生成架构图的能力。这个设计思路其实很聪明,因为绘图这件事本身依赖大模型对系统结构的理解能力,把理解交给代理,把渲染交给前端,各司其职。
2. 核心设计思路拆解:为什么是"技能模块"而不是"独立工具"
2.1 技能模块化的底层逻辑
我研究过不少 AI 代理相关的项目,发现一个规律:凡是把功能做成"技能"或者"工具"挂载到代理上的,扩展性都不会差。archify 选择这条路,背后的考量其实很实在。架构图的生成涉及三个环节——语义理解、结构建模、可视化渲染。语义理解必须依赖大模型,这是代理的强项;结构建模需要一个中间格式来承载节点和连线的关系;可视化渲染则需要前端库来画图。
如果 archify 做成一个独立工具,那它就得自己集成大模型调用、自己做提示词工程、自己维护模型版本,维护成本极高。而做成技能模块之后,它只需要定义清楚"输入什么、输出什么",中间的大模型调用完全交给宿主代理。这就好比你不必自己造一台发动机,只需要把发动机装到车上就行。代理升级了模型,archify 自动受益;代理换了供应商,archify 只要接口不变就还能用。
这种解耦带来的另一个好处是可组合性。你可以让代理先用一个技能读代码仓库,再用 archify 生成架构图,最后用另一个技能把图导出成文档。整个流程串起来,就是一个自动化的架构文档生成流水线。单独一个 archify 做不到这些,但作为技能模块,它能被编排进更大的工作流里。
2.2 可交互架构图的技术选型考量
"可交互"这三个字,是 archify 区别于普通 AI 绘图工具的分水岭。我见过太多 AI 生成的架构图,本质上就是一张 PNG,节点位置固定,文字写死,想改一个模块名都得重新生成。archify 走的是另一条路,它生成的图是基于数据驱动的,节点和连线都是结构化数据,前端根据数据渲染出图形。
这意味着什么?意味着你可以点击某个节点展开它的子模块,可以悬停查看某个服务的详细说明,可以拖拽调整布局,甚至可以点击节点跳转到对应的代码文件。这些交互能力,静态图片给不了。实现上,这类可交互图通常基于 SVG 或者 Canvas 渲染,配合一套图数据结构(比如节点列表加边列表),前端用类似 D3.js、Cytoscape.js 或者 React Flow 这样的库来画。
为什么 archify 要强调可交互?因为架构图的使用场景本身就是动态的。评审的时候有人问"这个服务依赖哪些下游",你得能当场展开;新人入职问"这个模块负责什么",你得能点进去看注释。静态图在这些场景下就是死物,而可交互图是活的。从投入产出比来看,前期多花一点功夫做数据结构化,后期省下的是无数次重画的时间。
2.3 与主流方案的横向对比
为了让大家更清楚 archify 的定位,我把它和几种常见方案做了个对比。
| 方案 | 生成方式 | 可交互性 | 维护成本 | 适合场景 |
|---|---|---|---|---|
| 手工绘图(draw.io 等) | 人工拖拽 | 弱(部分支持) | 高,改一次画一次 | 一次性汇报 |
| 代码即图(PlantUML/Mermaid) | 写 DSL 代码 | 无 | 中,需维护代码 | 文档内嵌 |
| AI 生图(通用绘图模型) | 提示词生成 | 无,输出图片 | 低但不可控 | 概念示意 |
| archify 技能模块 | 代理理解后生成 | 强,数据驱动 | 低,随代码更新 | 持续演进的系统 |
从表里能看出来,archify 的差异化在于"低维护成本 + 强交互"。PlantUML 虽然也是代码驱动,但你得自己写 DSL,系统一复杂,DSL 就长得没法看。archify 把写 DSL 这一步也省了,你直接用自然语言描述,或者让它读代码,它来生成结构。这个体验上的差距,用过的人都懂。
3. 核心细节解析:archify 生成一张图要经过哪些环节
3.1 输入层:代理如何理解你的系统
archify 的输入可以有很多种形式,这也是它灵活的地方。最常见的是自然语言描述,比如你跟代理说"我有一个电商系统,包含用户服务、订单服务、支付服务,订单服务依赖用户服务和支付服务,底层用 MySQL 和 Redis"。代理解析这段话,提取出节点和依赖关系,这是最基础的用法。
进阶一点的是读取代码仓库。代理可以扫描你的项目目录,识别出各个模块、服务、依赖关系,然后自动生成架构图。这个能力依赖代理对代码结构的理解,比如它能识别出 Spring Boot 的 Controller、Service、Repository 分层,或者识别出微服务之间的调用关系。我实测下来,对于结构清晰的项目,这种方式生成的图准确率相当高。
还有一种输入是配置文件,比如 docker-compose.yml、Kubernetes 的 deployment 配置。这些文件本身就描述了服务之间的依赖和部署关系,代理读完之后生成的图,基本就是一张部署架构图。这种用法在运维场景下特别实用,因为部署拓扑经常变,手工画图根本跟不上。
提示:输入描述越结构化,生成的图越准确。如果你用自然语言,建议按"模块-职责-依赖"的格式组织,比一大段散文效果好得多。
3.2 中间层:结构化数据的组织方式
代理理解完输入之后,不会直接去画图,而是先生成一份结构化的中间数据。这份数据通常包含节点列表和边列表。节点里会有 id、名称、类型(服务、数据库、缓存、网关等)、描述等字段;边里会有源节点、目标节点、关系类型(调用、依赖、数据流等)。
为什么要有这一层?因为这是"可交互"的基础。前端拿到这份数据,才能知道哪个节点可以点击、点击之后展示什么、节点之间怎么连线。如果代理直接输出一张图片,那交互就无从谈起。这份中间数据一般用 JSON 格式承载,结构大致长这样:
{ "nodes": [ {"id": "user-service", "name": "用户服务", "type": "service", "desc": "负责用户注册登录"}, {"id": "order-service", "name": "订单服务", "type": "service", "desc": "负责订单创建与管理"}, {"id": "mysql", "name": "MySQL", "type": "database", "desc": "主数据存储"} ], "edges": [ {"from": "order-service", "to": "user-service", "type": "call"}, {"from": "order-service", "to": "mysql", "type": "read-write"} ] }这份数据的好处是可校验、可修改。如果代理生成的图有误,你不用重新生成,直接改 JSON 就行。而且这份数据可以存进版本库,跟着代码一起演进,下次生成时对比一下就知道哪里变了。
3.3 渲染层:从数据到可交互图形
渲染层是 archify 的前端部分,负责把中间数据变成看得见、点得动的图。这一步的技术选型很关键,因为要兼顾美观和性能。节点少的时候(几十个以内),用 SVG 渲染完全够用,清晰度还高;节点多了(上百个),可能就得考虑 Canvas 或者 WebGL 了。
布局算法也是个大问题。节点怎么摆才好看、连线怎么走才不交叉,这些都有专门的算法,比如力导向布局、层次布局、正交布局。archify 一般会根据图的类型自动选择布局,比如分层架构用层次布局,微服务调用关系用力导向布局。我个人的经验是,布局算法再智能,也架不住节点太多,所以生成大图的时候,建议先按模块分组,分组内部再展开。
交互方面,常见的操作包括缩放、拖拽、点击展开、悬停提示。这些交互的实现,依赖前端框架的事件处理能力。如果你是自己集成 archify,建议选一个成熟的图可视化库,别自己从零写,坑太多。
4. 实操过程:从零跑通 archify 的完整流程
4.1 环境准备与依赖安装
要跑通 archify,你得先有一个能加载技能的 AI 代理环境。这里我不指定具体是哪个代理平台,因为不同平台的加载方式不一样,但核心步骤是相通的。你需要确认代理支持自定义技能或者工具调用,这是前提。
环境准备好之后,把 archify 的技能定义文件放到代理的技能目录下。技能定义文件一般包含两部分:一是技能的描述,告诉代理这个技能是干什么的、什么时候该用;二是技能的参数定义,告诉代理调用这个技能需要传什么参数。这两部分写清楚了,代理才知道在什么场景下调用 archify。
依赖方面,archify 的渲染部分通常依赖 Node.js 环境,因为前端构建需要。如果你只是用代理生成数据、自己用现成工具渲染,那依赖会少很多。我建议新手先用最简配置跑通,别一上来就搞全套。
# 以常见的技能加载方式为例,具体命令以你所用代理的文档为准 git clone <archify 仓库地址> cd archify npm install npm run build注意:不同代理平台的技能目录结构差异很大,安装前务必先看代理的官方文档,别照着别的平台教程硬套,容易踩坑。
4.2 编写第一个技能调用示例
环境就绪之后,先写一个最简单的调用示例,验证链路是否通。最简单的场景就是让代理根据一段描述生成架构图。你可以这样跟代理说:
"帮我生成一张架构图,包含三个服务:网关服务、用户服务、订单服务。网关服务调用用户服务和订单服务,用户服务和订单服务都依赖 MySQL 数据库。"
代理收到这个请求后,会判断这需要调用 archify 技能,然后把描述传给技能。技能内部会调用大模型解析描述,生成中间数据,再渲染成图。整个过程如果顺利,你就能看到一张可交互的架构图。
第一次跑的时候,建议把中间数据打印出来看看,确认节点和边都提取正确了。如果发现漏了节点或者连错了线,说明提示词需要调整。这一步是调优的关键,别跳过。
4.3 参数配置与效果调优
archify 一般会提供一些参数让你控制生成效果,常见的包括图的类型(分层图、调用图、部署图)、布局方式、节点样式等。这些参数怎么配,直接影响最终效果。
我整理了一份常用参数的配置建议:
| 参数 | 作用 | 推荐值 | 说明 |
|---|---|---|---|
| diagram_type | 图类型 | layered | 分层架构用 layered,调用关系用 graph |
| layout | 布局算法 | dagre | 层次清晰,适合大多数场景 |
| direction | 布局方向 | TB | 从上到下,符合阅读习惯 |
| node_style | 节点样式 | rounded | 圆角矩形,视觉柔和 |
| show_legend | 是否显示图例 | true | 节点类型多时建议开启 |
调优的核心思路是:先保证结构正确,再追求美观。结构错了,图再好看也没用。结构对了之后,再调布局和样式,让图更易读。我见过有人一上来就纠结颜色搭配,结果节点关系都是错的,本末倒置。
4.4 集成到日常工作流
跑通单次生成之后,下一步是把它集成到日常工作流里。我的做法是,在项目的 CI 流程里加一个步骤,每次代码合并到主分支,就自动触发一次架构图生成,把生成的图和数据存到文档目录。这样架构图永远是新的,不用人工维护。
具体实现上,可以写一个脚本,调用代理的 API,传入代码仓库路径,让代理读取代码后生成架构图。脚本跑完之后,把生成的 HTML 或者数据文件推到文档站点。这套流程搭起来之后,架构文档的维护成本几乎降为零。
# 伪代码示例,展示集成思路 #!/bin/bash # 触发代理生成架构图 curl -X POST <代理API地址>/generate \ -d '{"skill": "archify", "input": "./src", "type": "layered"}' \ -o ./docs/architecture.json # 渲染成可交互页面 node ./archify/render.js ./docs/architecture.json ./docs/architecture.html5. 常见问题与排查技巧实录
5.1 生成的图节点缺失或关系错误
这是最常见的问题,根源通常在输入描述不够清晰,或者代理对代码的理解有偏差。排查思路是:先把中间数据打印出来,看看节点和边提取成了什么样。如果节点缺失,检查输入描述里有没有明确提到那个模块;如果关系错误,检查描述里的依赖方向有没有说反。
我踩过的一个坑是,描述里用了"订单服务连接用户服务"这种模糊说法,代理理解成了双向依赖。后来改成"订单服务调用用户服务",方向就对了。所以描述依赖关系时,动词要精确,调用、依赖、读写、订阅,这些词的含义不一样,代理会区别对待。
5.2 图太大导致渲染卡顿
节点超过一百个之后,渲染性能会明显下降,尤其是用 SVG 渲染的时候。解决办法有两个:一是分组折叠,把相关节点归到一个组里,默认折叠,点击才展开;二是分层展示,先展示顶层架构,点击某个模块再下钻到内部细节。
我在一个微服务项目里试过,两百多个服务全画在一张图上,浏览器直接卡死。后来改成按业务域分组,每组默认折叠,只显示组名和组间关系,性能问题立刻解决。这个思路其实和看地图一样,先看省市,再看街道,信息分层呈现才看得清。
5.3 代理不调用 archify 技能
有时候你跟代理说了半天,它就是不用 archify,自己用文字描述了一遍架构。这种情况通常是技能描述写得不够好,代理没意识到该用这个技能。解决办法是优化技能描述,把触发条件写清楚,比如"当用户要求生成架构图、系统图、部署图时,调用此技能"。
另一个原因是代理的上下文里已经有类似的能力,它优先用了内置功能。这时候你可以在提示词里明确指定"使用 archify 技能生成",强制它调用。实测下来,明确指定之后,调用成功率会高很多。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决建议 |
|---|---|---|---|
| 节点缺失 | 输入描述不完整 | 检查中间数据 | 补充模块描述 |
| 关系方向错误 | 动词使用模糊 | 检查边的方向 | 用精确动词 |
| 渲染卡顿 | 节点过多 | 查看节点数量 | 分组折叠或分层 |
| 技能不调用 | 技能描述不清 | 查看代理日志 | 优化描述或强制指定 |
| 布局混乱 | 布局算法不匹配 | 尝试不同布局 | 按图类型选布局 |
| 中文乱码 | 字体未配置 | 检查渲染配置 | 指定中文字体 |
提示:遇到问题先看中间数据,中间数据对了,问题就在渲染层;中间数据错了,问题就在理解层。这个二分法能帮你快速定位。
6. 我个人的使用体会与几个实用建议
用了一段时间 archify 之后,我最大的感受是,它改变的不是画图这个动作,而是架构文档的维护方式。以前架构图是"一次性产物",画完就扔在那,代码改了也没人更新。现在架构图是"代码的衍生品",代码一变,图就能重新生成,永远和代码保持一致。这个转变的价值,比省下画图时间大得多。
几个实用建议分享给准备上手的朋友。第一,从简单场景开始,别一上来就让它读整个大仓库,先拿一个小模块试试,跑通了再扩大范围。第二,中间数据要存起来,别每次重新生成,存下来之后可以对比、可以回滚、可以手工微调。第三,别追求一次完美,AI 生成的东西总有偏差,把它当成初稿生成器,人工再润色,效率最高。第四,注意图的粒度,一张图别塞太多信息,该拆就拆,可交互的优势就在于可以分层展示。
后续这个方向还能怎么扩展?我想到的是和代码变更联动,每次 PR 合并时自动对比架构图的变化,如果新增了服务依赖,就在 PR 里提示出来。这样架构评审就能前置到代码评审阶段,而不是等到系统出问题才回头看架构。这个思路我觉得挺有价值,等有空了打算自己搭一个试试。