import torchfrom PIL import Imagefrom transformers import AutoProcessor, Qwen3VLForConditionalGeneration MODEL = "zeeshan141/doc-decision" processor = AutoProcessor.from_pretrained(MODEL)# The same image size limits the benchmark scores were measured with.processor.image_processor.size = {"shortest_edge": 3136, "longest_edge": 501760}model = Qwen3VLForConditionalGeneration.from_pretrained(MODEL, dtype=torch.bfloat16, device_map="auto").eval() def choose(image_path, question, options, context="Inspect the supplied media carefully."): """Returns the chosen option and each option's probability.""" labels = [chr(ord("A") + i) for i in range(len(options))] listed = "".join(f"[{label}] {option}\n" for label, option in zip(labels, options)) text = f"{context}\nQuestion: {question}\nChoose exactly one candidate and answer with its label.\nCandidates:\n{listed}" with Image.open(image_path) as page: image = page.convert("RGB") messages = [{"role": "user", "content": [{"type": "image", "image": image}, {"type": "text", "text": text}]}] prompt = processor.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) + "Answer:\n" inputs = processor(text=[prompt], images=[image], return_tensors="pt").to(model.device) with torch.no_grad(): logits = model(**inputs).logits[0, -1] label_ids = [processor.tokenizer.encode(label, add_special_tokens=False)[0] for label in labels] probabilities = logits[label_ids].float().softmax(-1).tolist() best = max(range(len(options)), key=probabilities.__getitem__) return options[best], dict(zip(options, probabilities)) answer, probabilities = choose("invoice.png", "Is the invoice total above $500?", ["Yes", "No"])print(answer, probabilities)