JairoCesar commited on
Commit
96f8a77
·
verified ·
1 Parent(s): d337405

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +69 -39
app.py CHANGED
@@ -56,25 +56,48 @@ model = get_gemini_model()
56
 
57
  @st.cache_data
58
  def load_data():
59
- """Carga la base de datos enriquecida y extrae la lista de condiciones."""
 
 
60
  try:
61
  path_alimentos = os.path.join('DATOS', 'alimentos_enriquecido.json')
 
62
 
63
  with open(path_alimentos, 'r', encoding='utf-8') as f:
64
  data_alimentos = json.load(f)
65
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
66
  lista_condiciones = sorted(list(set(item['condicion_asociada'] for item in data_alimentos)))
67
 
68
- logger.info(f"✅ Base de datos enriquecida cargada con {len(data_alimentos)} registros.")
69
  return data_alimentos, lista_condiciones
70
 
71
- except FileNotFoundError:
72
- st.error("❌ Error: No se encontró el archivo 'alimentos_enriquecido.json'. Asegúrate de que existe en la carpeta 'DATOS'.")
73
  return None, None
74
- except json.JSONDecodeError:
75
- st.error("❌ Error: El archivo 'alimentos_enriquecido.json' tiene un formato incorrecto.")
76
  return None, None
77
-
78
  alimentos_data, lista_condiciones = load_data()
79
 
80
  FOOD_TO_COMPOUND_MAP = {
@@ -176,42 +199,49 @@ def find_best_matches_hybrid(entities, data):
176
 
177
  # ... (La función generate_detailed_analysis no cambia) ...
178
  def generate_detailed_analysis(query, match):
179
- """Genera la explicación final para el usuario (PROMPT MEJORADO)."""
180
  if not model: return "Error: El modelo de IA no está disponible."
181
 
182
- prompt = f"""
183
- Eres un asistente de IA experto en nutrición y bienestar. Tu tono es empático, claro y muy educativo. NO actúas como un médico, sino como un guía informativo.
184
-
185
- El usuario te ha contado esto: "{query}"
186
-
187
- Tu sistema ha encontrado la siguiente posible conexión:
188
- - Condición: {match.get("condicion_asociada")}
189
- - Mecanismo: {match.get("mecanismo_fisiologico")}
190
- - Recomendaciones: {match.get("recomendaciones_examenes")}
191
- - Alimentos Implicados: {match.get("compuesto_alimento")}
192
-
193
- **Tu Tarea:** Redacta una respuesta excepcional para el usuario usando Markdown. Sigue esta estructura OBLIGATORIAMENTE:
194
-
195
- ### Posible Causa: {match.get("condicion_asociada")}
196
-
197
- Hola. Entiendo que te preocupa lo que sientes después de comer. Basado en los síntomas y alimentos que mencionaste, como **[menciona aquí los síntomas y alimentos clave del 'query' del usuario]**, existe una posible relación con una condición conocida como **{match.get("condicion_asociada")}**.
198
-
199
- ### ¿Qué podría estar pasando en tu cuerpo?
200
-
201
- *Explica el campo "mecanismo_fisiologico" en términos muy sencillos. Usa una analogía si es posible. Por ejemplo, si es sobre Gota, explica las purinas y los cristales.*
202
-
203
- ### Pasos a Seguir y Recomendaciones
204
-
205
- Aquí te dejo algunas recomendaciones generales que se suelen considerar para esta condición. Es fundamental que las converses con un profesional de la salud:
206
-
207
- * **[Punto 1 de las recomendaciones, reformulado como un consejo práctico]**
208
- * **[Punto 2 de las recomendaciones, enfocado en los exámenes si los hay]**
209
- * **Atención a otros alimentos:** Ten en cuenta que, además de lo que mencionaste, otros alimentos implicados en esta condición son: **[menciona 2-3 ejemplos del campo "compuesto_alimento", sin la lista completa]**.
210
 
211
- ### **IMPORTANTE: Descargo de Responsabilidad**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
 
213
- Este análisis es una herramienta informativa y de orientación basada en inteligencia artificial. **NO es un diagnóstico médico.** La información proporcionada no debe sustituir la consulta, el diagnóstico o el tratamiento de un médico o profesional de la salud cualificado. Consulta siempre a un experto para evaluar tu caso particular.
214
- """
215
  try:
216
  response = model.generate_content(prompt)
217
  return response.text
 
56
 
57
  @st.cache_data
58
  def load_data():
59
+ """
60
+ Carga la base de datos principal y la enriquece con el conocimiento dual.
61
+ """
62
  try:
63
  path_alimentos = os.path.join('DATOS', 'alimentos_enriquecido.json')
64
+ path_dual = os.path.join('DATOS', 'conocimiento_dual.json')
65
 
66
  with open(path_alimentos, 'r', encoding='utf-8') as f:
67
  data_alimentos = json.load(f)
68
 
69
+ # Cargar el conocimiento dual (si existe)
70
+ conocimiento_dual = {}
71
+ if os.path.exists(path_dual):
72
+ with open(path_dual, 'r', encoding='utf-8') as f:
73
+ data_dual = json.load(f)
74
+ # Crear un diccionario para un acceso rápido
75
+ for item in data_dual:
76
+ key = item['condicion_asociada']
77
+ conocimiento_dual[key] = {
78
+ 'efecto_benefico': item.get('efecto_benefico'),
79
+ 'contexto_negativo': item.get('contexto_negativo')
80
+ }
81
+ logger.info(f"✅ Conocimiento dual cargado con {len(conocimiento_dual)} registros.")
82
+
83
+ # Fusionar los datos
84
+ for entry in data_alimentos:
85
+ key = entry['condicion_asociada']
86
+ if key in conocimiento_dual:
87
+ entry['efecto_benefico'] = conocimiento_dual[key]['efecto_benefico']
88
+ entry['contexto_negativo'] = conocimiento_dual[key]['contexto_negativo']
89
+
90
  lista_condiciones = sorted(list(set(item['condicion_asociada'] for item in data_alimentos)))
91
 
92
+ logger.info(f"✅ Base de datos principal enriquecida y fusionada.")
93
  return data_alimentos, lista_condiciones
94
 
95
+ except FileNotFoundError as e:
96
+ st.error(f"❌ Error: No se encontró el archivo '{e.filename}'. Asegúrate de que está en la carpeta 'DATOS'.")
97
  return None, None
98
+ except json.JSONDecodeError as e:
99
+ st.error(f"❌ Error: Un archivo JSON tiene un formato incorrecto: {e}")
100
  return None, None
 
101
  alimentos_data, lista_condiciones = load_data()
102
 
103
  FOOD_TO_COMPOUND_MAP = {
 
199
 
200
  # ... (La función generate_detailed_analysis no cambia) ...
201
  def generate_detailed_analysis(query, match):
202
+ """Genera la explicación final, manejando la información de dualidad si existe."""
203
  if not model: return "Error: El modelo de IA no está disponible."
204
 
205
+ # Construcción del prompt dinámico
206
+ prompt_parts = [
207
+ "Eres un asistente de IA experto en nutrición personalizada. Tu tono es empático, claro y muy educativo. NO actúas como un médico, sino como un guía informativo.",
208
+ f'El usuario ha descrito el siguiente caso: "{query}"',
209
+ f'Tu sistema ha encontrado la siguiente posible conexión:',
210
+ f'- Condición: {match.get("condicion_asociada")}',
211
+ f'- Mecanismo: {match.get("mecanismo_fisiologico")}',
212
+ f'- Recomendaciones: {match.get("recomendaciones_examenes")}',
213
+ f'- Alimentos Implicados: {match.get("compuesto_alimento")}',
214
+
215
+ "\n**Tu Tarea:** Redacta una respuesta excepcional para el usuario usando Markdown. Sigue esta estructura OBLIGATORIAMENTE:",
216
+
217
+ f'### Posible Causa: {match.get("condicion_asociada")}',
218
+ f'Hola. Entiendo que te preocupa lo que sientes. Basado en los síntomas y alimentos que mencionaste, existe una posible relación con una condición conocida como **{match.get("condicion_asociada")}**.',
219
+
220
+ f'### ¿Qué podría estar pasando en tu cuerpo?',
221
+ f'Explica el siguiente mecanismo en términos muy sencillos, usando una analogía si es posible: "{match.get("mecanismo_fisiologico")}"'
222
+ ]
 
 
 
 
 
 
 
 
 
 
223
 
224
+ # --- Lógica para añadir la sección de dualidad ---
225
+ if match.get("efecto_benefico") and match.get("contexto_negativo"):
226
+ prompt_parts.append(
227
+ "\n### El Doble Filo de Estos Alimentos\n"
228
+ f'**Para la mayoría de las personas:** Resume por qué estos alimentos son generalmente buenos, basándote en: "{match.get("efecto_benefico")}"\n'
229
+ f'**Sin embargo, en ciertos contextos:** Explica por qué pueden ser problemáticos para el usuario, basándote en: "{match.get("contexto_negativo")}"'
230
+ )
231
+
232
+ prompt_parts.extend([
233
+ "\n### Pasos a Seguir y Recomendaciones",
234
+ "Aquí te dejo algunas recomendaciones generales. Es fundamental que las converses con un profesional de la salud:",
235
+ f'* **[Punto 1 de las recomendaciones, reformulado como un consejo práctico basado en "{match.get("recomendaciones_examenes")}"]**',
236
+ f'* **[Punto 2 de las recomendaciones, enfocado en los exámenes si los hay, basado en "{match.get("recomendaciones_examenes")}"]**',
237
+ f'* **Atención a otros alimentos:** Ten en cuenta que, además de lo que mencionaste, otros alimentos implicados en esta condición son: **[menciona 2-3 ejemplos del campo "{match.get("compuesto_alimento")}"]**.',
238
+
239
+ "\n### **IMPORTANTE: Descargo de Responsabilidad**",
240
+ "Este análisis es una herramienta informativa y de orientación basada en inteligencia artificial. **NO es un diagnóstico médico.** La información proporcionada no debe sustituir la consulta, el diagnóstico o el tratamiento de un médico o profesional de la salud cualificado. Consulta siempre a un experto para evaluar tu caso particular."
241
+ ])
242
 
243
+ prompt = "\n".join(prompt_parts)
244
+
245
  try:
246
  response = model.generate_content(prompt)
247
  return response.text