How much retrieval quality does Isotrieve preserve when migrating between embedding models? nDCG@10 retention measured against full re-embedding on BEIR SciFact.
SciFact, MiniLM → bge-large, K=4000, 3 seeds.
| Adapter | nDCG@10 Retention | Notes |
|---|---|---|
| Ridge | 0.866 ± 0.008 | Default. Fast, stable. |
| LowRank | 0.857 ± 0.009 | Compressed. ~1% worse. |
| Procrustes | 0.851 ± 0.007 | Square only. Orthogonal. |
| MLP | 0.719 ± 0.008 | Non-linear. Linear wins. |
All adapters averaged across 3 seeds on SciFact.
| K (calibration texts) | nDCG@10 Retention | Gate Verdict |
|---|---|---|
| 500 | 0.667 ± 0.039 | WARN |
| 1000 | 0.732 ± 0.056 | WARN |
| 2000 | 0.788 ± 0.054 | PASS |
| 4000 | 0.817 ± 0.064 | PASS |
Same dimension ≠ same space. e5 requires "query: " / "passage: " prefixes.
| Metric | nDCG@10 |
|---|---|
| Floor (raw cross-space) | 0.000 |
| Isotrieve (mapped) | 0.656 |
| Ceiling (full re-embed) | 0.722 |
| Retention | 0.908 |
Without e5 prefixes, ceiling drops to 0.355 — model preprocessing matters.
| Threshold τ | Raw Recall@10 | + Recalibration | Δ |
|---|---|---|---|
| τ ≤ 0.75 | 100% | 100% | 0 |
| τ = 0.80 | 12% | 17% | +4.7% |
MAE = 0.095, margin compression = 0.83x. Helps marginally on same-dim pairs.
| Threshold τ | Raw Recall@10 | + Recalibration | Δ |
|---|---|---|---|
| τ = 0.60 | 78% | 100% | +22% |
| τ = 0.70 | 27% | 67% | +40% |
| τ = 0.80 | 8% | 19% | +11% |
MAE = 0.364, margin compression = 0.85x. Essential for rectangular pairs.
Adaptive P33/P67 percentile margins from calibration data.
| Pair | High-Conf R@10 | Low-Conf R@10 | Gap |
|---|---|---|---|
| bge → e5 | 0.955 | 0.637 | 0.318 |
| MiniLM → bge | 0.875 | 0.651 | 0.224 |
| Feature | Result | Action |
|---|---|---|
| Cross-encoder reranking | −10.7pts | Not shipped. Domain mismatched. |
| TSVD shrinkage | −0.33pt at rank=512 | Not worth complexity. |
| Procrustes centering | −55pt on unit vectors | Reverted. Breaks serve-mode. |
| Source | Target | Dim | K | Retention |
|---|---|---|---|---|
| BAAI/bge-large-en-v1.5 | intfloat/e5-large-v2 | 1024 → 1024 | 2000 | 0.908 |
| all-MiniLM-L6-v2 | BAAI/bge-large-en-v1.5 | 384 → 1024 | 4000 | 0.866 |
nDCG@10 Retention measures how well Isotrieve preserves retrieval quality compared to re-embedding everything from scratch.
A retention of 0.866 means Isotrieve achieves 86.6% of the quality you'd get by fully re-embedding. The remaining ~13% is the cost of not re-embedding.
Ridge (linear regression) is the default and best performer. MLP (neural network) does worse — linear mapping is sufficient for this task.
K is the number of texts you embed with both models to learn the mapping. More texts = better mapping, but more cost.
K=2000 is the minimum for a reliable mapping (PASS verdict). Below that, the mapping is too noisy.
The cost is O(K) API calls — for K=2000, that's ~2000 embeddings, which is cheap compared to re-embedding your entire corpus.
Both bge-large and e5-large produce 1024-dimensional vectors. You'd think they'd be compatible — they're not.
Floor = 0.0: Raw cross-space retrieval gets zero results. The vectors are in completely different geometric spaces.
Retention = 0.908: After Isotrieve mapping, we recover 90.8% of the quality you'd get by re-embedding everything.
Ceiling is the best possible (full re-embed). Isotrieve gets close to it without touching your corpus.
When you search with mapped vectors, the similarity scores are compressed — they don't span the same range as native scores.
Isotonic regression learns a mapping from compressed scores back to the full range. This makes threshold-based decisions (e.g., "only return results with score > 0.7") reliable again.
Same-dim pairs have mild compression (MAE=0.095) — recalibration helps a little. Rectangular pairs have severe compression (MAE=0.364) — recalibration is essential.