多模态提示与视觉理解
GPT-4o、Claude 3.5、Gemini 等模型已支持图文混合输入。多模态 Prompt 工程不是简单的"看图说话",而是图文协同引导模型完成复杂任务。
多模态提示流程
graph TB
A[输入] --> B{类型判断}
B --> C[纯文本]
B --> D[图文混合]
B --> E[多图比较]
D --> F[图片描述
指令] D --> G[图片分析
推理] D --> H[图片提取
结构化] E --> I[差异对比] E --> J[批量处理] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:2px style D fill:#e3f2fd,stroke:#1565c0,stroke-width:2px style E fill:#fff9c4,stroke:#f9a825,stroke-width:2px
指令] D --> G[图片分析
推理] D --> H[图片提取
结构化] E --> I[差异对比] E --> J[批量处理] style A fill:#ede7f6,stroke:#5e35b1,stroke-width:2px style D fill:#e3f2fd,stroke:#1565c0,stroke-width:2px style E fill:#fff9c4,stroke:#f9a825,stroke-width:2px
多模态 Prompt 构建器
from dataclasses import dataclass, field
from enum import Enum
class ImageDetail(Enum):
LOW = "low" # 快速概览,65 tokens
HIGH = "high" # 详细分析,最多 1105 tokens
AUTO = "auto" # 模型自动选择
@dataclass
class ImageInput:
"""图片输入"""
source: str # URL 或 base64
detail: ImageDetail = ImageDetail.AUTO
description: str = "" # 图片说明
@dataclass
class MultimodalPrompt:
"""多模态 Prompt 构建器"""
system: str = ""
text_parts: list[str] = field(default_factory=list)
images: list[ImageInput] = field(default_factory=list)
def add_text(self, text: str) -> "MultimodalPrompt":
self.text_parts.append(text)
return self
def add_image(
self, source: str, detail: ImageDetail = ImageDetail.AUTO,
description: str = ""
) -> "MultimodalPrompt":
self.images.append(ImageInput(source, detail, description))
return self
def to_messages(self) -> list[dict]:
"""生成 OpenAI 兼容的消息格式"""
messages = []
if self.system:
messages.append({"role": "system", "content": self.system})
content = []
for text in self.text_parts:
content.append({"type": "text", "text": text})
for img in self.images:
content.append({
"type": "image_url",
"image_url": {
"url": img.source,
"detail": img.detail.value,
},
})
messages.append({"role": "user", "content": content})
return messages
@property
def estimated_tokens(self) -> int:
"""估算 token 消耗"""
text_tokens = sum(len(t) // 2 for t in self.text_parts)
image_tokens = sum(
65 if img.detail == ImageDetail.LOW else 1105
for img in self.images
)
return text_tokens + image_tokens
# 示例:UI 截图分析
prompt = (
MultimodalPrompt(system="你是一个资深 UI/UX 审查专家。")
.add_text("请分析这个登录页面的设计,从以下维度评分(1-10):")
.add_text("1. 视觉层次\n2. 可用性\n3. 无障碍\n4. 移动端适配")
.add_image("screenshot.png", ImageDetail.HIGH, "登录页截图")
.add_text("请以JSON格式输出评分和改进建议。")
)
print(f"图片数: {len(prompt.images)}")
print(f"预估 tokens: {prompt.estimated_tokens}")
多模态任务模式
from dataclasses import dataclass
@dataclass
class VisionTask:
"""视觉任务模板"""
name: str
system_prompt: str
user_template: str
detail: ImageDetail
def format_prompt(self, **kwargs) -> str:
return self.user_template.format(**kwargs)
# 预置任务库
VISION_TASKS = {
# OCR 提取
"ocr": VisionTask(
"文字提取",
"你是OCR专家,精确提取图片中的所有文字。",
"请提取图片中的所有文字,保持原始排版。语言:{language}",
ImageDetail.HIGH,
),
# 图表分析
"chart": VisionTask(
"图表分析",
"你是数据分析师,擅长解读各类图表。",
"请分析这张{chart_type},包括:\n1. 数据趋势\n2. 关键数据点\n3. 结论",
ImageDetail.HIGH,
),
# 产品识别
"product": VisionTask(
"产品识别",
"你是电商产品专家。",
"识别图片中的产品,输出:\n- 品类\n- 品牌(如可识别)\n- 颜色/尺寸\n- 预估价格范围({currency})",
ImageDetail.AUTO,
),
# 对比分析
"compare": VisionTask(
"图片对比",
"你是视觉比较专家,请仔细分析两张图的异同。",
"对比这两张图片,列出:\n1. 相同点\n2. 不同点\n3. {focus_area}方面的差异",
ImageDetail.HIGH,
),
}
# 使用
task = VISION_TASKS["chart"]
prompt = task.format_prompt(chart_type="柱状图")
print(f"任务: {task.name}")
print(f"精度: {task.detail.value}")
print(f"Prompt: {prompt}")
多模态最佳实践
| 实践 | 说明 | 效果 |
|---|---|---|
| 先文字后图片 | Prompt 中先给指令再放图 | 提升理解准确率 |
| 明确指定分析焦点 | "关注左上角的折线图" | 避免遗漏关键区域 |
| 控制 detail 级别 | 概览用 low,细节用 high | 节省 token 成本 |
| 多图标注序号 | "图1是... 图2是..." | 避免混淆 |
| 结构化输出 | 要求 JSON/表格输出 | 便于后续处理 |
| 迭代追问 | 先概览→再细节追问 | 多轮获取深度信息 |
平台多模态能力对比
| 能力 | GPT-4o | Claude 3.5 | Gemini 1.5 | Qwen-VL |
|---|---|---|---|---|
| 图片理解 | ★★★★★ | ★★★★ | ★★★★ | ★★★★ |
| OCR 精度 | ★★★★ | ★★★★★ | ★★★★ | ★★★★ |
| 图表分析 | ★★★★★ | ★★★★ | ★★★★★ | ★★★ |
| 多图比较 | ★★★★ | ★★★★★ | ★★★★ | ★★★ |
| 视频理解 | ❌ | ❌ | ★★★★★ | ★★★ |
| 最大图片数 | 20 | 20 | 3600帧 | 10 |
本章小结
- 图文混合是新常态——顶级模型都已支持多模态输入
- 先文字后图片——让模型带着指令看图比"请看这张图"更有效
- detail 控制成本——low 只消耗 65 tokens,high 消耗 1105 tokens
- 结构化输出——多模态更需要指定输出格式
- 视频理解选 Gemini——目前唯一支持长视频理解的模型
下一章:Prompt 注入防御