文本之外的三个维度
多模态是什么、为什么现在能用
"多模态"在 LLM 语境里指模型同时处理文本以外的信号——图像、音频、视频。2023 年中以前这是几个分离的技术栈:看图用 CNN、识图用 OCR 模型、语音识别 Whisper、语音合成另一个模型,彼此之间要靠脚本拼。2024 年起主流基座模型开始原生统一,GPT-4o、Claude Opus、Gemini、Qwen-VL 这些都是同一个模型同时处理多种输入。工程上带来两点本质变化:
- 你不再需要级联多个模型,一次 API 调用完成"看图 + 推理 + 答题"
- 调用方式和纯文本基本一致,只是
messages里的 content 从字符串变成数组
本篇把三种模态(图像、语音、视频)分别讲清楚,给出最常用的 Python 代码模板,最后聊怎么判断"这个场景该不该上多模态"。
图像输入:让模型"看见"
协议上的变化只有一处:messages 里每条消息的 content 从字符串变成数组,可以混合文本块和图片块:
messages = [
{
"role": "user",
"content": [
{"type": "text", "text": "这张图里有几只猫?"},
{"type": "image_url", "image_url": {"url": "https://example.com/cats.jpg"}},
],
}
]
image_url 的 url 字段有三种形态都被支持:
- 公网可访问的 HTTP(S) URL
data:image/jpeg;base64,...的 data URL(本地图片常用这种)- 某些厂商还支持直接上传文件 id
最常见的场景是处理本地图片,用 base64 编码成 data URL:
# vision_demo.py
import base64
import os
from pathlib import Path
from openai import OpenAI
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(
api_key=os.getenv("OPENAI_API_KEY"),
# GPT-4o 的 vision 稳定度目前最好
)
def image_to_data_url(path: str | Path) -> str:
path = Path(path)
suffix = path.suffix.lower().lstrip(".")
mime = {"jpg": "jpeg", "jpeg": "jpeg", "png": "png", "webp": "webp", "gif": "gif"}[suffix]
b64 = base64.b64encode(path.read_bytes()).decode()
return f"data:image/{mime};base64,{b64}"
def describe(image_path: str, question: str = "详细描述这张图片") -> str:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{"type": "text", "text": question},
{"type": "image_url", "image_url": {"url": image_to_data_url(image_path)}},
],
}
],
)
return resp.choices[0].message.content
if __name__ == "__main__":
print(describe("./photo.jpg", "图里有多少人?他们在做什么?"))
整个过程不需要任何专门的"视觉库",纯 base64 + openai SDK。Claude、Qwen-VL 用法一致。
图像理解的典型场景
1. OCR + 版面理解——从扫描件、截图、表单里提取结构化信息。相比传统 OCR(Tesseract)的优势是能处理复杂版面、手写、表格等 Tesseract 吃力的场景:
describe(
"invoice.png",
"这是一张发票。请按以下 JSON 返回:{vendor, amount, date, items: [{name, quantity, price}]}。直接返回 JSON。"
)
配合第 04 篇的 Pydantic + response_format,可以得到高可靠的结构化结果。
2. 图表理解——让模型读 dashboard 截图、股票 K 线、统计图,总结趋势。对自动化报告生成很有用。
3. UI 分析——给它一张应用截图,让它指出"哪些元素是可点击的"、"这个 UI 有什么可用性问题"。用于 QA 自动化和设计评审。
4. 图片审核——分类图片是否违规、是否符合某个业务标签。比传统分类模型更灵活(不用重新训练就能加新类别)。
5. 多图对比——一次传多张图让模型比较差异。content 数组里塞多个 image_url 块即可。
模型选型与成本
2026 年初常用的多模态视觉模型:
| 模型 | 强项 | 价格 | 是否开源 |
|---|---|---|---|
| GPT-4o / GPT-4o-mini | 综合最强、稳定 | 中 / 低 | 闭源 |
| Claude Opus 4 / Sonnet 4 | 长文档理解、UI 分析 | 中高 | 闭源 |
| Gemini 2.0 Pro | 视频原生支持、成本低 | 低 | 闭源 |
| Qwen2.5-VL-72B | 中文场景、开源 | / | 开源 |
| Llama 3.2 Vision | 通用、可本地 | / | 开源 |
成本提醒:图片 token 计费比纯文本贵很多。GPT-4o 一张 1024×1024 的图大约折合 1105 个 token,相当于几百字的中文。高频图片处理场景要算好成本。模型一般支持"低清/高清"两档,低清档省 token 但对细节任务不够用,按场景选。
本地视觉模型
Ollama 支持部分视觉模型,可以本地跑:
ollama pull llama3.2-vision:11b
ollama pull qwen2.5-vl:7b
然后用 OpenAI SDK 指向 Ollama 调用(详见主线第 10 篇),API 和上面完全一样。
硬件门槛:视觉模型比同参数量的纯文本模型多占显存(图像编码器额外几 GB),11B 的视觉模型实际占用接近 16~20 GB。Mac 统一内存 32GB+ 或 16GB+ 独显的机器比较舒服。
语音:从文字到声音,从声音到文字
语音部分的两个核心能力:
- ASR(Automatic Speech Recognition)——语音转文字
- TTS(Text-to-Speech)——文字转语音
Whisper:事实标准的 ASR
OpenAI 开源的 Whisper 是目前 ASR 领域的事实基准,对中文支持很好:
# API 用法
with open("audio.mp3", "rb") as f:
transcription = client.audio.transcriptions.create(
model="whisper-1",
file=f,
language="zh", # 可选,明确指定加速
)
print(transcription.text)
本地运行用 faster-whisper(CTranslate2 优化版,比官方快几倍):
pip install faster-whisperfrom faster_whisper import WhisperModel
model = WhisperModel("large-v3", device="cpu", compute_type="int8")
segments, info = model.transcribe("audio.mp3", beam_size=5)
for seg in segments:
print(f"[{seg.start:.1f}s - {seg.end:.1f}s] {seg.text}")
本地 large-v3 模型 3GB,纯 CPU 跑实时率约 1.5~3 倍(1 分钟音频 20~40 秒出结果),GPU 快 10 倍以上。
TTS 选型
- OpenAI TTS(
tts-1/tts-1-hd)——英文自然、中文一般、价格便宜 - ElevenLabs——英文天花板,支持声音克隆,贵
- MiniMax / 豆包——国内 API,中文拟人度最好
- 开源 Fish-Speech / ChatTTS——本地部署,对硬件要求中等
OpenAI TTS 用法:
resp = client.audio.speech.create(
model="tts-1",
voice="alloy", # 可选 alloy / echo / fable / onyx / nova / shimmer
input="你好,今天天气不错",
)
resp.stream_to_file("output.mp3")
Realtime API:低延迟语音对话
OpenAI 2024 年推出的 Realtime API 支持通过 WebSocket 双向流式语音——麦克风音频进去,几百毫秒就能得到流式的语音回复,打断、语气识别都原生支持。这是做语音助手、面试辅助、实时翻译类产品的重要能力,但协议相对复杂,本篇不展开。
视频:主流进入的时间点
视频理解和生成在 2025 年进入主流。
视频理解——Gemini 原生支持,把视频文件直接作为 content 块传入,模型能理解动作、时间线、对话。典型应用:安防分析、会议总结、视频内容审核。其它厂商目前主要做法是"抽帧为图片序列",效果明显差一截。
视频生成——Sora、Veo、Runway Gen-3、Kling(国内)都达到了可用级别。Python 调用方式都是标准 REST API,input 是 prompt + 参数(时长、分辨率、运动强度),output 是生成的视频 URL。
当前实际体验:5~10 秒的短视频生成已经相当稳定,1 分钟以上的连续叙事仍然不稳。成本每分钟 1~5 美元不等,短期不是"人人可调"的平价能力。
一个真实场景 demo:截图辅助助手
整合成一个"你发截图它帮你看"的小工具:
# screenshot_helper.py
import streamlit as st
import base64
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
st.set_page_config(page_title="截图助手", page_icon=":camera:")
st.title("截图分析助手")
uploaded = st.file_uploader("上传截图", type=["png", "jpg", "jpeg", "webp"])
mode = st.radio("模式", ["提取文字", "描述内容", "分析 UI", "自由提问"])
custom_q = st.text_input("自定义问题(仅在自由提问模式用)")
if uploaded and st.button("分析"):
b64 = base64.b64encode(uploaded.getvalue()).decode()
mime = uploaded.type or "image/png"
data_url = f"data:{mime};base64,{b64}"
prompts = {
"提取文字": "把图片里所有可见文字按阅读顺序提取出来,保留段落结构。",
"描述内容": "用三段话描述图片内容:1)整体场景 2)主要元素 3)可能的用途或背景。",
"分析 UI": "这是一个应用/网页截图。请分析:1)主要功能区 2)可点击元素 3)可能的 UX 问题。",
"自由提问": custom_q or "描述这张图",
}
with st.spinner("分析中..."):
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": prompts[mode]},
{"type": "image_url", "image_url": {"url": data_url}},
],
}],
temperature=0,
)
st.markdown(resp.choices[0].message.content)
把主线第 11 篇的 Streamlit 套进来,20 几行代码就有一个可用的截图工具。想扩展就是多加几个预设 prompt 或接入 RAG 让它能查你的文档。
什么时候该用多模态
多模态能力强,但不是所有问题都适合。实际应用中多问一句"能不能先 OCR 成文本再处理"往往更划算:
该用多模态
- 图像信息无法无损转成文本(图表、照片、UI 截图)
- 要理解空间关系(物体位置、画面构图)
- 视频/音频的原始载体本身就重要(情感、语调、动作)
- 开发迭代快、不想搭多个模型级联
不一定要多模态
- 纯文字扫描件——传统 OCR + 文本 LLM 更便宜更快
- 结构化表单——专用 OCR 模型(PaddleOCR 等)准确率更高
- 简单分类任务——轻量视觉分类模型(CLIP、YOLO)成本是 LLM 的 1%
一个经验法则:先用多模态做 POC,跑通后看是否有可替换的轻量方案。不要本末倒置,为了"用 LLM"而强行 LLM。
本篇要点
- 多模态在协议层面只改一处:
content从字符串变成 text + image 块的数组 - 图像模型选型:通用 GPT-4o、长文档/UI 选 Claude、开源 Qwen-VL / Llama Vision
- 图像成本比纯文本贵数倍,高频场景要精算
- 语音:Whisper 是 ASR 事实标准,TTS 按中英文场景选
- 视频理解目前 Gemini 领先,视频生成 Sora / Kling 已达可用
- 多模态不是万灵药,能用轻量专用模型解决的就别硬上 LLM
系列真正收尾
到这里"Python 新手的 AI 进阶之路"主线 12 篇 + 番外 8 篇彻底完整。回望一下你走过的知识地图:
- 入门基础:环境搭建、API 调用、messages 协议
- Prompt 与输出:Prompt 工程、Pydantic 结构化
- 数据与检索:Embedding、向量、RAG 实战
- 能力扩展:Function Calling、Agent、MCP、多模态
- 部署与 UI:本地模型、Streamlit 应用
- 工程化:异步并发、评测、监控、成本、微调、安全
- 基础理论:LLM 历史、API 参数、Token、上下文、幻觉、开源
真正的学习从你用这些知识做一个有人用的产品开始。祝你写出有人爱用的东西。
相关阅读
- OpenAI Vision 指南
- Anthropic Vision 文档
- Whisper 开源仓库
- faster-whisper
- Qwen-VL 文档
- OpenAI Realtime API
- Google Gemini 视频理解
版权声明: 如无特别声明,本文版权归 sshipanoo 所有,转载请注明本文链接。
(采用 CC BY-NC-SA 4.0 许可协议进行授权)
本文标题:番外 8:多模态入门,图像、语音与视频
本文链接:https://www.sshipanoo.com/blog/ai/ai-for-python/番外08-多模态入门/
本文最后一次更新为 天前,文章中的某些内容可能已过时!