多模态大模型技术入门:让 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 范式CLIPContrastive 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, keepdimTrue) return features def encode_text(self, text): features self.text_model(text) features self.text_projection(features) features features / features.norm(dim-1, keepdimTrue) 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 架构LLaVALarge Language and Vision Assistant是开源多模态模型的代表图像 → Vision Encoder ( CLIP ) → Linear Projection → LLM ↑ 文本 → Tokenizer → LLM → 输出 │关键组件Vision Encoder使用预训练的 CLIP ViTProjection将图像特征映射到 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, labelsNone): # 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_embedscombined_embeddings, labelslabels ) return outputs主流多模态模型GPT-4VOpenAI 的 GPT-4 with Vision 能够理解图片内容并回答问题分析图表和数据阅读文档和截图识别手写内容使用方式from openai import OpenAI client OpenAI() response client.chat.completions.create( modelgpt-4-vision-preview, messages[ { role: user, content: [ {type: text, text: 描述这张图片}, { type: image_url, image_url: {url: https://example.com/image.jpg} } ] } ], max_tokens300 )Claude 3Anthropic 的 Claude 3 系列Haiku、Sonnet、Opus都具有视觉能力支持高达 200K 上下文优秀的图表理解能力准确的文本识别OCR开源多模态模型模型参数量特点LLaVA 1.57B/13B开源先驱效果好CogVLM17B国产优秀模型Qwen-VL7B/14B阿里开源支持中文InternVL20B腾讯开源对标 GPT-4VMiniGPT-47B轻量级多模态BakLLaVA7BMistral LLaVAHuggingFace 多模态实战使用 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_dtypetorch.float16, device_mapauto ) # 准备输入 prompt 描述这张图片的内容 image_url https://example.com/image.jpg image Image.open(requests.get(image_url, streamTrue).raw) inputs processor( textprompt, imagesimage, return_tensorspt ).to(cuda) # 生成 generate_ids model.generate( **inputs, max_length200 ) output processor.batch_decode( generate_ids, skip_special_tokensTrue )[0] print(output)微调多模态模型from peft import LoraConfig, get_peft_model from transformers import TrainingArguments, Trainer # 配置 LoRA lora_config LoraConfig( r8, lora_alpha16, target_modules[q_proj, v_proj, mlp.gate_proj, mlp.up_proj], lora_dropout0.05, biasnone ) # 应用 LoRA model get_peft_model(model, lora_config) # 训练配置 training_args TrainingArguments( output_dir./output, num_train_epochs3, per_device_train_batch_size4, gradient_accumulation_steps4, learning_rate2e-4, fp16True, logging_steps10, ) trainer Trainer( modelmodel, argstraining_args, train_datasettrain_dataset, data_collatordata_collator, ) trainer.train()多模态应用场景文档理解def analyze_document(image_path: str) - dict: 分析文档图片 prompt 请分析这张文档图片提取以下信息 1. 文档类型发票、合同、报告等 2. 关键信息日期、金额、签名等 3. 文档的主要内容摘要 以结构化 JSON 格式输出 image Image.open(image_path) inputs processor( textprompt, imagesimage, return_tensorspt ).to(cuda) outputs model.generate(**inputs, max_length500) result processor.decode(outputs[0], skip_special_tokensTrue) 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( textprompt, imagesimage, return_tensorspt ).to(cuda) outputs model.generate(**inputs) return processor.decode(outputs[0], skip_special_tokensTrue)多模态技术挑战幻觉问题多模态模型有时会生成与图片内容不符的描述。缓解方法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 提供了统一的多模态 APILoRA 等技术可以用于多模态模型的微调多模态技术仍在快速发展中期待看到更多创新应用。