The problem A team I was helping upgraded their embedding model to cut cost — swapped an older general-purpose embedding model for a newer, cheaper one. No schema change, no downtime, no errors in any log. Over the next three weeks, support tickets crept up: "the assistant is confidently answering with the wrong doc." Nobody connected it to the embedding swap because nothing had crashed. Retrieval doesn't throw an exception when it's wrong. It just returns the nearest vectors — and "nearest" quietly stopped meaning anything. Why it happens Here's the part that trips people up: embedding spaces are not portable across models. Two different embedding models can both output 1536-dimensional vectors, both be excellent, and still be totally incompatible with each other — because "dimension 47" in model A's space and "dimension 47" in model B's space encode nothing in common. Each model learns its own geometry during training, shaped by its own objective and data. There's no shared coordinate system, no translation layer, no reason two models would ever agree on what "close" means. So when you re-embed only new documents with the new model but leave old vectors sitting in the same index — which is what happened here, because a full reindex looked expensive and "we'll backfill later" — you end up with a vector store where some entries speak model A and some speak model B. A query embedded with model B gets compared against both. Against the model-B vectors, cosine similarity is meaningful. Against the model-A vectors, it's closer to noise — sometimes high, sometimes low, with no reliable relationship to actual semantic relevance. I ran a quick sanity check to see how bad "noise" actually looks in practice: import numpy as np def cosine ( a , b ): return np . dot ( a , b ) / ( np . linalg . norm ( a ) * np . linalg . norm ( b )) # same-model vectors for related concepts cluster tight and high same_model_sim = 0.83 # typical for genuinely related text, same model # cross-model comparison: query embedded with model B,

Upgrading Your Embedding Model Doesn't Break RAG Loudly — It Breaks It Quietly
speed engineer

