Uma_audit_demo / app.py
Americo's picture
Update app.py
0f0f6fa verified
import gradio as gr
from openai import OpenAI
import google.generativeai as genai
import os
client = OpenAI(api_key = os.environ["openai"])
# Configure key
genai.configure(api_key=os.environ["gemini"])
conf = genai.types.GenerationConfig(
temperature= 0.0,
)
safety_settings = [
{
"category": "HARM_CATEGORY_DANGEROUS",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_HARASSMENT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_HATE_SPEECH",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_SEXUALLY_EXPLICIT",
"threshold": "BLOCK_NONE",
},
{
"category": "HARM_CATEGORY_DANGEROUS_CONTENT",
"threshold": "BLOCK_NONE",
},
]
def gemini_pro(text):
model = genai.GenerativeModel('gemini-1.5-pro', generation_config=conf,safety_settings=safety_settings)
response = model.generate_content(f"""Eres un asistente que asiste en auditar una consulta m茅dica de telemedicina. Eval煤a los siguientes puntos:
- Calidad de la epicrisis
- Si el diagn贸stico final es acorde a la epriciris
- Si el tratamiento fue acorde a la interpretaci贸n
- Si el reposo (en caso de existir) fue correctamente indicado
- Si la duraci贸n de la consulta fue acorde (mayor a 3 minutos)
- En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagn贸stico, tanto en tipo de medicamento como en d贸sis. Si no se prescribi贸 ning煤n medicamento y no correspond铆a prescribirlo la evaluaci贸n debe ser positiva.
Con toda la evaluaci贸n genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atenci贸n en general.
La puntuaci贸n debe ir de 0 a 10. 0 es un atenci贸n de muy mala calidad y 10 es una atenci贸n de calidad excelente.
El json debe tener 煤nicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'.
No agregar keys distintas a las mencionadas.
Con la consulta: ```{text}```""")
return response.text.replace('```json','').replace('```','')
def gemini_flash(text):
model = genai.GenerativeModel('gemini-1.5-flash', generation_config=conf,safety_settings=safety_settings)
response = model.generate_content(f"""Eres un asistente que asiste en auditar una consulta m茅dica de telemedicina. Eval煤a los siguientes puntos:
- Calidad de la epicrisis
- Si el diagn贸stico final es acorde a la epriciris
- Si el tratamiento fue acorde a la interpretaci贸n
- Si el reposo (en caso de existir) fue correctamente indicado
- Si la duraci贸n de la consulta fue acorde (mayor a 3 minutos)
- En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagn贸stico, tanto en tipo de medicamento como en d贸sis. Si no se prescribi贸 ning煤n medicamento y no correspond铆a prescribirlo la evaluaci贸n debe ser positiva.
Con toda la evaluaci贸n genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atenci贸n en general.
La puntuaci贸n debe ir de 0 a 10. 0 es un atenci贸n de muy mala calidad y 10 es una atenci贸n de calidad excelente.
El json debe tener 煤nicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'.
No agregar keys distintas a las mencionadas.
Con la consulta: ```{text}```""")
return response.text.replace('```json','').replace('```','')
def process_selection(text, model):
# Selecci贸n del modelo seg煤n la opci贸n escogida
if model == "GPT-4o":
resumen = chatgpt_response(text)
elif model == "Gemini Pro":
resumen = gemini_pro(text)
elif model == "Gemini Flash":
resumen = gemini_flash(text)
print("RESUMEN",resumen)
# Eval煤a el string JSON a un diccionario de Python
resumen = eval(resumen)
# Manejar claves faltantes proporcionando valores predeterminados
calidad_epicrisis = resumen.get('Calidad_epicrisis', 'No disponible')
diagnostico_corresponde_epicrisis = resumen.get('Diagnostico_corresponde_epicrisis', 'No disponible')
tratamiento_acorde_interpretacion = resumen.get('Tratamiento_acorde_interpretacion', 'No disponible')
reposo_correctamente_indicado = resumen.get('Reposo_correctamente_indicado', 'No disponible')
duracion_consulta_acorde = resumen.get('Duracion_consulta_acorde', 'No disponible')
medicamento_correctamente_administrado = resumen.get('Medicamento_correctamente_administrado', 'No disponible')
puntaje_final = resumen.get('Puntaje_Final', 'No disponible')
comentarios = resumen.get('Comentarios', 'No disponible')
# Formatear la salida
return f"""## Evaluaci贸n de la consulta m茅dica:
- **Calidad de la Epicrisis:** {calidad_epicrisis}
- **Diagn贸stico corresponde a la Epicrisis:** {diagnostico_corresponde_epicrisis}
- **Tratamiento acorde a la Interpretaci贸n:** {tratamiento_acorde_interpretacion}
- **Reposo correctamente indicado:** {reposo_correctamente_indicado}
- **Duraci贸n de la consulta acorde:** {duracion_consulta_acorde}
- **Medicamento correctamente administrado:** {medicamento_correctamente_administrado}
### Puntaje final:
- **Puntaje (0-10):** {puntaje_final}
### Comentarios:
{comentarios}
"""
def chatgpt_response(text):
response = client.chat.completions.create(
model="gpt-4o", response_format={ "type": "json_object" },
messages=[
{"role": "system", "content": """
Eres un asistente que asiste en auditar una consulta m茅dica de telemedicina. Eval煤a los siguientes puntos:
- Calidad de la epicrisis
- Si el diagn贸stico final es acorde a la epriciris
- Si el tratamiento fue acorde a la interpretaci贸n
- Si el reposo (en caso de existir) fue correctamente indicado
- Si la duraci贸n de la consulta fue acorde (mayor a 3 minutos)
- En caso de que se haya prescripto un medicamento, evaluar si el medicamento prescripto es acorde al diagn贸stico, tanto en tipo de medicamento como en d贸sis. Si no se prescribi贸 ning煤n medicamento y no correspond铆a prescribirlo la evaluaci贸n debe ser positiva.
Con toda la evaluaci贸n genera un json con los puntajes para cada punto, el puntaje final (promedio de los puntajes para cada punto, debe ir de 1 a 10) y comentarios para la atenci贸n en general.
La puntuaci贸n debe ir de 0 a 10. 0 es un atenci贸n de muy mala calidad y 10 es una atenci贸n de calidad excelente.
El json debe tener 煤nicamente la siguientes keys: 'Calidad_epicrisis','Diagnostico_corresponde_epicrisis','Tratamiento_acorde_interpretacion','Reposo_correctamente_indicado','Duracion_consulta_acorde', 'Medicamento_correctamente_administrado', 'Puntaje_Final', 'Comentarios'.
No agregar keys distintas a las mencionadas.
"""},
{"role": "user", "content": text}
]
)
return response.choices[0].message.content.replace('```json','').replace('```','')
examples = [
["""Epicrisis: Consulta por anemia. Antecedentes de obesidad, HTA, inicio anticonceptivos y a los pocos d铆as las dejo de tomar por hemorragia. Reinicio y volvi贸 a tener sangrado abundante. Tuvo s铆ntomas de taquicardia. Tiene control con medico de cabecera la semana entrante.
Diagnostico: Consulta por anemia.
Tratamiento: Se recomienda iniciar suplementos de hierro oral (sulfato ferroso) para tratar la anemia ferrop茅nica. Si el sangrado est谩 relacionado con el uso de anticonceptivos, se sugiere su suspensi贸n y una consulta con un ginec贸logo para evaluar alternativas de manejo del sangrado.
Reposo: 48 horas.
Duraci贸n: 300 segundos.
Medicamento: sulfato ferroso .""", "GPT-4o"],
["""Epicrisis: Consulta por hipertensi贸n arterial. Paciente presenta antecedentes familiares de HTA y refiere episodios de cefalea, mareos y visi贸n borrosa. Se realiza medici贸n de presi贸n arterial y se encuentra elevada en varias ocasiones. Se program贸 control en 1 mes con an谩lisis de laboratorio.
Diagn贸stico: Hipertensi贸n arterial.
Tratamiento: Se recomienda iniciar tratamiento antihipertensivo con lisinopril 10 mg una vez al d铆a. Se aconseja llevar un registro diario de la presi贸n arterial y realizar cambios en el estilo de vida, como una dieta baja en sodio y aumento de actividad f铆sica.
Reposo: Reposo relativo seg煤n la tolerancia.
Duraci贸n: 360 segundos.
Medicamento: lisinopril.""", "Gemini Pro"],
["""Epicrisis: Consulta por dolor tor谩cico. Paciente refiere dolor en el pecho de inicio s煤bito, con irradiaci贸n a brazo izquierdo. Refiere antecedentes de ansiedad y estr茅s, pero no ha sido evaluado por un m茅dico. Se le pregunta sobre s铆ntomas asociados y menciona que ha tenido palpitaciones. El m茅dico realiza una evaluaci贸n superficial sin solicitar estudios complementarios y no considera la historia cl铆nica previa.
Diagn贸stico: Dolor tor谩cico no diagnosticado.
Tratamiento: No se prescribe tratamiento ni se recomienda seguimiento. El paciente es dado de alta con una recomendaci贸n gen茅rica de "descansar" y volver si los s铆ntomas persisten.
Reposo: No se indica reposo espec铆fico.
Duraci贸n: 100 segundos.
Medicamento: Ninguno.""", "Gemini Flash"]
]
iface = gr.Interface(
fn=process_selection,
inputs=[gr.Textbox(label="Descripci贸n de la consulta"),gr.Dropdown(choices=['GPT-4o','Gemini Pro', 'Gemini Flash'], label="Modelo")],
outputs="markdown",
examples=examples,
title="馃攳 AI HealthAudit 馃┖"
)
iface.launch(debug=True)