On this page

On 2026-11-03 09:09:18 Asia/Shanghai (2026-11-03T01:09:18.361Z), the Perplexity community account pplx-announcements published an Announcements thread titled *Introducing pplx-embed-v2-context: open-weight vision-language embedding models in 9B and 0.6B*. The short post states that both sizes can return one int8 vector per document, or one chunk vector per chunk that sees the whole document, links the paper arXiv:2610.38854, and notes the write-up was done with turbopuffer.

That community clock is not the first timestamp for the family. The paper page lists citation date 2026/10/28 and “Submitted on 28 Oct 2026.” Hugging Face shows pplx-embed-v2-context-0.6b created 2026-10-21 20:42:50 Asia/Shanghai and last modified 2026-10-30 18:00:18 Asia/Shanghai; pplx-embed-v2-context-9b created 2026-10-28 20:38:45 Asia/Shanghai and last modified 2026-10-30 17:59:28 Asia/Shanghai. 2026-11-03 is the community announcement day—not a claim that the whole stack appeared for the first time that morning.

Related reading: Ai2 OlmoEarth 1.3 Spots Land Change Without Training a Model, How Perplexity Computer Runs Locally on Mac and What Hybrid Mode Does, Atria Dawn Formal Weights Are Out: 512K Context on Hugging Face, and OpenAI Habitat: Storage Reads ~12x Faster — Not ChatGPT Answers. Those pieces sit on neighboring lines—satellite embeddings explorer, Perplexity Computer on Mac, open formal weights, and storage-layer reads. They are not the same topic as contextual multimodal retrieval embeddings.

Why isolated chunks lose the answer

In retrieval-augmented generation, long documents are split into chunks that are indexed and scored on their own. A rent figure, a revision letter, or a table cell often depends on a heading, a definition, or an entity name elsewhere in the same file. A standard dense embedder encodes each chunk in isolation, so the vector may no longer match the query that needs that surrounding context. Encoding the entire document as a single vector tends to wash out the details a reader still needs.

Contextual embeddings encode each chunk with the document’s surrounding context in view. Perplexity’s cards describe two modes on the same models: contextual (chunks see neighbors) and non-contextual (text inputs embedded alone). The community one-liner matches that split: one int8 vector for a whole document, or one contextual vector per chunk.

The paper *Contextual Embeddings Beyond the Gold Chunk* argues that real retrieval often needs more than a single “gold” answer span—supporting evidence that identifies the entity, period, or condition also has to surface. Training here distills graded chunk-level relevance from a query-aware context compression model instead of relying only on gold-chunk labels. That research framing is on arXiv; the sections below stay with what operators can read from the announcement, the cards, and the paper abstract/front matter.

Two open-weight sizes on Hugging Face

Both repositories are under perplexity-ai, tagged for feature extraction / contextual embeddings, multilingual language tags, and custom_code. Both list gated=false. Bases are late-chunk siblings: perplexity-ai/pplx-embed-v2-late-0.6b and perplexity-ai/pplx-embed-v2-late-9b (finetune relation on the cards).

Field0.6B9B
Repoperplexity-ai/pplx-embed-v2-context-0.6bperplexity-ai/pplx-embed-v2-context-9b
Safetensors total595370176 (≈ 595M)8401083632 (≈ 8.40B)
License on card / APINo clear license in cardData / README YAML (API license=None)license: mit in cardData (tags include license:mit)
gatedfalsefalse
Native embedding width (card examples)10242048 (Matryoshka also at 1024)

License boundary: the 9B card states MIT. The 0.6B card, README front matter, and API expose no clear license field—0.6B is not documented as MIT, and the two sizes do not share one stated license. Redistribution needs a fresh look at the hub page.

Card copy calls each model “state-of-the-art.” That wording is model-card self-report. We have not retested recall, nDCG, VRAM, throughput, multilingual quality, or visual-document retrieval on DigIntoAI stacks.

Encoding rules that silently break quality

Both READMEs share the same hard rules. Missing any one of them is how a “correct-looking” index still ranks poorly.

  1. Queries use encode_queries; document chunks use encode. The models are trained with separate query and document prefixes. Encoding queries with encode silently degrades retrieval quality—no hard error, just worse ranking.
  2. In contextual mode, document chunks should be non-overlapping. Overlapping spans fight the training assumption that each chunk boundary is a clean separator.
  3. Native outputs are unnormalized int8. Compare with cosine similarity, or pass normalize_embeddings=True and use the dot product.
  4. Load with trust_remote_code=True. Custom code is required; documented dependencies include transformers>=5.4.0, plus torch, numpy, safetensors, tqdm, Pillow, and torchvision. Optional flash-linear-attention and causal-conv1d enable the fast linear-attention path.
  5. Text encode does not truncate. Split or truncate oversize documents before calling the API. One embedding per document means passing each document as a single-chunk list.

Minimal text shape from the cards (IDs and flags as documented):

python
from transformers import AutoModel

model = AutoModel.from_pretrained(
    "perplexity-ai/pplx-embed-v2-context-0.6b",  # or ...-9b
    trust_remote_code=True,
).to("cuda")

documents = [
    ["Chunk A of doc 1.", "Chunk B of doc 1."],
    ["Only chunk of doc 2."],
]
chunk_embeddings = model.encode(documents, normalize_embeddings=True)
query_embeddings = model.encode_queries(
    [["What question matches chunk A?"]],
    normalize_embeddings=True,
)

Non-contextual mode on the cards flattens every chunk into its own singleton list before encode. Contextual mode keeps chunks grouped per document so neighbors stay visible in one forward pass.

Mixing 9B and 0.6B in one index

The cards state that the 1024-dimensional MRL prefix of the 9B model shares an embedding space with the 0.6B model. Documents can be embedded with one size and queried with the other—after aligning dimensions correctly.

The 9B card documents Matryoshka training at 1024 and 2048. To compare against 0.6B:

  1. Call encode / encode_queries / encode_images without normalizing first (native unnormalized int8).
  2. Only the first 1024 dimensions of each 9B vector remain.
  3. Then L2-normalize.
  4. Queries and image embeddings follow the same truncate-then-normalize path when mixing.

Other truncation widths were not trained for this alignment. Skipping the “unnormalized → slice → normalize” order is another silent mismatch risk.

Images and visual documents: horizontal bands

Both cards expose encode_images for pages or other images as contextual chunks. Each image is encoded in one contextual forward pass; merged visual tokens are divided into whole-row horizontal bands. Queries against those pages still use encode_queries.

Documented image knobs include chunks (default 8 requested bands), min_pixels (16384), max_pixels (1800000), and batch_size (1). The actual band count is capped by the number of merged image rows. Page-level scoring in the examples takes the max chunk score after a normalized matrix product. Card text says chunking images can substantially improve retrieval—again card claim, not a DigIntoAI measurement.

Ordinary chunking vs contextual chunking

AxisOrdinary (non-contextual)Contextual (pplx-embed-v2-context)
What the encoder seesOne chunk aloneChunk plus surrounding document context
Typical card call shapeFlatten to [[chunk], …] then encodeKeep [[c1, c2, …], …] per document for encode
Query pathStill encode_queriesStill encode_queries
OverlapOften used in classic RAGCards require non-overlapping chunks in contextual mode
Whole-document vectorOne isolated doc stringDocument as a single-chunk list

Non-contextual fits when chunks are already self-contained (FAQ lines, short titles). Contextual fits when answers depend on headings, pronouns, table headers, or revision notes elsewhere in the same file—the failure mode the paper and cards are built around.

Operator checklist

  1. Clock. Community post 2026-11-03 09:09:18 Asia/Shanghai by pplx-announcements; paper submitted 2026-10-28; HF repos predate the community post—not “first appeared today.”
  2. Sizes. Open-weight 9B (≈ 8.40B) and 0.6B (≈ 595M), both gated=false, custom code, vision-language retrieval over text / images / visual documents.
  3. License. 9B = MIT on cardData; 0.6B = no clear license on the card/API—license lines stay separate.
  4. API split. Documents → encode; queries → encode_queries. Mixing the wrong method silently degrades quality.
  5. Chunking. Contextual mode → non-overlapping chunks; optional single-chunk list for one vector per document.
  6. Vectors. Native unnormalized int8; cosine, or normalize then dot product.
  7. Load. trust_remote_code=True; transformers>=5.4.0 stack as on the cards.
  8. Cross-size. Shared 1024-d MRL prefix: slice unnormalized 9B vectors to 1024, then normalize, before comparing with 0.6B.
  9. Vision. encode_images with horizontal bands; queries still via encode_queries.
  10. Scores. Card / paper “SOTA” language = self-reported. We have not retested recall, VRAM, multilingual quality, or visual retrieval.

Bottom line

Perplexity’s community announcement on 2026-11-03 pointed operators at open-weight pplx-embed-v2-context in 9B and 0.6B, with contextual chunk vectors that can see the rest of the document and a shared 1024-d space for mixed-size indexes. The research paper and HF repos were already on the record from late October 2026. The practical traps are operational, not marketing: wrong encode method for queries, overlapping contextual chunks, normalizing before MRL truncation, and treating model-card SOTA lines as third-party measurements. We have not run end-to-end retrieval or hardware benches on these weights—live notes can go through the site-owner contact in the footer.