diff --git a/README.md b/README.md index 8733912..3f32ef8 100644 --- a/README.md +++ b/README.md @@ -215,111 +215,145 @@ Comentários ajudam o LLM a entender o domínio (descrições de tabelas/colunas ```sql COMMENT ON TABLE DATASET_ED_ADMISSION IS -'Tabela de pacientes do pronto-socorro / ER patients admission table'; + 'Tabela de pacientes que deram entrada no pronto-socorro / ER patients admission table'; COMMENT ON COLUMN DATASET_ED_ADMISSION.subject_id IS -'Patient ID / ID do paciente (unique identifier)'; + 'Patient ID / ID do paciente (unique identifier)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.hadm_id IS -'Hospital admission ID / ID da internação hospitalar (NULL if not admitted)'; + 'Hospital admission ID / ID da internação hospitalar (NULL if not admitted)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.stay_id IS -'ER stay ID / ID da estadia no pronto-socorro'; + 'ER stay ID / ID da estadia no pronto-socorro, ou o mesmo que o ID de internação'; COMMENT ON COLUMN DATASET_ED_ADMISSION.intime IS -'ER entry timestamp / Data-hora de entrada no pronto-socorro (use EXTRACT(MONTH) for month filter)'; + 'ER entry timestamp / Data-hora de entrada no pronto-socorro (use EXTRACT(MONTH) for month filter)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.outtime IS -'ER discharge timestamp / Data-hora de saída do pronto-socorro'; + 'ER discharge timestamp / Data-hora de saída do pronto-socorro'; COMMENT ON COLUMN DATASET_ED_ADMISSION.gender IS -'Gender (M/F) / Sexo (M/F)'; + 'Gender (Male or M/Female or F) / Sexo (Masculino ou M/Feminino ou F)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.race IS -'Race/Ethnicity / Raça ou etnia do paciente'; + 'Race/Ethnicity / Raça ou etnia do paciente'; COMMENT ON COLUMN DATASET_ED_ADMISSION.arrival_transport IS -'Arrival transport mode (ambulance, walk) / Forma de chegada (ambulância, caminhada)'; + 'Arrival transport mode (ambulance, walk) / Forma de chegada (ambulância, caminhada)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.disposition IS -'Disposition after ER (ADMITTED, HOME, etc.) / Destino após atendimento'; + 'Disposition after ER (ADMITTED, HOME, etc.) / Destino após atendimento'; COMMENT ON COLUMN DATASET_ED_ADMISSION.admitted_from_ed IS -'Hospitalized from ER (1=yes, 0=no) / Internado a partir do pronto-socorro'; + 'Hospitalized from ER (1=yes, 0=no) / Internado a partir do pronto-socorro (1=internação/0=Sem internação)'; COMMENT ON COLUMN DATASET_ED_ADMISSION.temperature IS -'Body temperature (Celsius) / Temperatura corporal'; + 'Body temperature (Celsius) / Temperatura corporal'; COMMENT ON COLUMN DATASET_ED_ADMISSION.heartrate IS -'Heart rate (bpm) / Frequência cardíaca'; + 'Heart rate (bpm) / Frequência cardíaca'; COMMENT ON COLUMN DATASET_ED_ADMISSION.resprate IS -'Respiratory rate (breaths/min) / Frequência respiratória'; + 'Respiratory rate (breaths/min) / Frequência respiratória'; COMMENT ON COLUMN DATASET_ED_ADMISSION.o2sat IS -'Oxygen saturation (SpO2) / Saturação de oxigênio'; + 'Oxygen saturation (SpO2) / Saturação de oxigênio'; COMMENT ON COLUMN DATASET_ED_ADMISSION.sbp IS -'Systolic blood pressure / Pressão arterial sistólica'; + 'Systolic blood pressure / Pressão arterial sistólica'; COMMENT ON COLUMN DATASET_ED_ADMISSION.dbp IS -'Diastolic blood pressure / Pressão arterial diastólica'; + 'Diastolic blood pressure / Pressão arterial diastólica'; COMMENT ON COLUMN DATASET_ED_ADMISSION.n_diagnosis IS -'Number of diagnoses / Número de diagnósticos registrados'; + 'Number of diagnoses / Número de diagnósticos registrados'; COMMENT ON COLUMN DATASET_ED_ADMISSION.split IS -'Data split flag (train, val, test) / Particionamento dos dados'; + 'Data split flag (train, val, test) / Particionamento dos dados'; ``` ### 5.6 Criar uma view para NL com nomes claros Esta view, mais amigável, facilitará a LLM do banco de dados a entender mais facilmente os campos. -Vista no schema atual (quando estiver em ADMIN): - -```sql -CREATE OR REPLACE VIEW MEU_USUARIO.NLU_ED_ADMISSION AS -SELECT - subject_id AS patient_id, - hadm_id AS admission_id, - stay_id AS er_stay_id, - intime AS er_entry_time, - outtime AS er_exit_time, - gender, race, arrival_transport, disposition, - admitted_from_ed AS admitted, - temperature, heartrate, resprate, o2sat, sbp, dbp, - n_diagnosis, split, - EXTRACT(MONTH FROM intime) AS month_num, - EXTRACT(YEAR FROM intime) AS year_num -FROM ADMIN.DATASET_ED_ADMISSION; -``` - -E uma view equivalente no schema do usuário (recomendado para consumo pelo app): +Criar uma view no schema do usuário (recomendado para consumo pelo app): ```sql -- execute no MESMO schema usado pelo SELECT AI (ex.: MEU_USUARIO) CREATE OR REPLACE VIEW MEU_USUARIO.NLU_ED_ADMISSION AS SELECT - subject_id AS patient_id, - hadm_id AS admission_id, - stay_id AS er_stay_id, - intime AS er_entry_time, - outtime AS er_exit_time, - gender, race, arrival_transport, disposition, - admitted_from_ed AS admitted, -- 1/0 - temperature, heartrate, resprate, o2sat, sbp, dbp, - n_diagnosis, split, - EXTRACT(MONTH FROM intime) AS month_num, - EXTRACT(YEAR FROM intime) AS year_num + subject_id AS patient_id, -- ID do paciente + hadm_id AS admission_id, -- ID da internação (NULL se não internado) + stay_id AS er_stay_id, -- ID da estadia no PS + intime AS er_entry_time, -- data/hora de entrada no PS + outtime AS er_exit_time, -- data/hora de saída do PS + gender, + race, + arrival_transport, + disposition, -- ADMITTED, HOME, etc. + admitted_from_ed AS admitted, -- 1=internado, 0=não + temperature, + heartrate, + resprate, + o2sat, + sbp, + dbp, + n_diagnosis, + split, + EXTRACT(MONTH FROM intime) AS month_num, -- 1..12 + TO_CHAR(intime, 'fmMonth', 'NLS_DATE_LANGUAGE=PORTUGUESE') as month_name, + EXTRACT(YEAR FROM intime) AS year_num -- ano numérico FROM ADMIN.DATASET_ED_ADMISSION; -COMMENT ON TABLE MEU_USUARIO.NLU_ED_ADMISSION IS 'ER admissions with friendly names for NL queries / Tabela para NL'; -COMMENT ON COLUMN NLU_ED_ADMISSION.patient_id IS 'Patient ID / ID do paciente'; -COMMENT ON COLUMN NLU_ED_ADMISSION.admitted IS 'Hospitalized from ER (1=yes, 0=no) / Internado a partir do PS'; -COMMENT ON COLUMN NLU_ED_ADMISSION.er_entry_time IS 'ER entry timestamp / Entrada no PS'; -COMMENT ON COLUMN NLU_ED_ADMISSION.month_num IS 'Month number (1..12)'; -COMMENT ON COLUMN NLU_ED_ADMISSION.year_num IS 'Year'; +COMMENT ON TABLE MEU_USUARIO.NLU_ED_ADMISSION IS 'Tabela de Internações de pacientes que deram entrada no pronto-socorro com nomes de campos amigaveis para consultas em linguagem natural'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.gender IS + 'Genero (Masculino ou M/Feminino ou F)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.race IS + 'Raça ou etnia do paciente'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.arrival_transport IS + 'Forma de chegada (ambulância, caminhada)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.disposition IS + 'Destino após atendimento (ADMITTED=Internados/Internado, HOME=Dispensados/Dispensado/Sem Internação/Sem Internações, TRANSFER=Transferido/Transferidos)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.temperature IS + 'Temperatura corporal (celsius)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.heartrate IS + 'Frequência cardíaca em BPM'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.resprate IS + 'Frequência respiratória (respiração/minuto)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.o2sat IS + 'Saturação de oxigênio (SpO2)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.sbp IS + 'Pressão arterial sistólica'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.dbp IS + 'Pressão arterial diastólica'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.n_diagnosis IS + 'Número de diagnósticos registrados'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.split IS + 'Particionamento dos dados (train, val, test)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.patient_id IS 'ID do paciente'; +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.admitted IS 'Admitted indica se Paciente foi Internado (1=Internado/0=Não Internado)'; +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.er_entry_time IS 'Data de Entrada no pronto-socorro'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.month_num IS + 'Número do mês da entrada no PS / Mês (1=Janeiro, 2=Fevereiro, 3=Março, 4=Abril, 5=Maio, 6=Junho, 7=Julho, 8=Agosto, 9=Setembro, 10=Outubro, 11=Novembro, 12=Dezembro)'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.month_name IS + 'Nome do mês de entrada do paciente no PS (ex.: Janeiro, Fevereiro, Março, ...). Use para exibição; para filtros, prefira month_num e year_num.'; + +COMMENT ON COLUMN MEU_USUARIO.NLU_ED_ADMISSION.year_num IS 'Ano de Entrada no pronto-socorro'; ``` >**Por que?** Nomes como patient_id, admitted, month_num facilitam a tradução NL→SQL e evitam ambiguidade. @@ -370,9 +404,13 @@ python app_select_ai.py ### Acessando a aplicação Abra `http://localhost:5001` e faça perguntas como: -- “comparar risco de internacao de pacientes” -- “quantos pacientes chegaram no hospital” -- “mostrar pacientes e suas pressoes arteriais acima de 120 80” +- quantos pacientes chegaram no hospital +- mostrar pacientes e suas pressoes arteriais acima de 120 80 +- quantos pacientes deram entrada no hospital no mes "Junho" +- quantos pacientes do genero F +- quantos pacientes do genero M que tenham pressao acima de 120 80 +- listar pacientes do genero M com todos os seus dados de mediçao que tenham pressao acima de 120 80 +- quantos pacientes internados no hospital por genero ### Exportar resultados - **PDF**: botão “Exportar PDF”. diff --git a/files/app_select_ai.py b/files/app_select_ai.py index f3ab155..63350bd 100644 --- a/files/app_select_ai.py +++ b/files/app_select_ai.py @@ -262,7 +262,7 @@ PAGE = """