Spaces:
Runtime error
Runtime error
| """ | |
| 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() | |