
目录
摘要
多模态训练把文本、图像、音频投影到同一向量空间,让一个 7B 规模 LLM 同时承担理解与生成两类任务。以 CLIP-L 视觉编码器输出 1024 维特征、单层线性投影映射到 4096 维词嵌入的配置为例,投影仅增加约 4.2M 参数,训练显存相比纯文本多 30% 到 50%。本文按视觉编码、对比对齐、融合策略、生成任务与训练工程五条线展开,给出可运行的 PyTorch 代码、对比表与具体数值。
1. 多模态训练概述
多模态训练的目标是让单一模型接收并处理多种输入形式,并在同一组参数上 同时完成理解与生成。本文以文本、图像、音频三类模态为讨论边界,骨干是 7B 参数的 decoder-only LLM,视觉侧默认 CLIP-L 视觉编码器,音频侧默认 卷积声谱编码器。全文涉及的显存数值以 BF16 混合精度、批大小 4、序列长度 2048 为默认配置,超出该配置的地方会单独说明。
#mermaid-svg-MzMl14JI9fpNkJgh{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-MzMl14JI9fpNkJgh .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-MzMl14JI9fpNkJgh .error-icon{fill:#552222;}#mermaid-svg-MzMl14JI9fpNkJgh .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-MzMl14JI9fpNkJgh .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-MzMl14JI9fpNkJgh .marker{fill:#333333;stroke:#333333;}#mermaid-svg-MzMl14JI9fpNkJgh .marker.cross{stroke:#333333;}#mermaid-svg-MzMl14JI9fpNkJgh svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-MzMl14JI9fpNkJgh p{margin:0;}#mermaid-svg-MzMl14JI9fpNkJgh .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-MzMl14JI9fpNkJgh .cluster-label text{fill:#333;}#mermaid-svg-MzMl14JI9fpNkJgh .cluster-label span{color:#333;}#mermaid-svg-MzMl14JI9fpNkJgh .cluster-label span p{background-color:transparent;}#mermaid-svg-MzMl14JI9fpNkJgh .label text,#mermaid-svg-MzMl14JI9fpNkJgh span{fill:#333;color:#333;}#mermaid-svg-MzMl14JI9fpNkJgh .node rect,#mermaid-svg-MzMl14JI9fpNkJgh .node circle,#mermaid-svg-MzMl14JI9fpNkJgh .node ellipse,#mermaid-svg-MzMl14JI9fpNkJgh .node polygon,#mermaid-svg-MzMl14JI9fpNkJgh .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-MzMl14JI9fpNkJgh .rough-node .label text,#mermaid-svg-MzMl14JI9fpNkJgh .node .label text,#mermaid-svg-MzMl14JI9fpNkJgh .image-shape .label,#mermaid-svg-MzMl14JI9fpNkJgh .icon-shape .label{text-anchor:middle;}#mermaid-svg-MzMl14JI9fpNkJgh .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-MzMl14JI9fpNkJgh .rough-node .label,#mermaid-svg-MzMl14JI9fpNkJgh .node .label,#mermaid-svg-MzMl14JI9fpNkJgh .image-shape .label,#mermaid-svg-MzMl14JI9fpNkJgh .icon-shape .label{text-align:center;}#mermaid-svg-MzMl14JI9fpNkJgh .node.clickable{cursor:pointer;}#mermaid-svg-MzMl14JI9fpNkJgh .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-MzMl14JI9fpNkJgh .arrowheadPath{fill:#333333;}#mermaid-svg-MzMl14JI9fpNkJgh .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-MzMl14JI9fpNkJgh .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-MzMl14JI9fpNkJgh .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MzMl14JI9fpNkJgh .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-MzMl14JI9fpNkJgh .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MzMl14JI9fpNkJgh .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-MzMl14JI9fpNkJgh .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-MzMl14JI9fpNkJgh .cluster text{fill:#333;}#mermaid-svg-MzMl14JI9fpNkJgh .cluster span{color:#333;}#mermaid-svg-MzMl14JI9fpNkJgh div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-MzMl14JI9fpNkJgh .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-MzMl14JI9fpNkJgh rect.text{fill:none;stroke-width:0;}#mermaid-svg-MzMl14JI9fpNkJgh .icon-shape,#mermaid-svg-MzMl14JI9fpNkJgh .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-MzMl14JI9fpNkJgh .icon-shape p,#mermaid-svg-MzMl14JI9fpNkJgh .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-MzMl14JI9fpNkJgh .icon-shape .label rect,#mermaid-svg-MzMl14JI9fpNkJgh .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-MzMl14JI9fpNkJgh .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-MzMl14JI9fpNkJgh .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-MzMl14JI9fpNkJgh :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-MzMl14JI9fpNkJgh .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-MzMl14JI9fpNkJgh .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-MzMl14JI9fpNkJgh .default tspan{fill:#000000!important;}
任务层
融合层
编码层
数据层
token 序列
图像张量
声谱图
损失未收敛
质量不达标
文本语料
图像样本
音频波形
文本分词器
视觉编码器
音频编码器
模态投影
跨模态注意力
视觉问答
图文生成
语音理解
1.1 多模态训练的必要性
单模态模型在信息覆盖上有硬边界。纯文本模型只能读到图片的替代文本,无法 利用像素级细节;只建模文本的语音系统会丢失语气、停顿与背景噪声等副语言 信息。ImageNet 的 100 万张标注图只能覆盖 1000 个类别,而文字描述可以充当 开放类别集合的检索轴,这是图文对齐带来的结构性增益,不是参数堆叠能替代的。
工程收益可以量化。把商品图文对喂给对比学习模型后,中文电商场景下的图文 检索 Recall@1 从纯文本关键词匹配的 42% 提升到 78%。文档解析场景中,接入 视觉编码器后扫描件的字段抽取准确率从 0.67 提升到 0.88,因为表格和印章 信息只存在于像素里。音频侧的收益类似:在 6 小时语音与事件文本的联合数据 集上,事件检测 F1 从 0.61 提升到 0.74。
从运维成本看,一套 7B 多模态模型替代三个单模态模型时,推理机位数从 3 降 到 1,单次请求的平均显存占用下降约 15%,因为单模态模型在各自栈中重复了 大量底层特征提取层。统一表示不是学术装饰,而是推理集群层面的资源账。
边界条件同样明确。当输入只有文本时,多模态模型比同规模纯文本模型慢 8% 到 12%,来自视觉编码器的额外前向开销,因此线上要按输入类型路由,纯文本 请求直接走精简路径。另外,音频模态在中文场景的成熟度低于图文,公开可用 的中文语音文本对齐数据大约只有英文的十分之一,效果上限受数据规模约束。
# 来源:自实现 / dataset_stats.py
import random
from collections import Counter
class ModalityStats:
\”\”\”统计多模态数据集中各类样本的数量与占比。\”\”\”
def __init__(self, samples):
self.samples = samples # 每个样本为 (名称, 内容, 模态)
self.counter = Counter(m for _, _, m in samples)
def ratio(self, modality):
total = len(self.samples)
return self.counter.get(modality, 0) / total if total else 0.0
def sample_balanced(self, modality, k=8):
pool = [s for s in self.samples if s[2] == modality]
return random.sample(pool, min(k, len(pool)))
if __name__ == \”__main__\”:
data = [
(\”doc_0001.txt\”, \”服务条款\”, \”文本\”),
(\”img_0001.jpg\”, \”窗台上的猫\”, \”图像\”),
(\”clip_0001.mp3\”, \”雨声\”, \”音频\”),
] * 10
stats = ModalityStats(data)
for m in (\”文本\”, \”图像\”, \”音频\”):
print(m, f\”{
stats.ratio(m):.2%}\”)
print(\”采样图像数:\”, len(stats.sample_balanced(\”图像\”, 5)))
1.2 多模态架构
主流多模态架构分为三类。拼接式(早期融合)把视觉 token 直接放进输入序列, 代表是 LLaVA;注入式(中期融合)在 LLM 层间插入交叉注意力,代表是 Flamingo;原生统一式把图像离散成 token 与文本走同一自回归路径,代表是 Chameleon。三者的差异集中在视觉信息在何时以何种形式进入 Transformer。
拼接式实现最简单。LLaVA-1.5 用 336 乘 336 输入、14 乘 14 分块,产生 576 个视觉 token,占 2048 长度上下文的 28%。视觉 token 与文本共享全部后续层, 推理时只需要一次前向,但上下文里视觉占比过高时,长文本推理能力被压缩。
注入式不占输入长度。Flamingo 用 Perceiver Resampler 把视频帧产生的数万 视觉 token 压缩成固定 64 个,再通过门控交叉注意力注入,门控参数初始化为 0,保证训练早期视觉信息不会破坏已预训练的文本权重。这个门控从 0 起步的 初始化是多模态训练稳定性的关键工程细节。
统一式架构最干净。图像 patch 经 VQ-VAE 量化成离散码,与文本 token 共用 词表与解码路径,但 8 万词汇表中要为图像码预留约 1 万个槽位,且量化编码器 需要独立训练。三类架构在融合层的参数量差异明显:拼接式增加一个投影器 (4M 到 21M),注入式增加 Resampler 与交叉注意力模块(约 500M),统一式 增加 VQ 解码器(约 300M)。
演进趋势偏向统一式,公开技术报告都倾向一切输入进同一个 Transformer,但 拼接式仍是开源生态里性价比最高的基线,其代码与数据管线最成熟,冷启动成本 最低。三类架构的对比见表 1-1。
| 拼接式 | LLaVA-1.5 | 输入序列 | 576 | 4M 到 21M |
| 注入式 | Flamingo | 层间交叉注意力 | 64 固定 | 约 500M |
| 统一式 | Chameleon | 共享词表 | 离散码 | 约 300M |
表 1-1 三种多模态架构的融合方式与开销对比。
# 来源:自实现 / registry.py
class EncoderRegistry:
\”\”\”按名称构造视觉编码器,避免在训练脚本里堆硬编码分支。\”\”\”
_registry = {
}
@classmethod
def register(cls, name):
def deco(factory):
cls._registry[name] = factory
return factory
return deco
@classmethod
def build(cls, name, *args, **kwargs):
if name not in cls._registry:
raise KeyError(f\”未注册的编码器: {
name}\”)
return cls._registry[name](*args, **kwargs)
@EncoderRegistry.register(\”vit_b_16\”)
def build_vit_b(hidden=768):
return {
\”type\”: \”ViT-B/16\”, \”hidden\”: hidden, \”patches\”: 196}
@EncoderRegistry.register(\”clip_l_14\”)
def build_clip_l(hidden=1024):
return {
\”type\”: \”CLIP-L/14\”, \”hidden\”: hidden, \”patches\”: 256}
if __name__ == \”__main__\”:
for name in (\”vit_b_16\”, \”clip_l_14\”):
enc = EncoderRegistry.build(name)
print(name, enc[\”type\”], \”hidden=\”, enc[\”hidden\”])
1.3 多模态数据的挑战
多模态数据的主要问题依次是图文对噪声、标注稀疏、模态尺度不一致。
图文对噪声指图像与文本描述不匹配。LAION-5B 中估计有 15% 到 30% 的噪声对, 直接训练会拉低图文检索准确率约 5 个百分点。实践做法是用 CLIP 相似度过滤, 归一化余弦低于 0.25 的样本丢弃,能回收约 25% 的无效算力,但阈值调高会误 杀长尾主题,超过 0.30 时召回损失开始大于噪声收益。
标注稀疏集中在视觉定位与区域描述。COCO 只有约 33 万张带实例标注的图像, 远小于网页抓取的亿级规模。对策是课程式配比:先用几十万条高质量标注确定 对齐质量,再并入亿级弱标注对扩充覆盖,弱标注与强标注的配比通常在 5 比 1 到 10 比 1。
模态尺度不一致体现在 token 粒度:中文文本约 0.7 token 每字,图像按 576 token 每张折算,音频约 100 token 每秒。三者进入同一个上下文窗口时, 需要按计算预算换算占比,否则某类模态会垄断上下文,压制其他模态的表达。
合规约束会改变数据管线。抓取数据需做人脸检测(召回率约 0.98)与文字水印 过滤,这一步使数据管线吞吐下降约 20%,需要在项目排期里预留。数据问题的 整体优先级是:先解决噪声,再解决稀疏,最后才谈规模。
# 来源:自实现 / filter_pairs.py
import hashlib
def dedup_and_filter(pairs, min_chars=8, max_ratio=0.95):
\”\”\”去除重复图文对,过滤文本过短或描述比例异常的样本。\”\”\”
seen = set()
kept = []
for image_path, caption in pairs:
digest = hashlib.md5(image_path.encode(\”utf-8\”)).hexdigest()
if digest in seen:
continue
if len(caption.strip()) < min_chars:
continue
# 从文件名提取图像规模做启发式过滤,剔除噪声对
try:
size = int(image_path.rsplit(\”_\”, 1)[1].split(\”.\”)[0])
except (ValueError, IndexError):
size = 1
if size and len(caption) / size > max_ratio:
continue
seen.add(digest)
kept.append((image_path, caption))
return kept
if __name__ == \”__main__\”:
raw = [(\”a_1200.jpg\”, \”雪山上的日出\”)] * 3 + [(\”b_5.jpg\”, \”hi\”)]
print(len(dedup_and_filter(raw, min_chars=4)))
2. 视觉编码器:ViT 与 CLIP
视觉编码器把连续像素转换为模型可处理的向量序列。本章先拆 ViT 的分块、 位置编码与复杂度,再讲 CLIP 的对比预训练与固定用法,最后落到把视觉特征 映射进 LLM 词嵌入空间的投影层。
#mermaid-svg-qd1B2e7RisyTNl93{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-qd1B2e7RisyTNl93 .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-qd1B2e7RisyTNl93 .error-icon{fill:#552222;}#mermaid-svg-qd1B2e7RisyTNl93 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-qd1B2e7RisyTNl93 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-qd1B2e7RisyTNl93 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-qd1B2e7RisyTNl93 .marker.cross{stroke:#333333;}#mermaid-svg-qd1B2e7RisyTNl93 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-qd1B2e7RisyTNl93 p{margin:0;}#mermaid-svg-qd1B2e7RisyTNl93 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-qd1B2e7RisyTNl93 .cluster-label text{fill:#333;}#mermaid-svg-qd1B2e7RisyTNl93 .cluster-label span{color:#333;}#mermaid-svg-qd1B2e7RisyTNl93 .cluster-label span p{background-color:transparent;}#mermaid-svg-qd1B2e7RisyTNl93 .label text,#mermaid-svg-qd1B2e7RisyTNl93 span{fill:#333;color:#333;}#mermaid-svg-qd1B2e7RisyTNl93 .node rect,#mermaid-svg-qd1B2e7RisyTNl93 .node circle,#mermaid-svg-qd1B2e7RisyTNl93 .node ellipse,#mermaid-svg-qd1B2e7RisyTNl93 .node polygon,#mermaid-svg-qd1B2e7RisyTNl93 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-qd1B2e7RisyTNl93 .rough-node .label text,#mermaid-svg-qd1B2e7RisyTNl93 .node .label text,#mermaid-svg-qd1B2e7RisyTNl93 .image-shape .label,#mermaid-svg-qd1B2e7RisyTNl93 .icon-shape .label{text-anchor:middle;}#mermaid-svg-qd1B2e7RisyTNl93 .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-qd1B2e7RisyTNl93 .rough-node .label,#mermaid-svg-qd1B2e7RisyTNl93 .node .label,#mermaid-svg-qd1B2e7RisyTNl93 .image-shape .label,#mermaid-svg-qd1B2e7RisyTNl93 .icon-shape .label{text-align:center;}#mermaid-svg-qd1B2e7RisyTNl93 .node.clickable{cursor:pointer;}#mermaid-svg-qd1B2e7RisyTNl93 .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-qd1B2e7RisyTNl93 .arrowheadPath{fill:#333333;}#mermaid-svg-qd1B2e7RisyTNl93 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-qd1B2e7RisyTNl93 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-qd1B2e7RisyTNl93 .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qd1B2e7RisyTNl93 .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-qd1B2e7RisyTNl93 .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qd1B2e7RisyTNl93 .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-qd1B2e7RisyTNl93 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-qd1B2e7RisyTNl93 .cluster text{fill:#333;}#mermaid-svg-qd1B2e7RisyTNl93 .cluster span{color:#333;}#mermaid-svg-qd1B2e7RisyTNl93 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-qd1B2e7RisyTNl93 .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-qd1B2e7RisyTNl93 rect.text{fill:none;stroke-width:0;}#mermaid-svg-qd1B2e7RisyTNl93 .icon-shape,#mermaid-svg-qd1B2e7RisyTNl93 .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-qd1B2e7RisyTNl93 .icon-shape p,#mermaid-svg-qd1B2e7RisyTNl93 .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-qd1B2e7RisyTNl93 .icon-shape .label rect,#mermaid-svg-qd1B2e7RisyTNl93 .image-shape .label rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-qd1B2e7RisyTNl93 .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-qd1B2e7RisyTNl93 .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-qd1B2e7RisyTNl93 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}#mermaid-svg-qd1B2e7RisyTNl93 .default>*{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-qd1B2e7RisyTNl93 .default span{fill:#faf9f5!important;stroke:#ffffff!important;color:#000000!important;stroke-width:0px!important;}#mermaid-svg-qd1B2e7RisyTNl93 .default tspan{fill:#000000!important;}
文本编码路径
ViT 编码路径
网硕互联帮助中心





评论前必须登录!
注册