Qwen3-VL视觉语言模型实战教程:从零基础到精通,一文掌握文档理解与信息提取!
本文介绍了阿里巴巴Qwen3-VL视觉语言模型在文档理解中的应用,详细展示了OCR和信息提取任务的实现方法。文章对比了传统OCR+LLM方案的局限性,演示了如何利用Qwen3-VL直接理解图像内容并提取结构化信息。通过完整代码示例,读者可学习从环境搭建到模型推理的全过程,掌握这一多模态AI工具处理文档任务的实用技能。
今年9月份,阿里巴巴通义千问团队推出了多模态视觉语言模型Qwen3-VL,该模型能同时理解图片、文字甚至视频。
本期,我们将介绍如何使用 Qwen3-VL 视觉语言模型执行文档理解任务,包括 OCR 和信息提取。

什么是视觉语言模型?
视觉语言模型 是能够同时处理图像和文本输入,并生成文本响应的多模态 AI 模型。
这类模型直接理解图像内容,无需依赖中间处理步骤。
为什么需要视觉语言模型?
传统文档处理采用 OCR + LLM 的组合方案,但存在两个主要问题:
OCR 技术存在缺陷。传统 OCR 引擎在处理小文本、倾斜图像或垂直文本时经常出错。
OCR 输出的质量问题直接影响下游任务效果。
文本的视觉位置信息至关重要。在某些场景下,文本在图像中的空间位置直接关系到语义理解。

考虑上图中的复选框示例。如果只是对文本进行OCR处理,就会丢失被勾选复选框的视觉位置,因此很难知道三个文档中哪个是相关的。
使用视觉语言模型能很好地解决这个任务,因为它能够直接理解视觉布局。
Qwen3-VL 模型概述
Qwen3-VL 是阿里巴巴推出的视觉语言模型系列。

该系列包含多个版本:235B-A22B、30B-A3B,以及密集的 4B 和 8B 版本。本文使用 4B 版本进行测试。
环境准备
安装依赖
安装所需的 Python 包:
pip install torch accelerate pillow torchvisionpip install git+https://github.com/huggingface/transformers
Transformers 库需要从 GitHub 源码安装,因为 Qwen3-VL 尚未包含在官方发布版本中。
核心代码实现
from transformers import Qwen3VLForConditionalGeneration, AutoProcessorfrom PIL import Imageimport osimport time# 加载模型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: """调整图像尺寸,保持宽高比""" 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_pathdef_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 isnotNone: 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 messagesdefinference(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 inzip(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]
代码说明:
- •
_resize_image_if_needed:调整图像尺寸以适应模型限制 - •
_build_messages:构建多模态输入消息 - •
inference:执行模型推理
测试数据

挪威奥斯陆市规划局提供的公开文档。(链接:https://contributor.insightmediagroup.io/wp-content/uploads/2025/10/example-doc-site-plan-cropped-1024x232.jpg)
执行 OCR 任务
OCR 提示词
按照 Qwen3-VL 官方文档建议,使用简单直接的提示词:
user_prompt = "Read all the text in the image."
执行代码
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 = 1024image_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- ogbygningsetatenDato: 23.01.2014Bruker: HKNMålestokk 1:500Ekvidistanse 1mHøydegrunnlag: Oslo lokalKoordinatsystem: EUREF89 - UTM sone 32© Plan- og bygningsetaten,Oslo kommuneOriginalformat A3Adresse:Camilla Colletts vei 15Gnr/Bnr:.Kartet er sammenstilt for:.PlotID: / Best.nr.:27661 /Deres ref: Camilla Colletts vei 15Kommentar:Gjeldende kommunedelplaner:KDP-BB, KDP-13, KDP-5Kartutsnittet gjelder vertikalinvå 2.I tillegg finnes det regulering ifølgende vertikalinvå:(Hvis blank: Ingen øvrige.)Det er ikke registrertnaturn mangfold innenforSe tegnforklaring på eget ark.Beskrivelse:NR:Dato:Revidert dato:
程序准确提取了图像中的所有文本内容。
执行信息提取任务
JSON 格式信息提取
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 = 1024image_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"}
所有字段都被正确提取。虽然文档中 Gnr 字段显示为空白,但模型从地址中推断出了街道编号。
处理缺失信息
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 = 1024image_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 任务中的常见缺陷。模型有时会忽略文档的某些部分。
计算资源需求是另一个重要考量。视觉语言模型需要大量内存和处理能力。
在本地环境中,处理高分辨率图像或多页文档时会遇到硬件限制。
总结
本文通过 Qwen3-VL 实例,演示了视觉语言模型在 OCR 和信息提取任务上的应用。
与传统 OCR 方案相比,视觉语言模型提供了更直接的解决方案。
如何学习AI大模型 ?
“最先掌握AI的人,将会比较晚掌握AI的人有竞争优势”。
这句话,放在计算机、互联网、移动互联网的开局时期,都是一样的道理。
我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。
我意识到有很多经验和知识值得分享给大家,故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。【保证100%免费】🆓
CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈
对于0基础小白入门:
如果你是零基础小白,想快速入门大模型是可以考虑的。
一方面是学习时间相对较短,学习内容更全面更集中。
二方面是可以根据这些资料规划好学习计划和方向。
👉1.大模型入门学习思维导图👈
要学习一门新的技术,作为新手一定要先学习成长路线图,方向不对,努力白费。
对于从来没有接触过AI大模型的同学,我们帮你准备了详细的学习成长路线图&学习规划。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。(全套教程文末领取哈)
👉2.AGI大模型配套视频👈
很多朋友都不喜欢晦涩的文字,我也为大家准备了视频教程,每个章节都是当前板块的精华浓缩。

👉3.大模型实际应用报告合集👈
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。(全套教程文末领取哈)

👉4.大模型实战项目&项目源码👈
光学理论是没用的,要学会跟着一起做,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战项目来学习。(全套教程文末领取哈)
👉5.大模型经典学习电子书👈
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。(全套教程文末领取哈)
👉6.大模型面试题&答案👈
截至目前大模型已经超过200个,在大模型纵横的时代,不仅大模型技术越来越卷,就连大模型相关的岗位和面试也开始越来越卷了。为了让大家更容易上车大模型算法赛道,我总结了大模型常考的面试题。(全套教程文末领取哈)
为什么分享这些资料?
只要你是真心想学AI大模型,我这份资料就可以无偿分享给你学习,我国在这方面的相关人才比较紧缺,大模型行业确实也需要更多的有志之士加入进来,我也真心希望帮助大家学好这门技术,如果日后有什么学习上的问题,欢迎找我交流,有技术上面的问题,我是很愿意去帮助大家的!
这些资料真的有用吗?
这份资料由我和鲁为民博士共同整理,鲁为民博士先后获得了北京清华大学学士和美国加州理工学院博士学位,在包括IEEE Transactions等学术期刊和诸多国际会议上发表了超过50篇学术论文、取得了多项美国和中国发明专利,同时还斩获了吴文俊人工智能科学技术奖。目前我正在和鲁博士共同进行人工智能的研究。
资料内容涵盖了从入门到进阶的各类视频教程和实战项目,无论你是小白还是有些技术基础的,这份资料都绝对能帮助你提升薪资待遇,转行大模型岗位。


CSDN粉丝独家福利
这份完整版的 AI 大模型学习资料已经上传CSDN,朋友们如果需要可以扫描下方二维码&点击下方CSDN官方认证链接免费领取 【保证100%免费】
读者福利: 👉👉CSDN大礼包:《最新AI大模型学习资源包》免费分享 👈👈
更多推荐
所有评论(0)