The Qwen3-VL-Embedding and Qwen3-VL-Reranker model series are the latest additions to the Qwen family, built upon the recently open-sourced and powerful Qwen3-VL foundation model. Specifically designed for multimodal information retrieval and cross-modal understanding, this suite accepts diverse inputs including text, images, screenshots, and videos, as well as inputs containing a mixture of these modalities.
While the Embedding model generates high-dimensional vectors for broad applications like retrieval and clustering, the Reranker model is engineered to refine these results, establishing a comprehensive pipeline for state-of-the-art multimodal search.
Multimodal Versatility: Both models seamlessly handle a wide range of inputs—including text, images, screenshots, and video—within a unified framework. They deliver state-of-the-art performance across diverse multimodal tasks such as image-text retrieval, video-text matching, visual question answering (VQA), and multimodal content clustering.
Unified Representation Learning (Embedding): By leveraging the Qwen3-VL architecture, the Embedding model generates semantically rich vectors that capture both visual and textual information in a shared space. This facilitates efficient similarity computation and retrieval across different modalities.
High-Precision Reranking (Reranker): We also introduce the Qwen3-VL-Reranker series to complement the embedding model. The reranker takes a (query, document) pair as input—where both query and document may contain arbitrary single or mixed modalities—and outputs a precise relevance score. In retrieval pipelines, the two models are typically used in tandem: the embedding model performs efficient initial recall, while the reranker refines results in a subsequent re-ranking stage. This two-stage approach significantly boosts retrieval accuracy.
Exceptional Practicality: Inheriting Qwen3-VL’s multilingual capabilities, the series supports over 30 languages, making it ideal for global applications. It is highly practical for real-world scenarios, offering flexible vector dimensions, customizable instructions for specific use cases, and strong performance even with quantized embeddings. These capabilities enable developers to seamlessly integrate both models into existing pipelines, unlocking powerful cross-lingual and cross-modal understanding.
Model Overview
Qwen3-VL-Embedding-8B has the following features:
Model Type: MultiModal Embedding
Supported Languages: 30+ Languages
Supported Input Modalities: Text, images, screenshots, videos, and arbitrary multimodal combinations (e.g., text + image, text + video)
Number of Parameters: 8B
Context Length: 32k
Embedding Dimension: Up to 4096, supports user-defined output dimensions ranging from 64 to 4096
For more details, including benchmark evaluation, hardware requirements, and inference performance, please refer to our technical report, blog, GitHub.
Qwen3-VL-Embedding and Qwen3-VL-Reranker Model list
Quantization Support indicates the supported quantization post process for the output embedding.
MRL Support indicates whether the embedding model supports custom dimensions for the final embedding.
Instruction Aware notes whether the embedding or reranking model supports customizing the input instruction according to different tasks.
Our evaluation indicates that, for most downstream tasks, using instructions (instruct) typically yields an improvement of 1% to 5% compared to not using them. Therefore, we recommend that developers create tailored instructions specific to their tasks and scenarios. In multilingual contexts, we also advise users to write their instructions in English, as most instructions utilized during the model training process were originally written in English.
Results on the MMEB-V2 benchmark. All models except IFM-TTE have been re-evaluated on the updated VisDoc OOD split. CLS: classification, QA: question answering, RET: retrieval, GD: grounding, MRET: moment retrieval, VDR: ViDoRe, VR: VisRAG, OOD: out-of-distribution.
Install Sentence Transformers with pip install sentence-transformers, then use the model like this:
python
1from sentence_transformers import SentenceTransformer
23# Load the model4model = SentenceTransformer("Qwen/Qwen3-VL-Embedding-8B")56# Text queries7queries =[8"A woman playing with her dog on a beach at sunset.",9"Pet owner training dog outdoors near water.",10"Woman surfing on waves during a sunny day.",11"City skyline view from a high-rise building at night.",12]1314# Documents: text, image, and text+image15documents =[16"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust.",17"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg",18{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust.","image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"},19]2021# Encode queries and documents22query_embeddings = model.encode(queries)23doc_embeddings = model.encode(documents)24print(query_embeddings.shape, doc_embeddings.shape)25# (4, 4096) (3, 4096)2627# Compute similarities28similarities = model.similarity(query_embeddings, doc_embeddings)29print(similarities)30# tensor([[0.7438, 0.6556, 0.6244],31# [0.4430, 0.3323, 0.3929],32# [0.3685, 0.2310, 0.2874],33# [0.0602, -0.0162, 0.0167]])
By default, all inputs are wrapped with the "Represent the user's input." instruction via a system prompt. You can customize this by passing a different prompt:
python
1# With a custom prompt2model.encode(queries, prompt="Retrieve relevant documents for the query.")
1from scripts.qwen3_vl_embedding import Qwen3VLEmbedder
23# Define a list of query texts4queries =[5{"text":"A woman playing with her dog on a beach at sunset."},6{"text":"Pet owner training dog outdoors near water."},7{"text":"Woman surfing on waves during a sunny day."},8{"text":"City skyline view from a high-rise building at night."}9]1011# Define a list of document texts and images12documents =[13{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust."},14{"image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"},15{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust.","image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"}16]1718# Specify the model path19model_name_or_path ="Qwen/Qwen3-VL-Embedding-8B"2021# Initialize the Qwen3VLEmbedder model22model = Qwen3VLEmbedder(model_name_or_path=model_name_or_path)23# We recommend enabling flash_attention_2 for better acceleration and memory saving,24# model = Qwen3VLEmbedder(model_name_or_path=model_name_or_path, torch_dtype=torch.float16, attn_implementation="flash_attention_2")2526# Combine queries and documents into a single input list27inputs = queries + documents
2829# Process the inputs to get embeddings30embeddings = model.process(inputs)3132# Compute similarity scores between query embeddings and document embeddings33similarity_scores =(embeddings[:4] @ embeddings[4:].T)3435# Print out the similarity scores in a list format36print(similarity_scores.tolist())3738# [[0.74267578125, 0.6630859375, 0.6328125], [0.443603515625, 0.33349609375, 0.396484375], [0.3671875, 0.2354736328125, 0.289306640625], [0.060821533203125, -0.01557159423828125, 0.0165863037109375]]
vLLM Basic Usage Example
python
1import argparse
2import numpy as np
3import os
4from typing import List, Dict, Any
5from vllm import LLM, EngineArgs
6from vllm.multimodal.utils import fetch_image
789# Define a list of query texts10queries =[11{"text":"A woman playing with her dog on a beach at sunset."},12{"text":"Pet owner training dog outdoors near water."},13{"text":"Woman surfing on waves during a sunny day."},14{"text":"City skyline view from a high-rise building at night."}15]1617# Define a list of document texts and images18documents =[19{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust."},20{"image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"},21{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust.","image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"}22]2324defformat_input_to_conversation(input_dict: Dict[str, Any], instruction:str="Represent the user's input.")-> List[Dict]:25 content =[]2627 text = input_dict.get('text')28 image = input_dict.get('image')2930if image:31 image_content =None32ifisinstance(image,str):33if image.startswith(('http','https','oss')):34 image_content = image
35else:36 abs_image_path = os.path.abspath(image)37 image_content ='file://'+ abs_image_path
38else:39 image_content = image
4041if image_content:42 content.append({43'type':'image',44'image': image_content,45})4647if text:48 content.append({'type':'text','text': text})4950ifnot content:51 content.append({'type':'text','text':""})5253 conversation =[54{"role":"system","content":[{"type":"text","text": instruction}]},55{"role":"user","content": content}56]5758return conversation
5960defprepare_vllm_inputs(input_dict: Dict[str, Any], llm, instruction:str="Represent the user's input.")-> Dict[str, Any]:61 text = input_dict.get('text')62 image = input_dict.get('image')6364 conversation = format_input_to_conversation(input_dict, instruction)6566 prompt_text = llm.llm_engine.tokenizer.apply_chat_template(67 conversation,68 tokenize=False,69 add_generation_prompt=True70)7172 multi_modal_data =None73if image:74ifisinstance(image,str):75if image.startswith(('http','https','oss')):76try:77 image_obj = fetch_image(image)78 multi_modal_data ={"image": image_obj}79except Exception as e:80print(f"Warning: Failed to fetch image {image}: {e}")81else:82 abs_image_path = os.path.abspath(image)83if os.path.exists(abs_image_path):84from PIL import Image
85 image_obj = Image.open(abs_image_path)86 multi_modal_data ={"image": image_obj}87else:88print(f"Warning: Image file not found: {abs_image_path}")89else:90 multi_modal_data ={"image": image}9192 result ={93"prompt": prompt_text,94"multi_modal_data": multi_modal_data
95}96return result
9798defmain():99 parser = argparse.ArgumentParser(description="Offline Similarity Check with vLLM")100 parser.add_argument("--model-path",type=str, default="models/Qwen3-VL-Embedding-8B",help="Path to the model")101 parser.add_argument("--dtype",type=str, default="bfloat16",help="Data type (e.g., bfloat16)")102 args = parser.parse_args()103104print(f"Loading model from {args.model_path}...")105106 engine_args = EngineArgs(107 model=args.model_path,108 runner="pooling",109 dtype=args.dtype,110 trust_remote_code=True,111)112113 llm = LLM(**vars(engine_args))114115 all_inputs = queries + documents
116 vllm_inputs =[prepare_vllm_inputs(inp, llm)for inp in all_inputs]117118119 outputs = llm.embed(vllm_inputs)120121 embeddings_list =[]122for i, output inenumerate(outputs):123 emb = output.outputs.embedding
124 embeddings_list.append(emb)125print(f"Input {i} embedding shape: {len(emb)}")126127 embeddings = np.array(embeddings_list)128print(f"\nEmbeddings shape: {embeddings.shape}")129130 num_queries =len(queries)131 query_embeddings = embeddings[:num_queries]132 doc_embeddings = embeddings[num_queries:]133134 similarity_scores = query_embeddings @ doc_embeddings.T
135136print("\nSimilarity Scores:")137print(similarity_scores.tolist())138139140if __name__ =="__main__":141 main()
SGLang Basic Usage Example
python
1import argparse
2import numpy as np
3import torch
4import os
5from typing import List, Dict, Any
6from sglang.srt.entrypoints.engine import Engine
78# Define a list of query texts9queries =[10{"text":"A woman playing with her dog on a beach at sunset."},11{"text":"Pet owner training dog outdoors near water."},12{"text":"Woman surfing on waves during a sunny day."},13{"text":"City skyline view from a high-rise building at night."}14]1516# Define a list of document texts and images17documents =[18{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust."},19{"image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"},20{"text":"A woman shares a joyful moment with her golden retriever on a sun-drenched beach at sunset, as the dog offers its paw in a heartwarming display of companionship and trust.","image":"https://qianwen-res.oss-cn-beijing.aliyuncs.com/Qwen-VL/assets/demo.jpeg"}21]2223defformat_input_to_conversation(input_dict: Dict[str, Any], instruction:str="Represent the user's input.")-> List[Dict]:24 content =[]2526 text = input_dict.get('text')27 image = input_dict.get('image')2829if image:30 image_content =None31ifisinstance(image,str):32if image.startswith(('http','oss')):33 image_content = image
34else:35 abs_image_path = os.path.abspath(image)36 image_content ='file://'+ abs_image_path
37else:38 image_content = image
39if image_content:40 content.append({41'type':'image','image': image_content,42})4344if text:45 content.append({'type':'text','text': text})4647ifnot content:48 content.append({'type':'text','text':""})4950 conversation =[51{"role":"system","content":[{"type":"text","text": instruction}]},52{"role":"user","content": content}53]5455return conversation
5657defconvert_to_sglang_format(input_dict: Dict[str, Any], engine: Engine, instruction:str="Represent the user's input.")-> Dict[str, Any]:58 conversation = format_input_to_conversation(input_dict, instruction)5960 text_for_api = engine.tokenizer_manager.tokenizer.apply_chat_template(61 conversation,62 tokenize=False,63 add_generation_prompt=True64)6566 result ={"text": text_for_api}6768 image = input_dict.get('image')69if image andisinstance(image,str):70 result["image"]= image
717273return result
7475defmain():76 parser = argparse.ArgumentParser(description="Offline Similarity Check with SGLang")77 parser.add_argument("--model-path",type=str, default="models/Qwen3-VL-Embedding-8B",help="Path to the model")78 parser.add_argument("--dtype",type=str, default="bfloat16",help="Data type (e.g., bfloat16)")79 args = parser.parse_args()8081print(f"Loading model from {args.model_path}...")8283 engine = Engine(84 model_path=args.model_path,85 is_embedding=True,86 dtype=args.dtype,87 trust_remote_code=True,88)8990 inputs = queries + documents
91 sglang_inputs =[convert_to_sglang_format(inp, engine)for inp in inputs]92print(sglang_inputs[:])93print(f"sglang_inputs: {sglang_inputs}")94print(f"Processing {len(sglang_inputs)} inputs...")9596 prompts =[inp['text']for inp in sglang_inputs]97 images =[inp.get('image')for inp in sglang_inputs]9899100 results = engine.encode(prompts, image_data=images)101102 embeddings_list =[]103for res in results:104 embeddings_list.append(res['embedding'])105106 embeddings = np.array(embeddings_list)107print(f"Embeddings shape: {embeddings.shape}")108109 num_queries =len(queries)110 query_embeddings = embeddings[:num_queries]111 doc_embeddings = embeddings[num_queries:]112113 similarity_scores =(query_embeddings @ doc_embeddings.T)114115print("\nSimilarity Scores:")116print(similarity_scores.tolist())117118if __name__ =="__main__":119 main()
If you find our work helpful, feel free to give us a cite.
@article{qwen3vlembedding,
title={Qwen3-VL-Embedding and Qwen3-VL-Reranker: A Unified Framework for State-of-the-Art Multimodal Retrieval and Ranking},
author={Li, Mingxin and Zhang, Yanzhao and Long, Dingkun and Chen Keqin and Song, Sibo and Bai, Shuai and Yang, Zhibo and Xie, Pengjun and Yang, An and Liu, Dayiheng and Zhou, Jingren and Lin, Junyang},
journal={arXiv preprint arXiv:2601.04720},
year={2026}
}