Model reference · open weights

LaSER-Qwen3

Embeddings Alibaba-NLP Embeddings 3 builds Open weights 693 dl/mo

LaSER-Qwen3 is an open-weight embedding model from Alibaba. LaSER-Qwen3-4B (FP16) weighs 8.0 GB; the smallest configuration that runs it is RTX 3060 12 GB.

  • LaSER-Qwen3-0.6B is a 596M parameter dense retriever developed by Alibaba that uses latent space explicit reasoning for feature extraction.
  • The model supports a context length of 40,960 tokens and is designed for English language tasks.
  • It is released under the MIT license.

Summary of the Alibaba-NLP/LaSER-Qwen3-0.6B model card, 2026-10-01. The estimate below is for another build of the family.

What it is

Released byAlibaba
Released2026-03-31
Parameters596M
VRAM8.0 GB for the weights

What it runs on

Memory and cards for LaSER-Qwen3-4B (FP16)

8.0 GBweights, file size
1.1 GBruntime overhead
CardRunsMemory
RTX 3060 12 GBfits11.6 GB
RTX 4060 Ti 16 GBfits15.4 GB
RTX 3090 24 GBfits23.4 GB
RTX 4090 24 GBfits23.4 GB
RTX 5090 32 GBfits31.0 GB
L40S 48 GBfits44.0 GB
A100 80 GBfits78.2 GB
H100 80 GBfits78.1 GB
RTX PRO 6000 Blackwell 96 GBfits93.8 GB
DGX Spark (GB10) 128 GB unifiedfits107 GB
H200 141 GBfits138 GB
B200 180 GBfits176 GB

Builds

Sizes, precisions & builds

BuildParamsPrecisionWeightsSmallest setup
LaSER-Qwen3-0.6B ↗ 596MFP16 1.2 GBRTX 3060 12 GB
LaSER-Qwen3-8B ↗ 8.2BFP16 16.4 GBRTX 4090 24 GB
LaSER-Qwen3-4B (above) ↗ 4.0BFP16 8.0 GBRTX 3060 12 GB

From the model card

What Alibaba says about LaSER-Qwen3

Read the model card

LaSER (Latent Space Explicit Reasoning) is a self-distillation framework that internalizes explicit Chain-of-Thought reasoning into the latent space of dense retrievers, enabling the model to "think silently" through continuous latent tokens.

LaSER-Qwen3-0.6B is a 0.6B-parameter dense retriever built on Qwen/Qwen3-0.6B.

📄 Paper: LaSER: Internalizing Explicit Reasoning into Latent Space for Dense Retrieval

💻 Code: https://github.com/ignorejjj/LaSER

Model Summary

AttributeDetail
Model TypeDense Retriever with Latent Thinking
Base ModelQwen/Qwen3-0.6B
Parameters0.6B
Embedding Dimension1024
Max Sequence Length8192 (training: 512)
Similarity FunctionCosine Similarity
Latent Thinking Steps (K)3 (default)
Training Data81K examples from ReasonEmb
LicenseMIT

How It Works

Unlike standard dense retrievers that encode queries in a single forward pass, LaSER generates K continuous latent thinking tokens autoregressively in the embedding space:

  1. Encode the input text into embeddings
  2. At each thinking step, project the last hidden state through the LM head → softmax → compute a probability-weighted soft token from the embedding table
  3. Append the soft token and repeat for K steps (using KV caching for efficiency)
  4. Mean-pool the hidden states from all K thinking steps → L2 normalize

This enables complex reasoning while maintaining the inference efficiency of standard dense retrievers (~1.7× latency overhead, only ~0.3% of rewrite-then-retrieve pipelines).

Usage

Direct Usage with Transformers

import torch
import torch.nn.functional as F
from transformers import AutoModelForCausalLM, AutoTokenizer

def laser_encode(model, tokenizer, texts, max_length=512, num_thinking_steps=3):
    """Encode texts using LaSER's latent thinking mechanism."""
    device = next(model.parameters()).device
    batch = tokenizer(texts, padding=True, truncation=True, max_length=max_length, return_tensors="pt").to(device)
    input_ids, attention_mask = batch["input_ids"], batch["attention_mask"]

    batch_size = input_ids.size(0)
    thinking_slots = num_thinking_steps - 1
    eos_id = tokenizer.eos_token_id

    if thinking_slots > 0:
        eos_padding = torch.full((batch_size, thinking_slots), eos_id, dtype=input_ids.dtype, device=device)
        mask_padding = torch.ones((batch_size, thinking_slots), dtype=attention_mask.dtype, device=device)
        input_ids = torch.cat([input_ids, eos_padding], dim=1)
        attention_mask = torch.cat([attention_mask, mask_padding], dim=1)

    input_embeds = model.get_input_embeddings()(input_ids)
    embedding_table = model.get_input_embeddings().weight
    base_seq_len = input_embeds.size(1) - thinking_slots

    past_key_values = None
    hidden_steps = []

    for step_idx in range(thinking_slots):
        pos = base_seq_len + step_idx
        step_embeds = input_embeds[:, :pos, :] if past_key_values is None else input_embeds[:, pos-1:pos, :]
        step_mask = attention_mask[:, :pos]

        outputs = model(inputs_embeds=step_embeds, attention_mask=step_mask,
                       output_hidden_states=True, past_key_values=past_key_values,
                       use_cache=True, return_dict=True)
        hidden_steps.append(outputs.hidden_states[-1][:, -1, :])
        token_probs = torch.softmax(outputs.logits[:, -1, :], dim=-1)
        new_embed = token_probs @ embedding_table
        past_key_values = outputs.past_key_values
        pre = input_embeds[:, :pos, :]
        post = input_embeds[:, pos+1:, :]
        input_embeds = torch.cat([pre, new_embed.unsqueeze(1), post], dim=1)

    final_embeds = input_embeds[:, -1:, :] if past_key_values else input_embeds
    outputs = model(inputs_embeds=final_embeds, attention_mask=attention_mask,
                   output_hidden_states=True, past_key_values=past_key_values,
                   use_cache=True, return_dict=True)
    hidden_steps.append(outputs.hidden_states[-1][:, -1, :])

    embeddings = torch.stack(hidden_steps, dim=1).mean(dim=1)
    return F.normalize(embeddings, p=2, dim=-1)

# Load model
model_name = "Alibaba-NLP/LaSER-Qwen3-0.6B"
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.padding_side = "left"
if tokenizer.pad_token_id is None:
    tokenizer.pad_token = tokenizer.eos_token

model = AutoModelForCausalLM.from_pretrained(
    model_name, torch_dtype=torch.float16, trust_remote_code=True
).cuda().eval()

# Encode queries and documents
with torch.inference_mode():
    query_emb = laser_encode(model, tokenizer, ["why is the sky blue"], num_thinking_steps=3)
    doc_emb = laser_encode(model, tokenizer, ["Rayleigh scattering makes short wavelengths scatter more strongly"], num_thinking_steps=3)

# Compute similarity
similarity = (query_emb @ doc_emb.T).item()
print(f"Cosine similarity: {similarity:.4f}")

Batch Encoding

queries = [
    "What causes tides in the ocean?",
    "How does photosynthesis convert light to energy?",
    "Why do metals conduct electricity?",
]

with torch.inference_mode():
    query_embeddings = laser_encode(model, tokenizer, queries, num_thinking_steps=3)
    print(f"Batch embeddings shape: {query_embeddings.shape}")  # (3, 1024)

Evaluation Results

BRIGHT Benchmark (nDCG@10) — In-Domain

ModelSizeAvg.
Qwen3-Embedding0.6B14.4
Fair Baseline (Qwen3-0.6B)0.6B18.3
Rewrite-then-Retrieve (Qwen3-0.6B) †0.6B22.4
GIRCSE (Qwen3-0.6B)0.6B19.1
LaSER-Qwen3-0.6B (Ours)0.6B23.1

FollowIR & BrowseComp-Plus — Out-of-Domain

| Model | Follow

Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.

© 2026 AxForge · EU-hosted AI infrastructure Pricing Docs Trust Privacy Terms