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
import numpy as np
from PIL import Image
import vertexai
from vertexai.vision_models import MultiModalEmbeddingModel
from src.config.config import settings
logger = logging.getLogger(__name__)
class EmbeddingService:
"""Service for generating image and text embeddings"""
"""Service for generating image and text embeddings using Vertex AI multimodal model"""
def __init__(self):
self.model = None
self.processor = None
self.model_name = "openai/clip-vit-base-patch32"
self.device = "cpu" # Simplified without PyTorch
self.embedding_dim = 512 # Dimension of CLIP's embeddings
self.model_name = "multimodalembedding@001"
self.embedding_dim = 1408 # Vertex AI multimodal embedding dimensions
self._initialize_vertex_ai()
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):
"""
Load the embedding model if not already loaded
"""
"""Load the Vertex AI multimodal embedding model"""
if self.model is None:
try:
logger.info(f"Loading embedding model on {self.device}")
# Placeholder for model loading logic
logger.info("Embedding model loaded successfully")
logger.info(f"Loading Vertex AI multimodal embedding model: {self.model_name}")
self.model = MultiModalEmbeddingModel.from_pretrained(self.model_name)
logger.info("Vertex AI multimodal embedding model loaded successfully")
except Exception as e:
logger.error(f"Error loading embedding model: {e}")
logger.error(f"Error loading Vertex AI model: {e}")
raise
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:
image_data: Binary image data
@ -45,22 +60,38 @@ class EmbeddingService:
try:
self._load_model()
# Load the image
image = Image.open(io.BytesIO(image_data))
# Create Vertex AI image object
from vertexai.vision_models import Image as VertexImage
vertex_image = VertexImage(image_data)
# Placeholder for image embedding generation
# Returns a random normalized vector as placeholder
embedding = np.random.randn(self.embedding_dim).astype(np.float32)
embedding = embedding / np.linalg.norm(embedding)
# Generate image embedding using Vertex AI multimodal model
embeddings = self.model.get_embeddings(image=vertex_image)
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:
logger.error(f"Error generating image embedding: {e}")
raise
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:
text: Text query
@ -71,12 +102,27 @@ class EmbeddingService:
try:
self._load_model()
# Placeholder for text embedding generation
# Returns a random normalized vector as placeholder
embedding = np.random.randn(self.embedding_dim).astype(np.float32)
embedding = embedding / np.linalg.norm(embedding)
# Generate text embedding using Vertex AI multimodal model
embeddings = self.model.get_embeddings(contextual_text=text)
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:
logger.error(f"Error generating text embedding: {e}")
return None