Adjustments

This commit is contained in:
2025-08-23 18:12:49 -03:00
parent b6d93b6541
commit 7e9207db22
2 changed files with 98 additions and 60 deletions

156
README.md
View File

@@ -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”.

View File

@@ -262,7 +262,7 @@ PAGE = """
<div class="footer">
<form class="ask" method="post" onsubmit="markScrollToBottom()">
<input type="text" name="frase" placeholder="Faça sua pergunta… (Enter para enviar)" required>
<input type="text" name="tabela" value="{{ default_table }}">
<input type="text" name="tabela" value="{{ default_table }}" style="display:none;">
<button type="submit">Enviar</button>
</form>
<div class="muted" style="margin-top:6px">Dica: cite colunas (ex.: <code>admitted</code>, <code>month_num</code>, <code>year_num</code>) para respostas mais precisas.</div>