Кодинг-агенты на базе языковых моделей умеют генерировать HTML, запускать браузер через Playwright и снимать скриншоты — но не умеют смотреть на результат. Скриншот лежит на диске, а модель не знает, уехала ли кнопка влево или обрезалась ли таблица на мобильном. Без визуальной обратной связи цикл «написал → проверил → исправил» разрывается, и человек вынужден вручную описывать баги — вместо того чтобы принимать готовый результат.
Автор материала предложил архитектурно простое решение: MCP-сервер (Model Context Protocol — стандарт для подключения внешних инструментов к языковым моделям), который принимает скриншот и возвращает структурированное текстовое описание. Внутри сервера — вызов локальной vision-модели. Ключевая гипотеза: для «зрения» на скриншотах не нужна фронтирная модель. Задача сводится к извлечению данных — OCR, перечисление кнопок, определение layout, детекция обрезки — и с ней справляется компактная открытая модель.
| Слой | Модель | Средний балл | Разрыв до фронтира |
|---|---|---|---|
| Baseline | qwen3-vl:8b v0.1.0 | 3,99 | 1,01 |
| Tuned | qwen3-vl:8b v0.2.2 | 4,70 | 0,30 |
| Frontier | Claude Opus 4.7 | 5,00 | — |
В качестве модели выбрана qwen3-vl:8b — открытая мультимодальная модель от Alibaba с 8 миллиардами параметров, понимающая изображения из коробки. Развёртывание через Ollama занимает одну команду: `ollama pull qwen3-vl:8b`. Работает на GPU класса RTX 3090/4090 или Apple Silicon M-серии с 16 и более гигабайтами RAM. MCP-сервер vision-sidecar-mcp опубликован на GitHub и предоставляет три инструмента: `analyze_image` для общего анализа скриншота, `analyze_structured` для извлечения данных в JSON-схему и `extract_table` для работы с таблицами. Весь пайплайн от нуля до работающего агента — около 20 минут.
MCP-сервер vision-sidecar-mcp принимает скриншот и возвращает структурированное описание — текст, кнопки, layout, таблицы — в JSON.

Для оценки качества автор провёл трёхэтапное сравнение на 10 скриншотах реального веб-приложения — детской математической RPG — во вьюпортах от 320×568 пикселей (минимальный мобильный) до 1440×900 (десктоп). Каждый скриншот оценивался по 9 измерениям с баллами от 0 до 5: точность OCR, детекция UI-элементов, понимание layout, детекция кнопок и CTA, семантическое понимание, извлечение таблиц, контроль галлюцинаций, обработка неопределённости и пригодность для дальнейшей обработки. Оценщиком выступал сам Claude Opus 4.7.
Базовая конфигурация qwen3-vl:8b набрала средний балл 3,99 из 5,00 — при потолке 5,00 у Claude Opus 4.7. После тюнинга исключительно на уровне промптов и параметров inference (без fine-tuning весов модели) результат вырос до 4,70. Разрыв с фронтиром сократился с 1,01 до 0,30 балла — то есть закрыт на 70%. Наибольший прирост показали скриншоты с минимальным вьюпортом 320 пикселей (+1,6 балла) и мобильный hero-экран (+1,2 балла).
Что конкретно дал тюнинг: детерминированный seed=42 в сочетании с узкими параметрами сэмплинга top_p=0.9 и top_k=20 убрал вариативность между запусками. Байт-идентичные скриншоты теперь дают структурно идентичный вывод — это открывает возможность regression-тестирования визуальных изменений. Добавление выделенного поля `glyphs_and_icons` в JSON-схему заставило модель явно перечислять спецсимволы: символ ✦ в базовой конфигурации читался как «+» в 100% случаев, после изменения схемы — распознаётся корректно в 100% случаев в structured-режиме.
Главный нерешённый gap — контроль галлюцинаций. Здесь разрыв с Claude Opus 4.7 сократился лишь с 1,4 до 1,2 балла и остаётся самым большим среди всех измерений. Автор отмечает, что fine-tuning весов модели — отдельная, вполне выполнимая задача, которая может дополнительно сократить этот разрыв. Для продакшн-нагрузки с многопоточностью рекомендуется заменить Ollama на vllm или llama.cpp с API-интерфейсом.

Подход демонстрирует практическую закономерность: задачи извлечения данных из изображений — в отличие от генерации или рассуждений — не требуют максимальной мощности модели. Компактная открытая модель, правильно настроенная на уровне промптов и параметров, закрывает большую часть разрыва с фронтиром при нулевых затратах на облачные API.



