CoolFace
Modelpublic

OrDora/coachtwin-embedder

sourceHugging Faceapache-2.0updated 1mo agoView on Hugging Face
0likes101downloads
Model Card

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.

modelparamsdimstrict P@3loose P@3MRR@10corpus encode
bge-small-en-v1.533M3840.66870.82730.802010.4s
all-mpnet-base-v2110M7680.50470.74530.686631.2s
all-MiniLM-L6-v222M3840.47330.66670.66867.0s

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.