Spaces:
Sleeping
Sleeping
Download backend/src/embedding_generator.py from hardkpentium101/indicRAG: direct link, hf CLI and curl.
- Browser
- Download file 3.24 kB
-
https://huggingface.co/spaces/hardkpentium101/indicRAG/resolve/main/backend/src/embedding_generator.py
- Command line
-
hf download hf://spaces/hardkpentium101/indicRAG/backend/src/embedding_generator.py
-
curl -L -o embedding_generator.py https://huggingface.co/spaces/hardkpentium101/indicRAG/resolve/main/backend/src/embedding_generator.py
3.24 kB
| import os | |
| from typing import List | |
| import numpy as np | |
| from transformers import AutoTokenizer, AutoModel | |
| from dotenv import load_dotenv | |
| import torch | |
| import ast # <-- FIXED: Added missing import for sanitization | |
| load_dotenv() | |
| # --- SANITIZATION LAYER START --- | |
| # Force-overwrite the environment HF_TOKEN to remove any byte-literal wrapping or literal newlines | |
| hf_token = os.getenv("HF_TOKEN") | |
| if hf_token: | |
| try: | |
| if hf_token.startswith("b'") or hf_token.startswith('b"'): | |
| hf_token = ast.literal_eval(hf_token).decode("utf-8") | |
| else: | |
| hf_token = hf_token.strip() | |
| # Clean up escaped literal newlines (\n) causing the Illegal Header crash | |
| hf_token = hf_token.replace("\\n", "").replace("\n", "").strip() | |
| # Overwrite the active environment memory mapping globally | |
| os.environ["HF_TOKEN"] = hf_token | |
| except Exception: | |
| # Fallback to popping it out of memory if it can't be parsed safely | |
| os.environ.pop("HF_TOKEN", None) | |
| # --- SANITIZATION LAYER END --- | |
| # Set cache directory | |
| os.environ["HF_HOME"] = os.getenv("HF_HOME", "/tmp/huggingface_cache") | |
| class EmbeddingGenerator: | |
| def __init__(self, model_name="sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2"): | |
| """Initialize embedding generator for multilingual text""" | |
| self.model_name = model_name | |
| # Pull the clean token string safely out of the cleaned environment memory | |
| token_str = os.getenv("HF_TOKEN") | |
| # Pass token explicitly even for local checks to override residual library bugs | |
| self.tokenizer = AutoTokenizer.from_pretrained( | |
| model_name, | |
| local_files_only=False, | |
| token=token_str | |
| ) | |
| self.model = AutoModel.from_pretrained( | |
| model_name, | |
| torch_dtype=torch.float32, # Use torch_dtype instead of dtype | |
| device_map="cpu", | |
| low_cpu_mem_usage=False, | |
| local_files_only=False, | |
| token=token_str | |
| ) | |
| self.model = self.model.to("cpu") | |
| self.model.eval() | |
| def get_embedding(self, text: str) -> List[float]: | |
| """Generate embedding for text""" | |
| inputs = self.tokenizer( | |
| text, | |
| return_tensors="pt", | |
| padding=True, | |
| truncation=True, | |
| max_length=512, | |
| add_special_tokens=True | |
| ) | |
| with torch.no_grad(): | |
| outputs = self.model(**inputs) | |
| embeddings = outputs.last_hidden_state.mean(dim=1).squeeze().cpu().numpy() | |
| return embeddings.tolist() | |
| def get_embeddings_batch(self, texts: List[str]) -> List[List[float]]: | |
| """Generate embeddings for a batch of texts""" | |
| return [self.get_embedding(text) for text in texts] | |
| def get_embedding_function(): | |
| """Return the embedding function""" | |
| embedder = EmbeddingGenerator() | |
| return embedder.get_embedding | |
| if __name__ == "__main__": | |
| embed_gen = EmbeddingGenerator() | |
| test_text = "Hello world, नमस्ते दुनिया" | |
| embedding = embed_gen.get_embedding(test_text) | |
| print(f"Embedding length: {len(embedding)}") | |
| print(f"First 10 values: {embedding[:10]}") | |