Hodely commited on
Commit
6c92216
·
verified ·
1 Parent(s): acceed5

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +73 -60
app.py CHANGED
@@ -1,70 +1,83 @@
1
- from flask import Flask, request, jsonify
2
- from flask_cors import CORS
3
- from transformers import pipeline
4
- import os
5
 
6
- app = Flask(__name__)
7
- CORS(app) # Habilita CORS para permitir peticiones desde tu frontend
 
 
 
 
 
 
 
 
 
8
 
9
- # Nombre del modelo de Hugging Face
10
- MODEL_ID = "sarvamai/sarvam-m"
 
 
 
 
 
 
 
 
 
 
 
11
 
12
- # Variable para almacenar el pipeline de la IA
13
- pipe = None
 
 
 
 
 
14
 
15
- # Función para cargar el modelo
16
- def load_model():
17
- global pipe
18
- try:
19
- print(f"Cargando modelo '{MODEL_ID}'. Esto puede tardar unos minutos...")
20
- # El token de Hugging Face se obtiene automáticamente de la variable de entorno HF_TOKEN
21
- # que configuras como un "Secret" en Hugging Face Spaces.
22
- pipe = pipeline("text-generation", model=MODEL_ID, device=-1) # device=-1 usa CPU
23
- print(f"Modelo '{MODEL_ID}' cargado con éxito.")
24
- except Exception as e:
25
- print(f"Error al cargar el modelo '{MODEL_ID}': {e}")
26
- pipe = None
27
- print("El servidor no podrá responder a las solicitudes de IA.")
28
 
29
- # Cargar el modelo inmediatamente después de crear la aplicación Flask
30
- # Esto se asegura de que el modelo se cargue al inicio del servidor
31
- with app.app_context():
32
- load_model()
33
 
34
- @app.route('/chat', methods=['POST'])
35
- def chat():
36
- if pipe is None:
37
- return jsonify({"error": "El modelo de IA no está cargado. Por favor, revisa el log del servidor."}), 503
 
 
 
 
 
38
 
39
- data = request.json
40
- messages = data.get('messages') # El frontend envía el historial completo
 
41
 
42
- if not messages:
43
- return jsonify({"error": "No se proporcionaron mensajes."}), 400
44
 
45
- try:
46
- prompt = ""
47
- for msg in messages:
48
- if msg['role'] == 'user':
49
- prompt += f"Usuario: {msg['content']}\n"
50
- elif msg['role'] == 'assistant':
51
- prompt += f"Asistente: {msg['content']}\n"
52
- prompt += "Asistente:"
 
 
 
 
 
 
 
 
 
 
 
 
53
 
54
- response = pipe(prompt, max_new_tokens=250, temperature=0.7, do_sample=True, clean_up_tokenization_spaces=True)
55
-
56
- generated_text = response[0]['generated_text']
57
- ai_response_content = generated_text.split("Asistente:", 1)[-1].strip()
58
-
59
- if not ai_response_content:
60
- ai_response_content = "Lo siento, no pude generar una respuesta clara. ¿Puedes intentarlo de nuevo?"
61
-
62
- return jsonify({"response": ai_response_content})
63
-
64
- except Exception as e:
65
- print(f"Error en la inferencia de la IA: {e}")
66
- return jsonify({"error": f"Error interno del servidor: {str(e)}"}), 500
67
-
68
- if __name__ == '__main__':
69
- port = int(os.environ.get('PORT', 7860))
70
- app.run(debug=False, host='0.0.0.0', port=port)
 
1
+ from transformers import AutoTokenizer, AutoModelForCausalLM
2
+ import gradio as gr
3
+ import torch
 
4
 
5
+ # --- Cargar el tokenizador y el modelo ---
6
+ # Se cargan una sola vez al inicio de la aplicación para mayor eficiencia.
7
+ # 'device_map="auto"' es crucial para que Hugging Face Spaces lo asigne correctamente
8
+ # a la GPU (si está disponible) o a la CPU.
9
+ # 'torch_dtype=torch.bfloat16' optimiza el uso de memoria en GPUs modernas.
10
+ tokenizer = AutoTokenizer.from_pretrained("tiiuae/Falcon-H1-1.5B-Deep-Instruct")
11
+ model = AutoModelForCausalLM.from_pretrained(
12
+ "tiiuae/Falcon-H1-1.5B-Deep-Instruct",
13
+ torch_dtype=torch.bfloat16, # Puedes probar con torch.float16 si da problemas
14
+ device_map="auto"
15
+ )
16
 
17
+ # --- Definir la función de generación de texto ---
18
+ def generate_text(user_input, history):
19
+ # Personalidad de Amside AI
20
+ # Este es un "system prompt" que ayuda al modelo a mantener el personaje.
21
+ # Se añade al inicio de cada conversación o antes de cada turno.
22
+ # Ajusta esta parte para afinar la personalidad de Amside.
23
+ system_message = (
24
+ "Eres Amside AI, una inteligencia artificial creada por Hodelygil. "
25
+ "Tu propósito principal es asistir en el estudio y el aprendizaje, "
26
+ "proporcionando información y explicaciones detalladas. "
27
+ "Sin embargo, también eres amigable y puedes mantener conversaciones informales y agradables. "
28
+ "Responde de manera informativa y útil, pero con un tono conversacional."
29
+ )
30
 
31
+ # Formatear los mensajes para el modelo, incluyendo el historial de chat
32
+ # El formato del "chat_template" es crucial para que el modelo entienda el diálogo.
33
+ messages = [{"role": "system", "content": system_message}] # El system message va primero
34
+ for human, bot in history:
35
+ messages.append({"role": "user", "content": human})
36
+ messages.append({"role": "assistant", "content": bot})
37
+ messages.append({"role": "user", "content": user_input})
38
 
39
+ # Codificar los mensajes en IDs de tokens
40
+ input_ids = tokenizer.apply_chat_template(messages, return_tensors="pt")
 
 
 
 
 
 
 
 
 
 
 
41
 
42
+ # Mover los IDs de tokens al mismo dispositivo donde se cargó el modelo (GPU/CPU)
43
+ input_ids = input_ids.to(model.device)
 
 
44
 
45
+ # Generar la respuesta del modelo
46
+ outputs = model.generate(
47
+ input_ids,
48
+ max_new_tokens=500, # Máximo de tokens para la respuesta del modelo
49
+ do_sample=True, # Activa el muestreo para respuestas más creativas
50
+ temperature=0.7, # Controla la aleatoriedad (menor = más predecible)
51
+ top_p=0.9, # Controla la diversidad de las palabras elegidas
52
+ repetition_penalty=1.1 # Penaliza la repetición de frases
53
+ )
54
 
55
+ # Decodificar la respuesta y eliminar el prompt original para solo mostrar la respuesta de Amside
56
+ # outputs[0] es la secuencia completa, input_ids.shape[1] es la longitud del prompt
57
+ response = tokenizer.decode(outputs[0][input_ids.shape[1]:], skip_special_tokens=True)
58
 
59
+ return response
 
60
 
61
+ # --- Configurar la interfaz de Gradio ---
62
+ # gr.ChatInterface es una forma sencilla de crear una interfaz de chatbot.
63
+ iface = gr.ChatInterface(
64
+ fn=generate_text,
65
+ chatbot=gr.Chatbot(height=400), # Altura de la ventana de chat
66
+ textbox=gr.Textbox(placeholder="Escribe tu mensaje para Amside AI...", container=False, scale=7),
67
+ title="Amside AI - Tu Compañero de Estudio y Conversación",
68
+ description="Soy Amside AI, una inteligencia artificial creada por Hodelygil. Estoy aquí para ayudarte a estudiar y conversar.",
69
+ examples=[
70
+ "¿Qué es la fotosíntesis?",
71
+ "Cuéntame un dato interesante.",
72
+ "¿Cómo funciona la gravedad?",
73
+ "Hola Amside, ¿cómo estás?",
74
+ "Dame un resumen de la historia de España."
75
+ ],
76
+ theme="soft", # Un tema visual más suave para la interfaz
77
+ retry_btn="Reintentar",
78
+ undo_btn="Deshacer",
79
+ clear_btn="Limpiar Historial"
80
+ )
81
 
82
+ # Lanzar la aplicación Gradio
83
+ iface.launch()