from typing import List from functools import lru_cache import numpy as np from sentence_transformers import SentenceTransformer class EmbeddingService: def __init__(self, model_name: str) -> None: self.model = SentenceTransformer(model_name) def encode(self, texts: List[str]) -> np.ndarray: vectors = self.model.encode( texts, normalize_embeddings=True, show_progress_bar=False, convert_to_numpy=True, ) return np.asarray(vectors, dtype=np.float32) @lru_cache(maxsize=2048) def encode_query_cached(self, text: str) -> bytes: vec = self.model.encode( [text], normalize_embeddings=True, show_progress_bar=False, convert_to_numpy=True, ) arr = np.asarray(vec, dtype=np.float32) return arr.tobytes() def encode_query(self, text: str) -> np.ndarray: buf = self.encode_query_cached(text) return np.frombuffer(buf, dtype=np.float32).reshape(1, -1)