Skip to content

Token Embedding Usages

Summary

  • Model Usage: Token classification models
  • Pooling Tasks: token_embed
  • Offline APIs:
    • LLM.encode(..., pooling_task="token_embed")
  • Online APIs:
    • Pooling API (/pooling)

The difference between the (sequence) embedding task and the token embedding task is that (sequence) embedding outputs one embedding for each sequence, while token embedding outputs an embedding for each token.

Many embedding models support both (sequence) embedding and token embedding. For further details on (sequence) embedding, please refer to this page.

Note

Pooling multitask support has been removed since v0.21. When the default pooling task (embed) is not what you want, you need to manually specify it via PoolerConfig(task="token_embed") offline or --pooler-config.task token_embed online.

Typical Use Cases

Multi-Vector Retrieval

For implementation examples, see:

Offline: examples/pooling/token_embed/multi_vector_retrieval_offline.py

Online: examples/pooling/token_embed/multi_vector_retrieval_online.py

Late interaction

Similarity scores can be computed using late interaction between two input prompts via the score API. For more information, see Score API.

Extract last hidden states

Models of any architecture can be converted into embedding models using --convert embed. Token embedding can then be used to extract the last hidden states from these models.

Supported Models

Text-only Models

Architecture Models Example HF Models LoRA PP
ColBERTLfm2Model LFM2 LiquidAI/LFM2-ColBERT-350M
ColBERTModernBertModel ModernBERT lightonai/GTE-ModernColBERT-v1
ColBERTJinaRobertaModel Jina XLM-RoBERTa jinaai/jina-colbert-v2
HF_ColBERT BERT answerdotai/answerai-colbert-small-v1, colbert-ir/colbertv2.0
*ModelC, *ForCausalLMC, etc. Generative models N/A * *

Multimodal Models

Note

For more information about multimodal models inputs, see this page.

Architecture Models Inputs Example HF Models LoRA PP
ColModernVBertForRetrieval ColModernVBERT T / I ModernVBERT/colmodernvbert-merged
ColPaliForRetrieval ColPali T / I vidore/colpali-v1.3-hf
ColQwen3 Qwen3-VL T / I TomoroAI/tomoro-colqwen3-embed-4b, TomoroAI/tomoro-colqwen3-embed-8b
ColQwen3_5 ColQwen3.5 T + I + V athrael-soju/colqwen3.5-4.5B-v3, vultr/VultronRetrieverPrime-Qwen3.5-8B
OpsColQwen3Model Qwen3-VL T / I OpenSearch-AI/Ops-Colqwen3-4B, OpenSearch-AI/Ops-Colqwen3-8B
Qwen3VLNemotronEmbedModel Qwen3-VL T / I nvidia/nemotron-colembed-vl-4b-v2, nvidia/nemotron-colembed-vl-8b-v2 ✅︎ ✅︎
*ForConditionalGenerationC, *ForCausalLMC, etc. Generative models * N/A * *

C Automatically converted into an embedding model via --convert embed. (details)
* Feature support is the same as that of the original model.

If your model is not in the above list, we will try to automatically convert the model using as_embedding_model.

Special models

Architecture Models Example HF Models LoRA PP
JinaForRanking Qwen3-based jinaai/jina-reranker-v3

jina-reranker-v3 is a listwise document reranker model with a novel last but not late interaction architecture. More information can be found at: examples/pooling/token_embed/jina_reranker_v3_offline.py

Offline Inference

Pooling Parameters

The following pooling parameters are supported.

    use_activation: bool | None = None
    dimensions: int | None = None
    late_chunking_params: LateChunkingParams | None = None
    """Mean-pool contextual tokens into fixed-size chunks for `token_embed`."""

LLM.encode

The encode method is available to all pooling models in vLLM.

Set pooling_task="token_embed" when using LLM.encode for token embedding Models:

from vllm import LLM

llm = LLM(model="answerdotai/answerai-colbert-small-v1", runner="pooling")
(output,) = llm.encode("Hello, my name is", pooling_task="token_embed")

data = output.outputs.data
print(f"Data: {data!r}")

Fixed-length late chunking

Late chunking encodes the full input before averaging contextual token representations within each chunk. The chunk means pass through the model's embedding head, including its projection and optional normalization.

This mode is currently available through the offline LLM.encode API for plain-text input. With an instance configured for token_embed, enable it per request:

from vllm import PoolingParams
from vllm.pooling_params import LateChunkingParams

outputs = llm.encode(
    [document],
    pooling_task="token_embed",
    pooling_params=PoolingParams(
        late_chunking_params=LateChunkingParams(chunk_size=256)
    ),
)
vectors = outputs[0].outputs.data  # [num_chunks, embedding_dimension]
chunks = outputs[0].late_chunking.chunks

For N model-input tokens and chunk size C, the output contains ceil(N / C) vectors. The last chunk uses its actual length. Special tokens and instruction prefixes count toward both chunk boundaries and means. Omitting late_chunking_params preserves ordinary token embeddings.

Each vector row corresponds to one entry in chunks. Its token_range and char_range are zero-based, half-open ranges. Character ranges index the submitted Python string; use document[start:end] to retrieve the source text. A chunk containing only special tokens has char_range=None.

Use nonempty text within the model's context window and a fast tokenizer that provides aligned source offsets. Input truncation, explicit padding and renderer text normalization are not supported. The custom document/query outputs of JinaForRanking are also unsupported. Late chunking does not extend the model's context window or reduce its attention computation.

The offline example loads an E5 model and prints the vector shape, token ranges and source excerpts for two documents:

python examples/pooling/token_embed/late_chunking_offline.py --chunk-size 16

LLM.score

The score method outputs similarity scores between sentence pairs.

All models that support token embedding task also support using the score API to compute similarity scores by calculating the late interaction of two input prompts.

from vllm import LLM

llm = LLM(model="answerdotai/answerai-colbert-small-v1", runner="pooling")
(output,) = llm.score(
    "What is the capital of France?",
    "The capital of Brazil is Brasilia.",
)

score = output.outputs.score
print(f"Score: {score}")

Online Serving

Please refer to the Pooling API and use "task":"token_embed".

More examples

More examples can be found here: examples/pooling/token_embed

Supported Features

Token embedding features should be consistent with (sequence) embedding. For more information, see this page.