AIGC标识 让大模型"看懂"工程图纸: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 按视图切片)──────┘

三条设计原则

  1. 单一事实源:每类信息只在一处为"真",另一处只引用不复制,避免双份漂移。例如页面级精确坐标以 SVG 为准,参数化几何(局部 mm、可改图)以 MD 为准。
  2. ID 互联而非坐标复制:MD 保留局部 mm 参数坐标(可编辑),SVG 保留页面 pt 原生坐标(精确),换算关系写入 crosswalk。
  3. 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 人日/图"未计入三处增量:跨图字形字典与视觉识读双闸门(最重单项)、多轮盲测答卷维护、独立审计脚本。

方法论启示

这套方案最值得借鉴的,不是某个具体脚本,而是几条贯穿始终的工程纪律:

  1. 诚实记录 > 凑数达标:基线对不上先取证,证不可弥合后"记录并解释",绝不调参加机制凑数。
  2. 防"自己说自己通过":校验由生成器自判有结构性风险,必须另立不复用其判定的独立审计。
  3. 静默降质最危险:竖排归正式写错不报错、只悄悄降质,靠 self_check 双界断言逐视图验。
  4. 测量口径要对称:precision 假性偏低是口径不对称,不是交付物缺陷,先定性再动手。
  5. token 是硬约束:MB 级 SVG 永不整份进上下文,MD 索引 + SVG 按视图切片。

项目地址: https://github.com/znlgis/opengis-skills (对应这篇博客的SKILL在 cad/design-drawing-svg-md 目录,含可直接复跑的泛化脚本 scripts/ 与完整规范文档 reference/

posted @ 2026-09-04 15:09  我才是银古  阅读(63)  评论(0)    收藏  举报