跳到主要内容

视觉-语言模型

学习目标

完成本节后,你将能够:

  • 理解视觉-语言模型(VLM)和普通图像模型、文本模型的区别
  • 说清楚图像编码器、语言模型和桥接模块的大概角色
  • 跑通一个简化版图文检索 / 图像问答示例
  • 明白 VLM 适合什么任务、有哪些常见限制

一、什么是视觉-语言模型?

视觉-语言模型(Vision-Language Model, VLM)可以理解成:

既能看图,又能理解文字,还能把两者联系起来的模型。

和普通模型相比:

  • 纯视觉模型:擅长识别图片内容
  • 纯语言模型:擅长理解和生成文字
  • 视觉语言模型:擅长“图和文一起处理”

这让它特别适合:

  • 图像问答
  • 图文检索
  • 图片描述
  • 界面理解
  • 文档截图问答

二、VLM 的直觉结构

先不用被复杂架构吓到,抓住最粗的骨架就够了:

你可以先这么理解它们的职责

模块作用
图像编码器把图片变成向量 / 特征
文本模块理解提示词、生成回答
桥接模块让图像特征和语言系统能接上

三、一个最小图文检索例子

为了保证代码能直接运行,我们用手工定义的图像特征和文本特征,模拟 VLM 的“同空间对齐”思想。

import numpy as np

image_embeddings = {
"cat_photo": np.array([0.95, 0.10, 0.05]),
"car_photo": np.array([0.05, 0.20, 0.95]),
"cake_photo": np.array([0.60, 0.85, 0.10])
}

text_embeddings = {
"a small cat": np.array([0.90, 0.15, 0.05]),
"a vehicle": np.array([0.05, 0.10, 0.98]),
"a sweet dessert": np.array([0.55, 0.90, 0.10])
}

def cosine_similarity(a, b):
return float(np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)))

for text, text_vec in text_embeddings.items():
print(f"\\n文本查询: {text}")
results = []
for image_name, image_vec in image_embeddings.items():
results.append((cosine_similarity(text_vec, image_vec), image_name))
results.sort(reverse=True)
for score, image_name in results:
print(f" {image_name}: {score:.4f}")

如果一个模型学会了好的跨模态对齐,相关图文就会更靠近。


四、图像问答(VQA)是什么味道?

图像问答的目标是:

给模型一张图,再问它一个问题,让它基于图像内容回答。

在真实 VLM 中,模型会:

  1. 看图得到视觉特征
  2. 结合文本问题理解需求
  3. 综合两者生成答案

我们先写一个非常简化的“玩具版”。

image_features = {
"screen_error": {
"has_text": True,
"is_ui": True,
"main_color": "dark",
"topic": "error_message"
},
"food_photo": {
"has_text": False,
"is_ui": False,
"main_color": "warm",
"topic": "dessert"
}
}

def ask_vlm(image_name, question):
feat = image_features[image_name]
question = question.lower()

if "有没有文字" in question or "has text" in question:
return "有文字" if feat["has_text"] else "没有明显文字"
if "是不是界面" in question or "ui" in question:
return "像是一个界面截图" if feat["is_ui"] else "不像界面截图"
if "主题" in question:
return f"这张图的主题更接近:{feat['topic']}"
return "当前玩具模型无法回答这个问题"

print(ask_vlm("screen_error", "这张图有没有文字?"))
print(ask_vlm("screen_error", "是不是界面截图?"))
print(ask_vlm("food_photo", "主题是什么?"))

当然,真实 VLM 不是靠手写规则,但这个例子能帮你理解:

  • 图像信息要先被表示
  • 问题也要被理解
  • 最终回答依赖“图像 + 问题”的联合推理

五、VLM 和 OCR 是什么关系?

很多人会把两者混在一起。

OCR

重点是:

  • 识别图里的文字是什么

VLM

重点是:

  • 不只看文字,还要理解整张图和问题之间的关系

比如一张报错截图:

  • OCR 负责认出报错文本
  • VLM 可以进一步回答“这更像网络错误还是权限错误?”

六、VLM 最适合哪些任务?

很适合

  • 看图问答
  • 截图解释
  • 图文检索
  • 电商商品图理解
  • 文档图像理解

不一定适合

  • 完全不需要图像信息的纯文本任务
  • 极度精细的专业图像诊断任务
  • 对像素级精度要求非常高的任务

这时候可能还需要专门视觉模型配合。


七、为什么 VLM 很容易“看错”或“答偏”?

因为它要同时跨越两层难度:

  1. 图像理解本身就不容易
  2. 图像和文字之间的关系建模更难

常见问题包括:

  • 视觉细节漏看
  • OCR 读错字
  • 问题理解偏了
  • 生成答案时夸大或脑补

所以做 VLM 产品时,验证和护栏同样重要。


八、今天很多产品为什么离不开 VLM?

因为用户真实输入往往不是“纯文字”。

比如:

  • 发一张页面截图问“这里哪里报错了?”
  • 发一张发票照片问“金额是多少?”
  • 发一张菜品图片问“这像什么食物?”

这些任务如果只给文字模型,信息是不完整的。


九、初学者常见误区

1. 以为 VLM 就是“图片喂给 GPT”

更准确地说,是“图像信息经过编码和对齐后,再进入语言系统”。

2. 以为 VLM 天生会 OCR、定位、推理,一切都很稳

真实效果取决于模型能力、提示词、图像质量和任务难度。

3. 以为能看图就一定比纯文本模型更好

只有当图像信息真的有价值时,多模态才有优势。


小结

这节课最重要的一句话是:

VLM 的关键,不只是“看图”,而是把图像和语言放进同一套理解流程里。

这也是多模态系统从“能看”走向“能解释、能回答、能交互”的关键一步。


练习

  1. 修改图文检索例子里的向量,让“cake_photo” 更接近 “a sweet dessert”。
  2. 给玩具版 ask_vlm() 再加一个问题类型,比如“这张图更像生活照片还是软件界面?”
  3. 思考:如果用户上传的是一张模糊截图,VLM 可能会在哪些环节出错?