fix generating text embeddings from searhc query

This commit is contained in:
johnpccd 2025-05-25 13:23:52 +02:00
parent a80550bdf6
commit 38f218691d

View File

@ -4,37 +4,52 @@ import os
from typing import List, Dict, Any, Union, Optional from typing import List, Dict, Any, Union, Optional
import numpy as np import numpy as np
from PIL import Image from PIL import Image
import vertexai
from vertexai.vision_models import MultiModalEmbeddingModel
from src.config.config import settings from src.config.config import settings
logger = logging.getLogger(__name__) logger = logging.getLogger(__name__)
class EmbeddingService: class EmbeddingService:
"""Service for generating image and text embeddings""" """Service for generating image and text embeddings using Vertex AI multimodal model"""
def __init__(self): def __init__(self):
self.model = None self.model = None
self.processor = None self.model_name = "multimodalembedding@001"
self.model_name = "openai/clip-vit-base-patch32" self.embedding_dim = 1408 # Vertex AI multimodal embedding dimensions
self.device = "cpu" # Simplified without PyTorch self._initialize_vertex_ai()
self.embedding_dim = 512 # Dimension of CLIP's embeddings
def _initialize_vertex_ai(self):
"""Initialize Vertex AI"""
try:
project_id = os.environ.get('GOOGLE_CLOUD_PROJECT') or settings.FIRESTORE_PROJECT_ID
location = os.environ.get('VERTEX_AI_LOCATION', 'us-central1')
if project_id:
vertexai.init(project=project_id, location=location)
logger.info(f"Initialized Vertex AI with project {project_id} in location {location}")
else:
logger.error("PROJECT_ID not found in environment variables")
raise ValueError("Google Cloud Project ID not configured")
except Exception as e:
logger.error(f"Error initializing Vertex AI: {e}")
raise
def _load_model(self): def _load_model(self):
""" """Load the Vertex AI multimodal embedding model"""
Load the embedding model if not already loaded
"""
if self.model is None: if self.model is None:
try: try:
logger.info(f"Loading embedding model on {self.device}") logger.info(f"Loading Vertex AI multimodal embedding model: {self.model_name}")
# Placeholder for model loading logic self.model = MultiModalEmbeddingModel.from_pretrained(self.model_name)
logger.info("Embedding model loaded successfully") logger.info("Vertex AI multimodal embedding model loaded successfully")
except Exception as e: except Exception as e:
logger.error(f"Error loading embedding model: {e}") logger.error(f"Error loading Vertex AI model: {e}")
raise raise
def generate_image_embedding(self, image_data: bytes) -> List[float]: def generate_image_embedding(self, image_data: bytes) -> List[float]:
""" """
Generate embedding for an image Generate embedding for an image using Vertex AI multimodal model
Args: Args:
image_data: Binary image data image_data: Binary image data
@ -45,22 +60,38 @@ class EmbeddingService:
try: try:
self._load_model() self._load_model()
# Load the image # Create Vertex AI image object
image = Image.open(io.BytesIO(image_data)) from vertexai.vision_models import Image as VertexImage
vertex_image = VertexImage(image_data)
# Placeholder for image embedding generation # Generate image embedding using Vertex AI multimodal model
# Returns a random normalized vector as placeholder embeddings = self.model.get_embeddings(image=vertex_image)
embedding = np.random.randn(self.embedding_dim).astype(np.float32)
embedding = embedding / np.linalg.norm(embedding) if embeddings is None or embeddings.image_embedding is None:
logger.error("Failed to generate image embeddings - no image embedding returned")
raise ValueError("Failed to generate image embeddings")
# Get the image embedding vector
embedding_vector = embeddings.image_embedding
# Convert to numpy array and normalize
embeddings_array = np.array(embedding_vector, dtype=np.float32)
# Normalize the feature vector
norm = np.linalg.norm(embeddings_array)
if norm > 0:
embeddings_array = embeddings_array / norm
logger.info(f"Generated image embeddings with shape: {embeddings_array.shape}")
return embeddings_array.tolist()
return embedding.tolist()
except Exception as e: except Exception as e:
logger.error(f"Error generating image embedding: {e}") logger.error(f"Error generating image embedding: {e}")
raise raise
async def generate_text_embedding(self, text: str) -> Optional[List[float]]: async def generate_text_embedding(self, text: str) -> Optional[List[float]]:
""" """
Generate embedding for a text query Generate embedding for a text query using Vertex AI multimodal model
Args: Args:
text: Text query text: Text query
@ -71,12 +102,27 @@ class EmbeddingService:
try: try:
self._load_model() self._load_model()
# Placeholder for text embedding generation # Generate text embedding using Vertex AI multimodal model
# Returns a random normalized vector as placeholder embeddings = self.model.get_embeddings(contextual_text=text)
embedding = np.random.randn(self.embedding_dim).astype(np.float32)
embedding = embedding / np.linalg.norm(embedding) if embeddings is None or embeddings.text_embedding is None:
logger.error("Failed to generate text embeddings - no text embedding returned")
return None
# Get the text embedding vector
embedding_vector = embeddings.text_embedding
# Convert to numpy array and normalize
embeddings_array = np.array(embedding_vector, dtype=np.float32)
# Normalize the feature vector
norm = np.linalg.norm(embeddings_array)
if norm > 0:
embeddings_array = embeddings_array / norm
logger.info(f"Generated text embeddings with shape: {embeddings_array.shape}")
return embeddings_array.tolist()
return embedding.tolist()
except Exception as e: except Exception as e:
logger.error(f"Error generating text embedding: {e}") logger.error(f"Error generating text embedding: {e}")
return None return None