Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -9,36 +9,28 @@ from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
|
|
9 |
from langchain.memory import ConversationBufferMemory
|
10 |
|
11 |
# Configuración del modelo de lenguaje
|
12 |
-
MODEL_NAME = "
|
13 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
14 |
-
HF_TOKEN = os.getenv("HF_TOKEN") #
|
15 |
|
16 |
-
# Verificación de token
|
17 |
if not HF_TOKEN:
|
18 |
raise ValueError("❌ ERROR: No se encontró HF_TOKEN. Asegúrate de definirlo en las variables de entorno.")
|
19 |
|
20 |
print("🔄 Cargando modelo de lenguaje...")
|
21 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
22 |
-
bnb_config = BitsAndBytesConfig(load_in_8bit=True)
|
23 |
|
24 |
model = AutoModelForCausalLM.from_pretrained(
|
25 |
MODEL_NAME,
|
26 |
-
torch_dtype=torch.float16,
|
27 |
-
|
28 |
-
device_map=
|
29 |
token=HF_TOKEN
|
30 |
)
|
31 |
|
32 |
# Memoria conversacional
|
33 |
memory = ConversationBufferMemory()
|
34 |
|
35 |
-
# Cargar modelo de la colmena
|
36 |
-
modelo_path = "modelo_colmena.pkl"
|
37 |
-
if os.path.exists(modelo_path):
|
38 |
-
modelo_colmena = joblib.load(modelo_path)
|
39 |
-
else:
|
40 |
-
modelo_colmena = None
|
41 |
-
|
42 |
# API de Node-RED
|
43 |
NODE_RED_URL = "https://appairedecolmena.es/colmena1/datos"
|
44 |
USERNAME = "user"
|
@@ -58,67 +50,65 @@ def obtener_datos_colmena():
|
|
58 |
except Exception as e:
|
59 |
return {"error": str(e)}
|
60 |
|
61 |
-
def
|
62 |
-
"""
|
63 |
-
|
64 |
-
|
65 |
-
|
66 |
-
|
67 |
-
elif "
|
68 |
-
|
69 |
-
|
70 |
-
|
71 |
-
|
72 |
-
elif "
|
73 |
-
|
74 |
-
|
75 |
-
|
76 |
-
|
77 |
-
|
78 |
-
|
79 |
-
|
|
|
|
|
80 |
|
81 |
def conversar_con_colmena(mensaje):
|
82 |
-
"""Genera una respuesta combinando el modelo de lenguaje con
|
83 |
datos = obtener_datos_colmena()
|
84 |
if "error" in datos:
|
85 |
return datos["error"]
|
86 |
|
87 |
-
datos_relevantes =
|
88 |
|
89 |
contexto = f"Datos actuales de la colmena: {datos_relevantes}\nUsuario: {mensaje}\nColmena:"
|
90 |
inputs = tokenizer(contexto, return_tensors="pt").to(device)
|
91 |
|
92 |
-
print(f"🔄 Enviando entrada al modelo: {contexto}")
|
93 |
|
94 |
with torch.no_grad():
|
95 |
output = model.generate(
|
96 |
**inputs,
|
97 |
-
max_length=
|
98 |
-
do_sample=True,
|
99 |
-
top_k=50,
|
100 |
-
temperature=0.7,
|
101 |
-
pad_token_id=tokenizer.eos_token_id
|
102 |
)
|
103 |
|
104 |
-
# Decodificar la salida del modelo
|
105 |
respuesta = tokenizer.decode(output[0], skip_special_tokens=True).strip()
|
|
|
106 |
|
107 |
-
# Imprimir la respuesta generada para depuración
|
108 |
-
print(f"✅ Respuesta generada por la IA: '{respuesta}'") # 👈 Para ver si está vacío
|
109 |
-
|
110 |
-
# Manejo de respuestas vacías
|
111 |
if not respuesta:
|
112 |
return "🤖 No pude generar una respuesta. Inténtalo de nuevo con otra pregunta."
|
113 |
|
114 |
-
return
|
115 |
|
116 |
iface = gr.Interface(
|
117 |
fn=conversar_con_colmena,
|
118 |
inputs="text",
|
119 |
outputs="text",
|
120 |
title="🐝 Chat con la Colmena",
|
121 |
-
description="
|
122 |
)
|
123 |
|
124 |
iface.launch()
|
|
|
9 |
from langchain.memory import ConversationBufferMemory
|
10 |
|
11 |
# Configuración del modelo de lenguaje
|
12 |
+
MODEL_NAME = "google/gemma-2b" # Modelo más pequeño y eficiente
|
13 |
device = "cuda" if torch.cuda.is_available() else "cpu"
|
14 |
+
HF_TOKEN = os.getenv("HF_TOKEN") # Token de Hugging Face
|
15 |
|
|
|
16 |
if not HF_TOKEN:
|
17 |
raise ValueError("❌ ERROR: No se encontró HF_TOKEN. Asegúrate de definirlo en las variables de entorno.")
|
18 |
|
19 |
print("🔄 Cargando modelo de lenguaje...")
|
20 |
tokenizer = AutoTokenizer.from_pretrained(MODEL_NAME, token=HF_TOKEN)
|
21 |
+
bnb_config = BitsAndBytesConfig(load_in_8bit=True)
|
22 |
|
23 |
model = AutoModelForCausalLM.from_pretrained(
|
24 |
MODEL_NAME,
|
25 |
+
torch_dtype=torch.float16,
|
26 |
+
quantization_config=bnb_config,
|
27 |
+
device_map="auto",
|
28 |
token=HF_TOKEN
|
29 |
)
|
30 |
|
31 |
# Memoria conversacional
|
32 |
memory = ConversationBufferMemory()
|
33 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
34 |
# API de Node-RED
|
35 |
NODE_RED_URL = "https://appairedecolmena.es/colmena1/datos"
|
36 |
USERNAME = "user"
|
|
|
50 |
except Exception as e:
|
51 |
return {"error": str(e)}
|
52 |
|
53 |
+
def generar_recomendacion(datos):
|
54 |
+
"""Genera recomendaciones basadas en el estado de la colmena."""
|
55 |
+
recomendaciones = []
|
56 |
+
|
57 |
+
if datos.get("temperaturaInterior") > 35:
|
58 |
+
recomendaciones.append("🌡 La temperatura interior es alta. Podrías mejorar la ventilación para evitar el sobrecalentamiento de la colmena.")
|
59 |
+
elif datos.get("temperaturaInterior") < 20:
|
60 |
+
recomendaciones.append("❄ La temperatura interior es baja. Asegúrate de que la calefacción funcione correctamente para evitar estrés en las abejas.")
|
61 |
+
|
62 |
+
if datos.get("humedadInterior") > 80:
|
63 |
+
recomendaciones.append("💧 La humedad es alta. Esto puede favorecer hongos y enfermedades. Asegúrate de que la ventilación sea adecuada.")
|
64 |
+
elif datos.get("humedadInterior") < 40:
|
65 |
+
recomendaciones.append("🔥 La humedad es baja. Las abejas necesitan un nivel de humedad adecuado para la crianza, podrías aumentar la humedad si es necesario.")
|
66 |
+
|
67 |
+
if datos.get("co2") > 1000:
|
68 |
+
recomendaciones.append("🌿 El nivel de CO₂ es alto. Esto puede indicar problemas de ventilación. Verifica que el sistema de ventilación esté activo.")
|
69 |
+
|
70 |
+
if not recomendaciones:
|
71 |
+
recomendaciones.append("✅ Todo parece estar en orden. Sigue monitoreando regularmente para asegurar el bienestar de la colmena.")
|
72 |
+
|
73 |
+
return "\n".join(recomendaciones)
|
74 |
|
75 |
def conversar_con_colmena(mensaje):
|
76 |
+
"""Genera una respuesta combinando el modelo de lenguaje con recomendaciones sobre la colmena."""
|
77 |
datos = obtener_datos_colmena()
|
78 |
if "error" in datos:
|
79 |
return datos["error"]
|
80 |
|
81 |
+
datos_relevantes = generar_recomendacion(datos)
|
82 |
|
83 |
contexto = f"Datos actuales de la colmena: {datos_relevantes}\nUsuario: {mensaje}\nColmena:"
|
84 |
inputs = tokenizer(contexto, return_tensors="pt").to(device)
|
85 |
|
86 |
+
print(f"🔄 Enviando entrada al modelo: {contexto}")
|
87 |
|
88 |
with torch.no_grad():
|
89 |
output = model.generate(
|
90 |
**inputs,
|
91 |
+
max_length=100,
|
92 |
+
do_sample=True,
|
93 |
+
top_k=50,
|
94 |
+
temperature=0.7,
|
95 |
+
pad_token_id=tokenizer.eos_token_id
|
96 |
)
|
97 |
|
|
|
98 |
respuesta = tokenizer.decode(output[0], skip_special_tokens=True).strip()
|
99 |
+
print(f"✅ Respuesta generada por la IA: '{respuesta}'")
|
100 |
|
|
|
|
|
|
|
|
|
101 |
if not respuesta:
|
102 |
return "🤖 No pude generar una respuesta. Inténtalo de nuevo con otra pregunta."
|
103 |
|
104 |
+
return f"{datos_relevantes}\n\n🤖 Respuesta de la IA: {respuesta}"
|
105 |
|
106 |
iface = gr.Interface(
|
107 |
fn=conversar_con_colmena,
|
108 |
inputs="text",
|
109 |
outputs="text",
|
110 |
title="🐝 Chat con la Colmena",
|
111 |
+
description="Consulta el estado de la colmena y recibe recomendaciones."
|
112 |
)
|
113 |
|
114 |
iface.launch()
|