什么是多模态 AI
我们之前聊的 LLM 主要处理文本。但人类感知世界不只靠文字——我们看图片、听声音、看视频。多模态 AI (Multimodal AI) 就是能同时理解和处理多种信息形式的 AI 系统。
单模态:
文本 → 模型 → 文本
多模态:
文本 ─┐
图像 ─┤→ 模型 → 文本/图像/音频
音频 ─┘
2023 年 GPT-4V 的发布是一个分水岭。从那以后,主流 LLM 都在快速拥抱多模态能力。
模态的种类
| 模态 | 输入示例 | 输出示例 | 代表模型 |
|---|---|---|---|
| 文本 (Text) | 自然语言、代码 | 回答、翻译、代码 | GPT-4o, Claude |
| 图像 (Vision) | 照片、截图、图表 | 图片描述、分析 | GPT-4o, Claude, Gemini |
| 音频 (Audio) | 语音、音乐 | 转录、翻译 | Whisper, GPT-4o |
| 视频 (Video) | 视频片段 | 内容理解、摘要 | Gemini, GPT-4o |
| 3D/空间 | 点云、3D 模型 | 场景理解 | 研究阶段 |
当前主流模型的多模态能力
| 模型 | 文本 | 图像输入 | 图像生成 | 音频输入 | 音频输出 | 视频 |
|---|---|---|---|---|---|---|
| GPT-4o | 是 | 是 | 是 | 是 | 是 | 是 |
| Claude Sonnet/Opus | 是 | 是 | 否 | 否 | 否 | 否 |
| Gemini 2.0 | 是 | 是 | 是 | 是 | 是 | 是 |
| Llama 3.2 Vision | 是 | 是 | 否 | 否 | 否 | 否 |
视觉模型:AI 如何”看”图片
原理简述
视觉模型处理图片的基本流程:
图片
↓
分割成小块 (Patch),通常 14×14 或 16×16 像素
↓
每个 Patch 转换为一个向量 (类似文本的 Token)
↓
通过 Vision Encoder (通常是 ViT) 提取视觉特征
↓
视觉特征 + 文本 Token 一起送入 LLM
↓
LLM 生成回答
一张 224×224 的图片:
→ 分成 16×16 的 Patch
→ 得到 (224/16)² = 196 个 Patch
→ 每个 Patch 变成一个"视觉 Token"
→ 加上文本 Token 一起处理
这就是为什么图片会消耗大量 Token——一张高分辨率图片可能等于几千个 Token。
Vision Transformer (ViT)
ViT 是目前视觉模型的基础架构。它把 Transformer 的思路从文本搬到了图像:
文本 Transformer: 词 → Token → Embedding → Transformer → 输出
视觉 Transformer: 图片 → Patch → Embedding → Transformer → 输出
核心洞察:图片的 Patch 就像句子中的词,可以用同样的注意力机制来处理。
实战:使用视觉 API
Claude Vision
import anthropic
import base64
client = anthropic.Anthropic()
# 方式 1: 使用 URL
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://example.com/chart.png"
}
},
{
"type": "text",
"text": "请分析这张图表,总结关键数据点"
}
]
}
]
)
print(response.content[0].text)
# 方式 2: 使用 Base64
with open("screenshot.png", "rb") as f:
image_data = base64.standard_b64encode(f.read()).decode("utf-8")
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data
}
},
{
"type": "text",
"text": "这个 UI 截图有什么可以改进的地方?"
}
]
}
]
)
OpenAI Vision
from openai import OpenAI
client = OpenAI()
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "这张图片里有什么?"
},
{
"type": "image_url",
"image_url": {
"url": "https://example.com/photo.jpg",
"detail": "high" # low / high / auto
}
}
]
}
]
)
print(response.choices[0].message.content)
图片 Token 消耗
图片的 Token 消耗取决于分辨率和 detail 设置:
| 设置 | Token 消耗 | 适合场景 |
|---|---|---|
| low (512×512) | ~85 tokens | 快速识别、简单分类 |
| high (最大 2048×2048) | ~765-1105 tokens | 详细分析、OCR、图表 |
| auto | 模型自动选择 | 一般场景 |
音频模型:AI 如何”听”声音
语音识别 (Speech-to-Text)
把语音转换为文字。OpenAI 的 Whisper 是目前最流行的开源方案。
from openai import OpenAI
client = OpenAI()
# 使用 Whisper API
with open("meeting_recording.mp3", "rb") as audio_file:
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=audio_file,
language="zh", # 指定语言可以提高准确率
response_format="verbose_json", # 包含时间戳
)
print(transcript.text)
# 带时间戳的输出
for segment in transcript.segments:
start = segment["start"]
end = segment["end"]
text = segment["text"]
print(f"[{start:.1f}s - {end:.1f}s] {text}")
语音合成 (Text-to-Speech)
把文字转换为语音。
from openai import OpenAI
client = OpenAI()
response = client.audio.speech.create(
model="tts-1", # tts-1 (快) 或 tts-1-hd (高质量)
voice="alloy", # alloy, echo, fable, onyx, nova, shimmer
input="你好,欢迎来到 AI 学习博客!今天我们来聊聊多模态 AI。"
)
# 保存为文件
response.stream_to_file("output.mp3")
实时语音对话
GPT-4o 支持原生的语音输入输出,不需要先转文字再处理:
传统流程: 语音 → STT → 文本 → LLM → 文本 → TTS → 语音
GPT-4o: 语音 → LLM → 语音(端到端,更自然)
这意味着模型能理解语气、情感、停顿等非文字信息,回复也更自然。
视频理解
视频本质上是”图片序列 + 音频”。目前的处理方式主要有两种:
1. 抽帧分析
# 从视频中抽取关键帧,逐帧分析
import cv2
import base64
def extract_frames(video_path, interval_seconds=5):
"""每隔 N 秒抽取一帧"""
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
frames = []
frame_count = 0
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
if frame_count % int(fps * interval_seconds) == 0:
_, buffer = cv2.imencode('.jpg', frame)
base64_frame = base64.b64encode(buffer).decode('utf-8')
frames.append(base64_frame)
frame_count += 1
cap.release()
return frames
# 抽取帧后发送给视觉模型分析
frames = extract_frames("demo_video.mp4", interval_seconds=10)
# 把多帧图片发送给 Claude 或 GPT-4o
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "这些是一个视频的关键帧,请描述视频内容:"},
*[
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": frame
}
}
for frame in frames[:10] # 限制帧数,控制 Token 消耗
]
]
}
]
2. 原生视频理解
Gemini 支持直接上传视频文件进行分析:
import google.generativeai as genai
model = genai.GenerativeModel("gemini-2.0-flash")
# 上传视频
video_file = genai.upload_file("demo_video.mp4")
# 分析视频
response = model.generate_content([
video_file,
"请总结这个视频的主要内容,列出关键时间点"
])
print(response.text)
开发者的实用场景
1. 文档 OCR 与理解
# 不只是 OCR,还能理解文档内容
response = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=2048,
messages=[{
"role": "user",
"content": [
{"type": "image", "source": {"type": "base64", "media_type": "image/png", "data": invoice_image}},
{"type": "text", "text": "请提取这张发票的关键信息,以 JSON 格式返回:发票号、日期、金额、供应商名称"}
]
}]
)
# 输出:
# {
# "invoice_number": "INV-2026-0042",
# "date": "2026-03-10",
# "amount": 15800.00,
# "vendor": "某某科技有限公司"
# }
2. UI 截图分析
# 让 AI 审查 UI 设计
prompt = """分析这个 UI 截图,从以下角度给出建议:
1. 布局合理性
2. 色彩搭配
3. 可访问性 (Accessibility)
4. 用户体验改进点
请具体指出问题位置和改进方案。"""
3. 图表数据提取
# 从图表中提取数据
prompt = """这是一张柱状图,请:
1. 描述图表展示的内容
2. 提取所有数据点
3. 以 CSV 格式输出数据"""
4. 代码截图转代码
# 把代码截图转换为可编辑的代码
prompt = "请把这张截图中的代码完整转录出来,保持原始格式和缩进。"
5. 会议录音摘要
# 转录 + 摘要一步到位
transcript = client.audio.transcriptions.create(
model="whisper-1",
file=open("meeting.mp3", "rb")
)
summary = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "你是一个会议记录助手,请提取关键决策和待办事项。"},
{"role": "user", "content": f"以下是会议录音的转录文本:\n\n{transcript.text}"}
]
)
6. 产品图片分析
# 电商场景:自动生成产品描述
prompt = """看这张产品图片,请生成:
1. 产品标题(20 字以内)
2. 产品描述(100 字)
3. 5 个关键卖点
4. 建议的搜索关键词"""
图像生成
除了理解图像,AI 也能生成图像。
主流图像生成模型
| 模型 | 提供方 | 特点 |
|---|---|---|
| DALL-E 3 | OpenAI | API 集成方便,理解复杂 prompt |
| Midjourney | Midjourney | 艺术质量高,社区活跃 |
| Stable Diffusion | Stability AI | 开源,可本地部署 |
| Flux | Black Forest Labs | 开源新秀,质量优秀 |
使用 DALL-E 3
from openai import OpenAI
client = OpenAI()
response = client.images.generate(
model="dall-e-3",
prompt="一只橘猫坐在笔记本电脑前写代码,赛博朋克风格,霓虹灯光",
size="1024x1024",
quality="hd",
n=1
)
image_url = response.data[0].url
print(f"图片地址: {image_url}")
图像编辑
# GPT-4o 支持图像编辑
response = client.images.edit(
model="dall-e-2",
image=open("original.png", "rb"),
mask=open("mask.png", "rb"), # 标记要编辑的区域
prompt="把背景换成海滩",
size="1024x1024"
)
多模态应用的注意事项
1. Token 成本
图片和音频会消耗大量 Token,注意控制成本:
一张高清图片: ~1000 tokens
一分钟音频转录: ~150 tokens (文本)
一个 10 分钟视频 (每 5 秒一帧): ~120 帧 × 1000 tokens = 120K tokens
优化策略:
- 图片:先压缩再发送,使用 low detail 模式
- 视频:合理设置抽帧间隔
- 音频:先转录为文本再处理
2. 隐私与安全
注意事项:
- 图片中可能包含人脸、车牌等敏感信息
- 音频可能包含个人隐私
- 上传到 API 的数据要注意合规性
- 考虑使用本地模型处理敏感数据
3. 准确性限制
视觉模型目前的局限:
| 任务 | 准确性 | 说明 |
|---|---|---|
| 图片描述 | 高 | 基本能准确描述图片内容 |
| OCR | 中高 | 清晰文字准确率高,手写体较差 |
| 计数 | 中 | 数量多时容易出错 |
| 空间关系 | 中 | ”左边”、“上面”有时会搞混 |
| 细节识别 | 中低 | 小字、模糊区域容易遗漏 |
| 数学公式 | 中 | 复杂公式可能识别错误 |
4. Prompt 技巧
# 好的多模态 prompt
"请仔细观察这张图片的右上角区域,那里有一段小字,请完整转录出来。"
# 不好的 prompt
"看看这张图" # 太模糊,模型不知道你想要什么
给视觉模型的 prompt 要具体:
- 指明关注区域
- 说清楚期望的输出格式
- 提供必要的上下文
未来趋势
1. 原生多模态
从”拼接多个模型”到”一个模型理解所有模态”。GPT-4o 已经在这个方向上迈出了一大步。
2. 实时交互
语音对话、视频通话中的实时 AI 理解和响应。延迟从秒级降到毫秒级。
3. 具身智能
多模态 AI + 机器人 = 能看、能听、能说、能动的 AI。这是多模态的终极形态。
4. 更多模态
触觉、嗅觉、温度……理论上任何可以数字化的感知都可以成为 AI 的输入。
总结
多模态 AI 让我们的应用不再局限于文本。作为开发者,现在就可以利用这些能力:
- 用 Vision API 处理图片、文档、UI 截图
- 用 Speech API 处理语音输入输出
- 用视频分析能力处理视频内容
- 用图像生成能力创建视觉内容
关键是选择合适的模态组合,控制好成本,注意隐私安全。
当 AI 能看、能听、能说的时候,它就不再只是一个”语言模型”,而是一个真正的”智能助手”。多模态是 AI 走向通用智能的必经之路,而我们正站在这条路的起点。
相关文章
评论
加载中...
评论
加载中...