XA-vito commited on
Commit
d30ade1
·
verified ·
1 Parent(s): 2dcb03b

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +38 -48
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 = "mistralai/Mistral-7B-Instruct-v0.3"
13
  device = "cuda" if torch.cuda.is_available() else "cpu"
14
- HF_TOKEN = os.getenv("HF_TOKEN") # Obtiene el token de la variable de entorno
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) # Cargar en 8-bit para reducir memoria
23
 
24
  model = AutoModelForCausalLM.from_pretrained(
25
  MODEL_NAME,
26
- torch_dtype=torch.float16, # Usa menos RAM que float32
27
- low_cpu_mem_usage=True, # Reduce uso de memoria en CPU
28
- device_map={"": "cpu"},
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 filtrar_datos_por_pregunta(mensaje, datos):
62
- """Filtra los datos de la colmena según la pregunta del usuario."""
63
- if "temperatura" in mensaje:
64
- return f"🌡 Temperatura interior: {datos['temperaturaInterior']}°C, exterior: {datos['temperatura_exterior']}°C."
65
- elif "humedad" in mensaje:
66
- return f"💧 Humedad interior: {datos['humedadInterior']}%, exterior: {datos['humedad_exterior']}%."
67
- elif "co2" in mensaje:
68
- return f"🌿 CO2: {datos['co2']} ppm."
69
- elif "ventilador" in mensaje:
70
- estado = "ENCENDIDO" if int(datos['ver_ventilador']) == 1 else "APAGADO"
71
- return f"🔄 Ventilador: {estado}."
72
- elif "calefactor" in mensaje:
73
- estado = "ENCENDIDO" if int(datos['ver_calefactor']) == 1 else "APAGADO"
74
- return f"🔥 Calefactor: {estado}."
75
- elif "ultrasonido" in mensaje:
76
- estado = "ENCENDIDO" if int(datos['ver_ultrasonido']) == 1 else "APAGADO"
77
- return f"🔊 Ultrasonido: {estado}."
78
- else:
79
- return "🤖 No entiendo la pregunta. Pregunta sobre temperatura, humedad, CO2, ventilador, calefactor o ultrasonido."
 
 
80
 
81
  def conversar_con_colmena(mensaje):
82
- """Genera una respuesta combinando el modelo de lenguaje con los datos de la colmena."""
83
  datos = obtener_datos_colmena()
84
  if "error" in datos:
85
  return datos["error"]
86
 
87
- datos_relevantes = filtrar_datos_por_pregunta(mensaje.lower(), datos)
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}") # 👈 Agrega este print para ver el contexto en consola
93
 
94
  with torch.no_grad():
95
  output = model.generate(
96
  **inputs,
97
- max_length=150, # Reduce el tamaño máximo para evitar que se quede colgado
98
- do_sample=True, # Sampling activado para más variabilidad
99
- top_k=50, # Controla la aleatoriedad para evitar salidas vacías
100
- temperature=0.7, # Ajusta la creatividad de la respuesta
101
- pad_token_id=tokenizer.eos_token_id # Evita errores de padding
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 respuesta # SOLUCIÓN 1 IMPLEMENTADA (Se retorna la respuesta)
115
 
116
  iface = gr.Interface(
117
  fn=conversar_con_colmena,
118
  inputs="text",
119
  outputs="text",
120
  title="🐝 Chat con la Colmena",
121
- description="Habla con la colmena en tiempo real sobre su estado."
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()