让大模型"看懂"工程图纸:SVG + MD 双载体记录方法论
问题:为什么大模型读不懂工程图纸
工程图纸(尤其是 A0 钢结构施工图)常以矢量线画 + 无文字层的 PDF 形式存在。这意味着图上的尺寸数字、标题栏文字、技术要求,在文件层面只是 glyph 轮廓路径——渲染出来人眼能看,但没有任何可提取的文本层。
把这样的 PDF 直接丢给大模型,会陷入一个尴尬境地:
- 只给 SVG:像素级可复刻,但对模型是坐标流——"会画不懂"。无文字层时,尺寸数字只是轮廓路径,模型读不出"930"这个值。
- 只给 Markdown:结构语义可读、可编辑,但"看懂画不准"——细节图元易被省略,无法精确指认"这条线在原图哪里"。
单一载体无法同时满足大模型"准确理解"所需的四个分量:几何精度 × 语义完整 × 可指认 × token 可行。
解法:双载体 + 统一 ID + 校验闭环
核心思路一句话:MD 是"大模型阅读主线",SVG 是"高精度几何档案 + 按需切片源",两者用统一 ID 体系互联,用校验闭环保证一致。
原图 PDF(矢量线画 / 无文字层 / 彩色分层)
│ 提取(fitz.get_drawings + 分层:OCG 语义优先 + 颜色兜底)
▼
MD(魂·阅读主线) ◄── ID 互联 ──► SVG(骨·几何档案)
语义/参数/值/工艺/BOM 原生坐标/图层/视图分组/文本
│ │
└──── 校验闭环(MD 重绘 ⇄ SVG 叠合 ⇄ 原图)────┘
└──── 消费(MD 全文分块 + SVG 按视图切片)──────┘
三条设计原则
- 单一事实源:每类信息只在一处为"真",另一处只引用不复制,避免双份漂移。例如页面级精确坐标以 SVG 为准,参数化几何(局部 mm、可改图)以 MD 为准。
- ID 互联而非坐标复制:MD 保留局部 mm 参数坐标(可编辑),SVG 保留页面 pt 原生坐标(精确),换算关系写入 crosswalk。
- token 可行:MB 级 SVG 不整份进上下文;MD 为索引,SVG 按
data-view切片按需取。
载体分工矩阵(节选)
| 信息项 | 事实源 | 另一载体 |
|---|---|---|
| 页面级精确坐标、线宽、图层归属 | SVG | MD 不复制页面坐标 |
| 参数化几何(局部 mm、可改图) | MD | SVG 不存参数,仅存形状 |
| 尺寸/半径/角度/厚度的值 | MD(dims 表) | SVG <text data-value> 作显示层 |
| 视图划分、归属、比例、投影/剖切关系 | MD | SVG data-view 镜像 |
| 弧/长圆孔的参数(R、len、w、orient) | MD | SVG 以 data-params 旁注 |
| 标题栏、技术要求(逐字) | MD | SVG <metadata> 镜像 |
冲突仲裁:几何坐标以 SVG 为准;值与语义以 MD 为准;不一致时由校验闭环产出修正单,人工确认后回写。
ID 体系与 crosswalk 换算链
SVG 与 MD 共用同一套 ID,两侧不得各自编号:
| ID | 对象 | 出现位置 |
|---|---|---|
V{nn} |
视图 | SVG data-view / MD 章节标题 |
V{nn}-P{mm} |
几何图元 | SVG data-prim-id / MD 图元 JSON |
V{nn}-D{mm} |
尺寸标注 | SVG data-dim-id(线与 text 同号)/ MD dims 表 |
V{nn}-B{mm} |
气球(零件编号) | MD 标注章 |
MD 参数坐标(x, y)= 视图局部 mm,原点 = 视图 bbox 左下角,X 右 Y 上;s = 2.83465 / 比例分母(pt/mm):
X_L = x·s + tx Y_L = −y·s + ty
页面 pt(竖放):x_p = W − Y_L y_p = X_L
一个值得注意的细节:换算链里 x0 = W − ty 而非 W − tx。这个容易写反的坑,靠 self_check 自检断言兜住——它强制局部原点 (0,0) 换算后必须落在该视图 bbox 左下角,从而唯一仲裁出正确公式。
生产与校验流水线(11 步)
这是整套方法论最硬核的部分。语义步骤号 ≠ 执行顺序,实际执行顺序有严格依赖:
01 → 02 → 03 → 03c → 03d → 03b → 05 → 06 → 04 → 07 → 08 → 09
| # | 阶段 | 一句话职责 |
|---|---|---|
| 1 | 矢量提取 + 分层 | fitz.get_drawings() 按 OCG 语义优先 + 颜色兜底 归六层 |
| 2 | 视图聚类归属 | outline+dimension+centerline 空间聚类 → data-view 分组与 bbox |
| 3 | 跨图字形字典 | 模板聚类 + 自监督解码 + 视觉逐行对账 → 跨图合并字典 |
| 4 | 文本恢复 | 按视图 bbox 高清竖正裁切识读 → 恢复 <text> 与 dim-id 绑定 |
| 5 | 配准 | 逐视图定尺度/旋转/平移 → crosswalk 的 tx/ty + self_check |
| 6 | SVG 生成 | 按六层 + 视图分组生成增强版 SVG(骨) |
| 7 | MD 增补 | 补 ID / 语义注解段 / crosswalk → 重建六层 MD |
| 8 | 三方互校 | MD 重绘 ⇄ SVG 叠合、绿层值集合 ⇄ dims、BOM ⇄ 气球 |
| 9 | LLM 验收 | 数据驱动题库 → 盲测子代理作答 → 准确率门禁 |
| 10 | 独立审计 | 不复用生成器判定,从交付物 + 源 PDF 重算方案条款 |
| 11 | 交付六件套 | 目录清单齐套 + 门禁汇总 + 基线对账 |
几个关键技术难点与实测结论
① 分层:OCG 语义优先 + 颜色兜底。 颜色→层硬映射对部分图会失效(实测某图绿色落粗实线 90%、黄色既是 thin 又是标题栏)。因此先按 OCG 名归层,颜色只在 OCG 不可用时兜底;纠偏只在主色占比 >50% 时触发,且须逐图落盘审计表。六层合规的前提是 title-block 独立成层(靠 OCG PDM_Title),否则退化为五层不合规。
② 跨图字形字典。 无文字层 PDF 的尺寸数字全是 glyph 轮廓路径,不先建字典就无法把轮廓还原成字符。签名口径有个重要教训:原文用"32×32 归一栅格化取位图哈希",同探针口径下得 2399 sid、13 个已知字符碎成 109 sid、还有同 sid 多字符冲突。改用量化矢量点集签名后得 1012 sid、零冲突——因为 CAD 矢量无采样噪声,同字符同字号点集 bit-exact,栅格化反而引入量化误差。
③ 视觉识读双闸门。 视觉转录结果只有双过才可入字典:第一道闸门用 PDF 文件名作图号真值,标题栏单行转录与图名的最长公共连续子串 ≥ 阈值(未过则整图不采信);第二道闸门核对转录非空白字符数 == 该行字符位数(容差 0)。这能拦下模型在小字高汉字格上虚构的无工程语义串。
④ 竖排归正式。 竖排归一化坐标必须用 (x,y) → (1−y, x)。旧式 (y, 1−x) 缺平移校正,两式 y 值相差一个随长宽比变化的常量平移,只在 w/h=0.5 时偶然重合——导致同一字符的正立态与躺倒态永不同 sid。写错是静默降质(不报错):实测模板数虚增 1010→1031、竖排已解文本行 129→1。修正后同 sid 兼有两种朝向的模板 4→52,全部图盲测升到 47/47。
⑤ 叠合校验的容差度量。 0.12pt 发丝线被 fitz 渲为浅灰抗锯齿、PIL 画为纯黑 1px,严格像素 IoU 假性偏低(实测仅 0.44–0.46)。改 2px 膨胀 + recall/precision/F1,门禁 recall≥0.99(实测 0.997/0.9998)。precision 不可当门禁——重绘把线宽取整像素硬边描边,而源图抗锯齿渲染,细线在源图达不到阈值、在重绘图却是满宽硬边,这是测量口径的不对称,不是交付物多画图元。
⑥ 独立审计。 前八步的校验都由生成器自己判定,存在"生成器说自己通过"的结构性风险。因此另立不复用生成器判定的审计(spec_audit + final_audit),直接从磁盘交付物与源 PDF 重算方案条款。审计判据必须先 dump 实际结构再写——本轮因按假设写判据踩了 6 次(颜色键名是 c 不是 color、原生旋转值在 page_rotation_src 等)。
门禁矩阵:硬门禁 vs 基线对账
一个重要的方法论区分——硬门禁与基线对账不可混在同一张表:
| 类别 | 含义 | 不达标动作 |
|---|---|---|
| 硬门禁(12 项) | 交付物自洽性与合规性,必须全过 | 回相应阶段修正后重跑,不得放行 |
| 基线对账 | 与参照数值比较,只记录并解释 | 写清机制差异;禁止为对齐数字调参或加机制 |
硬门禁包括:计数链四相等、六层齐全、无 UNASSIGNED、recall≥0.99、rms≤0.1pt、载体一致性、self_check 全过、QA≥20 题、盲测≥95%、MD≤80000 字符等。
基线对账的纪律尤其值得借鉴:"视图数不可预设"——它是聚类输出(实测区间 [8,26]),不得为对齐基线数字调参或加机制。实测有 4 项基线不可复现(视图数、弧/圆 rms、绿层绑定率、recall),逐项定性为"实现路径与参照实现不同",均先取证、确认不可调参弥合后按"记录并解释"登记。
LLM 验收:盲测题库
每图 ≥20 题(实测落到 47 题)、覆盖五类,题库与答案单独成 JSON。验收时仅把交付物(MD + SVG 切片)喂给模型,不喂技能与方案文档:
| 类别 | 考察点 | 示例题 |
|---|---|---|
| 结构类 | 总量/材质(BOM) | 本图共几件?总重?件11 数量/材质? |
| 几何类 | 参数值(dims) | 件11 圆头半径、起吊孔径、斜边角? |
| 关系类 | 视图关系 | A-A 剖切经过哪些件?V16 是哪个位置的放大? |
| 工艺类 | 技术要求 | 吊耳底部焊缝高度与无损等级? |
| 指认类 | ID→语义定位 | V15-D03 标注的是哪个视图的哪个零件的哪个方向? |
验收标准:结构/几何/关系/工艺类准确率 ≥95%,指认类 100%,方视为"大模型已准确理解本图"。
几条实测纪律:答案键必须有判别力、禁裸整数(会被表格行号 |9| 假命中);题面必须排除定义上恒最大的候选(V00 按定义图元最多);盲测多轮幂等合并、来源可追溯;不为凑满分喂答案、也不改判分键。
大模型消费策略(token 可行)
- 默认只读 MD:语义、值、关系全在(某 A0 图全文约 7.7 万字符),按视图章节分块读,单章约 3–10KB。
- 需要精确坐标时按视图切 SVG:以
data-view="Vxx"抽取该组(单视图通常 10–40KB),连同 MD 对应章节一起喂。 - 永不整份喂 MB 级 SVG;glyph 路径段切片时剔除,只留
<text>。 - 重绘/改图任务以 MD 参数为输入;校验/测量任务以 SVG 切片为输入。
交付物六件套
| 文件 | 内容 | 事实源角色 |
|---|---|---|
<图号> R<x>.svg(增强版) |
骨:分层 + 视图分组 + 文本恢复 + 参数旁注 + metadata | 几何/图层/页面坐标 |
<图号> R<x>-可复现图纸描述.md |
魂:六层 schema + ID + 语义注解 + crosswalk 附录 | 值/语义/工艺/BOM |
<图号> R<x>_crosswalk.json |
view↔svg 组↔换算 | 换算 |
<图号> R<x>_QA题库.json |
验收题库及答案 | — |
<图号> R<x>_修正单.md |
三方互校差异仲裁记录 | — |
反向重绘验证.png |
校验产物,必须与源渲染同分辨率 | — |
成本与取舍
按工期分级:最小版 ≈0.5 人日/图;完整版 ≈1.5–2 人日/图(首图含字典冷启动更高,后续图因字典跨图复用而递减)。原估"≈1 人日/图"未计入三处增量:跨图字形字典与视觉识读双闸门(最重单项)、多轮盲测答卷维护、独立审计脚本。
方法论启示
这套方案最值得借鉴的,不是某个具体脚本,而是几条贯穿始终的工程纪律:
- 诚实记录 > 凑数达标:基线对不上先取证,证不可弥合后"记录并解释",绝不调参加机制凑数。
- 防"自己说自己通过":校验由生成器自判有结构性风险,必须另立不复用其判定的独立审计。
- 静默降质最危险:竖排归正式写错不报错、只悄悄降质,靠
self_check双界断言逐视图验。 - 测量口径要对称:precision 假性偏低是口径不对称,不是交付物缺陷,先定性再动手。
- token 是硬约束:MB 级 SVG 永不整份进上下文,MD 索引 + SVG 按视图切片。
项目地址: https://github.com/znlgis/opengis-skills (对应这篇博客的SKILL在 cad/design-drawing-svg-md 目录,含可直接复跑的泛化脚本 scripts/ 与完整规范文档 reference/)

浙公网安备 33010602011771号