Skip to content

2.6 多模态模型基础

上一节我们讨论了上下文窗口——那个决定模型一次能"记住"多少内容的机制。从最初的4K token到现在的128K甚至1M token,上下文窗口的扩展让模型能处理越来越长的文本。但细心的读者可能已经注意到一个隐含的假设:输入给模型的,全都是文字。如果用户想让模型理解一张截图、一段语音、一段视频呢?这个问题引出了本章最后一节的主题——多模态模型。除了文本之外,模型还能处理什么?又是怎么处理的?

事实上,回顾第二章的旅程,从2.1节认识大语言模型,到2.2节理解Transformer架构,再到2.3节tokenization、2.4节训练流程、2.5节上下文窗口,我们讨论的一切都围绕着"文本"这一种信息形式。模型通过文本学习知识、通过文本进行推理、通过文本输出结果。但真实世界的信息远不止文字——图像、声音、视频才是人类感知世界的主要方式。让模型突破"纯文本"的限制,正是多模态模型要解决的问题。


2.6.1 为什么需要多模态

要理解"多模态",不妨先想想我们自己。人有五官——眼睛看图、耳朵听声、鼻子闻味、舌头尝鲜、皮肤触物。我们认识世界,从来不是只靠文字。一个孩子学"苹果"这个词时,看到的是红红的圆果子,闻到的是果香,摸到的是光滑的表皮——文字只是其中一种信息载体,甚至可以说不是最主要的那一种。

语言模型原本只有"文字"这一种感官。它通过海量文本训练出了惊人的语言能力,但这也意味着它的世界是"只读字"的。这种限制在实际应用中会带来明显的问题:

  • 软件测试:想让模型分析一个App界面截图,只能先用人工把界面内容描述成文字,再喂给模型。中间信息损失巨大,而且费时费力。
  • 客服系统:用户发来一张故障照片,模型却"看不见",只能让用户用文字描述故障现象,体验很差。
  • 医疗诊断:医生想让模型辅助读X光片,模型却只能理解病历文字,对影像本身无能为力。
  • 视频审核:海量视频内容,模型只能处理字幕或描述文本,无法直接理解画面中发生了什么。

多模态模型就是要把模型的"感官"从单一的文本扩展到图像、音频、视频等多种模态,让它像人一样,能够综合多种信息来理解和回应。

所谓"模态"(Modality),指的是信息的呈现形式。文本是一种模态,图像是另一种,音频又是一种。一个模型如果能同时处理两种以上的模态,就称为"多模态模型"(Multimodal Model)。目前研究最成熟、应用最广泛的是"视觉-语言模型"(Vision-Language Model,VLM),即能同时处理图像和文本的模型,这也是本节的重点。音频和视频模态会简要介绍。


2.6.2 视觉-语言模型的核心架构

视觉-语言模型要解决的核心问题只有一个:语言模型只懂文字,怎么让它"看懂"图片?

一个自然的思路是:能不能把图片"翻译"成一种语言模型能理解的形式,然后和文字一起输入?这正是当前主流VLM的基本思路。整个架构可以分解为三个部分——视觉编码器、连接器、语言模型:

┌─────────────┐     ┌──────────────┐     ┌──────────────┐
│  视觉编码器  │     │   连接器      │     │   语言模型    │
│  (Vision    │ ──> │  (Connector)  │ ──> │   (LLM)      │
│  Encoder)   │     │              │     │              │
│  ViT/CLIP   │     │  MLP/Q-Former│     │  LLaMA/Qwen  │
└─────────────┘     └──────────────┘     └──────────────┘

下面逐一解释这三个部分。

视觉编码器:把图片变成一串"文字描述"

视觉编码器的任务是接收一张图片,输出一组数学向量——可以理解为"把图片变成一串描述性的特征token"。这串特征token对语言模型来说,就像是一段特殊的"文字",虽然不是自然语言,但携带了图片的关键信息。

这里有一个关键的类比:就像给人看一张猫的图片,大脑不会逐像素地记忆,而是提取出"猫、橘色、沙发、阳光"这样的语义特征。视觉编码器做的也是这件事——把密集的像素压缩成稀疏的语义表示。 这就好比把一本厚厚的画册浓缩成一页文字摘要,虽然丢了细节,但核心信息都在。

目前主流的视觉编码器有几种:

ViT(Vision Transformer) 是将Transformer架构从文本迁移到图像的开创性工作。它的做法很直观——把一张图片切成若干小块(patch,比如16×16像素的小方块),每个patch就像一个"词",然后按顺序送入Transformer处理。就像读文章时逐词理解,ViT逐patch地理解图片。最终每个patch对应一个输出向量,整张图片就变成了N个向量的序列:

原始图片(224×224 像素)

   │ 切分为 14×14 = 196 个 patch(每个 16×16 像素)

[P1][P2][P3] ... [P196]   ← 每个 patch 变成一个"视觉词"

   │ 送入 Transformer 编码

[V1][V2][V3] ... [V196]   ← 输出 196 个视觉特征向量

CLIP(Contrastive Language-Image Pre-training) 的独特之处在于它是"图文对比学习"训练出来的。训练时给它一张图片和一段文字描述,让模型学会判断"这段文字是不是在描述这张图"。经过海量图文对训练后,CLIP的视觉编码器输出的特征,天然就和文本语义对齐——也就是说,"猫的图片"和"一只猫"这行文字,在向量空间中会非常接近。这种对齐特性使得CLIP特别适合作为VLM的视觉编码器,因为输出的视觉特征"天然就是语言模型能理解的语义"。

SigLIP 可以看作CLIP的改进版本。它将对比学习从全局的softmax损失改成sigmoid损失,训练更高效,在许多下游任务上表现更好。DeepSeek-VL2等模型就采用了SigLIP作为视觉编码器。

经过视觉编码器后,一张图片就被转换成了 N × d_v 的向量序列(N是patch数量,d_v是特征维度)。但这还不够——这个序列的维度和语言模型期望的输入维度通常不一样,需要一座"桥"来连接两边。

连接器:让视觉特征和语言模型对上话

连接器(Connector),也叫投影器(Projector),位于视觉编码器和语言模型之间。它的作用是将视觉特征"翻译"成语言模型能接受的输入格式。

打个比方:视觉编码器输出的是"法语",语言模型只懂"中文",连接器就是那个翻译官,把法语翻译成中文。

主流的连接器方案有三种:

方案一:简单MLP(多层感知机)。 LLaVA系列采用这种方案。做法很直接——用一个或几层全连接网络,把视觉特征的维度变换成语言模型的输入维度。优点是简单高效、训练成本低;缺点是没有信息压缩,196个视觉token会全部输入语言模型,占用较多上下文窗口。

方案二:Q-Former。 BLIP-2系列采用这种方案。Q-Former内部有一组可学习的"查询"向量(比如32个),通过交叉注意力机制从视觉特征中"提取"信息,把196个视觉token压缩成32个。优点是信息压缩高效,显著减少token数量;缺点是结构复杂、训练难度大。

方案三:直接拼接。 Fuyu等模型采用这种方案。不设独立的视觉编码器,而是直接把图像patch展平后作为token输入语言模型。最简洁,但对语言模型本身的图像理解能力要求很高。

这三种方案各有取舍。从工程角度看,MLP方案最适合快速实验和原型开发——你可以拿一个现成的视觉编码器(如CLIP-ViT)和一个现成的语言模型(如Llama),中间接一个两层MLP,用少量数据训练就能得到一个可用的VLM。这正是LLaVA的设计哲学,也是它成为开源VLM标杆的原因:用最简单的方式验证了"三段式"架构的可行性。而在追求极致性能时,Q-Former的压缩能力和直接拼接的端到端训练可能更有优势,但代价是更高的工程复杂度。

语言模型:负责最终的推理和生成

连接器输出的视觉token和用户输入的文本token拼在一起,送入语言模型。语言模型就像一个"只读字"的人,但现在看到的"字"里混入了一些特殊的视觉token。由于经过了视觉编码器和连接器的处理,这些视觉token已经携带了图片的语义信息,语言模型可以通过注意力机制将它们和文本token一起处理,最终生成回复。

完整的处理流程可以这样理解:

用户提问:"这张图里有什么?"
图片内容:一张橘猫坐在沙发上的照片

第 1 步:视觉编码器处理图片
  图片 → [V1][V2]...[V196]   (196 个视觉特征向量)

第 2 步:连接器转换维度并压缩
  [V1][V2]...[V196] → [T1][T2]...[T32]   (压缩为 32 个视觉 token)

第 3 步:视觉 token 与文本 token 拼接
  [图token] [这张] [图里] [有] [什么] [?]

第 4 步:语言模型统一处理,生成回复
  → "图里有一只橘色的猫,正坐在灰色的沙发上……"

这就是为什么VLM能"看图说话"——图片被转成了语言模型能处理的token,融入了它的推理过程。从语言模型的视角看,视觉token和文本token没有本质区别,都是输入序列的一部分。

理解了这个三段式架构后,一个自然的疑问是:既然视觉token和文本token最终都在同一个序列中被处理,那么模型是否真的"理解"了图片?从某种意义上说,模型理解的不是图片本身,而是图片经过视觉编码器后留下的"语义痕迹"。就像你向一个从未见过猫的人描述"猫是毛茸茸的、有尖耳朵、会喵喵叫的动物"——他虽然没见过猫,但能通过你的描述大致理解"猫"是什么。视觉编码器扮演的就是这个"描述者"的角色,只不过它描述的不是自然语言,而是一组高维向量。


2.6.3 原生多模态与拼接式多模态

上一节介绍的"视觉编码器 + 连接器 + 语言模型"架构,业界通常称为拼接式多模态(或模块化多模态)。它的特点是:视觉和语言是两个独立的模块,通过连接器"拼"在一起。

与之对应的是原生多模态(Native Multimodal),特点是:所有模态从一开始就在同一个模型内处理,没有独立的视觉编码器,也没有显式的连接器。图像(或音频)和文本一样,被转换成token后直接送入同一个Transformer。

两者的对比可以从多个维度来看:

维度拼接式多模态原生多模态
架构视觉编码器 + 连接器 + LLM,模块分明统一的Transformer,所有模态共享参数
模态融合后期拼接,视觉信息经过"翻译"才进入语言模型早期融合,各模态从一开始就在同一空间处理
训练方式通常先训视觉编码器,再对齐,再指令微调从预训练阶段就将多模态数据混合训练
扩展新模态需要新增编码器和连接器,相对灵活需要从头训练或大规模微调,成本高
代表模型LLaVA、BLIP-2、早期Qwen-VLGPT-4o、Gemini 1.5/2.0、Qwen2-VL
优势模块化、可复用已有LLM、训练成本低跨模态理解更深入、推理延迟更低
劣势跨模态推理可能受限、视觉信息有损失训练成本高、工程复杂

一个直观的理解方式:拼接式像"请了一个翻译,把英文翻成中文再读"——翻译再好,也难免丢失原文的微妙之处;原生式像"这个人从小双语长大"——两种语言在他脑中是融合的,理解更自然,也更能在两种语言之间自由切换。

需要特别指出的是,GPT-4V(GPT-4的视觉版本)并不是原生多模态——它本质上是在GPT-4基础上接了视觉模块,属于拼接式。而GPT-4o("o"代表omni)才是OpenAI宣称的原生多模态模型,文本、图像、音频在同一个模型中处理。Gemini系列从设计之初就是原生多模态架构。这个区分在实际选型时很重要:原生多模态模型在跨模态推理任务(比如"图中文字的逻辑是否自洽""这段音频和这张图片是否描述同一场景")上通常更有优势。

从发展趋势来看,行业正在从拼接式向原生多模态迁移。GPT-4o、Gemini 2.0等新一代模型都采用了原生架构。但拼接式方案在开源社区仍然主流——因为原生多模态的训练需要海量多模态数据和巨大的计算资源,远非一般团队能够承担。对于学习者和中小团队来说,理解拼接式架构(尤其是LLaVA的三段式设计)仍然是最务实的选择,它既足够强大,又足够透明、可控。


2.6.4 音频模态:Whisper简介

除了图像,音频是另一个重要的模态。音频模态的核心任务通常是语音识别(ASR,Automatic Speech Recognition)——把人说的话转成文字。一旦转成文字,就可以交给普通语言模型处理了。

OpenAI开源的Whisper是目前最知名的语音识别模型之一。它的架构同样基于Transformer,训练数据涵盖了68万小时的多语言语音,支持99种语言的识别和翻译。Whisper的工作流程是:

音频波形

   │ 1. 转换为 mel 频谱图(把音频变成类似图像的二维表示)

Mel 频谱图

   │ 2. 送入 Transformer 编码器-解码器

文本输出:"今天天气不错"

Whisper的成功说明了一个重要的道理:很多看似不同的模态,经过恰当的特征提取后,都可以用Transformer来处理。 图像切成patch变成token,音频转成mel频谱再编码,文字直接token化——殊途同归,最终都变成了Transformer能消化的token序列。

在多模态Agent中,Whisper常被用作"耳朵":先用Whisper把用户的语音转成文字,再交给LLM处理,最后用TTS(Text-to-Speech)把回复念出来。GPT-4o的原生多模态则更进一步,省去了中间的文字转换环节,直接在同一个模型中处理音频输入和输出——你可以直接对它说话,它也直接用语音回答你。

除了Whisper,音频领域还有其他值得关注的方向。例如音频生成模型(如Suno、Udio、MusicGen)能根据文字描述生成音乐;语音克隆技术能从几秒的参考音频中复制说话人的音色。这些技术虽然不属于"多模态理解"的范畴,但与多模态Agent结合后,可以构建出完整的"听→理解→说"交互闭环,在智能客服、语音助手等场景有巨大的应用潜力。


2.6.5 主流多模态模型对比

经过近几年的快速发展,多模态模型已经形成了丰富的生态。下表列出了几个代表性模型:

模型架构类型视觉编码器连接器语言模型特点
GPT-4o原生多模态未公开未公开GPT-4系列文本+图像+音频统一处理
Gemini 2.0原生多模态未公开未公开Gemini支持超长上下文、视频理解
Claude 3.5拼接式未公开未公开Claude视觉推理强、图表理解优秀
LLaVA-1.5拼接式CLIP-ViT-L2层MLPVicuna-7B开源标杆,结构清晰
Qwen2-VL偏原生ViT动态分辨率Qwen2支持中文、任意分辨率图像
InternVL2拼接式InternViTMLPInternLM2开源最强之一
DeepSeek-VL2拼接式SigLIPMLPDeepSeek MoEMoE架构,推理高效

几点说明:

  • 闭源模型(GPT-4o、Gemini、Claude)的架构细节未公开,上表为基于公开技术报告和论文的推测。
  • 开源模型的架构相对透明。LLaVA是学习VLM的最佳入门选择,结构清晰、代码易读,非常适合理解"三段式"架构。
  • Qwen2-VL采用了"动态分辨率"技术,能处理任意长宽比的图片,不像早期模型需要把图片裁剪或缩放到固定尺寸(比如224×224),这在处理长截图、宽表格等实际图片时优势明显。同时它对中文场景的优化也使其在国内应用中表现突出。
  • DeepSeek-VL2采用MoE(Mixture of Experts)架构,推理时只激活部分参数,在保持强大能力的同时显著降低计算成本。这种"稀疏激活"的思路是当前大模型降低推理成本的重要方向。
  • 选择模型时,除了关注基准测试分数,更要关注实际任务表现。许多模型在某些基准上得分接近,但在特定场景(如中文OCR、手写体识别、细粒度图表理解)上差异显著。建议在实际数据上做小规模测试后再决定。

2.6.6 多模态模型的训练方法

多模态模型的训练通常分为两个阶段,可以类比人类的学习过程。一个小孩子学认东西,先是被动地反复看图片听大人说名字(建立"形象"和"词语"之间的联系),然后才开始被提问"这是什么?"并尝试回答(学会按要求输出)。多模态模型的训练也是类似的两个阶段。

阶段一:预训练对齐——学会"看图配文字"

这个阶段的目标是让视觉编码器和语言模型"对齐",也就是说,让连接器学会把视觉特征转换成语言模型能理解的token。具体做法是:

  • 冻结视觉编码器和语言模型(它们的参数不更新)
  • 只训练连接器的参数
  • 使用大量"图文对"数据(如LAION、COCO等数据集,每条数据是一张图片配一段描述文字)
  • 训练目标:让连接器输出的视觉token,能让语言模型"读出"正确的图片描述

类比一下:就像教一个只会中文的人看法语的图片说明书——先训练一个翻译官(连接器),把法语的图片标注翻译成他能看懂的中文。

阶段二:指令微调——学会"看图回答问题"

对齐之后,模型已经能"看懂"图片了,但还不会按用户的指令做事。指令微调阶段就是教它这一点:

  • 解冻语言模型(或部分解冻)
  • 使用多模态指令数据(如"这张图里有几只猫?""把图中的表格转成Markdown格式")
  • 数据来源:视觉问答、图像描述、OCR、图表理解等多种任务
  • 训练目标:让模型能按照用户的自然语言指令完成多模态任务

继续类比:翻译官学会翻译后,现在要训练他"别人问什么就答什么"的能力,而不只是做简单的图片标注。

阶段 1:预训练对齐
  输入:[图片] + "描述这张图片"
  目标:让连接器学会把视觉特征映射到语言空间
  只训练连接器的参数

阶段 2:指令微调
  输入:[图片] + "图中有几个人?他们在做什么?"
  目标:让模型学会按指令完成多模态任务
  训练连接器 + 语言模型(部分参数)

两点说明:

训练数据的关键性。 预训练对齐阶段使用的图文对数据质量,直接决定了连接器的"翻译"水平。早期LLaVA使用的是从CC3M等数据集中筛选的约595K条高质量图文对。后来的研究发现,数据质量和多样性比数量更重要——少量的高质量指令数据,效果可能优于大量的低质量数据。这也是为什么许多开源模型在指令微调阶段会精心构建数据集。

计算成本考量。 阶段一只需要训练连接器,计算成本较低。阶段二需要解冻语言模型,计算成本显著上升。对于资源有限的研究者来说,可以只在阶段一训练连接器,使用已有的强大语言模型作为底座,就能得到一个可用的VLM——这正是LLaVA最初的做法,也是它成为开源VLM标杆的原因之一:用最少的资源验证了"三段式"架构的可行性。

两阶段训练是当前主流方案,LLaVA、BLIP-2、Qwen-VL等大多采用这一范式。原生多模态模型的训练则更加复杂,通常从预训练阶段就混合多模态数据,但基本原理相通——都是先让模型学会"理解"多模态输入,再让它学会"按指令行动"。


2.6.7 多模态模型的能力

多模态模型扩展了语言模型的能力边界,主要体现在以下几个方面。

视觉理解是目前应用最广泛的能力:

  • 物体识别与描述:识别图片中的物体、场景,用自然语言描述
  • OCR(光学字符识别):提取图片中的文字内容,包括手写体、印刷体、艺术字
  • 图表理解:理解柱状图、折线图、流程图等可视化内容,回答相关问题
  • 场景推理:根据图片内容进行推理,如"图中的人为什么在笑?"
  • 视觉定位(Grounding):不仅能识别物体,还能给出物体在图片中的位置(坐标框)

视频理解可以看作"连续的图片帧序列",但难点在于时序关系。一段视频通常包含每秒24~30帧图片,直接把所有帧都送入模型显然不现实(一个10秒的视频就有240~300帧,远超上下文窗口能容纳的视觉token数量)。因此,实际做法通常是:

  • 关键帧采样:不是逐帧处理,而是按一定间隔(如每秒取1帧或每2秒取1帧)抽取关键帧,大幅减少需要处理的帧数。
  • 逐帧分析:对抽取的关键帧进行图像理解,识别每帧中的物体和场景。
  • 动作识别:通过多帧之间的变化,识别视频中的人在做什么动作(走路、跑步、挥手等)。
  • 时序推理:结合多帧信息,理解事件的前因后果。如"他为什么突然跑起来?"需要模型理解前后帧的关系,而不只是看单帧。

视频理解是多模态领域的前沿方向之一。Gemini 1.5 Pro号称可以处理最长1小时的视频输入,其技术细节虽未完全公开,但核心思路仍是将视频帧序列化为token后统一处理。开源模型方面,Qwen2-VL和InternVL2也具备一定的视频理解能力,但在长视频和复杂时序推理上仍有差距。

音频理解

  • 语音识别(ASR):将语音转成文字。这是目前最成熟的音频模态能力,Whisper等模型已经能在多种语言、多种口音、多种噪声环境下达到接近人类的识别准确率。
  • 音乐分析:识别音乐风格、乐器、情绪。如判断一段音乐是爵士还是古典、用了哪些乐器、情绪是欢快还是忧伤。
  • 音频事件检测:识别环境音,如狗叫、汽车鸣笛、玻璃破碎。在安防监控、智能家居等场景有广泛应用。

需要说明的是,当前大多数VLM并不直接处理音频——它们处理的是"图片+文本"。音频通常先用Whisper等模型转成文字,再交给语言模型处理。只有GPT-4o等原生多模态模型才能在同一个模型中直接接受音频输入并输出音频,无需中间的文字转换环节。这也体现了原生多模态的一个独特优势:保留了语音中的语调、情绪等副语言信息,这些信息在文字转换过程中往往会丢失。

值得注意的是,不同模型的能力侧重不同。Claude 3.5在图表理解和逻辑推理上表现突出,Gemini在视频理解上有优势,Qwen2-VL对中文和文档场景支持更好。选型时需要根据具体任务评估,没有"万能最优"的模型。


2.6.8 多模态Agent的应用前景

多模态能力一旦与Agent框架结合,就能催生许多过去难以实现的应用:

  • UI自动化Agent:理解屏幕截图,操控桌面或移动应用。例如,一个测试Agent可以"看到"App界面上的按钮,自动点击并验证功能,而不需要人工编写UI选择器。
  • 文档处理Agent:理解PDF、扫描件、图片中的文字和图表。在法务、财务场景,能自动提取合同条款、核对发票信息。
  • 视频监控Agent:实时分析视频流,检测异常事件。如工厂安全监控、交通违规检测。
  • 医疗诊断Agent:辅助分析医学影像(X光、CT、MRI),给出初步判断供医生参考。
  • 自动驾驶Agent:理解道路场景(摄像头+雷达数据),做出驾驶决策。

这些场景的共同特点是:需要模型同时理解视觉信息和语言指令,并将两者结合进行推理。 这正是多模态模型的用武之地,也是后续章节中Agent开发的重要能力基础。

以UI自动化Agent为例,更具体地看它的工作流程:Agent首先截取当前屏幕画面,将截图和用户指令(如"帮我把这个文档另存为PDF")一起发给多模态模型;模型"看"截图后,识别出菜单栏、按钮等UI元素的位置,并返回操作指令(如"点击左上角File菜单");Agent执行操作后再次截图,循环这一过程直到任务完成。整个过程中,模型需要持续地"看图→推理→行动",这对视觉理解的准确性和时序推理能力都提出了很高要求。这也是为什么多模态Agent被视为AI应用的最前沿方向之一——它让模型从"只会说"进化到"能看能做"。


2.6.9 常见误区

在实际学习和使用多模态模型时,有几个常见误区需要澄清。

误区一:"多模态模型 = 能生成图片的模型"

这是一个非常常见的误解。能生成图片的模型(如DALL-E、Stable Diffusion、Midjourney)是"文生图"模型,它们的核心是图像生成——输入文字,输出图片。而本节讨论的多模态模型(如GPT-4o、LLaVA)核心是图像理解——输入图片,输出对图片的理解和回答。两者的方向恰好相反:前者是"文字→图片",后者是"图片→文字理解"。当然,GPT-4o等模型也具备一定的图像生成能力,但这不是"多模态理解"的核心定义。把两者混为一谈,会导致选型时方向性错误。

误区二:"GPT-4V是原生多模态"

如前所述,GPT-4V是在GPT-4基础上接了视觉模块,属于拼接式多模态。GPT-4o才是OpenAI宣称的原生多模态模型。两者的区别在于:GPT-4V处理图像时,图像要先经过独立的视觉编码器再输入语言模型;GPT-4o则在同一个模型中直接处理所有模态。这个区别在跨模态推理任务上会体现出来——原生多模态通常表现更好。

误区三:"多模态模型一定比纯文本模型更强大"

不一定。如果你的任务只涉及文本(如写代码、做翻译、回答知识问题),纯文本模型可能更快、更便宜、效果也不差。多模态模型的优势在于处理"包含图像/音频"的输入,如果输入里没有这些模态,它的多模态能力就无用武之地,反而可能因为模型更大、推理更慢而不划算。选型的关键不是"能力多",而是"匹配需求"。

误区四:"开源多模态模型已经追上闭源"

虽然开源模型(如InternVL2、Qwen2-VL)进步很快,在许多基准测试上逼近闭源模型,但在复杂视觉推理、细粒度OCR、多图联合推理等高难度场景上,闭源模型(GPT-4o、Gemini)仍有明显优势。开源模型适合研究学习、定制化部署和成本敏感场景,闭源模型适合对效果要求极高的生产场景。盲目相信"开源已追平"可能导致项目效果不及预期。

误区五:"多模态模型看图片就是逐像素分析的"

恰恰相反。多模态模型并不像传统图像处理那样逐像素分析,而是通过视觉编码器将图片"压缩"成一组语义特征token。这意味着模型理解的是图片的语义信息("一只橘猫坐在沙发上"),而非精确的像素级信息("坐标(100,200)处的RGB值为(255,165,0)")。这种特性带来了一个副作用:模型可能对图片中的细小文字、精确数字、细微颜色差异识别不够准确。如果任务需要像素级精度(如精确测量图片中物体的尺寸),多模态模型可能不是最佳选择,传统计算机视觉方法(如OCR引擎、目标检测模型)可能更可靠。


2.6.10 实战:调用多模态模型

理论讲完了,下面通过两个代码示例,实际体验多模态模型的使用。

示例1:使用OpenAI API进行图像理解

python
# 导入 OpenAI 官方客户端库
from openai import OpenAI
# 导入 base64 模块,用于将图片二进制数据编码为 base64 字符串
import base64

# 初始化 OpenAI 客户端
# 需要提前设置环境变量 OPENAI_API_KEY
client = OpenAI()

def encode_image(image_path):
    """将本地图片文件编码为 base64 字符串。
    
    OpenAI 的多模态 API 要求图片以 base64 编码的 data URL 形式传入,
    或者传入一个可公开访问的图片 URL。
    本函数处理的是本地文件,所以用 base64 编码。
    """
    # 以二进制读取模式打开图片文件
    with open(image_path, "rb") as f:
        # 读取二进制数据 → 编码为 base64 → 解码为 UTF-8 字符串
        return base64.b64encode(f.read()).decode("utf-8")

def analyze_image(image_path, question):
    """调用 GPT-4o-mini 模型分析图片并回答问题。
    
    参数:
        image_path: 本地图片文件路径
        question:   针对图片的提问文本
    返回:
        模型的文本回复
    """
    # 第一步:将本地图片编码为 base64 字符串
    base64_image = encode_image(image_path)
    
    # 第二步:调用聊天补全接口
    # 关键点:content 字段是一个列表,可以混合多种类型的输入
    response = client.chat.completions.create(
        model="gpt-4o-mini",  # 指定使用支持视觉的模型
        messages=[
            {
                "role": "user",        # 用户角色
                "content": [           # content 是列表,可混合文本和图片
                    # 文本部分:用户的提问
                    {"type": "text", "text": question},
                    # 图片部分:以 base64 data URL 形式传入
                    {
                        "type": "image_url",
                        "image_url": {
                            # 格式为 data URL:data:image/jpeg;base64,<编码数据>
                            "url": f"data:image/jpeg;base64,{base64_image}"
                        }
                    }
                ]
            }
        ]
    )
    # 第三步:从响应中提取模型生成的文本并返回
    return response.choices[0].message.content

# 使用示例(取消注释后即可运行):
# result = analyze_image("screenshot.png", "这张图片中有什么内容?")
# print(result)

这段代码的关键在于 content 字段——它不再是一个纯文本字符串,而是一个列表,列表中可以混合 text 类型和 image_url 类型的元素。这就是"多模态输入"在API层面的体现:文本和图片在同一个消息中传给模型,模型会综合两者进行理解和回复。

一个实用技巧:如果你需要分析多张图片,只需要在 content 列表中添加多个 image_url 类型的元素即可。模型会综合考虑所有图片的信息来回答问题,比如"比较这两张图的差异"。此外,如果你不想用base64编码本地图片,也可以先将图片上传到某个可公开访问的URL,然后直接在 image_url.url 中传入该URL,API会自动下载并处理。

示例2:使用HuggingFace加载开源多模态模型

python
# 导入 Qwen2-VL 模型类和处理器
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
# 导入 Qwen-VL 专用的视觉信息处理工具
from qwen_vl_utils import process_vision_info
# 导入 PyTorch
import torch

# 第一步:加载 Qwen2-VL-7B 指令模型
# torch.bfloat16: 使用半精度浮点数,大幅减少显存占用
# device_map="auto": 自动将模型分布到可用的 GPU 上
model = Qwen2VLForConditionalGeneration.from_pretrained(
    "Qwen/Qwen2-VL-7B-Instruct",
    torch_dtype=torch.bfloat16,
    device_map="auto"
)

# 加载处理器:负责将文本和图片转换为模型能接受的输入张量格式
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")

# 第二步:准备多模态对话消息
messages = [
    {
        "role": "user",
        "content": [
            # 图片输入:可以是本地路径或 URL
            {"type": "image", "image": "https://example.com/image.jpg"},
            # 文本输入:用户的问题
            {"type": "text", "text": "描述这张图片"}
        ]
    }
]

# 第三步:处理输入
# 用处理器将消息列表转为模型输入文本(应用聊天模板,添加特殊标记)
text = processor.apply_chat_template(messages, tokenize=False)
# 提取消息中的图片和视频信息(下载图片、提取视频帧等)
image_inputs, video_inputs = process_vision_info(messages)
# 将文本、图片、视频统一处理为模型可接受的张量
inputs = processor(
    text=[text],
    images=image_inputs,
    videos=video_inputs,
    return_tensors="pt"        # 返回 PyTorch 张量格式
).to(model.device)             # 将所有输入张量移到模型所在的设备上

# 第四步:生成回复
# max_new_tokens=512: 最多生成 512 个新 token
generated_ids = model.generate(**inputs, max_new_tokens=512)

# 第五步:解码输出
# generated_ids 包含输入和输出两部分,需要切片取出新生成的部分
# inputs.input_ids.shape[1] 是输入的长度,切片 [冒号, 该长度:] 取之后的生成部分
output = processor.batch_decode(
    generated_ids[:, inputs.input_ids.shape[1]:],  # 只取生成部分,去掉输入
    skip_special_tokens=True   # 跳过特殊 token(如 <pad>, <eos> 等)
)[0]
print(output)

这段代码展示了开源多模态模型的完整调用流程:加载模型 → 准备消息 → 处理输入 → 生成 → 解码。与OpenAI API相比,使用开源模型需要自己处理更多细节(如显存管理、输入预处理、设备迁移),但好处是可以完全掌控模型、数据不离开本地、还能根据需求进行微调定制。

两个示例虽然调用的模型不同,但核心逻辑是相通的:都是把图片和文本组合成一条多模态消息,交给模型处理,然后获取文本回复。 理解了这个模式,就掌握了使用多模态模型的基本方法。

在实际项目中,选择闭源API还是开源模型,通常取决于以下几个因素:数据隐私要求(敏感数据不能传给第三方API)、成本预算(API按次计费,开源模型需GPU硬件)、定制化需求(是否需要微调模型)、以及团队的技术能力(开源模型部署需要更多工程投入)。对于学习和原型验证,推荐先用闭源API快速跑通流程;对于生产部署,再评估是否切换到开源方案。


2.6.11 本节小结

本节从"为什么需要多模态"出发,系统介绍了多模态模型的基本概念和核心技术:

  • 多模态模型扩展了语言模型的"感官",让它像人有五官一样,能处理图像、音频、视频等多种信息形式,而不再局限于文字。
  • 视觉-语言模型(VLM) 的核心架构是"视觉编码器 + 连接器 + 语言模型"三段式。视觉编码器(ViT、CLIP、SigLIP)把图片变成一串特征token,连接器(MLP、Q-Former)把视觉特征"翻译"成语言模型能接受的格式,语言模型最终完成推理和生成。
  • 拼接式与原生多模态是当前两种主要技术路线。拼接式模块化、灵活、训练成本低;原生多模态跨模态理解更深入、推理更高效。GPT-4o和Gemini代表原生路线,LLaVA和BLIP-2代表拼接路线。
  • 训练方法通常分两阶段:先预训练对齐(让视觉和语言"对上话"),再指令微调(让模型学会按指令完成多模态任务)。
  • 音频模态以Whisper为代表,通过将音频转为mel频谱图再用Transformer处理,实现了强大的多语言语音识别能力。
  • 多模态Agent在UI自动化、文档处理、视频监控、医疗诊断、自动驾驶等领域前景广阔,是未来Agent应用的重要方向。
  • 常见误区包括将"多模态"等同于"能生成图片"、误判GPT-4V为原生多模态、盲目认为多模态一定优于纯文本模型等,需要在实际选型中谨慎辨别。

启后

回顾整个第二章,我们从最基础的"什么是大语言模型"出发,依次了解了Transformer架构、tokenization与分词、模型训练流程、上下文窗口、多模态模型。这些知识让我们理解了模型"是什么"以及"能做什么"。

但知道原理只是起点。在实际开发中,你会发现一个普遍现象:同样一个GPT-4o,有人能用它完成复杂的分析任务、写出精妙的代码,有人却觉得它"答非所问""不够聪明"。差距往往不在模型本身,而在"怎么问"。如何设计有效的提示,让模型准确理解你的意图并给出高质量回复?如何通过结构化的表达方式,把模糊的需求转化为模型能精确执行的任务描述?从理解模型原理,到学会和模型高效对话——这就是第3章"提示工程"要回答的问题。我们即将从理论走向更偏实战的领域。

提示工程不需要GPU,不需要训练模型,只需要你、一个文本编辑器和一个API密钥。但它可能是整个AI开发流程中投入产出比最高的一环——一句好的提示词,可能比你花数天微调模型的效果还好。准备好了吗?让我们进入第3章。


参考资料

  1. LLaVA: Visual Instruction Tuning (Liu et al., 2023) - 开源多模态模型标杆
    https://arxiv.org/abs/2304.08485

  2. BLIP-2: Bootstrapping Language-Image Pre-training (Li et al., 2023)
    https://arxiv.org/abs/2301.12597

  3. Qwen2-VL 技术报告
    https://arxiv.org/abs/2409.12191

  4. GPT-4V(ision) System Card (OpenAI, 2023)
    https://cdn.openai.com/papers/GPTV_System_Card.pdf

  5. InternVL 2.0 - 开源多模态模型
    https://internvl.github.io/blog/2024-07-02-InternVL-2.0/