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)