/ Модель

Характеристики

Контекст
262 144 токена
Размер весов
16,3 ГБ
Лицензия
Apache 2.0
Архитектура
qwen3_vl · dense
Базовая модель
Qwen3-VL-8B-Instruct-UI-Genie
Библиотека
transformers
Опубликована
29 июн 2026

Qwen3-VL-8B-Instruct-UI-Genie-scoring

Изображение и текст → текст3 профессии

Мультимодальная reward-модель Qwen3-VL оценивает качество траекторий действий GUI-агентов и помогает обучать их или выбирать лучший вариант.

18скачиваний за 30 дней0лайковвеса обновлены12 авг 2026

Бенчмарки

Как модель справилась с задачами пользователей ailist и что о ней публикуют открытые лидерборды

Тесты пользователейпока нет

Никто ещё не опубликовал тест этой модели. Соберите бенчмарк из своих задач — результат появится здесь.

  1. Добавьте модель в бенчмарк

    Вместе с другими моделями категории «Изображение → текст» — сравнение идёт внутри одной категории.

  2. Опишите свои задачи

    Напишите запросы, при необходимости приложите файлы и эталонные ответы.

  3. Запустите и опубликуйте

    Модели ответят на каждую задачу, судья оценит ответы. Опубликованный результат появится на этой странице.

Публичные оценки

Из открытых лидербордов. Сравнивайте результаты одного теста при одинаковых условиях — отсутствие оценки не значит, что модель хуже.

В подключённых источниках результатов для этой модели пока нет.

Что умеет модель

Описание составлено по карточке модели и метаданным Hugging Face

Gyubeum разработала мультимодальную reward-модель Qwen3-VL-8B-Instruct-UI-Genie-scoring для оценки траекторий действий GUI-агентов в мобильных интерфейсах. Модель дообучена на UI-Genie-RM-517k на основе Gyubeum/Qwen3-VL-8B-Instruct-UI-Genie, которая, в свою очередь, создана на базе Qwen/Qwen3-VL-8B-Instruct. Это плотная архитектура Qwen3-VL с классификационной головой регрессии: она выдаёт одно скалярное вознаграждение на входную траекторию; более высокая оценка означает более качественное действие. Для обучения использовалась парная функция потерь Bradley–Terry.

Модель предназначена для получения сигнала вознаграждения при обучении GUI-агентов методами PPO/GRPO или RLHF, а также для выбора лучшей траектории из нескольких вариантов. В README указана точность парного сравнения 90,6% на отложенных парах UI-Genie и 61,1% на внепредметном наборе AndroidFlux. Лицензия — Apache-2.0. Для загрузки рекомендуется Transformers; загрузчик Qwen3-VL в vLLM не поддерживает дополнительный тензор score.weight.

Сценарии применения

  • оценка качества действий агента в мобильном интерфейсе
  • ранжирование траекторий GUI-агента по ожидаемому качеству
  • выбор лучшей траектории из нескольких вариантов
  • получение сигнала вознаграждения для PPO или GRPO
  • оценка пар предпочтений при обучении GUI-агента

Ограничения

На внепредметном наборе AndroidFlux парная точность составляет 61,1%, заметно ниже результата на UI-Genie; качество оценки может зависеть от распределения действий и используемого агента. vLLM-загрузчик Qwen3-VL не поддерживает дополнительный тензор score.weight, поэтому README рекомендует Transformers.

Для каких профессий подходит3

Разделы каталога профессий, в задачах которых используется эта модель

Все профессии

Карточка модели

README от автора на Hugging Face, как он его опубликовал

Открыть на Hugging Face

Qwen3-VL-8B-Instruct-UI-Genie-scoring

A Bradley-Terry reward model fine-tuned from Gyubeum/Qwen3-VL-8B-Instruct-UI-Genie (itself SFT'd from Qwen/Qwen3-VL-8B-Instruct) on the UI-Genie-RM-517k dataset. This is a merged sequence-classification checkpoint (task_type="seq_cls", num_labels=1, problem_type="regression") trained with the Bradley-Terry pairwise loss. A learned score.weight linear head projects the last non-padding token's hidden state to a scalar reward.

Score = score_head(last non-padding token hidden state) — a single float per input trajectory. Higher score = higher quality action.

2026-08-10 update: an earlier upload of this repo shipped with the untrained bootstrap score.weight (the swift trainer keeps the head out of the LoRA adapter and writes it only to deepspeed checkpoint shards, which a naive merge/export silently drops — see score_head_source.txt in this repo for provenance). score.weight's norm in the old upload matched the untrained bootstrap head exactly; it now differs by norm 0.099 after fine-tuning. This upload replaces it with the actual trained head and was re-validated with rm_eval before publishing (see Evaluation below).

Intended Use

Drop-in scalar reward signal for GUI agent training (e.g. PPO/GRPO, RLHF) or best-of-N selection. Unlike the discrete <|+|> / <|-|> classifier, this model outputs a continuous unbounded reward that is directly usable as a value signal.

Inference

Requirements

pip install transformers torch pillow safetensors

Note: Use HuggingFace transformers directly — vLLM's Qwen3VLForConditionalGeneration loader does not support the additional score.weight tensor.

Scoring with HuggingFace Transformers

import json
import os
import torch
from safetensors import safe_open
from transformers import AutoProcessor, Qwen3VLForConditionalGeneration
from PIL import Image

MODEL_PATH = "Gyubeum/Qwen3-VL-8B-Instruct-UI-Genie-scoring"
MAX_LEN = 8192
DEVICE = "cuda"

# HF tolerates the extra `score.weight` tensor in the checkpoint (warning,
# harmless) — it just isn't wired into the base CausalLM class, so we load
# it ourselves into a separate linear head below.
model = Qwen3VLForConditionalGeneration.from_pretrained(
    MODEL_PATH,
    torch_dtype=torch.bfloat16,
    low_cpu_mem_usage=True,
).to(DEVICE).eval()
processor = AutoProcessor.from_pretrained(MODEL_PATH, max_pixels=1_048_576)
tokenizer = processor.tokenizer


def _load_score_head(model_path: str) -> torch.nn.Linear:
    from huggingface_hub import hf_hub_download

    index_path = hf_hub_download(model_path, "model.safetensors.index.json")
    with open(index_path) as f:
        weight_map = json.load(f)["weight_map"]
    shard_path = hf_hub_download(model_path, weight_map["score.weight"])
    with safe_open(shard_path, framework="pt") as f:
        weight = f.get_tensor("score.weight")
    head = torch.nn.Linear(weight.shape[1], weight.shape[0], bias=False)
    with torch.no_grad():
        head.weight.copy_(weight)
    return head.to(DEVICE, dtype=torch.bfloat16)


score_head = _load_score_head(MODEL_PATH)


def score_action(prefix_messages, response_text, images=None):
    """
    Score a GUI agent action.

    Args:
        prefix_messages: Chat messages up to (not including) the assistant turn.
                         E.g. [{"role": "system", "content": "..."},
                               {"role": "user", "content": [{"type":"text","text":"..."},
                                                             {"type":"image"}]}]
        response_text:   The assistant tool-call response to score.
        images:          List of PIL.Image objects matching image placeholders.

    Returns:
        float: Scalar BT reward (higher = better action).
    """
    structured_msgs = list(prefix_messages) + [
        {"role": "assistant", "content": response_text.strip()}
    ]
    # Mirrors training: chat template closes the assistant turn with
    # <|im_end|>; the score head reads the hidden state at that position.
    full_text = processor.apply_chat_template(
        structured_msgs, tokenize=False, add_generation_prompt=False
    )

    inputs = processor(
        text=[full_text],
        images=images or None,
        truncation=True,
        max_length=MAX_LEN,
        return_tensors="pt",
    ).to(DEVICE)

    with torch.inference_mode():
        outputs = model(**inputs, output_hidden_states=True, return_dict=True)

    last_hidden = outputs.hidden_states[-1]           # (1, seq_len, hidden_dim)
    last_idx = inputs["attention_mask"].sum(dim=1) - 1
    pooled = last_hidden[0, last_idx[0], :]            # (hidden_dim,)
    reward = score_head(pooled.unsqueeze(0).to(score_head.weight.dtype))
    return reward.squeeze().float().item()


# Example: compare two candidate actions
screenshot = Image.open("screenshot.png").convert("RGB")

SYSTEM_PROMPT = "You are a helpful assistant."  # use full mobile_use tool spec in practice

messages = [
    {"role": "system", "content": SYSTEM_PROMPT},
    {"role": "user",   "content": [
        {"type": "text",  "text": "The user query: tap the search button\n"},
        {"type": "image"},
    ]},
]

action_a = '{"name": "mobile_use", "arguments": {"action": "click", "coordinate": [540, 120]}}'
action_b = '{"name": "mobile_use", "arguments": {"action": "click", "coordinate": [100, 800]}}'

score_a = score_action(messages, action_a, images=[screenshot])
score_b = score_action(messages, action_b, images=[screenshot])

print(f"Action A: {score_a:.4f}")
print(f"Action B: {score_b:.4f}")
print(f"Preferred: {'A' if score_a > score_b else 'B'}")

Pairwise evaluation with rm_eval

python eval_rm.py \
    --rm_path Gyubeum/Qwen3-VL-8B-Instruct-UI-Genie-scoring \
    --datasets ui-genie \
    --mode bt \
    --uigenie_jsonl /path/to/reward_data_rm_pairs_last5.jsonl \
    --uigenie_images_dir /path/to/images \
    --output_dir results/

Evaluation

Pairwise accuracy on held-out (chosen, rejected) UI-Genie pairs:

DatasetPairsPairwise accuracySource
UI-Genie (held-out)100090.6% (906/1000, 3 ties)Fresh rm_eval run, 2026-08-11, on this uploaded checkpoint
UI-Genie (held-out)100090.5% (905/1000, 3 ties)rm_eval run, 2026-05-01, on this exact checkpoint (mtime-verified)
AndroidFlux (OOD multi-agent replay)20361.1% (124/203)rm_eval run, 2026-04-30, on this exact checkpoint (mtime-verified)

The two UI-Genie runs agree to within 1 pair (906 vs. 905 correct, identical tie count), confirming the fix reproduces consistently.

AndroidFlux is out-of-domain relative to the UI-Genie training data (different agents, different action distribution) and is reported for reference, not as the primary validation signal.

Training Details

FieldValue
Base modelGyubeum/Qwen3-VL-8B-Instruct-UI-Genie
Training methodBradley-Terry pairwise loss (LoRA, merged)
ArchitectureQwen3VLForConditionalGeneration + score.weight linear head
Task typeseq_cls (regression, num_labels=1)
ScoreLast non-padding token hidden state → linear head → scalar
dtypebfloat16

Related Models

Citation

@misc{qwen3technicalreport,
      title={Qwen3 Technical Report},
      author={Qwen Team},
      year={2025},
      eprint={2505.09388},
      archivePrefix={arXiv},
      primaryClass={cs.CL},
}

Как запустить

На своей GPU в ailist. Цена — по текущим предложениям провайдеров

GPU в ailist

Универсальный рантайм · transformers

Можно запустить

Подбираем GPU…

Класс архитектуры
Qwen3VLForConditionalGeneration
Ревизия весов
b7d953e

0 моделей