Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
|
@@ -56,25 +56,48 @@ model = get_gemini_model()
|
|
| 56 |
|
| 57 |
@st.cache_data
|
| 58 |
def load_data():
|
| 59 |
-
"""
|
|
|
|
|
|
|
| 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
|
| 69 |
return data_alimentos, lista_condiciones
|
| 70 |
|
| 71 |
-
except FileNotFoundError:
|
| 72 |
-
st.error("❌ Error: No se encontró el archivo '
|
| 73 |
return None, None
|
| 74 |
-
except json.JSONDecodeError:
|
| 75 |
-
st.error("❌ Error:
|
| 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
|
| 180 |
if not model: return "Error: El modelo de IA no está disponible."
|
| 181 |
|
| 182 |
-
|
| 183 |
-
|
| 184 |
-
|
| 185 |
-
|
| 186 |
-
|
| 187 |
-
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
|
| 191 |
-
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
| 196 |
-
|
| 197 |
-
|
| 198 |
-
|
| 199 |
-
|
| 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 |
-
#
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 212 |
|
| 213 |
-
|
| 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
|