AI/ML 详解:多模态

Day 23 · 2026-06-09 · 难度:前沿
面向:有编程经验的非 AI 方向工程师

视觉语言模型Vision-Language Model · VLM

跨模态对齐
一句话类比

CLIP 这条对比学习(contrastive learning,把"配对"的样本拉近、"不配"的推远)路线,本质就是你做推荐/搜索时熟悉的双塔召回模型(two-tower retrieval)——user 塔和 item 塔各自把输入编码成向量,在同一空间算内积。CLIP 把"图像塔"和"文本塔"训到同一个向量空间,配对的图文内积大、错配的小。而现代生成式 VLM(LLaVA 那一路)走的是另一条:在 LLM 前面接一个"图像→token"的编码器,相当于给只懂文本的查询引擎加一层 ETL 适配器,把图像翻译成 LLM 能直接消费的 token。

它解决什么问题 + 工作机制

痛点:LLM 的输入只有文本 token,它根本"看不见"像素。要让模型理解图像,业界分出两条范式:

  • 对比式(CLIP, 2021):用 4 亿网络图文对训练,对比损失让配对的图文向量靠近、错配的远离。产出一个共享嵌入空间,天然支持 zero-shot 分类、图文检索。但它只会"匹配",不会"生成"句子;
  • 生成式(Flamingo / LLaVA):vision encoder(通常就是 CLIP 训出的 ViT)把图切成 patch、编码成向量 → 投影层(projection)把视觉向量映射到 LLM 的 token 空间 → 当成"视觉 token"拼在文本 token 前面,LLM 像处理普通 token 一样推理、生成。训练时常冻结视觉编码器和大部分 LLM,只训那层投影 + 少量微调,便宜且有效。
生成式 VLM 架构(LLaVA 式)

图像ViT 视觉编码器patch 向量投影层 MLP
↓(投影到 LLM token 空间)
视觉 token+文本 token「这张图里有什么?」LLM 文字回答
↑ 核心:图像被"翻译"成一串 token,和文字 token 平起平坐进同一个 LLM
代码示例
import base64
from anthropic import Anthropic
client = Anthropic()  # 需要 ANTHROPIC_API_KEY

img = base64.b64encode(open("chart.png", "rb").read()).decode()
resp = client.messages.create(
    model="claude-opus-4-8", max_tokens=512,
    messages=[{"role": "user", "content": [
        {"type": "image", "source": {"type": "base64",
         "media_type": "image/png", "data": img}},
        {"type": "text", "text": "这张图表的核心结论是什么?"}
    ]}]
)  # 图和文字放进同一条 message —— 它们最终都是 token
print(resp.content[0].text)
常见误区 + 实践场景
"VLM 真的'看清'了每个像素"——错。图像被压成有限个 patch token(常见 256–576 个),细小文字、精确计数、密集表格里的数字常常出错。它擅长"语义理解"(这是什么场景),不擅长"像素级精读"(第三行第五列写的几)。
📌 妈妈场景:读论文时把架构图 / 实验表截图丢给 VLM 快速理解大意很高效——但关键数字一定要回原图核对,别让模型替你"读"出一个它其实没看清的小数点。
Takeaway + 思考题
💡 VLM 不是"长了眼睛的 LLM",而是"把图像翻译成 token 喂给 LLM"——理解这点,就理解了它能力的边界。
🤔 如果图像最终也是 token,那"一图胜千言"在 token 预算上成立吗?一张图该值多少 token,是谁的工程决策?

音频大模型Audio LLM · Whisper

序列建模语音
一句话类比

音频是一条一维时间序列流——像数据库的 binlog 或消息队列里的事件流,连续不断。Whisper 的做法:把波形切成 30 秒窗口、转成 log-Mel 频谱图(一张"时间 × 频率"的二维图),再用 encoder-decoder Transformer 把它"翻译"成文字 token。本质和 seq2seq 机器翻译同构:源序列是声音,目标序列是文字,中间隔着一个编码器和一个解码器。

它解决什么问题 + 工作机制

痛点:传统语音识别要拼接好几个模块——语音活动检测、声学模型、语言模型、强制对齐,每个独立训练、接口脆弱。Whisper(2022)用一个端到端 seq2seq 模型替换整条流水线,靠 68 万小时"弱监督"(weak supervision,即从网络抓的不保证完全准确的字幕)数据训练,做到 zero-shot 跨语言、跨口音的鲁棒识别。机制四步:波形 → log-Mel 频谱 → encoder 编码 → decoder 自回归吐文字 token,用特殊控制 token 切换任务(转写 / 翻译 / 语言识别 / 时间戳)。

新一代 audio LLM(如 GPT-4o、Gemini 的原生语音)更进一步:把音频 token 和文本 token 放进同一个 LLM,直接做语音对话、情感与语气理解,而不只是"转成文字"。这又回到那个统一主题——音频也被编码成 token

代码示例
from openai import OpenAI
client = OpenAI()  # 需要 OPENAI_API_KEY

# Whisper 把音频文件直接转成文字(官方托管 API)
with open("meeting.mp3", "rb") as f:
    tr = client.audio.transcriptions.create(
        model="whisper-1",
        file=f,
        response_format="text",
        # language="zh" 可显式指定,避免短音频语种误判
    )
print(tr)  # 拿到文字后,再喂给 LLM 做总结 / 抽取行动项
常见误区 + 实践场景
"Whisper 一定比小模型准"——不总是。在长音频里它会出现"重复幻觉"(同一句话反复输出),在安静 / 无语音段会凭空编造文字。它是生成模型,沉默时也会"猜"。对准确性敏感的场景要做静音切分和后处理。
📌 妈妈场景:把会议录音、语音备忘录转成文字 → 再让 LLM 总结决策与待办,是个高杠杆工作流。但人名、数字、专业术语务必校对——这正是转写最容易翻车的地方。
Takeaway + 思考题
💡 语音识别 = 把声音 seq2seq 翻译成文字;现代 audio LLM 则把声音也变成 token,直接进 LLM 推理。
🤔 当模型"听懂"语气和停顿,而不只是字面文字时,哪些场景会被重新定义——客服、陪伴、还是测谎?

视频理解Video Understanding

时序采样
一句话类比

视频 = 图像在时间维度上的分片(sharding)。1 分钟 30fps 的视频 = 1800 帧,每帧又是几百个 patch token——token 量直接爆炸,等于对一张超大表做全表扫描。工程上必须像数据库做采样 + 分区裁剪一样:抽帧(frame sampling)+ 时序池化,只保留信息增量大的帧,把冗余的"增量日志"丢掉。

它解决什么问题 + 工作机制

视频理解的核心难题就两个字:太多——token 爆炸 + 时序冗余。相邻帧往往 99% 重复(像几乎没变化的增量日志),全塞进去既贵又会稀释注意力。两类机制应对:

  • 时序建模:每帧过 vision encoder 得到空间特征,再叠一层时序注意力或 3D 卷积,捕捉"运动"信息(光靠单帧看不出"杯子正在倒");
  • token 压缩:稀疏抽帧(如 1fps 而非 30fps)、token merging(合并相似 patch)、用 Q-Former 把每帧压成少数几个 query token。目标是用最少 token 保住最多信息
1 分钟视频的 token 量(示意)
30 fps 全采 ~1800 帧 → token 爆炸 💥
1 fps 稀采   ~60 帧 → 可控 ✅
↑ 核心 trade-off:抽太稀漏掉快动作,抽太密 token 撑爆窗口
代码示例
import cv2, base64
# 用 OpenCV 按 1fps 稀疏抽帧,而不是把每一帧都送进模型
cap = cv2.VideoCapture("lesson.mp4")
fps = cap.get(cv2.CAP_PROP_FPS)
frames = []
i = 0
while True:
    ok, frame = cap.read()
    if not ok: break
    if i % int(fps) == 0:  # 每秒取 1 帧
        _, buf = cv2.imencode(".jpg", frame)
        frames.append(base64.b64encode(buf).decode())
    i += 1
# 把这些帧 + 时间戳一起送进 VLM,问"第几秒发生了什么"
print(len(frames), "帧送入模型(已稀疏化)")
常见误区 + 实践场景
"帧塞得越多,理解越好"——错。超过窗口预算后,注意力被稀释,关键帧反而淹没在冗余里,效果不升反降。视频理解的艺术是"抽对帧",不是"抽更多帧"——和长上下文里"放对的东西"是同一个道理。
📌 妈妈场景:让 AI 看教学视频或孩子的活动录像,问"第几分钟讲了某概念 / 孩子在做什么"——先按 1fps 抽帧并标上时间戳,模型才能把内容和时间对上,而不是糊成一团。
Takeaway + 思考题
💡 视频理解的瓶颈不是"看不懂一帧",而是"帧太多"——它本质是一道采样与压缩的工程题。
🤔 "抽帧丢信息"和数据库"采样查询丢精度"是同一类取舍。你会用什么信号决定"这一帧值不值得保留"?

具身智能 · 视觉-语言-动作Embodied AI · VLA

端到端闭环
一句话类比

VLA 把机器人的"感知 → 决策 → 执行"做成一个端到端服务。传统机器人是微服务架构:感知模块、规划模块、控制模块各自独立、靠接口拼接,一处出错全链路崩。VLA(RT-2 / OpenVLA)是单体大模型:图像 + 自然语言指令进,机器人动作直接出——而且动作被编码成 token(像把一次 RPC 调用序列化成 token),让机器人控制直接复用 LLM 那套"预测下一个 token"的机器。

它解决什么问题 + 工作机制

痛点:机器人极难泛化——换一个没见过的物体、没见过的厨房就失败,因为真实机器人数据稀缺(采集一条轨迹要真机操作,慢且贵)。VLA 的关键洞见:把动作离散化成 token,机器人控制就变成"序列生成",于是能复用 VLM 在互联网级图文数据上学到的常识

RT-2(2023)把 7 自由度动作(xyz 位移 + 姿态 roll/pitch/yaw + 夹爪开合)离散成 token,和文本放进同一个词表,在机器人轨迹和网络图文上联合微调。结果机器人涌现出"常识推理"能力:让它"把草莓放进正确的碗",它能从预训练知识里推出草莓和碗的语义关系——这是纯机器人数据训不出来的。

VLA 闭环(感知-动作 loop)

摄像头图像+指令「把草莓放进碗」VLA 大模型
↓ 输出动作 token(和文本同一词表)
动作 token机器人执行 7-DoF 动作 环境改变
└──────────── 下一帧图像反馈,闭环继续 ────────────┘
代码示例
from transformers import AutoModelForVision2Seq, AutoProcessor
import torch
# OpenVLA:开源 7B 视觉-语言-动作模型(需 GPU)
proc = AutoProcessor.from_pretrained("openvla/openvla-7b", trust_remote_code=True)
vla = AutoModelForVision2Seq.from_pretrained(
    "openvla/openvla-7b", torch_dtype=torch.bfloat16,
    trust_remote_code=True).to("cuda:0")

image = get_from_camera()  # PIL 图像,来自机器人摄像头
prompt = "In: What action should the robot take to pick up the cup?\nOut:"
inputs = proc(prompt, image).to("cuda:0", dtype=torch.bfloat16)
# 输出 7 自由度动作(xyz+姿态+夹爪),再反归一化送给真机
action = vla.predict_action(**inputs, unnorm_key="bridge_orig", do_sample=False)
print(action)  # 动作其实就是被"解码"出来的 token
常见误区 + 实践场景
"动作能 token 化,家用机器人马上就来了"——别急。真实世界数据稀缺、安全 / 延迟 / 物理接触都是硬约束(撞坏东西不能"重试一次"),目前 VLA 仍主要活在受控实验室。它证明了"语言是通用接口"这条路走得通,但离你家厨房还远。
📌 跨学科思考场景:VLA 给 BigCat 一个深刻的验证——"语言是通用接口"假说成立。把任何任务(看、听、动)编码成 token 序列,就能复用同一套自回归预测引擎。这和"分布式系统里万物皆消息"的统一抽象异曲同工。
Takeaway + 思考题
💡 串起今天四块拼图:文本、图像、音频、视频、动作——全部被编码成 token,喂进同一个自回归引擎。多模态的本质就是"万物皆 token"。
🤔 如果连机器人动作都能当 token 预测,那"思考"和"行动"在计算上还有本质区别吗?这对 agent 设计意味着什么?

深入资源Further Reading

深入思考Deep Questions

1. 今天四个概念有个统一暗线:"万物皆 token"。为什么这个范式能 work?它的代价是什么?
能 work 的根因是 Transformer 的 attention 对"序列"是模态无关的——它只在乎一串向量之间两两的相关性,不在乎这些向量原本是文字、图像 patch、声音频谱还是机器人动作。只要你能把一种模态编码成向量序列,就能塞进同一个引擎,复用它的预测机制和它在海量数据上学到的统计规律。这就是为什么"语言是通用接口"——更准确说是"token 序列是通用接口"。代价有三:(a) 信息损失——把连续的像素、声波、动作离散成有限 token,一定丢精度(图像读不清小字、动作精度受词表粒度限制);(b) token 爆炸——高带宽模态(视频)的 token 量随时长×分辨率爆炸,O(n²) 的 attention 直接劝退,所以必须采样压缩;(c) 对齐难题——不同模态的 token 要落进"同一个语义空间"才能互相推理,而对齐质量决定了跨模态能力的上限。BigCat 你会发现这和分布式系统"万物皆消息"的统一抽象同构:统一接口换来了组合性,代价是序列化/反序列化的损耗和带宽压力。
2. CLIP 的对比式 vs LLaVA 的生成式,两条路线何时该用哪个?
取决于你要"匹配"还是"生成"。对比式(CLIP)产出的是一个共享嵌入空间,强项是:图文检索(用文字搜图、用图搜图)、zero-shot 分类、做多模态 RAG 的召回层、给图像打标签——任何"算相似度"的任务。它轻、快、可离线建索引,本质就是你熟悉的双塔召回。弱点:它不会说话,给不出"这张图里发生了什么"的自然语言描述。生成式(LLaVA / Flamingo)强项是:图像问答、看图写描述、OCR+推理、视觉对话——任何需要"用语言表达对图的理解"的任务。代价是推理贵、慢,且会幻觉。实战常常两者叠加:先用 CLIP 嵌入做检索召回(便宜地从百万图里捞出相关的几张),再用生成式 VLM 对召回结果做精细推理(贵但准)。这又是"召回-精排"两段式架构在多模态上的复刻。
3. 视频的 token 爆炸,和分布式系统里的什么经典问题同构?怎么迁移你已有的工程直觉?
同构于"海量时序数据的存储与查询"——时序数据库(time-series DB)、日志系统、流处理都在解同一道题。可迁移的直觉:(a) 降采样(downsampling)——监控系统不会存原始每毫秒数据,而是按秒/分钟聚合;视频抽帧就是时间维降采样,1fps 对应"每秒一个聚合点";(b) 增量去重 / delta 编码——相邻帧 99% 重复,就像增量日志只存变化量;token merging、关键帧提取本质是"只存 delta";(c) 分层存储(hot/cold)——可以对"动作密集段"高帧率采样、"静止段"低帧率,类比热数据高精度、冷数据归档;(d) 查询下推(predicate pushdown)——与其把整段视频喂模型再问"杯子何时倒的",不如先用轻量检测器定位候选时段,再精读——把过滤推到上游。BigCat 你处理过海量日志/监控的经验,几乎可以一对一映射到视频理解的工程权衡上。
4. VLA 验证了"语言是通用接口"。这件事对认知科学、对"思考 vs 行动"的边界,有什么哲学意涵?
VLA 最震撼的不是机器人能动,而是它暗示:感知、语言、行动可能共享同一种底层表示——都是可被同一个预测引擎处理的序列。这和认知科学里的几条线索呼应:具身认知(embodied cognition)主张"思维离不开身体与环境的互动",而 VLA 恰恰把"理解"和"行动"压进了一个模型,没有清晰的"先思考完再行动"的界限——动作 token 和思维 token 在同一个自回归流里被预测出来。再往深处,这触及一个老问题:如果"决定下一个词"和"决定下一个动作"在计算上是同一回事,那我们引以为傲的"深思熟虑"是否也只是一种更长的 token 预测?这未必是降格——也可能说明,智能的统一性比我们以为的更强。当然要警惕过度类比:预测 token 不等于"理解意义",VLA 会被没见过的物理情境轻易骗倒,它没有人类那种从身体经验长出的世界模型。这条"统一 vs 涌现"的张力,正是 BigCat 你交叉佛学、神经科学、复杂性科学时最值得反复琢磨的边界。
5. 不同模态的 token 真的"在同一个向量空间"吗?跨模态对齐到底意味着什么?
"同一空间"是个有用但需小心的说法。对 CLIP,图像向量和文本向量确实被训练到同一个度量空间——配对的图文内积大,所以能直接算跨模态相似度,这是真·共享空间。但对 LLaVA 式生成 VLM,更准确的描述是:视觉 token 被投影到 LLM 能"消费"的输入空间,让 LLM 把它当作一种"外语词"来处理——它们未必和文本 token 占据完全对称的位置,只是被对齐到"LLM 看得懂"的程度。对齐的本质,是让"同一语义在不同模态里落到相近的位置":一张猫的图和"猫"这个词,应该指向相似的内部表示。对齐质量决定了一切下游能力——对齐不好,模型就"看着图说胡话"。难点在于不同模态的信息密度天差地别(一个词 vs 几十万像素),强行塞进一个空间必然有信息瓶颈。这也是为什么多模态模型在"需要精确对应"的任务(读图中文字、数物体个数)上仍频频翻车——语义对齐了,但像素级的细粒度对齐还远没解决。