在多模态大模型(MLLM)的浪潮中,我们习惯了 GPT-4V 或 Claude 3 这种“看图说话”的模式。然而,构建一个 SVG-MLLM 远比处理普通自然图像复杂。普通的 MLLM 输出的是自然语言描述,容错率极高;而 SVG-MLLM 输出的是 可执行代码。少一个闭合标签 />,或者坐标偏离了 5%,整个图像可能就会崩坏或完全改变语义。
因此,SVG-MLLM 的架构不能仅仅是简单的 ViT + LLM。我们需要构建一个 “三位一体” 的架构:
本章将带你深入设计这个系统的每一个组件:从处理长序列坐标的特殊 Tokenizer,到融合视觉特征的 Projector,再到保证输出合法的约束解码器。
在设计架构前,我们必须明确模型需要支持的 五大核心任务,这决定了输入输出流的设计:
[Input Modalities] [The "Brain" (LLM)] [Output]
------------------ ------------------- --------
1. Image Input (PNG)
⬇
[Visual Encoder] ──┐
(e.g., SigLIP) │
⬇ │
[MLP Projector] │
⬇ │
[Visual Tokens] ─────┼───> [ Transformer Decoder ] ───> [Probability Distribution]
│ (Llama-3 / Qwen-2 Base) ⬇
2. Text Instruction │ ⬆ [Next Token Prediction]
⬇ │ [LoRA Adapters] ⬇
[Text Tokenizer] ────┤ │ [Constraint Masking]
⬇ │ │ ⬇
[Text Tokens] ───────┘ │ ┌───────────────────┐
│ │ 1. Text Response │
3. SVG Code Input │ │ 2. SVG Code Stream│
⬇ │ │ <path d="..." │
[SVG Special Tokenizer] ─────────────┘ └───────────────────┘
(Coord Discretization)
这是 SVG-MLLM 最关键的“独门绝技”。直接用通用的 BPE(Byte Pair Encoding)处理 SVG 是灾难性的。
对于路径 <path d="M 150.5 200.0 ..."/>:
['<', 'path', 'd', '=', '"', 'M', '150', '.', '5', '200', ...]。100 比 10 大,它只当它们是字符)。我们需要设计一种混合 Tokenizer:
结构词 (Structural Tokens):
保留 XML 标签,如 <svg>, <rect>, fill=, stroke=。这部分沿用 LLM 词表。
<coord_0> 到 <coord_1024> 共 1025 个特殊 Token。M 150.5 200.0 变为 M <coord_150> <coord_200>。序列长度缩减 60% 以上,且模型能学到 <coord_100> 和 <coord_101> 在嵌入空间上的邻近性。M_x_y 作为一个整体事件,或者保留 SVG 的简写逻辑(h, v 相对坐标)。Rule-of-Thumb 11.1: 坐标即位置 embedding。 不要训练模型去“阅读”数字字符串。要让模型“选择”位置索引。通过使用
<coord_i>,你实际上是将回归问题转化为了分类问题,这在 Transformer 中更稳定。
SVG 的特点是无限分辨率。线条在任何缩放级别下都是清晰的,但视觉编码器(Visual Encoder)输入通常是固定的(如 $336 \times 336$ 或 $448 \times 448$)。
为了处理包含大量细节的工程图或地图 SVG,我们需要引入 AnyRes (Any Resolution) 机制:
视觉特征是 Dense 的(浮点向量),文本特征是 Discrete 的(Token ID)。连接它们的桥梁是 Projector。
在架构层面,我们需要让模型知道 SVG 代码中的 <path id="5"> 到底对应 图像中的哪一块像素。
User: <image_embeddings> <coord_bbox_10_10_50_50> 这里面是什么? Model: 这是一个 <rect>。这是 SVG-MLLM 与普通 Chatbot 最大的区别。我们需要保证输出是“合法的 SVG”。
LLM 本质是随机采样。它可能会生成:
<rect x="10" r="5" /> (rect 没有 r 属性,只有 rx/ry)。<path d="M 10 10 L 20" /> (路径数据中途截断,缺少坐标)。fill="redd" (颜色拼写错误)。我们不在训练时施加硬约束,而是在 推理 (Inference) 阶段施加 Logit 掩码。
<。<):期待标签名 svg, path, rect…rect):期待属性名 x, y, width…x=" 之后,只有数字 Token <coord_i> 是允许的,字母 Token 被屏蔽。Rule-of-Thumb 11.2: 让规则不仅在心中,也在手中。 仅仅依靠大量数据训练模型学会语法是昂贵的(且不保证 100% 正确)。加上一个轻量级的 Grammar Decoder(仅增加 <10ms 延迟)可以瞬间将语法正确率提升至 100%,让模型专注于语义和几何生成。
为了处理复杂的 SVG 生成(如“画一个带渐变背景的流程图”),单次 Pass 生成往往不够。我们需要设计 Agentic Workflow。
这是一个多轮对话的架构模式:
resvg 将 $C_0$ 渲染为图像 $I_0$。这实际上是在模拟人类设计师“画一笔,看一眼,改一笔”的过程。
模型可以先生成布局树(Layout Tree),再填充几何细节。
<bbox class="title" x="10" y="10" w="100" h="20" /><text> 和 <path>。
这降低了长序列生成的难度。SVG-MLLM 的架构设计是一场在“灵活性”与“精确性”之间的走钢丝:
下一章,我们将探讨如何利用这个架构进行训练:从预训练数据的构造到指令微调的技巧。
<circle cx="50.5" cy="50.5" r="10"/>。
<cmd> <coord> 格式后的序列。架构对比: 对比 DeepSVG(基于 VAE 和 LSTM/Transformer)与本章提出的 SVG-MLLM(基于 Decoder-only LLM)。列出至少三个维度的差异(输入模态、生成方式、通用性)。
<rect 后,下一个允许的 Token 集合是什么?
x, y, width, height, fill, stroke 以及闭合符 />。resvg,而是想把渲染器做成一个可微的神经网络层(Differentiable Rendering Layer)直接插入到 Decoder 后端。这将如何改变训练的 Loss 函数?
xml:space="preserve" 或冗长的 style 字符串。style="fill:red" $\rightarrow$ fill="red")。架构上,Tokenizer 甚至可以把常用属性名合并为一个 Token。viewBox 的长宽比作为一个特殊的 Prompt Token 输入给模型(例如 <ratio_1.5>)。