什么是多模态大模型

早期的大模型只会处理文字:你输入一段文本,它输出一段文本。但真实世界里,信息从来不只是文字——手机拍的照片、会议里说的话、屏幕上跳的数字,都是模型需要理解的对象。多模态大模型做的就是把文本、图像、语音这几种不同形式的信息,统一放进同一个模型里理解和生成。

和「先调一个图像识别接口、再调一个语音识别接口、最后把结果拼给文本模型」的拼装方案不同,真正的多模态模型是在同一个 Transformer 里同时处理多种输入。这意味着模型能在理解图像内容的同时参考上下文文本,也能在听到语音时结合屏幕上显示的画面做判断——这种跨模态的联合推理,是拼装方案做不到的。

多模态不是「多个单模态模型的拼接」,而是让模型在同一个注意力机制里同时看到文字、画面和声音。
本文核心知识点
  • 多模态大模型在统一架构中处理文本、图像与语音,支持跨模态联合推理。
  • 模态编码器视觉、语音各有独立的编码器,把原始信号转成模型能接收的向量。
  • 对齐策略通过投影层和对比学习,让不同模态的向量在同一语义空间里对齐。
  • Agent 集成把多模态模型作为感知层,接入工作流后就能看屏幕、听语音、做决策。
多模态配图:中央发光芯片核心接收眼睛、声波与文档三束输入,蓝色渐变扁平风格
多模态模型的输入示意:视觉、语音与文本三种信号各自经过编码器后汇入统一核心,再输出联合理解结果。

三种模态怎么变成向量

Transformer 只认识向量序列,所以不管你喂进去的是文字、图片还是语音,第一步都是把它们变成向量。三种模态的编码方式差别很大:文本走 Tokenizer 直接切词嵌入;图像用卷积或 ViT 切成图块再编码;语音则要先做声谱图,再用专门的声学模型编码。

模态原始信号编码器输出形式
文本字符串Tokenizer + EmbeddingToken 向量序列
图像像素矩阵ViT / CLIP 视觉塔图像块向量序列
语音声波波形声谱图 + 声学编码器帧级向量序列

编码完之后,三种向量序列长度和维度都不一样。要把它们送进同一个 Transformer,就需要一个投影层把它们映射到统一维度,再加上可学习的位置编码,让模型知道哪些向量来自图、哪些来自文、哪些来自语音。

# 多模态输入拼接的最小示意
text_tokens = tokenizer.encode("描述这张图片")     # [seq_len, hidden]
image_patches = vit.encode(image)                  # [num_patches, vis_dim]
audio_frames = audio_encoder.encode(wav)           # [num_frames, aud_dim]

# 投影到统一维度
text_hidden = text_proj(text_tokens)
image_hidden = text_dim_proj(image_patches)
audio_hidden = text_dim_proj(audio_frames)

# 拼接成统一序列
mixed = torch.cat([text_hidden, image_hidden, audio_hidden], dim=0)
output = transformer(mixed)  # 模型同时看到三种模态

这个拼接看起来简单,但训练时要保证模型真的学会了跨模态关联,而不是各看各的。常用的做法是对比学习:让图和对应的文字描述在向量空间里靠近,不相关的远离,慢慢把两个模态的语义对齐到一起。

统一 Transformer 与对齐策略

多模态模型的主干通常就是一个大的 Transformer,和纯文本模型结构几乎一样。区别只在于输入序列里混了不同模态的向量,以及在训练目标上加入了跨模态的信号。主流的做法有两条路线:一种是把视觉编码器的输出直接插到文本序列前面,让大语言模型像读特殊 Token 一样读图像;另一种是从头训练一个同时吃三种模态的统一模型。

对齐是多模态训练里最关键的一步。图像里的「猫」和文本里的「猫」,在向量空间里必须离得近,模型才能把图和话对应起来。这个对齐不是一蹴而就的,通常分两步:先用大规模图文对做对比预训练,把视觉和文本拉到同一空间;再用指令微调数据教模型根据图像内容回答问题。

# 对比学习损失的核心思想
# 对一批图文对,让配对的相似度高,不配对的相似度低
def contrastive_loss(image_embeds, text_embeds):
    sim = cosine_similarity(image_embeds, text_embeds)  # [batch, batch]
    labels = torch.arange(batch)
    loss_i = cross_entropy(sim, labels)       # 图找文
    loss_t = cross_entropy(sim.T, labels)      # 文找图
    return (loss_i + loss_t) / 2

实践里,多模态模型的训练数据质量比数量更重要。十万条对齐好的图文对,往往比一百万条噪声数据训练效果更好。做垂直场景时,一定要用自己业务领域的图文数据做微调,通用模型的泛化能力在专业术语上经常不够。

视觉理解:从 CLIP 到 VLM

视觉理解是多模态里最成熟的一块。CLIP 用对比学习把图文对齐之后,后面又发展出了能直接看图回答问题的视觉语言模型(VLM)。和 CLIP 只能判断「图和这段描述相不相关」不同,VLM 能输出一段完整的描述,甚至能回答「图里第三排左边的人穿什么颜色衣服」这种细粒度问题。

工程上接 VLM 做应用,通常是把图片压缩成合适分辨率,连同问题一起发给模型 API,拿回结构化回答。需要注意的是图片分辨率和 Token 数量的关系——高分辨率图切成太多图块,会把上下文窗口塞满,影响长对话能力。

接视觉模型的三条经验
  • 控制分辨率根据任务需要选分辨率,不要默认拉到最高,省 Token 就是省钱。
  • 明确任务在 prompt 里写清楚要识别什么、输出什么格式,不要只丢一句「看看这张图」。
  • 预处理校验发图之前先做基本检查:图片能不能正常打开、是不是需要旋转、有没有水印遮挡。

视觉理解在 Agent 场景里特别有用:让模型看一眼屏幕截图,就能知道当前打开了什么软件、按钮在哪里,然后决定下一步操作。这种「看屏幕」的能力,是桌面自动化 Agent 的基础。

语音输入与输出的接入

语音模态比视觉晚熟一些,但这两年进步很快。接入语音通常分两步:语音转文字(ASR)把用户说的话变成文本,再交给大模型处理;模型生成文本后,再用文字转语音(TTS)读出来。这种「ASR + LLM + TTS」的三段式结构,是目前大多数语音助手的标准做法。

更新的做法是端到端语音模型:不再先转成文字,而是直接吃声波、输出声波,中间不经过显式的文本步骤。这种方式在保留语气、情感和说话人特征上更好,但目前对开放域任务的准确率还不如三段式。落地时建议先从三段式做起,等业务场景明确了再评估是否切换到端到端。

# 三段式语音对话的最小流水线
def voice_conversation(audio_chunk):
    text = asr.transcribe(audio_chunk)       # 语音转文字
    reply = llm.chat(text)                    # 大模型生成回答
    reply_audio = tts.synthesize(reply)       # 文字转语音
    return reply_audio

语音场景对延迟特别敏感。用户说完话之后,超过一秒半没反应就会觉得卡。工程上要把 ASR、LLM、TTS 都做成流式:一边识别一边出文字,模型一边生成一边播语音,把端到端延迟压到可接受范围。