import os import faiss import pandas as pd from openai import AsyncOpenAI import pathlib from functools import lru_cache from environs import Env from transformers import AutoModel, AutoTokenizer, AutoModelForTokenClassification import torch env = Env() env.read_env() class BaseConfig: BASE_DIR: pathlib.Path = pathlib.Path(__file__).parent.parent DATA_DIR: pathlib.Path = BASE_DIR / 'project' / 'data' MODEL_NAME = 'sentence-transformers/paraphrase-multilingual-mpnet-base-v2' INFO_MODEL = AutoModel.from_pretrained(MODEL_NAME) INFO_TOKENIZER = AutoTokenizer.from_pretrained(MODEL_NAME) OPENAI_CLIENT = AsyncOpenAI(api_key=os.getenv('OPENAI_API_KEY')) FAISS_INDEX = faiss.read_index(str(BASE_DIR / 'faiss_javea.index')) NLP_MODEL_NAME = 'Babelscape/wikineural-multilingual-ner' NLP_TOKENIZER = AutoTokenizer.from_pretrained("Babelscape/wikineural-multilingual-ner") NLP_MODEL = AutoModelForTokenClassification.from_pretrained("Babelscape/wikineural-multilingual-ner") class DevelopmentConfig(BaseConfig): pass class ProductionConfig(BaseConfig): DATABASE_URL = f"postgresql+asyncpg://{env('DATABASE_USER')}:" \ f"{env('DATABASE_PASSWORD')}@" \ f"{env('DATABASE_HOST')}:" \ f"{env('DATABASE_PORT')}/" \ f"{env('DATABASE_NAME')}" PROMPT = "Jij bent een AI-expert in Jávea aan de Costa Blanca in Spanje, gespecialiseerd in het beantwoorden van " \ "vragen op basis van gegevens verzameld uit sociale media, met name Facebook-posts. Jouw doel is om " \ "gebruikers advies te geven dat gebaseerd is op de meest voorkomende aanbevelingen in deze gegevens. " \ "Wanneer er een vraag wordt gesteld, analyseer je de beschikbare informatie en geef je een beknopt " \ "antwoord op basis van jouw eerdere boodschappen. Als het advies herhaaldelijk door verschillende " \ "gebruikers wordt gegeven, benadruk dan dat dit als betrouwbaar en waardevol wordt beschouwd. Nooit " \ "vermelden dat jouw kennis afkomstig is van posts of opmerkingen. " EMPTY_PROMPT = "Je bent een kunstmatige intelligentie, een expert in Jávea aan de Costa Blanca in Spanje, " \ "gespecialiseerd in het beantwoorden van vragen. Je taak is om mensen te helpen zich thuis te " \ "voelen in hun nieuwe stad. Wanneer een vraag wordt gesteld, dien je beleefd te melden dat er geen " \ "antwoord beschikbaar is in je kennisdatabank en de gebruiker aan te raden de benodigde informatie " \ "op internet te vinden. " GOOGLE_PLACES_API_KEY = env('GOOGLE_PLACES_API_KEY') def __init__(self): if torch.cuda.is_available(): device = torch.device("cuda") else: device = torch.device("cpu") self.device = device self.INFO_MODEL.to(device) self.products_dataset = pd.read_csv(self.BASE_DIR / 'chunks_javea.csv') class TestConfig(BaseConfig): pass @lru_cache() def get_settings() -> DevelopmentConfig | ProductionConfig | TestConfig: config_cls_dict = { 'development': DevelopmentConfig, 'production': ProductionConfig, 'testing': TestConfig } config_name = env('FASTAPI_CONFIG', default='development') config_cls = config_cls_dict[config_name] return config_cls() settings = get_settings()