OrDora/coachtwin-embedder
CoachTwin Embedder
The sentence embedding model powering workout retrieval in the CoachTwin app. It is BAAI/bge-small-en-v1.5, chosen by evaluating three encoders on the CoachTwin Workouts dataset (10,393 workouts).
Why this model
Leave-one-out retrieval. Strict relevance requires a match on both goal and body_focus; loose requires body_focus.
Random-retrieval baseline: strict P@3 0.0220, loose 0.1200, MRR@10 0.0685. A precision number without its baseline is not interpretable.
Selected: `BAAI/bge-small-en-v1.5` - strict P@3 0.669, about 30x random.
The middle row is the interesting one: all-mpnet-base-v2 is 3.3x the parameters, 3x slower, and scores worse. The bigger encoder is not the better one here.
Usage
from sentencetransformers import SentenceTransformer model = SentenceTransformer("OrDora/coachtwin-embedder") emb = model.encode([text], normalizeembeddings=True)
Documents and queries use different templates, both recorded in embedding_info.json. This is a BGE model, so queries - not documents - take the prefix Represent this sentence for searching relevant passages: (needs_query_prefix: true).
Serialization note
Saved in the sentence-transformers 3.x module format. A repo saved by 5.x fails on 3.x with No module named 'sentence_transformers.base', and a client with a try/except fallback then silently swaps in a different encoder - no error, wrong neighbours, because several candidates share 384 dimensions.
Limitations
Base checkpoint, not fine-tuned. Evaluated only on synthetic English workout descriptions. Not fitness or medical advice.
