Spaces:
Running
Running
Update main.py
Browse files
main.py
CHANGED
|
@@ -16,9 +16,10 @@ logger = logging.getLogger(__name__)
|
|
| 16 |
warnings.filterwarnings("ignore")
|
| 17 |
|
| 18 |
# --- Configuração do Modelo e Diretórios ---
|
| 19 |
-
#
|
| 20 |
-
HF_MODEL_ID = "microsoft/Phi-3-mini-4k-instruct"
|
| 21 |
LOCAL_MODEL_DIR = "./models"
|
|
|
|
| 22 |
API_TOKEN = os.environ.get("HF_TOKEN")
|
| 23 |
|
| 24 |
# Variáveis globais para o LLM e a Aplicação Flask
|
|
@@ -83,6 +84,7 @@ def initialize_llm():
|
|
| 83 |
|
| 84 |
except Exception as e:
|
| 85 |
logger.error(f"FATAL: Erro na inicialização do LLM (Transformers): {e}", exc_info=True)
|
|
|
|
| 86 |
sys.exit(f"Falha Crítica ao iniciar: Erro ao carregar o LLM. Detalhe: {e}")
|
| 87 |
|
| 88 |
|
|
@@ -91,6 +93,7 @@ def initialize_llm():
|
|
| 91 |
@app.route("/")
|
| 92 |
def index():
|
| 93 |
"""Rota de bem-vindo."""
|
|
|
|
| 94 |
return "AKIRA IA ONLINE (Transformers)! Bué fixe, kota! Vamos kandandar!", 200
|
| 95 |
|
| 96 |
@app.route("/health")
|
|
@@ -116,20 +119,25 @@ def generate():
|
|
| 116 |
return jsonify({"error": "O campo 'prompt' é obrigatório."}), 400
|
| 117 |
|
| 118 |
model, tokenizer = llm
|
|
|
|
| 119 |
device = model.device
|
| 120 |
|
| 121 |
# 1. Cria a lista de mensagens no formato de chat
|
|
|
|
| 122 |
messages = [
|
| 123 |
{"role": "system", "content": "Você é um assistente de IA prestativo e criativo. Responda em português de Portugal."},
|
| 124 |
{"role": "user", "content": prompt}
|
| 125 |
]
|
| 126 |
|
| 127 |
# 2. Aplica o template de chat do Phi-3 e tokeniza
|
|
|
|
| 128 |
formatted_prompt = tokenizer.apply_chat_template(
|
| 129 |
messages,
|
| 130 |
tokenize=False,
|
| 131 |
-
add_generation_prompt=True
|
| 132 |
)
|
|
|
|
|
|
|
| 133 |
input_ids = tokenizer.encode(formatted_prompt, return_tensors="pt").to(device)
|
| 134 |
|
| 135 |
# 3. Geração de Texto
|
|
@@ -138,9 +146,10 @@ def generate():
|
|
| 138 |
input_ids,
|
| 139 |
max_new_tokens=int(max_tokens),
|
| 140 |
temperature=float(temperature),
|
| 141 |
-
do_sample=True, #
|
| 142 |
pad_token_id=tokenizer.eos_token_id,
|
| 143 |
-
#
|
|
|
|
| 144 |
)
|
| 145 |
|
| 146 |
# 4. Decodifica a resposta (ignorando o prompt de entrada)
|
|
@@ -163,4 +172,5 @@ if __name__ == "__main__":
|
|
| 163 |
|
| 164 |
# Inicia o servidor Flask na porta padrão do Hugging Face Spaces (7860)
|
| 165 |
logger.info("SERVIDOR FLASK PRONTO. RODANDO EM http://0.0.0.0:7860")
|
| 166 |
-
|
|
|
|
|
|
| 16 |
warnings.filterwarnings("ignore")
|
| 17 |
|
| 18 |
# --- Configuração do Modelo e Diretórios ---
|
| 19 |
+
# ID do modelo Hugging Face que será carregado
|
| 20 |
+
HF_MODEL_ID = "microsoft/Phi-3-mini-4k-instruct"
|
| 21 |
LOCAL_MODEL_DIR = "./models"
|
| 22 |
+
# O token é opcional, mas útil se o modelo for privado
|
| 23 |
API_TOKEN = os.environ.get("HF_TOKEN")
|
| 24 |
|
| 25 |
# Variáveis globais para o LLM e a Aplicação Flask
|
|
|
|
| 84 |
|
| 85 |
except Exception as e:
|
| 86 |
logger.error(f"FATAL: Erro na inicialização do LLM (Transformers): {e}", exc_info=True)
|
| 87 |
+
# O sys.exit é crucial em ambientes de contêiner para sinalizar falha
|
| 88 |
sys.exit(f"Falha Crítica ao iniciar: Erro ao carregar o LLM. Detalhe: {e}")
|
| 89 |
|
| 90 |
|
|
|
|
| 93 |
@app.route("/")
|
| 94 |
def index():
|
| 95 |
"""Rota de bem-vindo."""
|
| 96 |
+
# Mensagem de bem-vindo em Português de Portugal (Português Europeu)
|
| 97 |
return "AKIRA IA ONLINE (Transformers)! Bué fixe, kota! Vamos kandandar!", 200
|
| 98 |
|
| 99 |
@app.route("/health")
|
|
|
|
| 119 |
return jsonify({"error": "O campo 'prompt' é obrigatório."}), 400
|
| 120 |
|
| 121 |
model, tokenizer = llm
|
| 122 |
+
# Verifica se o modelo está no dispositivo correto (importante para evitar erros)
|
| 123 |
device = model.device
|
| 124 |
|
| 125 |
# 1. Cria a lista de mensagens no formato de chat
|
| 126 |
+
# Definindo a persona e o idioma de resposta (Português de Portugal)
|
| 127 |
messages = [
|
| 128 |
{"role": "system", "content": "Você é um assistente de IA prestativo e criativo. Responda em português de Portugal."},
|
| 129 |
{"role": "user", "content": prompt}
|
| 130 |
]
|
| 131 |
|
| 132 |
# 2. Aplica o template de chat do Phi-3 e tokeniza
|
| 133 |
+
# O template garante que o modelo entenda a estrutura da conversa
|
| 134 |
formatted_prompt = tokenizer.apply_chat_template(
|
| 135 |
messages,
|
| 136 |
tokenize=False,
|
| 137 |
+
add_generation_prompt=True # Adiciona o token final para iniciar a resposta do assistente
|
| 138 |
)
|
| 139 |
+
|
| 140 |
+
# Tokeniza e move para o dispositivo onde o modelo está
|
| 141 |
input_ids = tokenizer.encode(formatted_prompt, return_tensors="pt").to(device)
|
| 142 |
|
| 143 |
# 3. Geração de Texto
|
|
|
|
| 146 |
input_ids,
|
| 147 |
max_new_tokens=int(max_tokens),
|
| 148 |
temperature=float(temperature),
|
| 149 |
+
do_sample=True, # Permite amostragem (importante para temperatura > 0)
|
| 150 |
pad_token_id=tokenizer.eos_token_id,
|
| 151 |
+
# Usa o token de fim de sequência para parar a geração
|
| 152 |
+
eos_token_id=tokenizer.eos_token_id
|
| 153 |
)
|
| 154 |
|
| 155 |
# 4. Decodifica a resposta (ignorando o prompt de entrada)
|
|
|
|
| 172 |
|
| 173 |
# Inicia o servidor Flask na porta padrão do Hugging Face Spaces (7860)
|
| 174 |
logger.info("SERVIDOR FLASK PRONTO. RODANDO EM http://0.0.0.0:7860")
|
| 175 |
+
# 'threaded=False' é geralmente recomendado para evitar problemas de concorrência com PyTorch
|
| 176 |
+
app.run(host="0.0.0.0", port=7860, debug=False, threaded=False)
|