Perplexity Research and turbopuffer have released pplx-embed-v2-context-9b-preview, a contextual embedding model for RAG pipelines. Each chunk is embedded with the full document in view. The real change is the training signal. The model learns to retrieve the answer along with the context needed to verify it, not one ‘gold passage.’ P
Is it deployable? Yes, as a self-hosted preview. Weights are on Hugging Face under the MIT license. Loading requires transformers>=5.4.0 with trust_remote_code=True. It is not yet on the Perplexity API. The model card notes that weights and interface may change without backward compatibility.
Why the gold passage falls short
RAG systems split long documents into chunks. A chunk often depends on an entity, heading, or definition stated elsewhere. Contextual models address this with late chunking. The document is encoded in one pass, then pooled per chunk.
Training, however, usually marks one gold chunk per query. Every other chunk becomes a negative, including the sentences that make the answer checkable. Perplexity lists 3 more problems. Binary labels give a coarse signal. LLM annotation cost grows linearly with dataset size. Labels are also tied to one chunking strategy.
How the training works
The teacher is Perplexity’s query-aware context compression model. It reads the query and document together and scores every token.
- Chunk relevance: the mean of the top n token scores inside each chunk.
- Soft target: a temperature-scaled softmax over chunks in the positive document. Chunks in other documents get zero.
- Distillation loss: forward KL divergence between teacher and student distributions.
- Document loss: InfoNCE, where a document scores as its best chunk, inspired by ColBERT’s MaxSim.
Each batch samples a random chunking strategy. Chunks are separated by a learned <|chunk_sep|> token and mean-pooled. The teacher runs only during training, so inference adds no latency or storage.
The model starts from an in-house 9B ColBERT retrieval model. A linear projection outputs 2048 dimensions. Matryoshka training also supports 1024 dimensions. Quantization-aware training enables native int8 embeddings. The release is a model soup of several checkpoints. Training used roughly 430 datasets covering over 50 languages, with no ConTEB data.
Interactive explainer
#pcx{
–ink:#091717; –ink2:#0f2324; –panel:#13343B; –line:#2E565E;
–teal:#20808D; –cyan:#1FB8CD; –paper:#FBFAF4; –muted:#9fb7b8;
–warn:#e8a33d; –bad:#c9655a; –mtp:#76B900;
}
#pcx,#pcx *{box-sizing:border-box}
#pcx{color:var(–paper);font-family:Inter,ui-sans-serif,system-ui,-apple-system,”Segoe UI”,Roboto,Arial,sans-serif;line-height:normal;text-align:left}
#pcx{max-width:860px;margin:0 auto;padding:22px 18px 18px;background:var(–ink)}
#pcx .hdr{display:flex;align-items:center;gap:12px;margin-bottom:6px}
#pcx .logo{width:34px;height:34px;border-radius:9px;background:linear-gradient(135deg,var(–teal),var(–cyan));display:grid;place-items:center;font-weight:800;color:var(–ink);font-size:15px;flex:none}
#pcx h1{font-size:19px;line-height:1.25;margin:0;font-weight:700}
#pcx .sub{color:var(–muted);font-size:13px;margin:4px 0 16px;line-height:1.5}
#pcx .tabs{display:flex;gap:6px;flex-wrap:wrap;margin-bottom:14px}
#pcx .tab{background:var(–ink2);border:1px solid var(–line);color:var(–muted);padding:8px 12px;border-radius:999px;font-size:13px;cursor:pointer;transition:all .25s}
#pcx .tab b{color:var(–cyan);margin-right:6px;font-weight:700}
#pcx .tab.on{background:var(–teal);border-color:var(–teal);color:var(–paper)}
#pcx .tab.on b{color:var(–paper)}
#pcx .pane{display:none;animation:pcxfade .45s ease}
#pcx .pane.on{display:block}
@keyframes pcxfade{from{opacity:0;transform:translateY(6px)}to{opacity:1;transform:none}}
#pcx .card{background:var(–ink2);border:1px solid var(–line);border-radius:14px;padding:14px}
#pcx .lead{font-size:14px;line-height:1.6;margin:0 0 12px;color:#dfe9e8}
#pcx .q{display:flex;gap:8px;align-items:center;background:var(–panel);border:1px solid var(–line);border-radius:10px;padding:10px 12px;font-size:13.5px;margin-bottom:12px}
#pcx .q .pill{background:var(–cyan);color:var(–ink);font-weight:700;font-size:11px;padding:3px 8px;border-radius:999px;flex:none}
#pcx .ctrl{display:flex;gap:8px;flex-wrap:wrap;align-items:center;margin-bottom:12px}
#pcx .seg{display:inline-flex;border:1px solid var(–line);border-radius:10px;overflow:hidden}
#pcx .seg button{background:transparent;border:0;color:var(–muted);padding:8px 12px;font-size:13px;cursor:pointer}
#pcx .seg button.on{background:var(–teal);color:var(–paper)}
#pcx .btn{background:var(–cyan);color:var(–ink);border:0;border-radius:10px;padding:9px 14px;font-weight:700;font-size:13px;cursor:pointer;transition:transform .15s}
#pcx .btn:active{transform:scale(.97)}
#pcx .docs{display:grid;grid-template-columns:repeat(3,1fr);gap:10px}
#pcx .doc{background:var(–ink);border:1px solid var(–line);border-radius:12px;padding:10px;position:relative;transition:border-color .4s, box-shadow .4s}
#pcx .doc.win{border-color:var(–cyan);box-shadow:0 0 0 1px var(–cyan),0 0 22px rgba(31,184,205,.25)}
#pcx .doc h4{margin:0 0 8px;font-size:12px;color:var(–muted);font-weight:600;letter-spacing:.02em}
#pcx .s{font-size:12px;line-height:1.45;padding:5px 7px;border-radius:7px;margin-bottom:4px;border:1px solid transparent;transition:all .45s;position:relative}
#pcx .s.dim{opacity:.38}
#pcx .s.ans{background:rgba(31,184,205,.16);border-color:var(–cyan)}
#pcx .s.ev{background:rgba(32,128,141,.22);border-color:var(–teal)}
#pcx .s.amb{background:rgba(232,163,61,.14);border-color:var(–warn)}
#pcx .s .tag{position:absolute;right:6px;top:-8px;font-size:9.5px;font-weight:700;padding:1px 6px;border-radius:999px;background:var(–cyan);color:var(–ink);opacity:0;transform:scale(.6);transition:all .35s}
#pcx .s.ans .tag,#pcx .s.ev .tag,#pcx .s.amb .tag{opacity:1;transform:none}
#pcx .s.ev .tag{background:var(–teal);color:var(–paper)}
#pcx .s.amb .tag{background:var(–warn);color:var(–ink)}
#pcx .score{margin-top:8px;height:8px;background:#0b1e1f;border-radius:99px;overflow:hidden}
#pcx .score i{display:block;height:100%;width:0;background:var(–cyan);border-radius:99px;transition:width .9s cubic-bezier(.2,.8,.2,1)}
#pcx .sv{font-size:11px;color:var(–muted);margin-top:4px;font-variant-numeric:tabular-nums}
#pcx .flow{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;overflow:visible}
#pcx .flow path{fill:none;stroke:var(–cyan);stroke-width:1.6;stroke-dasharray:5 5;opacity:0}
#pcx .flow.go path{opacity:.85;animation:pcxdash 1.2s linear infinite}
@keyframes pcxdash{to{stroke-dashoffset:-20}}
#pcx .verdict{margin-top:12px;font-size:13.5px;line-height:1.55;padding:10px 12px;border-radius:10px;background:var(–panel);border-left:3px solid var(–cyan);min-height:44px}
#pcx .note{font-size:11.5px;color:var(–muted);margin-top:10px;line-height:1.5}
#pcx /* tab 2 */
.toks{display:flex;flex-wrap:wrap;gap:4px;margin:6px 0 4px}
#pcx .tk{font-size:12px;padding:4px 6px;border-radius:6px;background:#0b1e1f;color:#cfe0df;transition:background .6s, color .6s}
#pcx .sep{width:2px;align-self:stretch;background:var(–warn);border-radius:2px;margin:0 3px;transition:opacity .3s}
#pcx .row2{display:grid;grid-template-columns:1fr 1fr;gap:10px;margin-top:12px}
#pcx .bars .b{display:grid;grid-template-columns:70px 1fr 46px;gap:8px;align-items:center;font-size:12px;margin-bottom:6px}
#pcx .bars .t{height:12px;background:#0b1e1f;border-radius:6px;overflow:hidden}
#pcx .bars .t i{display:block;height:100%;width:0;border-radius:6px;transition:width .8s cubic-bezier(.2,.8,.2,1)}
#pcx .bars .num{text-align:right;color:var(–muted);font-variant-numeric:tabular-nums}
#pcx .ttl{font-size:12.5px;font-weight:700;margin:0 0 8px;color:var(–paper)}
#pcx .ttl span{color:var(–muted);font-weight:500}
#pcx input[type=range]{accent-color:var(–cyan);width:160px}
#pcx .lbl{font-size:12.5px;color:var(–muted)}
#pcx .steps{display:flex;gap:6px;flex-wrap:wrap;margin:10px 0 0}
#pcx .step{font-size:11.5px;padding:5px 9px;border-radius:999px;border:1px solid var(–line);color:var(–muted);transition:all .3s}
#pcx .step.on{border-color:var(–cyan);color:var(–paper);background:rgba(31,184,205,.12)}
#pcx /* tab 3 */
.res .b{grid-template-columns:150px 1fr 60px}
#pcx .legend{display:flex;gap:14px;font-size:12px;color:var(–muted);margin-bottom:10px;flex-wrap:wrap}
#pcx .legend i{display:inline-block;width:10px;height:10px;border-radius:3px;margin-right:6px;vertical-align:-1px}
#pcx .grp{margin-bottom:12px}
#pcx .grp h5{margin:0 0 6px;font-size:12.5px;color:var(–paper);font-weight:600}
#pcx /* tab 4 */
.big{font-size:30px;font-weight:800;color:var(–cyan);font-variant-numeric:tabular-nums;letter-spacing:-.01em}
#pcx .kpis{display:grid;grid-template-columns:repeat(3,1fr);gap:10px;margin-top:12px}
#pcx .kpi{background:var(–ink);border:1px solid var(–line);border-radius:12px;padding:10px}
#pcx .kpi .k{font-size:11.5px;color:var(–muted)}
#pcx .kpi .v{font-size:18px;font-weight:700;margin-top:3px;font-variant-numeric:tabular-nums}
#pcx select{background:var(–ink);color:var(–paper);border:1px solid var(–line);border-radius:8px;padding:7px 8px;font-size:13px}
#pcx .foot{display:flex;justify-content:space-between;gap:10px;flex-wrap:wrap;margin-top:16px;padding-top:12px;border-top:1px solid var(–line);font-size:11.5px;color:var(–muted)}
#pcx .foot a{color:var(–cyan);text-decoration:none}
#pcx .mtp{color:var(–mtp);font-weight:700}
@media (max-width:640px){#pcx .docs{grid-template-columns:1fr}
#pcx .row2{grid-template-columns:1fr}
#pcx .kpis{grid-template-columns:1fr}
#pcx .res .b{grid-template-columns:104px 1fr 52px}
#pcx h1{font-size:17px}}
@media (prefers-reduced-motion:reduce){#pcx *{animation:none!important;transition:none!important}}
How pplx-embed-v2-context retrieves answers and their evidence
An interactive walkthrough of Perplexity’s contextual embedding preview: why isolated chunks fail, how teacher distillation replaces the single gold passage, and what the reported numbers mean.
Three lease files share the sentence “Monthly rent is …”. Only one belongs to 5 Park Avenue. Switch modes and run retrieval.
Illustrative example modeled on the lease scenario in Perplexity’s post. Scores are for explanation only, not model outputs.
A context compression model acts as teacher. It scores every token for the query. Those scores are pooled per chunk (mean of the top n tokens) and turned into a soft target, instead of a one-hot gold label.
Temperature0.25
Change the boundaries: the same token scores re-aggregate without re-annotation. That is the “flexible chunk boundaries” property Perplexity describes. Token scores here are illustrative.
context-bench (2,099 queries, 38,894 documents, 2,458,072 sentence chunks, exhaustive ranking). Numbers below are as reported by Perplexity at K = 10.
Voyage values are computed as Perplexity’s figure minus the stated gap (14.4 and 5.0 points). Other Voyage metrics appear only in Perplexity’s chart and are not shown here.
Contextual embeddings store one vector per chunk, same as a normal chunk index. Cost depends on vector size. Perplexity reports that 1024-dim int8 (1 KB) slightly exceeds voyage-context-4 at 2048-dim float32 (8 KB) on its chunk-retrieval suite.
100,000
1,000,000
2,458,072 (context-bench)
10,000,000
100,000,000
Bytes = dimensions x bytes per value. Sensitivity is mean nDCG@10 across 74 MTEB tasks, as reported by Perplexity.
(function(){
var $=function(s,r){return (r||document).querySelector(s)}, $$=function(s,r){return Array.prototype.slice.call((r||document).querySelectorAll(s))};
function resize(){try{parent.postMessage({type:’pcx-resize’,h:document.getElementById(‘pcx’).offsetHeight+40},’*’)}catch(e){}}
window.addEventListener(‘load’,resize); window.addEventListener(‘resize’,resize);
/* tabs */
var started={};
$$(‘.tab’).forEach(function(t){t.addEventListener(‘click’,function(){
$$(‘.tab’).forEach(function(x){x.classList.remove(‘on’)}); t.classList.add(‘on’);
$$(‘.pane’).forEach(function(p){p.classList.remove(‘on’)});
var i=t.getAttribute(‘data-t’); $(‘#p’+i).classList.add(‘on’);
if(i===’2′) animRes(); if(i===’3′) calc(); if(i===’1’&&!started[1]){started[1]=1;anim2();}
setTimeout(resize,60);
})});
/* ———- TAB 1 ———- */
var DOCS=[
{name:’lease_5_park_avenue.pdf’, s:[‘Lease for 5 Park Avenue, Unit 4B.’,’Term ends June 30, 2027.’,’Pets require written approval.’,’Monthly rent is $3,450.’], right:true},
{name:’lease_9_park_avenue.pdf’, s:[‘Lease for 9 Park Avenue, Unit 2A.’,’Term ends March 31, 2028.’,’Parking is not included.’,’Monthly rent is $3,450.’]},
{name:’lease_5_park_lane.pdf’, s:[‘Lease for 5 Park Lane, Unit 1C.’,’Term ends June 30, 2027.’,’Utilities are billed monthly.’,’Monthly rent is $2,980.’]}
];
var mode=’iso’;
function draw1(){
var h=”;
DOCS.forEach(function(d,di){
h+=’
‘+d.name+’
‘;
d.s.forEach(function(s,si){h+=’
‘});
h+=’
‘;
});
$(‘#docs’).innerHTML=h;
}
draw1();
$$(‘#modeSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){
$$(‘#modeSeg button’).forEach(function(x){x.classList.remove(‘on’)}); b.classList.add(‘on’); mode=b.getAttribute(‘data-m’); reset1();
$(‘#verdict1′).textContent=’Mode set. Press Run retrieval.’;
})});
function reset1(){
DOCS.forEach(function(d,di){
$(‘#d’+di).classList.remove(‘win’); $(‘#f’+di).classList.remove(‘go’); $(‘#f’+di).innerHTML=”;
d.s.forEach(function(s,si){var e=$(‘#s’+di+’_’+si); e.className=’s’; $(‘.tag’,e).textContent=”});
$(‘#sc’+di).style.width=’0’; $(‘#sv’+di).textContent=’rent sentence score: -‘;
});
}
function link(di,a,b){
var svg=$(‘#f’+di), doc=$(‘#d’+di), r=doc.getBoundingClientRect(), ea=$(‘#s’+di+’_’+a).getBoundingClientRect(), eb=$(‘#s’+di+’_’+b).getBoundingClientRect();
var x=8, y1=ea.top-r.top+ea.height/2, y2=eb.top-r.top+eb.height/2;
var p=document.createElementNS(‘http://www.w3.org/2000/svg’,’path’);
p.setAttribute(‘d’,’M’+x+’ ‘+y1+’ C ‘+(x-26)+’ ‘+y1+’, ‘+(x-26)+’ ‘+y2+’, ‘+x+’ ‘+y2);
svg.appendChild(p);
}
$(‘#run1’).addEventListener(‘click’,function(){
reset1();
var iso={0:.71,1:.71,2:.69}, ctx={0:.88,1:.42,2:.47};
var sc=mode===’iso’?iso:ctx;
DOCS.forEach(function(d,di){
setTimeout(function(){
if(mode===’ctx’){ link(di,0,3); link(di,1,3); $(‘#f’+di).classList.add(‘go’); }
d.s.forEach(function(s,si){var e=$(‘#s’+di+’_’+si);
if(si===3){ if(mode===’iso’){e.classList.add(‘amb’);$(‘.tag’,e).textContent=’match?’} else if(d.right){e.classList.add(‘ans’);$(‘.tag’,e).textContent=’answer’} else e.classList.add(‘dim’); }
else if(mode===’ctx’&&d.right&&si<2){e.classList.add('ev');$('.tag',e).textContent='evidence'}
else e.classList.add('dim');
});
$('#sc'+di).style.width=(sc[di]*100)+'%';
$('#sv'+di).textContent='rent sentence score: '+sc[di].toFixed(2);
if(mode==='ctx'&&d.right) $('#d'+di).classList.add('win');
}, di*260);
});
setTimeout(function(){
$('#verdict1').innerHTML = mode==='iso'
? 'Ambiguous. Each sentence was embedded alone, so “Monthly rent is $3,450” carries no address. Two leases tie, and nothing tells you which lease or which end date it belongs to.’
: ‘Resolved. The rent sentence was encoded with the whole lease in view, so it carries “5 Park Avenue”. The model also surfaces the address and end-date lines as evidence, which is what context-bench’s Evidence Recall@K rewards.’;
resize();
}, 900);
});
/* ———- TAB 2 ———- */
/* sentences of a lease; token-level teacher scores (illustrative) */
var SENTS=[
{t:[‘Lease’,’for’,’5′,’Park’,’Avenue’], r:[.2,.15,.8,.85,.9]},
{t:[‘Term’,’ends’,’June’,’30,’,’2027′], r:[.55,.7,.75,.72,.78]},
{t:[‘Pets’,’require’,’written’,’approval’], r:[.04,.03,.02,.03]},
{t:[‘Monthly’,’rent’,’is’,’$3,450′], r:[.8,.95,.3,.97]},
{t:[‘Late’,’fees’,’apply’,’after’,’5′,’days’], r:[.12,.1,.05,.04,.06,.05]},
{t:[‘Trash’,’pickup’,’is’,’Tuesday’], r:[.02,.02,.01,.02]}
];
var bmode=’sent’, T=.25, TOPN=2;
function chunks(){
if(bmode===’sent’) return SENTS.map(function(s,i){return {label:’S’+(i+1), idx:[i]}});
var out=[]; for(var i=0;i.5?’#091717′:’#e6efee’) : ”;
h+=’‘+w+’‘;
});
if(bounds[i] && i<SENTS.length-1) h+='‘;
});
$(‘#toks’).innerHTML=h;
}
function softmax(v,t){var m=Math.max.apply(null,v), e=v.map(function(x){return Math.exp((x-m)/t)}), s=e.reduce(function(a,b){return a+b},0); return e.map(function(x){return x/s})}
function drawBars(fill){
var cs=chunks(), sc=cs.map(chunkScore), p=softmax(sc,T);
var gi=0; sc.forEach(function(v,i){if(v>sc[gi])gi=i});
var g=’
Gold-chunk label (one-hot)
‘, s=’
Teacher target (soft, from token scores)
‘;
cs.forEach(function(c,i){
var gv=i===gi?1:0;
g+=’
‘+(fill?gv.toFixed(2):”)+’
‘;
s+=’
‘+(fill?p[i].toFixed(2):”)+’
‘;
});
$(‘#goldBars’).innerHTML=g; $(‘#softBars’).innerHTML=s;
if(fill){ /* animate widths */
var ws=$$(‘#goldBars i’).concat($$(‘#softBars i’)).map(function(x){var w=x.style.width;x.style.width=’0′;return [x,w]});
requestAnimationFrame(function(){requestAnimationFrame(function(){ws.forEach(function(a){a[0].style.width=a[1]})})});
}
}
function setStep(n){$$(‘#steps .step’).forEach(function(e,i){e.classList.toggle(‘on’,i<n)})}
var timers=[];
function anim2(){
timers.forEach(clearTimeout); timers=[];
drawToks(false); drawBars(false); setStep(0);
timers.push(setTimeout(function(){drawToks(true);setStep(1)},300));
timers.push(setTimeout(function(){setStep(2)},1100));
timers.push(setTimeout(function(){drawBars(true);setStep(3);resize()},1700));
timers.push(setTimeout(function(){setStep(4)},2600));
}
$('#run2').addEventListener('click',anim2);
$$('#bSeg button').forEach(function(b){b.addEventListener('click',function(){
$$('#bSeg button').forEach(function(x){x.classList.remove('on')}); b.classList.add('on'); bmode=b.getAttribute('data-b'); drawToks(true); drawBars(true); setStep(4); resize();
})});
$('#temp').addEventListener('input',function(){T=parseFloat(this.value); $('#tv').textContent=T.toFixed(2); drawBars(true); setStep(4);});
drawToks(false); drawBars(false);
/* ———- TAB 3 ———- */
var RES=[
{m:'Answer@10', a:45.5, b:31.1},
{m:'Evidence Recall@10', a:40.6, b:35.6},
{m:'All-Evidence@10', a:31.1},
{m:'Document@10', a:61.6},
{m:'Document@1', a:15.2}
];
function animRes(){
var h='';
RES.forEach(function(r){
h+='
‘+r.m+’
‘;
h+=’
0%
‘;
if(r.b!=null) h+=’
0%
‘;
h+=’
‘;
});
$(‘#resBars’).innerHTML=h; resize();
setTimeout(function(){
$$(‘#resBars i’).forEach(function(i){i.style.width=i.getAttribute(‘data-w’)+’%’});
$$(‘#resBars .num’).forEach(function(n){countUp(n,parseFloat(n.getAttribute(‘data-n’)),’%’,1)});
},60);
}
$(‘#run3’).addEventListener(‘click’,animRes);
function countUp(el,to,suf,dec){
var t0=null,d=900; function f(ts){if(!t0)t0=ts;var k=Math.min(1,(ts-t0)/d),e=1-Math.pow(1-k,3);el.textContent=(to*e).toFixed(dec)+suf;if(k=1024&&i<u.length-1){b/=1024;i++}return b.toFixed(b<10?2:1)+' '+u[i]}
function calc(){
var n=parseInt($('#nChunks').value,10), per=dim*bpv, tot=n*per, ref=n*2048*4;
var el=$('#bigNum'), start=0, t0=null;
function f(ts){if(!t0)t0=ts;var k=Math.min(1,(ts-t0)/700),e=1-Math.pow(1-k,3);el.textContent=fmtBytes(tot*e||0);if(k<1)requestAnimationFrame(f)} requestAnimationFrame(f);
$('#k1').textContent=per.toLocaleString()+' B';
$('#k2').textContent=(ref/tot).toFixed(0)+'x smaller';
if(ref===tot) $('#k2').textContent='same size';
var rows=[['This config',tot,'var(–cyan)'],['2048-d float32',ref,'#5f7f83']];
var h=''; rows.forEach(function(r){h+='
‘+fmtBytes(r[1])+’
‘});
$(‘#stBars’).innerHTML=h;
setTimeout(function(){$$(‘#stBars i’).forEach(function(i){i.style.width=i.getAttribute(‘data-w’)+’%’})},40);
resize();
}
$(‘#nChunks’).addEventListener(‘change’,calc);
$$(‘#dimSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){$$(‘#dimSeg button’).forEach(function(x){x.classList.remove(‘on’)});b.classList.add(‘on’);dim=parseInt(b.getAttribute(‘data-d’),10);calc()})});
$$(‘#dtSeg button’).forEach(function(b){b.addEventListener(‘click’,function(){$$(‘#dtSeg button’).forEach(function(x){x.classList.remove(‘on’)});b.classList.add(‘on’);bpv=parseInt(b.getAttribute(‘data-q’),10);calc()})});
setTimeout(resize,200);
})();
context-bench: a new benchmark
context-bench is built and privately held by turbopuffer to limit training contamination. It holds 2,099 queries over 38,894 documents in 21 domains. Sentence chunking yields 2,458,072 chunks. Median target document length is roughly 6,100 tokens. Queries test 12 contextual capabilities, from pronoun resolution to table structure. Perplexity says the model was submitted blind.
Metrics are Document@K, Answer@K, Evidence Recall@K, and All-Evidence@K. Every model is ranked exhaustively against all chunks, so index settings play no role.
Results
- context-bench at K = 10: 45.5% answer recall, 40.6% evidence recall, 31.1% all-evidence recall.
- Document recall: 15.2% at K = 1 and 61.6% at K = 10.
- vs voyage-context-4: ahead by 14.4 points on answer recall and 5.0 on evidence recall at K = 10.
- ConTEB: highest average nDCG@10 among models shown. pplx-embed-context-v1-4B wins NarrativeQA, and Nemotron-3-Embed-8B wins COVID-QA.
- General retrieval: best average on query-to-chunk tasks. Slightly behind voyage-context-4 on query-to-document.
- Storage: 1024-dim int8 (1 KB per vector) slightly beats voyage-context-4 at 2048-dim float32 (8 KB).
- Chunk size: average score moves from 81.0% to 79.9% between 64 and 512 tokens.
Comparison with the closest competitors
| Feature | pplx-embed-v2-context-9b-preview | voyage-context-4 | pplx-embed-context-v1-4B | Nemotron-3-Embed-8B |
|---|---|---|---|---|
| Chunk embeddings | Contextual | Contextual | Contextual | Independent per chunk |
| Access | Open weights, MIT | Hosted API (Voyage, MongoDB Atlas) | Open weights, MIT; Perplexity API | Open weights, OpenMDW-1.1 |
| Parameters | 9B per blog (Hugging Face lists 8B) | Not disclosed (MoE backbone) | 4B | About 8B |
| Dimensions | 2048, 1024 | 2048, 1024, 512, 256 | 2560 (Matryoshka) | 4096, sliceable |
| Quantized output | Native int8 | int8, uint8, binary, ubinary | int8, binary | Float |
| Context | Evaluated up to 32,768 tokens | 32K per request; 120K with auto-chunking | 32K | 32,768 |
| Auto-chunking | No | Yes | No | No |
| Price | Self-host | $0.12 per 1M tokens; first 200M free | Self-host or API | Self-host |
Sources: Voyage docs, model cards linked above. Checked September 30, 2026.
Key Takeaways
- A token-level teacher replaces the single gold-chunk label.
- The model retrieves answers plus supporting evidence in one chunk index.
- context-bench Answer@10 is 45.5%, 14.4 points above voyage-context-4.
- Open MIT weights ship today; Perplexity API access is still pending.
Check out the technical details and model weights. All credit goes to the researcher of this project. Also, feel free to follow us on Twitter and don’t forget to join our 150k+ML SubReddit and Subscribe to our Newsletter. Wait! are you on telegram? now you can join us on telegram as well.
Need to partner with us for promoting your GitHub Repo OR Hugging Face Page OR Product Release OR Webinar etc.? Connect with us
The post Perplexity Releases pplx-embed-v2-context-9b-preview: A Contextual Embedding Model That Retrieves Answers and Their Supporting Evidence appeared first on MarkTechPost.
This article was originally published on MarkTechPost (AI research simplified). Click below to read the complete article.