ChatRAG2 / app.py
SorenMad's picture
Upload 4 files
8d3c4bf verified
import gradio as gr
from rag_engine import recuperar_documentos, generar_respuesta
def ask(query, top_k, umbral):
"""
Función principal que procesa la consulta del usuario y retorna la respuesta y documentos.
Args:
query (str): La pregunta del usuario
top_k (int): Número de documentos a recuperar
umbral (float): Umbral de similitud
Returns:
tuple: (respuesta, docs_formateados)
"""
if not query or query.strip() == "":
return "Por favor, ingresa una pregunta.", ""
try:
# Recuperar documentos relevantes
documentos_recuperados = recuperar_documentos(query, top_k=int(top_k), umbral=float(umbral))
# Generar respuesta usando el modelo de lenguaje
respuesta = generar_respuesta(query, documentos_recuperados)
# Formatear documentos recuperados para mostrarlos de forma legible
if documentos_recuperados:
docs_formateados = "\n\n---\n\n".join(documentos_recuperados)
else:
docs_formateados = "No se encontraron documentos relevantes con el umbral especificado."
return respuesta, docs_formateados
except Exception as e:
return f"Error al procesar la consulta: {str(e)}", ""
# Crear la interfaz Gradio
with gr.Blocks(title="Chat RAG") as demo:
# Título y descripción
gr.Markdown(
"""
# Chat RAG
Este sistema utiliza RAG para responder preguntas sobre información hospitalaria.
El sistema recupera documentos relevantes y genera respuestas basadas únicamente en el contexto proporcionado.
**Instrucciones:** Escribe tu pregunta en inglés, ajusta los parámetros si lo deseas, y haz clic en "Enviar".
"""
)
with gr.Row():
with gr.Column():
# Input: Pregunta del usuario
query_input = gr.Textbox(
label="Pregunta",
placeholder="Ejemplo: What is the hospital email?",
lines=2
)
# Input: Slider para top_k
top_k_slider = gr.Slider(
minimum=1,
maximum=5,
value=1,
step=1,
label="Top K - documentos"
)
# Input: Slider para umbral
umbral_slider = gr.Slider(
minimum=0.0,
maximum=1.0,
value=0.55,
step=0.05,
label="Umbral de similitud"
)
# Botón Enviar
submit_btn = gr.Button("Enviar", variant="primary")
with gr.Column():
# Output: Respuesta generada
respuesta_output = gr.Textbox(
label="Respuesta",
lines=3,
interactive=False
)
# Output: Documentos recuperados
docs_output = gr.Textbox(
label="Documentos recuperados",
lines=6,
max_lines=15,
interactive=False
)
# Conectar el botón con la función ask
submit_btn.click(
fn=ask,
inputs=[query_input, top_k_slider, umbral_slider],
outputs=[respuesta_output, docs_output]
)
# Lanzar la interfaz
if __name__ == "__main__":
demo.launch()