视觉语言模型(VLMs)是功能强大的模型,能够同时输入图像和文本,并以文本形式进行响应。这使得研究人员能够对文档和图像执行高效的视觉信息提取。本文将深入探讨新发布的通义千问3-VL(Qwen3-VL)模型,并揭示视觉语言模型所具备的强大功能及其应用潜力。
通义千问3-VL于数周前首次亮相,最初发布的是235B-A22B模型,这是一个相当庞大的模型。随后,团队又推出了30B-A3B版本,并于近期发布了更紧凑的4B和8B密集型版本。本文旨在深入阐述视觉语言模型的卓越能力,并从宏观层面介绍其各项功能。文中将以通义千问3-VL作为具体示例进行探讨,但值得注意的是,当前市场上还有许多其他高质量的视觉语言模型可供选择。撰写此文时,与通义千问团队无任何形式的关联。

这张信息图涵盖了本文的核心议题。文章将探讨视觉语言模型,以及它们在诸多情境下为何优于采用OCR结合大型语言模型(LLMs)来理解文档的方法。此外,还将详细介绍如何利用视觉语言模型进行光学字符识别(OCR)和信息提取,特别是结合通义千问3-VL的应用实践。最后,本文也将客观分析视觉语言模型当前存在的一些局限性。图片由ChatGPT生成。
为何我们需要视觉语言模型?
视觉语言模型之所以不可或缺,是因为传统的替代方案是依赖光学字符识别(OCR),然后将识别出的文本输入给大型语言模型(LLM)进行处理。然而,这种方法存在以下几个显著问题:
- OCR技术本身并不完美,导致大型语言模型必须处理不精确的文本提取结果。
- 文本在视觉上的位置信息会丢失,而这些信息对于理解内容至关重要。
传统的OCR引擎,例如Tesseract,长期以来在文档处理领域扮演着极其重要的角色。OCR技术使人们能够输入图像并从中提取文本,从而对文档内容进行进一步处理。然而,传统OCR远非完美无缺,它在处理小字体文本、倾斜图像、竖排文本等复杂场景时往往力不从心。一旦OCR输出质量不佳,后续的所有任务,无论是使用正则表达式还是大型语言模型,都将面临严峻挑战。因此,将图像直接输入给视觉语言模型(VLM),而非将OCR处理后的文本提供给大型语言模型,是利用信息更为高效且准确的方式。
文本的视觉位置有时对理解其含义至关重要。设想以下图像中的一个示例:其中包含多个复选框,用于标识哪些文本是相关的,有些复选框被选中,有些则未被选中。每个复选框旁边可能对应着一段文本,而只有与被选中复选框相邻的文本才是相关信息。通过OCR结合大型语言模型来提取此类信息将非常困难,因为模型无法准确判断哪个文本属于被选中的复选框。然而,利用视觉语言模型解决这项任务却变得轻而易举。

此示例凸显了视觉语言模型不可或缺的场景。如果仅仅对文本进行OCR识别,将会丢失被选中复选框的视觉位置信息,从而难以判断三个文档中哪个是相关的。然而,利用视觉语言模型来解决此类任务,过程则会变得异常简单。图片由原文作者提供。
将上述图像输入给通义千问3-VL模型后,它给出了以下响应:
根据提供的图片,被选中的文档是:
- **文档 1** (标有"X")
- **文档 3** (标有"X")
**文档 2** 未被选中 (它是空白的)。
正如所示,通义千问3-VL能够轻松准确地解决这一问题。
此外,视觉语言模型之所以重要,还因为它们能实现视频理解功能。单纯依靠OCR技术来真正理解视频片段是极其困难的,因为视频中的大量信息并非以文本形式呈现,而是直接以图像形式展现。因此,OCR在视频理解方面效果不佳。然而,新一代视觉语言模型支持一次性输入数百张图像(例如,用于表示一个视频),从而使其能够执行复杂的视频理解任务。
视觉语言模型的应用任务
视觉语言模型可以应用于多种任务。本文将重点探讨其中几个最相关的应用。
- 光学字符识别(OCR)
- 信息提取
数据准备
以下图像将作为本次测试的示例图片。

本文将使用这张图片作为通义千问3-VL的测试示例。该图像是一份来自挪威奥斯陆市规划局(“Plan og bygningsetaten”)的公开文档。之所以选择此图,是因为它代表了一个真实世界的文档案例,非常适合应用于视觉语言模型。需要注意的是,原图包含一幅图纸,为了适应本地计算机的处理能力限制,已对其进行了裁剪。这使得模型能够以高分辨率运行通义千问3-VL处理该图像。裁剪后的图像分辨率为(768, 136),对于本次OCR任务而言已足够。该图像是从一份600 DPI的PDF文件中提取的JPG格式。
选择这张图像的原因在于,它是一个真实文档的实例,非常适合用于通义千问3-VL的应用。此外,图像已被裁剪成当前形状,以便在本地计算机上以高分辨率输入通义千问3-VL进行处理。保持高分辨率对于图像OCR任务至关重要。此JPG图像是从一份600 DPI的PDF文件中提取的。通常情况下,300 DPI对于OCR已经足够,但为了确保最佳效果,此处保留了更高的DPI设置,这对于这张小型图像来说是可行的。
准备通义千问3-VL模型
运行通义千问3-VL需要以下库:
torch
accelerate
pillow
torchvision
git+https://github.com/huggingface/transformers
由于通义千问3-VL尚未包含在最新版本的Transformers库中,因此需要从GitHub源码安装Transformers。
以下代码加载所需的库、模型和处理器,并创建了一个推理函数:
from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
from PIL import Image
import os
import time
# default: Load the model on the available device(s)
model = Qwen3VLForConditionalGeneration.from_pretrained(
"Qwen/Qwen3-VL-4B-Instruct", dtype="auto", device_map="auto"
)
processor = AutoProcessor.from_pretrained("Qwen/Qwen3-VL-4B-Instruct")
def _resize_image_if_needed(image_path: str, max_size: int = 1024) -> str:
"""Resize image if needed to a maximum size of max_size. Keep the aspect ratio."""
img = Image.open(image_path)
width, height = img.size
if width <= max_size and height <= max_size:
return image_path
ratio = min(max_size / width, max_size / height)
new_width = int(width * ratio)
new_height = int(height * ratio)
img_resized = img.resize((new_width, new_height), Image.Resampling.LANCZOS)
base_name = os.path.splitext(image_path)[0]
ext = os.path.splitext(image_path)[1]
resized_path = f"{base_name}_resized{ext}"
img_resized.save(resized_path)
return resized_path
def _build_messages(system_prompt: str, user_prompt: str, image_paths: list[str] | None = None, max_image_size: int | None = None):
messages = [
{"role": "system", "content": [{"type": "text", "text": system_prompt}]}
]
user_content = []
if image_paths:
if max_image_size is not None:
processed_paths = [_resize_image_if_needed(path, max_image_size) for path in image_paths]
else:
processed_paths = image_paths
user_content.extend([
{"type": "image", "min_pixels": 512*32*32, "max_pixels": 2048*32*32, "image": image_path}
for image_path in processed_paths
])
user_content.append({"type": "text", "text": user_prompt})
messages.append({
"role": "user",
"content": user_content,
})
return messages
def inference(system_prompt: str, user_prompt: str, max_new_tokens: int = 1024, image_paths: list[str] | None = None, max_image_size: int | None = None):
messages = _build_messages(system_prompt, user_prompt, image_paths, max_image_size)
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
)
inputs = inputs.to(model.device)
start_time = time.time()
generated_ids = model.generate(**inputs, max_new_tokens=max_new_tokens)
generated_ids_trimmed = [
out_ids[len(in_ids):] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
end_time = time.time()
print(f"Time taken: {end_time - start_time} seconds")
return output_text[0]
光学字符识别(OCR)
光学字符识别(OCR)是大多数视觉语言模型(VLM)经过训练的任务之一。例如,可以通过阅读通义千问视觉语言模型的技术报告了解到,OCR数据是其训练集的重要组成部分。为了使VLM具备执行OCR的能力,训练过程中会向模型提供一系列图像及其包含的文本。模型通过这种方式学习如何从图像中准确提取文本信息。
接下来,将使用以下提示词对图像执行OCR,该提示词与通义千问团队在通义千问3-VL开发手册中用于OCR的提示词相同。
user_prompt = "Read all the text in the image."
现在,将运行模型。用于测试的图像文件名为 example-doc-site-plan-cropped.jpg。
system_prompt = """
You are a helpful assistant that can answer questions and help with tasks.
"""
user_prompt = "Read all the text in the image."
max_new_tokens = 1024
image_paths = ["example-doc-site-plan-cropped.jpg"]
output = inference(system_prompt, user_prompt, max_new_tokens, image_paths, max_image_size=1536)
print(output)
其输出结果如下:
Plan- og
bygningsetaten
日期: 23.01.2014
用户: HKN
比例尺 1:500
等高距 1m
高程基准: 奥斯陆本地
坐标系统: EUREF89 - UTM 32区
© 规划和建设局,
奥斯陆市政府
原始格式 A3
地址:
Camilla Colletts vei 15
地块号/地号:
.
地图由以下机构编制:
.
绘制ID: / 订单号.:
27661 /
您的参考: Camilla Colletts vei 15
备注:
现行市政分区规划:
KDP-BB, KDP-13, KDP-5
此地图片段适用于垂直层2。
此外,以下垂直层也存在分区:
(如果为空白: 没有其他。)
未在此范围内登记
自然多样性。
详情请参见单独图例。
描述:
编号:
日期:
修订日期:
该输出结果来自本次测试,完全正确,涵盖了图像中的所有文本,并提取了所有正确的字符。
信息提取
视觉语言模型同样可以执行信息提取任务。例如,它能用于从图像中提取重要的元数据。通常,人们希望将这些元数据提取为JSON格式,以便于解析并用于后续任务。在此示例中,将提取以下信息:
- 日期 –23.01.2014
- 地址 – Camilla Colletts vei 15
- 地块号(Gnr,即街道编号) – 在测试图像中为空白字段
- 比例尺(Målestokk) – 1:500
将运行以下代码:
user_prompt = """
Extract the following information from the image, and reply in JSON format:
{
"date": "The date of the document. In format YYYY-MM-DD.",
"address": "The address mentioned in the document.",
"gnr": "The street number (Gnr) mentioned in the document.",
"scale": "The scale (målestokk) mentioned in the document.",
}
If you cannot find the information, reply with None. The return object must be a valid JSON object. Reply only the JSON object, no other text.
"""
max_new_tokens = 1024
image_paths = ["example-doc-site-plan-cropped.jpg"]
output = inference(system_prompt, user_prompt, max_new_tokens, image_paths, max_image_size=1536)
print(output)
其输出结果如下:
{
"date": "2014-01-23",
"address": "Camilla Colletts vei 15",
"gnr": "15",
"scale": "1:500"
}
生成的JSON对象格式有效,通义千问模型成功提取了日期、地址和比例尺字段。然而,通义千问模型还返回了一个地块号(Gnr)。起初,看到这个结果时,可能误以为是模型的“幻觉”,因为测试图像中的Gnr字段是空白的。但实际上,通义千问模型做出了一种自然的推断,认为Gnr信息可能包含在地址中,而在这个特定案例中,这种推断是正确的。
为了进一步验证模型在找不到信息时返回“None”的能力,随后要求通义千问提取本示例中不存在的Bnr(建筑物编号)。运行以下代码:
user_prompt = """
Extract the following information from the image, and reply in JSON format:
{
"date": "The date of the document. In format YYYY-MM-DD.",
"address": "The address mentioned in the document.",
"Bnr": "The building number (Bnr) mentioned in the document.",
"scale": "The scale (målestokk) mentioned in the document.",
}
If you cannot find the information, reply with None. The return object must be a valid JSON object. Reply only the JSON object, no other text.
"""
max_new_tokens = 1024
image_paths = ["example-doc-site-plan-cropped.jpg"]
output = inference(system_prompt, user_prompt, max_new_tokens, image_paths, max_image_size=1536)
print(output)
得到结果如下:
{
"date": "2014-01-23",
"address": "Camilla Colletts vei 15",
"Bnr": None,
"scale": "1:500"
}
由此可见,通义千问模型确实能够在我们所需信息未出现在文档中时给出明确提示。
视觉语言模型的局限性
值得注意的是,视觉语言模型也存在一些问题。本次用于OCR和信息提取测试的图像相对简单。若要全面评估通义千问3模型的真实能力,需要将其应用于更具挑战性的任务,例如从更长的文档中提取大量文本,或者要求其提取更多元数据字段。
从目前观察到的情况来看,视觉语言模型当前的主要局限性包括:
- OCR时偶尔会出现文本遗漏
- 推理速度较慢
视觉语言模型在执行OCR时偶尔会遗漏文本,这一点在实际应用中已被多次观察到。当这种情况发生时,VLM通常会完全忽略文档的某个部分,从而导致文本信息缺失。这显然是一个严重的问题,因为它可能遗漏对后续任务(例如关键词搜索)至关重要的文本。发生这种情况的原因是一个复杂的话题,超出了本文的讨论范围,但对于使用VLM进行OCR的用户来说,这是一个必须了解的问题。
此外,视觉语言模型需要大量的计算处理能力。尽管本地计算机运行的是一个相对较小的模型,但在尝试处理一张2048×2048像素的图像时,便开始出现内存不足的问题。如果需要从更大的文档中提取文本,这将是一个显著的挑战。因此,不难想象将视觉语言模型应用于以下场景时,其资源消耗将是多么巨大:
- 一次性处理更多图像(例如,处理一份10页的文档)
- 处理更高分辨率的文档
- 使用参数更多、规模更大的视觉语言模型
总结
本文深入探讨了视觉语言模型(VLMs)的核心概念、强大功能以及通义千问3-VL的具体应用。我们了解到,VLMs凭借其同时处理图像和文本的能力,在文档理解、信息提取甚至视频理解方面,相较于传统的OCR结合LLMs方案具有显著优势,尤其是在保留文本视觉位置信息方面表现卓越。通过实际代码示例,展示了通义千问3-VL在OCR和结构化信息提取上的高效与准确性。然而,我们也需认识到VLMs当前面临的挑战,包括偶尔的文本遗漏和较高的计算资源需求。尽管存在这些局限性,视觉语言模型无疑代表了人工智能领域的一个重要发展方向,预示着未来人机交互和信息处理的广阔前景。
