Визуальные языковые модели (VLMs) представляют собой мощные системы, способные обрабатывать изображения и текст на входе, а на выходе генерировать текстовые ответы. Такие модели позволяют извлекать визуальную информацию из документов и изображений. В этой статье рассматривается недавно выпущенная Qwen 3 VL и демонстрируются ключевые возможности VLMs.
Qwen 3 VL появилась несколько недель назад, начиная с версии 235B-A22B, которая относится к крупным моделям. Затем вышла 30B-A3B, а совсем недавно добавились плотные варианты 4B и 8B. Цель материала — подчеркнуть потенциал визуальных языковых моделей и дать общее представление об их применении. Qwen 3 VL используется здесь как конкретный пример, хотя существует множество других качественных VLMs. Автор не имеет никакой связи с разработчиками Qwen.

Зачем нужны визуальные языковые модели
Визуальные языковые модели требуются, поскольку альтернатива — использование OCR для извлечения текста и последующая подача его в LLM — сопряжена с рядом проблем.
- OCR не всегда точен, и LLM приходится работать с неидеальным извлеченным текстом.
- Потеряется информация, связанная с визуальным расположением текста.
Традиционные движки OCR, такие как Tesseract, долгое время играли ключевую роль в обработке документов. Они позволяют загружать изображения и извлекать из них текст для дальнейшей обработки содержимого. Тем не менее, классический OCR далек от совершенства и может испытывать трудности с мелким шрифтом, искаженными изображениями, вертикальным текстом и подобными случаями. Если качество OCR низкое, то все последующие операции, будь то регулярные выражения или работа с LLM, окажутся затрудненными. Прямая подача изображений в VLMs вместо извлеченного текста в LLMs оказывается гораздо эффективнее для полного использования доступной информации.
Визуальное положение текста порой критично для правильного понимания его смысла. Представьте ситуацию, показанную на изображении ниже: там есть флажки, отмечающие релевантный текст, некоторые из которых отмечены, а другие — нет. К каждому флажку соответствует текст, и только тот, что рядом с отмеченным флажком, имеет значение. Извлечение такой информации с помощью OCR и LLMs сложно, поскольку невозможно определить, к какому тексту относится отмеченный флажок. В то же время для визуальных языковых моделей эта задача решается без усилий.

Изображение выше было подано в Qwen 3 VL, и модель дала следующий ответ:
Based on the image provided, the documents that are checked off are: - **Document 1** (marked with an "X") - **Document 3** (marked with an "X") **Document 2** is not checked (it is blank).Как видно, Qwen 3 VL без проблем справилась с задачей и выдала верный результат.
Еще одна причина необходимости VLMs — возможность анализа видео. Полное понимание видеоклипов с помощью OCR было бы чрезвычайно сложно, поскольку большая часть информации в видео передается не текстом, а напрямую изображениями. OCR здесь неэффективен. Однако современные VLMs позволяют загружать сотни изображений, например, представляющих видео, и выполнять задачи по его интерпретации.
Задачи для визуальных языковых моделей
Существует множество задач, на которые можно применять визуальные языковые модели. Здесь рассмотрены несколько наиболее актуальных.
- Оптическое распознавание символов (OCR)
- Извлечение информации
Данные для тестирования
Для демонстрации используется изображение ниже.

Такой документ идеален для применения Qwen 3 VL. Изображение обрезано для загрузки в высоком разрешении на локальном устройстве. Сохранение высокого разрешения необходимо для точного OCR. Изображение извлечено из PDF при 600 DPI. Обычно 300 DPI достаточно для распознавания, но повышенное значение обеспечивает надежность в этом компактном формате.
Подготовка Qwen 3 VL
Для запуска Qwen 3 VL требуются следующие импорты:
torch accelerate pillow torchvision git+https://github.com/huggingface/transformersTransformers нужно устанавливать из исходного кода на GitHub, поскольку Qwen 3 VL еще не включена в последнюю стабильную версию библиотеки.
Ниже приведен код для загрузки импортов, модели и процессора, а также создания функции для вывода:
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] Оптическое распознавание символов
Большинство VLMs обучаются на задачах OCR. В технических отчетах о моделях Qwen VL упоминается, что данные для OCR включены в обучающий набор. Для подготовки VLMs к распознаванию модель получает серию изображений с текстом, из которого учится извлекать символы.
Для изображения применяется следующий промпт, аналогичный тому, что использует команда Qwen для OCR в соответствии с руководством по Qwen 3 VL.
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 Dato: 23.01.2014 Bruker: HKN Målestokk 1:500 Ekvidistanse 1m Høydegrunnlag: Oslo lokal Koordinatsystem: EUREF89 - UTM sone 32 © Plan- og bygningsetaten, Oslo kommune Originalformat A3 Adresse: Camilla Colletts vei 15 Gnr/Bnr: . Kartet er sammenstilt for: . PlotID: / Best.nr.: 27661 / Deres ref: Camilla Colletts vei 15 Kommentar: Gjeldende kommunedelplaner: KDP-BB, KDP-13, KDP-5 Kartutsnittet gjelder vertikalinvå 2. I tillegg finnes det regulering i følgende vertikalinvå: (Hvis blank: Ingen øvrige.) Det er ikke registrert naturn mangfold innenfor Se tegnforklaring på eget ark. Beskrivelse: NR: Dato: Revidert dato:Этот вывод получен в ходе тестирования, он полностью точен, охватывает весь текст на изображении и правильно извлекает все символы.
Извлечение информации
Визуальные языковые модели также подходят для извлечения информации, например, ключевых метаданных из изображений. Обычно такие данные выводятся в формате 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-объект валиден, Qwen успешно извлекла дату, адрес и масштаб. Хотя поле 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" }Таким образом, Qwen корректно указывает на отсутствие информации в документе.
Ограничения визуальных языковых моделей
Стоит отметить, что у визуальных языковых моделей есть свои недостатки. Тестируемое изображение для OCR и извлечения информации относительно простое. Для полной оценки Qwen 3 VL потребовались бы более сложные сценарии, такие как распознавание большего объема текста из длинного документа или извлечение дополнительных метаданных.
Основные текущие ограничения VLMs, по наблюдениям:
- Пропуск текста при OCR.
- Медленный вывод.
Пропуск текста VLMs при OCR замечался неоднократно. В таких случаях модель просто игнорирует целую секцию документа, что крайне проблематично, поскольку может упустить ключевые данные для задач вроде поиска по ключевым словам. Причины этого феномена сложны и выходят за рамки статьи, но об этом важно знать при использовании VLMs для OCR.
Кроме того, VLMs требуют значительных вычислительных ресурсов. Тестирование проводилось локально на ПК с небольшой моделью. Проблемы с памятью возникли при обработке изображения 2048×2048, что усложняет работу с крупными документами. Можно представить, насколько ресурсоемко применять VLMs для:
- Обработки нескольких изображений одновременно (например, 10-страничный документ).
- Работы с документами в повышенном разрешении.
- Использования более крупных моделей с большим числом параметров.
Заключение
В статье рассмотрены визуальные языковые модели, начиная с объяснения их необходимости: некоторые задачи требуют не только текста, но и его визуального контекста. Далее показаны примеры задач для VLMs и как Qwen 3 VL с ними справляется. Визуальный модус станет все более значимым в ближайшие годы. До недавнего времени акцент был на чисто текстовых моделях, но для создания еще более мощных систем необходимо интегрировать визуальные возможности, где VLMs сыграют ключевую роль.