PROYECTO_2024 / app.py
C2MV's picture
Update app.py
24d616f verified
raw
history blame
24.6 kB
import os
os.system('pip install curl_cffi tqdm bitsandbytes tiktoken g4f pinecone-client pandas datasets sentence-transformers')
# Setup and load your keys
import os
from g4f import ChatCompletion
#from google.colab import userdata
from pinecone import Pinecone
import pandas as pd
from datasets import Dataset
from sentence_transformers import SentenceTransformer
import gradio as gr
model_name = "BAAI/bge-m3"
# Retrieve the Pinecone API key from the user
PINECONE_API_KEY = "3a3e9022-381d-436e-84cb-ba93464d283e" # Use the key you set in the secrets
PINECONE_ENVIRONMENT = "us-east-1" # Use the environment you set in the secrets
# Initialize Pinecone with the API key
pc = Pinecone(api_key=PINECONE_API_KEY)
# Global variables to store the selected model and dimensions
EMBED_MODEL = 'BGE_M3-1024'
DIMENSIONS = 1024
# Confirm selection automatically
print(f"Model selected: {EMBED_MODEL}")
print(f"Dimensions set as: {DIMENSIONS}")
# Function to print current selection (can be used in other cells)
def print_current_selection():
print(f"Currently selected model: {EMBED_MODEL}")
print(f"Dimensions: {DIMENSIONS}")
# Establecer el nombre del índice automáticamente
INDEX_NAME = 'neonatos'
# Obtener la clave API de Pinecone
#PINECONE_API_KEY = userdata.get('PINECONE_API_KEY')
def connect_to_pinecone(index_name):
global INDEX_NAME
try:
pc = Pinecone(api_key=PINECONE_API_KEY)
index = pc.Index(index_name)
# Asegurarse de que la conexión se establezca
index_stats = index.describe_index_stats()
print(f"Successfully connected to Pinecone index '{index_name}'!")
print("Index Stats:", index_stats)
# Actualizar la variable global INDEX_NAME
INDEX_NAME = index_name
print(f"Global INDEX_NAME updated to: {INDEX_NAME}")
except Exception as e:
print(f"Failed to connect to Pinecone index '{index_name}':", str(e))
# Conectar automáticamente al índice "neonatos"
connect_to_pinecone(INDEX_NAME)
# Función para imprimir el nombre del índice actual (puede ser usada en otras celdas)
def print_current_index():
print(f"Current index name: {INDEX_NAME}")
# Verificar si las variables globales necesarias están configuradas
if 'INDEX_NAME' not in globals() or INDEX_NAME is None:
raise ValueError("INDEX_NAME is not set. Please set the index name first.")
if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None:
raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.")
# Inicializar cliente de Pinecone
#PINECONE_API_KEY = userdata.get('PINECONE_API_KEY')
pc = Pinecone(api_key=PINECONE_API_KEY)
# Inicializar el índice de Pinecone
index = pc.Index(INDEX_NAME)
# Obtener la dimensión del índice
index_stats = index.describe_index_stats()
vector_dim = index_stats['dimension']
print(f"Index dimension: {vector_dim}")
# Definir manualmente los campos de contexto y enlace
CONTEXT_FIELDS = ['Tag','Pregunta','Respuesta']
LINK_FIELDS = ['Tag','Respuesta']
# Imprimir confirmación de campos seleccionados
print(f"Context fields set to: {CONTEXT_FIELDS}")
print(f"Link fields set to: {LINK_FIELDS}")
# Función para obtener las selecciones actuales de campos (puede ser usada en otras celdas)
def get_field_selections():
return {
"CONTEXT_FIELDS": CONTEXT_FIELDS,
"LINK_FIELDS": LINK_FIELDS
}
#####################################
# Check if required global variables are set
if 'EMBED_MODEL' not in globals() or EMBED_MODEL is None:
raise ValueError("EMBED_MODEL is not set. Please select an embedding model first.")
if 'INDEX_NAME' not in globals() or INDEX_NAME is None:
raise ValueError("INDEX_NAME is not set. Please create or select an index first.")
if 'CONTEXT_FIELDS' not in globals() or 'LINK_FIELDS' not in globals():
raise ValueError("CONTEXT_FIELDS and LINK_FIELDS are not set. Please run the field selection cell first.")
# Initialize the Sentence-Transformer model
embedding_model = SentenceTransformer(model_name)
# Initialize Pinecone with the API key and connect to the index
pinecone_client = Pinecone(api_key=PINECONE_API_KEY)
index = pinecone_client.Index(INDEX_NAME)
# Constants
LIMIT = 3750
def vector_search(query):
# Generate embedding using Sentence-Transformer model
xq = embedding_model.encode(query)
# Perform vector search on Pinecone index
res = index.query(vector=xq.tolist(), top_k=3, include_metadata=True)
if res['matches']:
return [
{
'content': ' '.join(f"{k}: {v}" for k, v in match['metadata'].items() if k in CONTEXT_FIELDS and k != 'Tag'),
'metadata': match['metadata']
}
for match in res['matches']
if 'metadata' in match
]
return []
def create_prompt(query, contexts):
prompt_start = "\n\nContexto:\n"
prompt_end = f"\n\nPregunta: {query}\nRespuesta:"
current_contexts = "\n\n---\n\n".join([context['content'] for context in contexts])
if len(prompt_start + current_contexts + prompt_end) >= LIMIT:
# Truncate contexts if they exceed the limit
available_space = LIMIT - len(prompt_start) - len(prompt_end)
truncated_contexts = current_contexts[:available_space]
return prompt_start + truncated_contexts + prompt_end
else:
return prompt_start + current_contexts + prompt_end
def complete(prompt):
return [f"Hola"]
def check_image_exists(filepath):
return os.path.exists(filepath)
def chat_function(message, history):
# Perform vector search
search_results = vector_search(message)
# Create prompt with relevant contexts
query_with_contexts = create_prompt(message, search_results)
# Generate response
response = complete(query_with_contexts)
partial_message = response[0].split("\n")[0] # Solo tomar la primera línea de la respuesta
# Handle the logic for processing tags and images internally
relevant_links = [result['metadata'].get(field) for result in search_results for field in LINK_FIELDS if field in result['metadata']]
full_response = partial_message
image_url = None
tags_detected = []
filtered_links = []
if relevant_links:
for link in relevant_links:
if any(tag in link for tag in ["rId101", "rId105", "rId109", "rId113", "rId117",
"rId121", "rId125", "rId129", "rId133", "rId136",
"rId139", "rId142", "rId145", "rId149", "rId153",
"rId157", "rId161", "rId165", "rId169", "rId173",
"rId177", "rId180", "rId184", "rId187", "rId192",
"rId195", "rId40", "rId44", "rId47", "rId50",
"rId53", "rId56", "rId59", "rId63", "rId66",
"rId70", "rId73", "rId76", "rId80", "rId83",
"rId87", "rId90", "rId94", "rId97"]):
tags_detected.append(link) # Save the tag but don't display it
else:
filtered_links.append(link)
# Add the first relevant link under a single "Respuestas relevantes" section
if filtered_links:
full_response += f".\n\nTe detallamos nuestro contenido a continuación:\n" + filtered_links[0]
# Now handle the images based on the detected tags
tags_to_images = {
"rId101": "images/rId101.png",
"rId105": "images/rId105.png",
"rId109": "images/rId109.png",
"rId113": "images/rId113.png",
"rId117": "images/rId117.png",
"rId121": "images/rId121.png",
"rId125": "images/rId125.png",
"rId129": "images/rId129.png",
"rId133": "images/rId133.png",
"rId136": "images/rId136.png",
"rId139": "images/rId139.png",
"rId142": "images/rId142.png",
"rId145": "images/rId145.png",
"rId149": "images/rId149.png",
"rId153": "images/rId153.png",
"rId157": "images/rId157.png",
"rId161": "images/rId161.png",
"rId165": "images/rId165.png",
"rId169": "images/rId169.png",
"rId173": "images/rId173.png",
"rId177": "images/rId177.png",
"rId180": "images/rId180.png",
"rId184": "images/rId184.png",
"rId187": "images/rId187.png",
"rId192": "images/rId192.png",
"rId195": "images/rId195.png",
"rId40": "images/rId40.png",
"rId44": "images/rId44.png",
"rId47": "images/rId47.png",
"rId50": "images/rId50.png",
"rId53": "images/rId53.png",
"rId56": "images/rId56.png",
"rId59": "images/rId59.png",
"rId63": "images/rId63.png",
"rId66": "images/rId66.png",
"rId70": "images/rId70.png",
"rId73": "images/rId73.png",
"rId76": "images/rId76.png",
"rId80": "images/rId80.png",
"rId83": "images/rId83.png",
"rId87": "images/rId87.png",
"rId90": "images/rId90.png",
"rId94": "images/rId94.png",
"rId97": "images/rId97.png",
}
for tag in tags_detected:
for key, path in tags_to_images.items():
if key in tag and check_image_exists(path):
image_url = path
break
return full_response, image_url
def update_image(image_url):
if image_url:
return image_url
else:
return None
# Gradio layout setup
with gr.Blocks() as demo:
with gr.Row():
with gr.Column(scale=1):
# Agregar el video al inicio
video = gr.Video(value="video.mp4", label="Video de Introducción")
chatbot_input = gr.Textbox(label="Tu mensaje")
chatbot_output = gr.Chatbot(label="ChatBot")
chatbot_history = gr.State(value=[])
image_url = gr.State(value=None)
submit_button = gr.Button("Enviar")
# Main accordion for categories
# Main accordion for categories
with gr.Accordion("Categorías de Preguntas", open=True):
# Diagnósticos Accordion
with gr.Accordion("Diagnósticos", open=False):
# Subaccordion for Diagnósticos Comunes
with gr.Accordion("Diagnósticos Comunes", open=False):
button_1 = gr.Button("¿Cuál es el diagnóstico más común en el conjunto de datos?")
button_2 = gr.Button("¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?")
button_3 = gr.Button("¿Cuáles son los diagnósticos más comunes que requieren hospitalización prolongada?")
button_4 = gr.Button("¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?")
button_5 = gr.Button("¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?")
button_6 = gr.Button("¿Cuáles son los diagnósticos menos comunes en el conjunto de datos?")
# Recommendation-oriented question
button_7 = gr.Button("¿Qué mejoras pueden implementarse para reducir la incidencia de diagnósticos comunes?")
# Subaccordion for Diagnósticos Críticos
with gr.Accordion("Diagnósticos Críticos", open=False):
button_8 = gr.Button("¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?")
button_9 = gr.Button("¿Cuál es la tasa de mortalidad asociada a estos diagnósticos graves?")
button_10 = gr.Button("¿Qué porcentaje de neonatos con sepsis requiere cuidados intensivos?")
# Recommendation-oriented question
button_11 = gr.Button("¿Qué medidas preventivas pueden reducir los diagnósticos críticos en neonatos?")
# Subaccordion for Codificación y Clasificación
with gr.Accordion("Codificación y Clasificación", open=False):
button_12 = gr.Button("¿Qué códigos CIE-10 están asociados con infecciones en neonatos?")
button_13 = gr.Button("¿Qué diagnósticos están clasificados bajo el código P00-P96 en neonatos?")
# Recommendation-oriented question
button_14 = gr.Button("¿Cómo puede mejorarse la codificación para identificar con precisión los diagnósticos neonatales?")
# Tratamientos Accordion
with gr.Accordion("Tratamientos", open=False):
# Subaccordion for Medicamentos Comunes
with gr.Accordion("Medicamentos Comunes", open=False):
button_15 = gr.Button("¿Cuáles son los medicamentos más utilizados en neonatos?")
button_16 = gr.Button("¿Cuál es el medicamento más utilizado para infecciones neonatales?")
button_17 = gr.Button("¿Cuáles son los efectos secundarios más comunes de estos medicamentos?")
# Recommendation-oriented question
button_18 = gr.Button("¿Qué mejoras pueden hacerse en la administración de medicamentos para minimizar efectos secundarios en neonatos?")
# Subaccordion for Intervenciones Médicas
with gr.Accordion("Intervenciones Médicas", open=False):
button_19 = gr.Button("¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?")
button_20 = gr.Button("¿Cuáles son las complicaciones más frecuentes durante las intervenciones quirúrgicas en neonatos?")
button_21 = gr.Button("¿Cuál es la tasa de éxito de las intervenciones quirúrgicas en neonatos?")
# Recommendation-oriented question
button_22 = gr.Button("¿Qué mejoras pueden implementarse para reducir las complicaciones durante intervenciones quirúrgicas?")
# Estadísticas y Frecuencia Accordion
with gr.Accordion("Estadísticas y Frecuencia", open=False):
# Subaccordion for Estadísticas Generales
with gr.Accordion("Estadísticas Generales", open=False):
button_23 = gr.Button("¿Qué porcentaje de los registros corresponde al diagnóstico de 'Nacido Vivo Único' (Z370)?")
button_24 = gr.Button("¿Cuál es la distribución por edad gestacional de los neonatos en el conjunto de datos?")
button_25 = gr.Button("¿Cuál es la tasa de readmisión hospitalaria en neonatos?")
# Recommendation-oriented question
button_26 = gr.Button("¿Qué cambios pueden hacerse para reducir la tasa de readmisión hospitalaria en neonatos?")
# Subaccordion for Diferencias Geográficas
with gr.Accordion("Diferencias Geográficas", open=False):
button_27 = gr.Button("¿Cómo varía el acceso a medicamentos entre regiones?")
button_28 = gr.Button("¿Existen diferencias significativas en las tasas de diagnóstico entre diferentes regiones?")
button_29 = gr.Button("¿Cómo varía la mortalidad neonatal entre diferentes departamentos?")
# Recommendation-oriented question
button_30 = gr.Button("¿Qué políticas pueden implementarse para mejorar el acceso a medicamentos en regiones menos desarrolladas?")
# Subaccordion for Análisis Temporal
with gr.Accordion("Análisis Temporal", open=False):
button_31 = gr.Button("¿Existen patrones estacionales en la administración de medicamentos?")
button_32 = gr.Button("¿Cómo han cambiado las tasas de mortalidad neonatal a lo largo de los años?")
button_33 = gr.Button("¿Existen variaciones en la incidencia de diagnósticos críticos a lo largo del año?")
# Recommendation-oriented question
button_34 = gr.Button("¿Qué estrategias pueden implementarse para reducir la mortalidad neonatal en períodos estacionales críticos?")
# Impacto y Calidad de Datos Accordion
with gr.Accordion("Impacto y Calidad de Datos", open=False):
# Subaccordion for Impacto en la Salud Neonatal
with gr.Accordion("Impacto en la Salud Neonatal", open=False):
button_35 = gr.Button("¿Cómo impacta el uso de antibióticos en la recuperación neonatal?")
button_36 = gr.Button("¿Qué mejoras se pueden implementar en la atención neonatal?")
button_37 = gr.Button("¿Cuál es la efectividad de las medidas preventivas en la reducción de infecciones neonatales?")
# Recommendation-oriented question
button_38 = gr.Button("¿Qué nuevas estrategias de prevención pueden implementarse para reducir infecciones neonatales?")
# Subaccordion for Calidad de Datos
with gr.Accordion("Calidad de Datos", open=False):
button_39 = gr.Button("¿Cuáles son las limitaciones de los datos sobre salud neonatal?")
button_40 = gr.Button("¿Qué tan completos y precisos son los registros de diagnóstico?")
button_41 = gr.Button("¿Cómo afecta la calidad de los datos a la investigación y atención neonatal?")
# Recommendation-oriented question
button_42 = gr.Button("¿Qué mejoras pueden implementarse para aumentar la calidad y precisión de los datos neonatales?")
with gr.Column(scale=1):
image_output = gr.Image(label="Imagen asociada")
def process_input(message, history):
full_response, image = chat_function(message, history)
history.append((message, full_response))
return history, history, image
# Function to update chatbot input with preset question
def send_preset_question(question, history):
return process_input(question, history)
# Assign the buttons to send the respective categorized questions
button_assignments = [
(button_1, "¿Cuál es el diagnóstico más común en el conjunto de datos?"),
(button_2, "¿Qué porcentaje del total de registros corresponde al diagnóstico 'Nacido Vivo Único' (Z370)?"),
(button_3, "¿Cuáles son los diagnósticos más comunes que requieren hospitalización prolongada?"),
(button_4, "¿Cuáles son los códigos CIE-10 relacionados con infecciones neonatales?"),
(button_5, "¿Qué tan frecuentes son los diagnósticos relacionados con nacimientos prematuros?"),
(button_6, "¿Cuáles son los diagnósticos menos comunes en el conjunto de datos?"),
(button_7, "¿Qué mejoras pueden implementarse para reducir la incidencia de diagnósticos comunes?"),
(button_8, "¿Cuál es la incidencia de diagnósticos graves como el 'Síndrome de Dificultad Respiratoria' (P220)?"),
(button_9, "¿Cuál es la tasa de mortalidad asociada a estos diagnósticos graves?"),
(button_10, "¿Qué porcentaje de neonatos con sepsis requiere cuidados intensivos?"),
(button_11, "¿Qué medidas preventivas pueden reducir los diagnósticos críticos en neonatos?"),
(button_12, "¿Qué códigos CIE-10 están asociados con infecciones en neonatos?"),
(button_13, "¿Qué diagnósticos están clasificados bajo el código P00-P96 en neonatos?"),
(button_14, "¿Cómo puede mejorarse la codificación para identificar con precisión los diagnósticos neonatales?"),
(button_15, "¿Cuáles son los medicamentos más utilizados en neonatos?"),
(button_16, "¿Cuál es el medicamento más utilizado para infecciones neonatales?"),
(button_17, "¿Cuáles son los efectos secundarios más comunes de estos medicamentos?"),
(button_18, "¿Qué mejoras pueden hacerse en la administración de medicamentos para minimizar efectos secundarios en neonatos?"),
(button_19, "¿Cuál es la proporción de diagnósticos que requieren intervención quirúrgica?"),
(button_20, "¿Cuáles son las complicaciones más frecuentes durante las intervenciones quirúrgicas en neonatos?"),
(button_21, "¿Cuál es la tasa de éxito de las intervenciones quirúrgicas en neonatos?"),
(button_22, "¿Qué mejoras pueden implementarse para reducir las complicaciones durante intervenciones quirúrgicas?"),
(button_23, "¿Qué porcentaje de los registros corresponde al diagnóstico de 'Nacido Vivo Único' (Z370)?"),
(button_24, "¿Cuál es la distribución por edad gestacional de los neonatos en el conjunto de datos?"),
(button_25, "¿Cuál es la tasa de readmisión hospitalaria en neonatos?"),
(button_26, "¿Qué cambios pueden hacerse para reducir la tasa de readmisión hospitalaria en neonatos?"),
(button_27, "¿Cómo varía el acceso a medicamentos entre regiones?"),
(button_28, "¿Existen diferencias significativas en las tasas de diagnóstico entre diferentes regiones?"),
(button_29, "¿Cómo varía la mortalidad neonatal entre diferentes departamentos?"),
(button_30, "¿Qué políticas pueden implementarse para mejorar el acceso a medicamentos en regiones menos desarrolladas?"),
(button_31, "¿Existen patrones estacionales en la administración de medicamentos?"),
(button_32, "¿Cómo han cambiado las tasas de mortalidad neonatal a lo largo de los años?"),
(button_33, "¿Existen variaciones en la incidencia de diagnósticos críticos a lo largo del año?"),
(button_34, "¿Qué estrategias pueden implementarse para reducir la mortalidad neonatal en períodos estacionales críticos?"),
(button_35, "¿Cómo impacta el uso de antibióticos en la recuperación neonatal?"),
(button_36, "¿Qué mejoras se pueden implementar en la atención neonatal?"),
(button_37, "¿Cuál es la efectividad de las medidas preventivas en la reducción de infecciones neonatales?"),
(button_38, "¿Qué nuevas estrategias de prevención pueden implementarse para reducir infecciones neonatales?"),
(button_39, "¿Cuáles son las limitaciones de los datos sobre salud neonatal?"),
(button_40, "¿Qué tan completos y precisos son los registros de diagnóstico?"),
(button_41, "¿Cómo afecta la calidad de los datos a la investigación y atención neonatal?"),
(button_42, "¿Qué mejoras pueden implementarse para aumentar la calidad y precisión de los datos neonatales?")
]
for button, question in button_assignments:
button.click(send_preset_question, inputs=[gr.State(value=question), chatbot_history], outputs=[chatbot_output, chatbot_history, image_url])
submit_button.click(process_input, inputs=[chatbot_input, chatbot_history], outputs=[chatbot_output, chatbot_history, image_url])
image_url.change(fn=update_image, inputs=image_url, outputs=image_output)
# Launch the interface
demo.launch(debug=True)