什么是多模态大模型
早期的大模型只会处理文字:你输入一段文本,它输出一段文本。但真实世界里,信息从来不只是文字——手机拍的照片、会议里说的话、屏幕上跳的数字,都是模型需要理解的对象。多模态大模型做的就是把文本、图像、语音这几种不同形式的信息,统一放进同一个模型里理解和生成。
和「先调一个图像识别接口、再调一个语音识别接口、最后把结果拼给文本模型」的拼装方案不同,真正的多模态模型是在同一个 Transformer 里同时处理多种输入。这意味着模型能在理解图像内容的同时参考上下文文本,也能在听到语音时结合屏幕上显示的画面做判断——这种跨模态的联合推理,是拼装方案做不到的。
多模态不是「多个单模态模型的拼接」,而是让模型在同一个注意力机制里同时看到文字、画面和声音。
- 多模态大模型在统一架构中处理文本、图像与语音,支持跨模态联合推理。
- 模态编码器视觉、语音各有独立的编码器,把原始信号转成模型能接收的向量。
- 对齐策略通过投影层和对比学习,让不同模态的向量在同一语义空间里对齐。
- Agent 集成把多模态模型作为感知层,接入工作流后就能看屏幕、听语音、做决策。
三种模态怎么变成向量
Transformer 只认识向量序列,所以不管你喂进去的是文字、图片还是语音,第一步都是把它们变成向量。三种模态的编码方式差别很大:文本走 Tokenizer 直接切词嵌入;图像用卷积或 ViT 切成图块再编码;语音则要先做声谱图,再用专门的声学模型编码。
| 模态 | 原始信号 | 编码器 | 输出形式 |
|---|---|---|---|
| 文本 | 字符串 | Tokenizer + Embedding | Token 向量序列 |
| 图像 | 像素矩阵 | 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 都做成流式:一边识别一边出文字,模型一边生成一边播语音,把端到端延迟压到可接受范围。
Agent 场景下的多模态实践
多模态能力放进 Agent 工作流之后,Agent 能做的事变多了:它不再只处理文本指令,还能看截图操作电脑、听语音指令、读文档里的图表。常见的落地形态有三种:桌面自动化 Agent 看屏幕点按钮、客服 Agent 听用户语音并结合产品截图回答问题、内容审核 Agent 同时检查图文内容。
做多模态 Agent 时,最容易犯的错是把所有模态都塞进一个模型里跑。实际上更合理的做法是分工:视觉模型负责看图,语音模型负责听写,通用大模型负责推理和决策,三者通过工作流串起来。每个模型只做自己擅长的事,整体效果比硬凑一个全能模型好得多。
落地路径与常见坑
如果要把多模态能力用到自己的产品里,建议按下面的顺序推进:
- 先选一个模态切入:不要一开始就想做图文音全能。先从视觉理解或语音对话里选一个最贴业务的。
- 调用现成 API:先用云厂商的多模态 API 跑通流程,确认业务场景真的需要多模态,再考虑自部署。
- 积累业务数据:收集自己场景里的图文对或语音对话,后续微调时这些数据是最宝贵的资产。
- 接进工作流:把多模态模型作为感知节点接入 Agent 工作流,和工具调用、记忆模块配合。
- 测端到端延迟:多模态模型推理比纯文本慢,一定要在真实业务压力下测延迟和成本。
常见的坑包括:以为多模态模型能看懂一切专业图(实际它对工程图纸、医疗影像这类垂直内容仍然很弱);忽视图片压缩导致发送的图模糊到模型认不出;以及把语音场景的延迟和文本场景混为一谈。这些都要在实际接的时候踩一遍才记得住。
多模态大模型的工程价值,在于让 AI 从「只能打字」变成「能看、能听、能说」。但落地时仍然要按模态拆分、按业务选模型,不要迷信一个全能大模型。