| from sentence_transformers import SentenceTransformer | |
| from backend.core.config import settings | |
| from backend.core.logging import logger | |
| _model: SentenceTransformer | None = None | |
| def _get_model() -> SentenceTransformer: | |
| global _model | |
| if _model is None: | |
| logger.info(f"Loading embedding model: {settings.EMBED_MODEL_NAME}") | |
| _model = SentenceTransformer(settings.EMBED_MODEL_NAME) | |
| logger.info(f"Embedding model loaded (dim={settings.EMBED_DIMENSIONS})") | |
| return _model | |
| def get_embedding(text: str) -> list[float]: | |
| model = _get_model() | |
| try: | |
| vector = model.encode(text, normalize_embeddings=True) | |
| return vector.tolist() | |
| except Exception as e: | |
| logger.error(f"Error generating embedding: {e}") | |
| raise | |
| def embed_text(text: str) -> list[float]: | |
| clean = text.strip() | |
| if not clean: | |
| return [0.0] * settings.EMBED_DIMENSIONS | |
| try: | |
| return get_embedding(clean) | |
| except Exception as e: | |
| logger.warning(f"Embedding failed, returning fallback zero vector: {e}") | |
| return [0.0] * settings.EMBED_DIMENSIONS | |