多模态大模型技术入门:让 AI 看见世界
多模态大模型技术入门:让 AI 看见世界
前言
人类感知世界的方式是多模态的——我们能看到图像、听到声音、读到文字。多模态大模型(Multimodal LLM)正是让 AI 拥有类似能力的关键技术。从 GPT-4V 到 Claude 3,从开源的 LLaVA 到 CogVim,多模态大模型正在快速改变 AI 的应用格局。
我最近在一个项目中集成了多模态能力,让 AI 能够理解和分析用户上传的图片。这段经历让我对多模态技术有了更深入的理解。今天分享一些多模态大模型的基础知识和实战经验。
什么是多模态
模态的定义
模态(Modality)指的是信息的不同形式或来源。常见的模态包括:
- 文本(Text):文字信息
- 图像(Image):视觉信息
- 音频(Audio):声音信息
- 视频(Video):时空连续的视觉和声音信息
- 语音(Speech):口语信息
多模态学习的目标
多模态学习旨在构建能够处理和关联多种模态信息的 AI 系统。核心挑战包括:
- 对齐(Alignment):不同模态的信息如何对应
- 融合(Fusion):如何整合不同模态的信息
- 翻译(Translation):如何从一种模态转换到另一种
多模态模型架构
经典架构:Encoder-Decoder
文本 → Text Encoder → Feature → Decoder → 输出 ↑ 图像 → Vision Encoder ───────────┘这是最直观的架构:各模态分别编码,然后在某个层面融合,共同输入解码器生成输出。
CLIP 范式
CLIP(Contrastive Language-Image Pre-training)开创了图文对齐的预训练范式:
import torch import torch.nn as nn class CLIP(nn.Module): def __init__(self, vision_model, text_model): super().__init__() self.vision_model = vision_model self.text_model = text_model self.vision_projection = nn.Linear(vision_dim, embed_dim) self.text_projection = nn.Linear(text_dim, embed_dim) self.temperature = nn.Parameter(torch.ones([]) * 2.6592) def encode_image(self, image): features = self.vision_model(image) features = self.vision_projection(features) features = features / features.norm(dim=-1, keepdim=True) return features def encode_text(self, text): features = self.text_model(text) features = self.text_projection(features) features = features / features.norm(dim=-1, keepdim=True) return features def forward(self, images, texts): image_features = self.encode_image(images) text_features = self.encode_text(texts) # 计算相似度 logit_scale = self.temperature.exp() logits_per_image = logit_scale * image_features @ text_features.t() logits_per_text = logit_scale * text_features @ image_features.t() return logits_per_image, logits_per_textLLaVA 架构
LLaVA(Large Language and Vision Assistant)是开源多模态模型的代表:
图像 → Vision Encoder ( CLIP ) → Linear Projection → LLM ↑ 文本 → Tokenizer → LLM → 输出 │关键组件:
- Vision Encoder:使用预训练的 CLIP ViT
- Projection:将图像特征映射到 LLM 的输入空间
- LLM:大语言模型,负责理解和生成
class LLaVA(nn.Module): def __init__(self, vision_model, visionProjection, llm, tokenizer): super().__init__() self.vision_model = vision_model self.vision_projection = visionProjection self.llm = llm self.tokenizer = tokenizer def forward(self, images, input_ids, labels=None): # 1. 图像编码 image_features = self.vision_model(images) # 2. 投影到 LLM 空间 image_embeddings = self.vision_projection(image_features) # 3. 获取文本 embeddings text_embeddings = self.llm.get_input_embeddings()(input_ids) # 4. 融合图像和文本 # 在 [IMG] token 位置替换为图像 embeddings combined_embeddings = self._combine_embeddings( text_embeddings, image_embeddings ) # 5. LLM 前向传播 outputs = self.llm( inputs_embeds=combined_embeddings, labels=labels ) return outputs主流多模态模型
GPT-4V
OpenAI 的 GPT-4 with Vision 能够:
- 理解图片内容并回答问题
- 分析图表和数据
- 阅读文档和截图
- 识别手写内容
使用方式:
from openai import OpenAI client = OpenAI() response = client.chat.completions.create( model="gpt-4-vision-preview", messages=[ { "role": "user", "content": [ {"type": "text", "text": "描述这张图片"}, { "type": "image_url", "image_url": {"url": "https://example.com/image.jpg"} } ] } ], max_tokens=300 )Claude 3
Anthropic 的 Claude 3 系列(Haiku、Sonnet、Opus)都具有视觉能力:
- 支持高达 200K 上下文
- 优秀的图表理解能力
- 准确的文本识别(OCR)
开源多模态模型
| 模型 | 参数量 | 特点 |
|---|---|---|
| LLaVA 1.5 | 7B/13B | 开源先驱,效果好 |
| CogVLM | 17B | 国产优秀模型 |
| Qwen-VL | 7B/14B | 阿里开源,支持中文 |
| InternVL | 20B | 腾讯开源,对标 GPT-4V |
| MiniGPT-4 | 7B | 轻量级多模态 |
| BakLLaVA | 7B | Mistral + LLaVA |
HuggingFace 多模态实战
使用 Transformers 加载多模态模型
from transformers import AutoProcessor, AutoModelForCausalLM from PIL import Image import requests # 加载模型和处理器 model_name = "llava-hf/llava-1.5-7b-hf" processor = AutoProcessor.from_pretrained(model_name) model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16, device_map="auto" ) # 准备输入 prompt = "描述这张图片的内容" image_url = "https://example.com/image.jpg" image = Image.open(requests.get(image_url, stream=True).raw) inputs = processor( text=prompt, images=image, return_tensors="pt" ).to("cuda") # 生成 generate_ids = model.generate( **inputs, max_length=200 ) output = processor.batch_decode( generate_ids, skip_special_tokens=True )[0] print(output)微调多模态模型
from peft import LoraConfig, get_peft_model from transformers import TrainingArguments, Trainer # 配置 LoRA lora_config = LoraConfig( r=8, lora_alpha=16, target_modules=["q_proj", "v_proj", "mlp.gate_proj", "mlp.up_proj"], lora_dropout=0.05, bias="none" ) # 应用 LoRA model = get_peft_model(model, lora_config) # 训练配置 training_args = TrainingArguments( output_dir="./output", num_train_epochs=3, per_device_train_batch_size=4, gradient_accumulation_steps=4, learning_rate=2e-4, fp16=True, logging_steps=10, ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, data_collator=data_collator, ) trainer.train()多模态应用场景
文档理解
def analyze_document(image_path: str) -> dict: """分析文档图片""" prompt = """请分析这张文档图片,提取以下信息: 1. 文档类型(发票、合同、报告等) 2. 关键信息(日期、金额、签名等) 3. 文档的主要内容摘要 以结构化 JSON 格式输出:""" image = Image.open(image_path) inputs = processor( text=prompt, images=image, return_tensors="pt" ).to("cuda") outputs = model.generate(**inputs, max_length=500) result = processor.decode(outputs[0], skip_special_tokens=True) return parse_json_response(result)图表分析
def analyze_chart(image_path: str) -> dict: """分析图表""" prompt = """这张图表展示的是什么数据? 请提取: 1. 图表类型(折线图、柱状图、饼图等) 2. X 轴和 Y 轴表示的内容 3. 主要趋势和发现 4. 关键数据点(最大值、最小值等)""" # ... 类似实现视觉问答
def visual_qa(image_path: str, question: str) -> str: """基于图片回答问题""" prompt = f"图片显示了什么?\n\n问题:{question}" image = Image.open(image_path) inputs = processor( text=prompt, images=image, return_tensors="pt" ).to("cuda") outputs = model.generate(**inputs) return processor.decode(outputs[0], skip_special_tokens=True)多模态技术挑战
幻觉问题
多模态模型有时会生成与图片内容不符的描述。缓解方法:
def reduce_hallucination(image_path: str, prompt: str) -> str: """减少多模态幻觉""" # 使用更严格的 prompt strict_prompt = f"""{prompt} 重要提醒: 1. 只描述图片中确实存在的内容 2. 如果不确定,请说"图片中看不清..." 3. 不要编造任何信息 回答:""" # ... 实现长文本输出
多模态模型在生成长文本时可能出现重复或偏离。解决方案包括:
- 限制 max_length
- 使用更强的解码策略(Beam Search、Diverse Beam)
- 后处理过滤重复内容
总结
多模态大模型代表了 AI 发展的重要方向。通过让模型同时理解和处理多种模态的信息,我们能够构建更加智能和实用的应用。
关键要点:
- CLIP 范式是多模态学习的基础
- LLaVA 等开源模型让多模态更加可及
- HuggingFace Transformers 提供了统一的多模态 API
- LoRA 等技术可以用于多模态模型的微调
多模态技术仍在快速发展中,期待看到更多创新应用。
