Model reference · open weights
pplx-embed-context is an open-weight embedding model from perplexity-ai. pplx-embed-context-v1-0.6b (FP32) weighs 1.2 GB; the smallest configuration that runs it is RTX 3060 12 GB.
For self-hosting, compare this build's requirements below with the GPU you plan to rent.
Summary of the perplexity-ai/pplx-embed-context-v1-4b model card, 2026-10-01. The estimate below is for another build of the family.
What it is
| Released by | perplexity-ai |
|---|---|
| Released | 2026-01-20 |
| Parameters | 4.0B |
| VRAM | 1.2 GB for the weights |
What it runs on
| Card | Runs | Memory |
|---|---|---|
| RTX 3060 12 GB | fits | 11.6 GB |
| RTX 4060 Ti 16 GB | fits | 15.4 GB |
| RTX 3090 24 GB | fits | 23.4 GB |
| RTX 4090 24 GB | fits | 23.4 GB |
| RTX 5090 32 GB | fits | 31.0 GB |
| L40S 48 GB | fits | 44.0 GB |
| A100 80 GB | fits | 78.2 GB |
| H100 80 GB | fits | 78.1 GB |
| RTX PRO 6000 Blackwell 96 GB | fits | 93.8 GB |
| DGX Spark (GB10) 128 GB unified | fits | 107 GB |
| H200 141 GB | fits | 138 GB |
| B200 180 GB | fits | 176 GB |
Builds
| Build | Params | Precision | Weights | Smallest setup |
|---|---|---|---|---|
| pplx-embed-context-v1-4b ↗ | 4.0B | FP32 | 8.0 GB | RTX 3060 12 GB |
| pplx-embed-context-v1-0.6b (above) ↗ | 596M | FP32 | 1.2 GB | RTX 3060 12 GB |
From the model card
pplx-embed-v1 and pplx-embed-context-v1 are state-of-the-art text embedding models optimized for real-world, web-scale retrieval tasks.
pplx-embed-v1 for independent text embedding (queries, documents, semantic search)pplx-embed-context-v1 for document chunks in RAG systems where surrounding context matters[!IMPORTANT]
pplx-embed-v1andpplx-embed-context-v1natively produce unnormalized int8-quantized embeddings. Ensure that you compare them via cosine similarity.
| Model | Dimensions | Context | MRL | Quantization | Instruction | Pooling |
|---|---|---|---|---|---|---|
pplx-embed-v1-0.6B | 1024 | 32K | Yes | INT8/BINARY | No | Mean |
pplx-embed-v1-4B | 2560 | 32K | Yes | INT8/BINARY | No | Mean |
pplx-embed-context-v1-0.6B | 1024 | 32K | Yes | INT8/BINARY | No | Mean |
pplx-embed-context-v1-4B | 2560 | 32K | Yes | INT8/BINARY | No | Mean |
curl -X POST https://api.perplexity.ai/v1/contextualizedembeddings \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"input": [
[
"Curiosity begins in childhood with endless questions about the world.",
"As we grow, curiosity drives us to explore new ideas and challenge assumptions.",
"Scientific breakthroughs often start with a simple curious question."
],
[
"The curiosity rover explores Mars, searching for signs of ancient life.",
"Each discovery on Mars sparks new questions about our place in the universe."
]
],
"model": "pplx-embed-context-v1-4b"
}'
from transformers import AutoModel
model_ctx = AutoModel.from_pretrained(
"perplexity-ai/pplx-embed-context-v1-4B",
trust_remote_code=True
)
doc_chunks = [
[
"Curiosity begins in childhood with endless questions about the world.",
"As we grow, curiosity drives us to explore new ideas.",
"Scientific breakthroughs often start with a curious question."
],
[
"The curiosity rover explores Mars searching for ancient life.",
"Each discovery on Mars sparks new questions about the universe."
]
]
# Returns list of numpy arrays (one per document)
# embeddings[0].shape = (3, 1024), embeddings[1].shape = (2, 1024)
embeddings = model_ctx.encode(doc_chunks)
import onnxruntime as ort
from transformers import AutoTokenizer
import numpy as np
import torch
def quantize_int8_tanh(x):
normalized = torch.tanh(x)
rounded = torch.round(normalized * 127)
clamped = torch.clamp(rounded, -128, 127)
return clamped
def quantize_binary(x):
return torch.where(x >= 0, 1.0, -1.0)
def mean_pooling(
token_embeddings: torch.Tensor, attention_mask: torch.Tensor
) -> torch.Tensor:
"""Apply mean pooling to token embeddings."""
input_mask_expanded = (
attention_mask.unsqueeze(-1).expand(token_embeddings.size()).float()
)
return torch.sum(token_embeddings * input_mask_expanded, 1) / torch.clamp(
input_mask_expanded.sum(1), min=1e-9
)
def extract_chunks_from_concatenated(
input_ids: torch.Tensor,
token_embeddings: torch.Tensor,
attention_mask: torch.Tensor,
tokenizer,
) -> list[list[torch.Tensor]]:
"""
Extract individual chunk embeddings from concatenated sequence using late chunking.
This method splits concatenated sequences like "[chunk1][SEP][chunk2][SEP]..."
back into individual chunk embeddings by finding SEP token positions.
Args:
input_ids: Token IDs (batch_size, seq_len)
token_embeddings: Token embeddings (batch_size, seq_len, hidden_dim)
attention_mask: Attention mask (batch_size, seq_len)
Returns:
list[list[torch.Tensor]]: List of documents, each containing list of chunk embeddings
Note:
The sep_token_id is retrieved tokenizer.sep_token_id.
Common values: pplx-embed-1=151643, BERT=102, varies by tokenizer.
"""
sep_token_id = tokenizer.sep_token_id
batch_size = input_ids.shape[0]
all_doc_chunks = []
for batch_idx in range(batch_size):
# non-pad sep tokens
valid_positions = attention_mask[batch_idx].bool()
sep_positions = (
(input_ids[batch_idx] == sep_token_id) & valid_positions
).nonzero(as_tuple=True)[0]
chunk_embeddings = []
start_pos = 0
for sep_pos in sep_positions:
chunk_tokens = token_embeddings[batch_idx, start_pos:sep_pos]
chunk_mask = attention_mask[batch_idx, start_pos:sep_pos]
chunk_emb = mean_pooling(
chunk_tokens.unsqueeze(0), chunk_mask.unsqueeze(0)
).squeeze(0)
chunk_embeddings.append(chunk_emb)
start_pos = sep_pos + 1
# Handle the last chunk (after the last SEP token)
last_valid_pos = attention_mask[batch_idx].sum().item()
chunk_tokens = token_embeddings[batch_idx, start_pos:last_valid_pos]
chunk_mask = attention_mask[batch_idx, start_pos:last_valid_pos]
if chunk_mask.sum() > 0:
chunk_emb = mean_pooling(
chunk_tokens.unsqueeze(0), chunk_mask.unsqueeze(0)
).squeeze(0)
else:
# Empty chunk - create zero embedding
chunk_emb = torch.zeros(
token_embeddings.shape[-1],
device=token_embeddings.device,
dtype=token_embeddings.dtype,
)
chunk_embeddings.append(chunk_emb)
all_doc_chunks.append(chunk_embeddings)
return all_doc_chunks
hf_path=("perplexity-ai/pplx-embed-context-v1-4b")
onnx_path=("onnx/model.onnx")
tokenizer = AutoTokenizer.from_pretrained(hf_path, trust_remote_code=True)
session = ort.InferenceSession(onnx_path)
texts = [
[
"Curiosity begins in childhood with endless questions about the world.",
"As we grow, cuQuoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.