indicRAG / backend /src /embedding_generator.py
hardkpentium101's picture
update embedding gen to use vector storage files
c31bec2
Raw History Blame Contribute Delete
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]}")