File size: 3,439 Bytes
8d3c4bf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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()