|
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() |
|
|