🖼️ 前置依赖:掌握基础 LLM API 调用与 Prompt 工程(LLM API 基础指南)。
1. 为什么视觉理解是 LLM 的下一个战场?
人类 80% 的信息通过视觉获取。在模型能"看懂"之前,AI 对现实世界的理解永远是残缺的。2024-2025 年的突破:
- GPT-4o:原生多模态,延迟低至 200ms,看图说话流畅如对话
- Claude 3.5 Sonnet:视觉推理能力大幅提升,能看懂复杂图表和 UI
- Gemini 1.5 Pro:百万级 token 上下文,支持视频多帧理解
- Qwen-VL / Llava:开源替代,本地运行 privacy-first
2. 视觉理解的底层架构
输入图像
│
▼
图像编码器 (ViT / CLIP Vision Encoder)
│
▼ 输出: Patch 嵌入向量
视觉-语言投影层 (Projection / Q-Former / Perceiver Resampler)
│
▼ 输出: 与 LLM 词嵌入同维度的视觉 token
LLM 主干 (Decoder-only Transformer)
│
▼
文本输出
2.1 图像编码器
| 架构 | 代表模型 | 特点 |
|---|---|---|
| ViT | GPT-4o, Gemini | 纯视觉 Transformer,直接将图像切分为 patch |
| CLIP | Llava, Qwen-VL | 视觉-语言预训练,强大的图文对齐能力 |
| SAM | 分割专用 | 像素级理解,用于细粒度定位 |
2.2 分辨率策略
分辨率直接影响成本和精度:
| 策略 | 分辨率 | 适用场景 | token 成本 |
|---|---|---|---|
| 低分辨率 | 512×512 | 物体识别、场景分类 | ~256 tokens |
| 标准分辨率 | 1024×1024 | OCR、UI 分析、图表 | ~1024 tokens |
| 高分辨率 | 2048+ | 细节检查、医学影像 | ~4K+ tokens |
| 多分辨率切分 | 原图 + 局部 crop | 高密度图表、长截图 | 可变 |
3. 五大模型 API 对比
| 能力 | GPT-4o | Claude 3.5 | Gemini 1.5 Pro | Qwen-VL-Max | Llava 1.6 |
|---|---|---|---|---|---|
| 图像理解 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| OCR 准确度 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ |
| 图表分析 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| UI 理解 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐ |
| 多图对比 | ✅ | ✅ | ✅ | ✅ | ⚠️ |
| 中文 OCR | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐ |
| API 成本/1K图像 | $0.005 | $0.003 | $0.0015 | $0.001 | 免费(本地) |
4. 四大场景实战代码
4.1 视觉问答(VQA)
from openai import OpenAI
import base64
client = OpenAI()
def encode_image(image_path):
with open(image_path, "rb") as f:
return base64.b64encode(f.read()).decode("utf-8")
image_b64 = encode_image("./cat.jpg")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有什么动物?它在做什么?"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_b64}",
"detail": "auto", # auto / low / high
},
},
],
}
],
max_tokens=300,
)
print(response.choices[0].message.content)
4.2 OCR 与表格提取
def extract_text_from_image(image_path):
"""从图片中提取结构化文本"""
image_b64 = encode_image(image_path)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": """请从这张图片中提取所有文本内容。
如果是表格,请输出 Markdown 格式。
如果是发票/票据,请提取:日期、金额、商户名称、商品列表。"""
},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_b64}"},
},
],
}
],
)
return response.choices[0].message.content
4.3 图表分析
def analyze_chart(image_path):
"""分析数据图表"""
image_b64 = encode_image(image_path)
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": """分析这张图表:
1. 图表类型和数据维度
2. 关键趋势和异常点(附具体数值)
3. 可能的数据洞察
4. 建议的可视化改进"""
},
{
"type": "image_url",
"image_url": {"url": f"data:image/jpeg;base64,{image_b64}"},
},
],
}
],
)
return response.choices[0].message.content
4.4 UI 自动化(视觉定位)
from playwright.sync_api import sync_playwright
def ui_agent(task: str, screenshot_func):
"""通过视觉理解完成 UI 任务"""
max_steps = 10
for step in range(max_steps):
screenshot = screenshot_func()
b64 = base64.b64encode(screenshot).decode()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": f"""当前网页截图。目标:{task}
请按以下格式回复:
分析:描述当前页面状态
行动:click(x,y) / type(x,y,"text") / scroll(up/down) / done
坐标基于 1920x1080 分辨率。"""
},
{
"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{b64}"},
},
],
}
],
)
action = response.choices[0].message.content
print(f"Step {step}: {action}")
if "done" in action.lower():
break
# 执行 action(需接入 Playwright)
execute_action(action)
# 使用 Playwright 截图
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
def screenshot():
return page.screenshot()
ui_agent("帮我登录并查看订单列表", screenshot)
5. 开源方案:本地运行视觉模型
5.1 使用 Ollama 运行 Llava
# 安装 Ollama
brew install ollama # macOS
curl -fsSL https://ollama.com/install.sh | sh # Linux
# 拉取 Llava 模型
ollama pull llava:34b
# 运行
ollama run llava:34b
5.2 Python 调用
import ollama
response = ollama.chat(
model="llava:34b",
messages=[{
"role": "user",
"content": "描述这张图片",
"images": ["./photo.jpg"]
}]
)
print(response["message"]["content"])
5.3 使用 transformers + Qwen-VL
from transformers import Qwen2VLForConditionalGeneration, AutoProcessor
from PIL import Image
import torch
model = Qwen2VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen2-VL-7B-Instruct",
torch_dtype=torch.float16,
device_map="auto",
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen2-VL-7B-Instruct")
image = Image.open("./chart.png")
conversation = [
{
"role": "user",
"content": [
{"type": "image"},
{"type": "text", "text": "分析这张图表的关键趋势"},
],
}
]
text_prompt = processor.apply_chat_template(conversation, add_generation_prompt=True)
inputs = processor(text=[text_prompt], images=[image], return_tensors="pt").to(model.device)
output_ids = model.generate(**inputs, max_new_tokens=512)
response = processor.batch_decode(output_ids, skip_special_tokens=True)[0]
print(response)
6. 性能优化策略
6.1 分辨率选择
def smart_resize(image_path, max_pixels=512 * 768):
"""智能调整图像大小,控制 token 成本"""
from PIL import Image
img = Image.open(image_path)
current_pixels = img.width * img.height
if current_pixels > max_pixels:
ratio = (max_pixels / current_pixels) ** 0.5
new_size = (int(img.width * ratio), int(img.height * ratio))
img = img.resize(new_size, Image.LANCZOS)
return img
6.2 多图拼接
def create_image_grid(image_paths, grid_size=(2, 2)):
"""将多张图片拼接为一张,减少 API 调用次数"""
from PIL import Image
images = [Image.open(p) for p in image_paths]
w, h = images[0].size
grid_w, grid_h = grid_size
grid = Image.new("RGB", (w * grid_w, h * grid_h))
for idx, img in enumerate(images):
x = (idx % grid_w) * w
y = (idx // grid_w) * h
grid.paste(img.resize((w, h)), (x, y))
return grid
7. 成本估算
| 场景 | 月均调用 | 单调用 token | API 成本 (GPT-4o) | 开源成本 |
|---|---|---|---|---|
| 发票 OCR | 1000 次 | 2K | $10 | 电费 ~$5 |
| 产品图描述 | 5000 次 | 1K | $25 | 电费 ~$20 |
| UI 自动化 | 10K 次 | 3K | $150 | 电费 ~$50 |
| 医学影像分析 | 500 次 | 8K | $40 | 电费 ~$15 |
总结选型建议
| 预算/需求 | 推荐方案 | 理由 |
|---|---|---|
| 最低成本 + 隐私优先 | Qwen-VL 本地 | 中文场景最强 |
| 最快上线 + 高质量 | GPT-4o / Claude 3.5 | 准确率最高、延迟最低 |
| 批量处理 + 中等质量 | Gemini 1.5 Pro | 百万上下文、单价最低 |
| 研究/定制化 | Llava + LoRA 微调 | 完全可控、可微调 |
📂 继续阅读:
- 多模态视频分析 — 视频理解、时序建模、关键帧提取
- 多模态语音合成与识别 — ASR / TTS / 实时语音
- 用 LLM 做 UI 自动化 — 文生图 / 视频生成
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。
「llm」更多文章
模型上下文协议(MCP)完整指南:从 Anthropic 标准到 AI 应用互操作性革命
系统拆解 Model Context Protocol(MCP)的设计哲学、协议分层和核心概念:Resources、Prompts、Tools、Sampling。 涵盖 MCP 与 Function Calling、插件系统、API 网关的区别与互补关系。 附架构全景图、协议消息格式详解,以及 MCP 在 Claude Desktop、Cline、Continue 等客户端中的实际运行机制。
多模态语音合成与识别:从 Whisper + TTS 到实时语音交互的 LLM 实践
系统拆解 LLM 语音技术栈:语音识别(ASR / Whisper)、语音合成(TTS / ElevenLabs / Coqui TTS)、语音活动检测(VAD)。 覆盖实时语音交互架构(流式识别 + 流式合成 + 打断机制)、多语言语音克隆、以及语音 Agent 的安全与隐私考量。 附完整的 Whisper API 集成、本地 TTS 部署、WebRTC 实时语音管道代码。
多模态视频分析:从关键帧抽取到时序理解的 LLM 视频理解实战
系统拆解 LLM 视频理解的技术路径:关键帧提取、时序编码(Temporal Modeling)、视觉-时序联合推理。 覆盖 Gemini 1.5 Pro(原生视频)、GPT-4o(帧序列)、Claude(关键帧截图)、Video-LLaMA 四种实现方式。 附视频摘要生成、动作识别、异常检测、教育内容分析四个场景的完整代码与成本优化策略。