""" Embedding generation utilities using sentence transformers. """ from typing import List, Union from sentence_transformers import SentenceTransformer import numpy as np class EmbeddingGenerator: """Handles text embedding generation.""" def __init__(self, model_name: str = 'all-MiniLM-L6-v2'): """ Initialize embedding generator. Args: model_name: Name of the sentence transformer model """ self.model_name = model_name self.model = SentenceTransformer(model_name) print(f"[Embeddings] Loaded model: {model_name}") def generate_embedding(self, text: str) -> List[float]: """ Generate embedding for a single text. Args: text: Input text Returns: Embedding vector as list of floats """ embedding = self.model.encode([text])[0] return embedding.tolist() def generate_embeddings(self, texts: List[str]) -> List[List[float]]: """ Generate embeddings for multiple texts (batch processing). Args: texts: List of input texts Returns: List of embedding vectors """ if not texts: return [] embeddings = self.model.encode(texts, show_progress_bar=len(texts) > 10) return embeddings.tolist() def compute_similarity( self, embedding1: Union[List[float], np.ndarray], embedding2: Union[List[float], np.ndarray] ) -> float: """ Compute cosine similarity between two embeddings. Args: embedding1: First embedding vector embedding2: Second embedding vector Returns: Cosine similarity score (0-1) """ # Convert to numpy arrays if needed emb1 = np.array(embedding1) if isinstance(embedding1, list) else embedding1 emb2 = np.array(embedding2) if isinstance(embedding2, list) else embedding2 # Compute cosine similarity dot_product = np.dot(emb1, emb2) norm1 = np.linalg.norm(emb1) norm2 = np.linalg.norm(emb2) if norm1 == 0 or norm2 == 0: return 0.0 return float(dot_product / (norm1 * norm2)) def get_model_info(self) -> dict: """ Get information about the loaded model. Returns: Dictionary with model information """ return { "model_name": self.model_name, "embedding_dimension": self.model.get_sentence_embedding_dimension(), "max_seq_length": self.model.max_seq_length } # Global embedding generator instance embedding_generator = EmbeddingGenerator()