import logging from injector import inject, singleton from llama_index.core.embeddings import BaseEmbedding, MockEmbedding from private_gpt.paths import models_cache_path from private_gpt.settings.settings import Settings logger = logging.getLogger(__name__) @singleton class EmbeddingComponent: embedding_model: BaseEmbedding @inject def __init__(self, settings: Settings) -> None: embedding_mode = settings.embedding.mode logger.info("Initializing the embedding model in mode=%s", embedding_mode) match embedding_mode: case "local": try: from llama_index.embeddings.huggingface import HuggingFaceEmbedding except ImportError as e: raise ImportError( "Local dependencies not found, install with `poetry install --extras local`" ) from e self.embedding_model = HuggingFaceEmbedding( model_name=settings.local.embedding_hf_model_name, cache_folder=str(models_cache_path), ) case "sagemaker": try: from private_gpt.components.embedding.custom.sagemaker import ( SagemakerEmbedding, ) except ImportError as e: raise ImportError( "Sagemaker dependencies not found, install with `poetry install --extras sagemaker`" ) from e self.embedding_model = SagemakerEmbedding( endpoint_name=settings.sagemaker.embedding_endpoint_name, ) case "openai": try: from llama_index.embeddings.openai import OpenAIEmbedding except ImportError as e: raise ImportError( "OpenAI dependencies not found, install with `poetry install --extras openai`" ) from e openai_settings = settings.openai.api_key self.embedding_model = OpenAIEmbedding(api_key=openai_settings) case "mock": # Not a random number, is the dimensionality used by # the default embedding model self.embedding_model = MockEmbedding(384)