Skip to main content

pplx-embed-v2-late (local)

pplx-embed-v2-late is a pair of MIT-licensed, multimodal late-interaction (ColBERT-style) retrievers from Perplexity, built on Qwen3.5 with bidirectional attention. Instead of one vector per document they emit one 128-d vector per token and score a query against a document with MaxSim. They retrieve text, images and rendered pages without OCR, and the 0.6B and 9B models share an embedding space — a 0.6B query encoder can search an index built with 9B.

OpenTryOn exposes them through the embed service with PplxEmbedLateAdapter (Path B).

CLI modelRepoActive params
pplx-embed-v2-late-0.6bperplexity-ai/pplx-embed-v2-late-0.6b340M
pplx-embed-v2-late-9bperplexity-ai/pplx-embed-v2-late-9b7.4B

Vendor-reported ViDoRe v3 image retrieval (nDCG@10): 62.3 (0.6B), 65.2 (9B).

Local only

Perplexity's hosted Embeddings API serves the v1 dense models (pplx-embed-v1-*, pplx-embed-context-v1-*; PERPLEXITY_API_KEY), not v2-late, and Hugging Face lists no inference provider for it. There is therefore no hosted v2-late integration to add. The text-only pplx-embed-v2-context-9b-preview is a separate preview model and is not integrated.

Requirements​

pip install opentryon[local]
pip install "sentence-transformers>=6.0.0" "transformers>=5.4.0"

Optional override: export PPLX_EMBED_MODEL_ID=/path/to/snapshot. Encode text and image batches separately — mixed text+image batches are unsupported (the adapter does this for you). To index a PDF, render its pages to images first.

CLI​

# Index two lookbook pages and rank them against a query
opentryon embed --model pplx-embed-v2-late-0.6b \
--image page1.png page2.png --query "red wool coat with oversized lapels"

# Text passages
opentryon embed --model pplx-embed-v2-late-9b --text "Care: dry clean only" "Machine wash cold"

Each input becomes a (tokens, 128) matrix stored in outputs/embed_<model>.npz (emb_0 …). With --query the command prints the MaxSim score per input.

Python​

from tryon.models.pplx_embed import PplxEmbedLateAdapter

adapter = PplxEmbedLateAdapter(variant="0.6b")
out = adapter.embed(image=["page1.png", "page2.png"], query="red wool coat")
print(out["scores"], [m.shape for m in out["embeddings"]])

Notes​

  • MCP tools: embed_pplx_embed_v2_late_0_6b, embed_pplx_embed_v2_late_9b.
  • Planner pins: pplx-embed-v2-late (→ 0.6B), pplx-embed-v2-late-9b.
  • Benchmark figures are vendor-reported. The 9B stores F32 safetensors — plan for a large GPU.
  • No GPU was available when this was integrated; weight loading was not exercised end to end.

See also: EmbeddingGemma 2 (single dense vector, adds audio/video).