第3章 基础概念:理解LLM与多模态模型区别,CLIP嵌入原理
刚接触多模态扩展的同学,最容易困惑的一个问题是:大语言模型(LLM)跟多模态模型(像LLaVA)到底差在哪儿? 我刚开始搞这个方向时也犯过迷糊——以为只要把图片塞给LLM就能看懂,结果发现根本不是这么回事。
简单说,LLM是“文本专精”的,多模态模型是在LLM基础上加了“视觉理解”能力。而连接文本和图像的那座桥,就是CLIP。这一章咱们把这三个概念彻底说透。
3.1 大语言模型(LLM)的本质
LLM的核心是一条流水线:文本输入 → 分词(Tokenization)→ 嵌入(Embedding)→ Transformer计算 → 文本输出。它只认识文本,压根没见过图像。
- 输入只能是文本:你给它一张图片的二进制流,它只会把它当成乱码处理。
- 输出也是文本:生成回答、写代码、做摘要……全是文字。
- 内部是Token序列:一个字或子词被映射成一个向量,然后做自注意力计算。
一个小实验:把一张猫的JPEG文件用
open().read()读成字节串,直接传给LLM,它会回复“无法理解您输入的内容”。我当年真这么试过,结果白费了几百美元API调用费。
3.2 多模态模型(如LLaVA)的扩展
多模态模型=LLM核心 + 视觉编码器 + 特征对齐模块。以LLaVA为例,流程是这样的:
- 视觉编码:用CLIP的ViT(Vision Transformer)把图像切成patch,提取视觉特征。
- 投影映射:一个简单的线性层或小型MLP,把视觉特征投影到LLM的嵌入空间。
- 融合输入:将投影后的视觉特征当作“特殊的文本Token”,跟用户输入的文本Token拼在一起喂给LLM。
说白了,多模态模型不是让LLM“看懂”图像,而是把图像翻译成了LLM能理解的向量语言。这个翻译官,就是CLIP。
注意:LLaVA这类模型在推理时,图像是一次性被编码的,不是逐帧扫描。你给它一张照片,它就生成一组视觉Token,跟文本Token数量相当(通常是256或576个)。我试过给一张高分辨率图,结果Token数爆炸,显存直接撑爆……后来才知道要先缩放到固定分辨率。
3.3 CLIP嵌入原理:让图像和文本对齐
CLIP的核心思想听起来很朴素:让匹配的图像和文本在向量空间里靠近,不匹配的远离。它用对比学习(Contrastive Learning)做到了这一点。
- 双编码器结构:一个文本编码器(通常是Transformer),一个图像编码器(通常是ViT)。
- 训练数据:4亿个(图像,标题)对,从互联网收集的。
- 损失函数:InfoNCE,强迫模型把正样本对的cos相似度拉高,负样本对的压低。
为什么用CLIP做桥梁?因为它产生的图像嵌入和文本嵌入在同一空间里,可以直接比相似度。LLaVA利用CLIP的图像编码器部分,把图像嵌入送到投影层,再喂给LLM。
一个关键概念:CLIP的嵌入维度是固定的(ViT-B/32是512维,ViT-L/14是768维)。这个向量就是图像的“语义指纹”,LLM的文本嵌入也是类似维度。两个空间对齐了,融合才可能。
3.4 区别对比:LLM vs 多模态模型
| 维度 | 纯LLM | 多模态模型(如LLaVA) |
|---|---|---|
| 输入类型 | 仅文本 | 文本 + 图像(支持其他模态如音频) |
| 视觉理解 | 完全不具备 | 通过CLIP/ViT编码图像内容 |
| 输出 | 文本 | 文本(可描述图像、数字等) |
| 是否需要CLIP | 不需要 | 必须依赖CLIP预训练权重 |
| 典型场景 | 对话、代码生成、翻译 | 图像描述、图文问答、图文检索 |
3.5 实践中如何选型
我个人的经验是:
- 如果你的任务只需要纯文本,别碰多模态——省显存、速度快、精度更稳。我曾经为了炫技硬上LLaVA做文本分类,结果反而引入图像噪声,准确率掉了3个点。
- 如果确实需要看图(比如发票识别、产品图理解),优先考虑轻量级CLIP + 小LLM组合,而不是直接上70B的大模型。在Llama CPP里,你可以只用
clip_model_load()加载CLIP,不加载LLM,单独做图像特征提取。 - 多模态模型不是万能的:对OCR(文字识别)、细粒度分类、长尾视觉概念仍然弱。我碰过一张模糊的月饼盒图片,LLaVA愣是把它认成了“圆形金属工具”……
避坑指南:我曾经在图和文本的Token拼接顺序上踩过坑——把图像Token放在文本Token前面,LLM会倾向于优先描述图像;反过来放在后面,模型会先回复文本问题,再带一句“图片里是……”。具体用哪种顺序,要看你下游任务的需求。建议在实践时用
llava_eval_image_embed()接口时,手动调整embed_position参数试几次。