--- title: RAGHospital emoji: 🏥 colorFrom: purple colorTo: indigo sdk: gradio app_file: app.py pinned: false sdk_version: 6.10.0 --- # RAG Q&A (Práctica Final RA3) **Autor:** Maxime Pol Marcet. Soy **Maxime Pol Marcet**, y asumo la **autoría íntegra** de este repositorio: código fuente, interfaz Gradio, motor RAG, configuración, dependencias, pruebas y esta documentación. Lo he redactado yo mismo para que cualquiera pueda instalar, ejecutar y validar el sistema sin adivinar; los comentarios en los archivos `.py` recogen en primera persona las decisiones técnicas y su motivación. Este README resume el proyecto según el enunciado (**MOPT DAW2**): instalación, ejecución, interfaz **Gradio** con función `ask` y API **`/ask`**, y prueba con `gradio_client`. ## Descripción del proyecto Sistema de **preguntas y respuestas** basado en **Retrieval-Augmented Generation (RAG)**. Recupera pasajes de `documents.json` (base de conocimiento en **inglés**) mediante embeddings (`MongoDB/mdbr-leaf-ir`) y genera la respuesta con un modelo causal (`PleIAs/Pleias-RAG-350M`). La interfaz es **Gradio** (`app.py`) y cumple **MOPT DAW2**: `gr.Blocks` con título y descripción en markdown, **un** `gr.Textbox` de pregunta con **placeholder**, **dos** `gr.Slider` para **top_k** (1–5, defecto 5, paso 1) y **umbral** (0,0–1,0, defecto 0,55, paso 0,05), `gr.Textbox` de respuesta (3 líneas) y de documentos recuperados (6 líneas, máx. 15), botón **Enviar** ligado a `ask`, y arranque con **`demo.launch()`** (en este repo con `server_port=7860` y tema/CSS propios: **solo afecta al aspecto**, no a esos requisitos). La función `ask` queda expuesta como API HTTP (ruta típica **`/ask`**). Despliegue posible en **Hugging Face Space** (SDK Gradio). Los textos de la interfaz pueden estar en **español**; el **prompt** y los **documentos** de ejemplo están en **inglés**. Los valores por defecto de **Top-K** (5) y **umbral** (0,55) están en **`config.py`**. ## Requisitos - Python 3.10+ recomendado - Conexión a Internet la primera vez (descarga de modelos desde Hugging Face) - RAM suficiente para cargar el modelo de embeddings y el LM (varios GB en CPU) ## Instalación ```bash python -m venv .venv # Windows: .venv\Scripts\activate # Linux/macOS: # source .venv/bin/activate pip install -r requirements.txt ``` ## Ejecución local Desde la raíz del proyecto: ```bash python app.py ``` Abre el navegador en la URL que indique la consola (por defecto `http://127.0.0.1:7860`). La app finaliza con **`demo.launch()`** (MOPT DAW2); en este proyecto se fija **`server_port=7860`** para desarrollo local. Escribe una pregunta en **inglés**, ajusta **Top-K** y **Umbral**, y pulsa **Enviar**. ## Prueba de la API con `gradio_client` Con la aplicación en marcha, puedes llamar al endpoint expuesto por la función `ask` (ruta API típica: `/ask`). La función devuelve **`(respuesta, docs_formateados)`**: la respuesta generada por el modelo y una cadena con los documentos recuperados; si hay varios pasajes, en `app.py` se unen con saltos y el separador `---` (`\n\n---\n\n`), coherente con el enunciado de la práctica. Si `query` va vacía o solo espacios, `ask` devuelve un aviso en la primera cadena y deja vacía la de documentos (no invoca al motor RAG). Variables de entorno opcionales: - `GRADIO_API_URL`: URL base del servidor Gradio (por defecto `http://127.0.0.1:7860`). - `HF_SPACE`: si está definido (p. ej. `usuario/mi-space-rag`), el script de prueba usará ese Space en lugar de la URL local. Ejemplo mínimo en Python (ejecutado desde la raíz del proyecto, para poder importar `config`): ```python from gradio_client import Client from config import DEFAULT_TOP_K, DEFAULT_UMBRAL client = Client("http://127.0.0.1:7860") result = client.predict( query="Where is the hospital located?", top_k=DEFAULT_TOP_K, umbral=DEFAULT_UMBRAL, api_name="/ask", ) answer, retrieved_docs = result[0], result[1] print("Answer:", answer) print("Documents:\n", retrieved_docs) ``` También puedes ejecutar el script incluido: ```bash python tests/test_api.py ``` ## Despliegue en Hugging Face Spaces 1. Crea una cuenta en [Hugging Face](https://huggingface.co/) y un **Space** nuevo con SDK **Gradio**. 2. Sube a la raíz del Space: `app.py`, `config.py`, `rag_engine.py`, `documents.json`, `requirements.txt` y este `README.md`. 3. Espera a que termine el build y revisa los **Logs** si falla (memoria insuficiente: prueba un plan con más RAM en la configuración del Space). 4. Prueba la app en la pestaña del Space y, desde tu máquina, define `HF_SPACE=tu_usuario/tu_space` al ejecutar `tests/test_api.py` para validar la API remota. ## Estructura del proyecto ``` ├── app.py ├── config.py ├── rag_engine.py ├── documents.json ├── requirements.txt ├── README.md ├── .vscode/ (opcional, ajustes del editor) ├── .cursor/ (opcional, ajustes de Cursor) └── tests/ └── test_api.py ```