Artefacto 2 de 6 · Mes 2 Desplegado · Cloud Run

Una memoria que sabe cuándo callar.

Un RAG sobre un corpus personal que responde citando el fragmento real y su página — y que dice «no guardo ese recuerdo» en vez de inventar cuando la pregunta cae fuera. Desplegado en producción con FastAPI, Docker y Cloud Run. Segundo artefacto de la ruta Data Science → AI Engineering.

3bandas de confianza
0 €coste de decir «no sé»
4capas desacopladas
1token para preguntar

La idea

Recuperar el momento, no resumir un libro

No es un buscador ni una enciclopedia: es recuperación episódica. Ante una pregunta, encuentra los momentos reales del corpus que más se le parecen por significado, y solo entonces redacta una respuesta anclada a esos momentos, citando de qué pasaje y página sale cada cosa.

Pregunta lenguaje natural se convierte en vector
→
Retrieval coseno los momentos más cercanos
→
Umbral ¿hay recuerdo? la sonda decide antes del LLM
→
Síntesis LLM con fuentes respuesta + citas
Definición de «hecho» Una pregunta devuelve respuesta apoyada en fragmentos reales con la fuente citada, servida desde una URL pública. No vive en un notebook.
El instrumento

La sonda mide antes de navegar

Antes de llamar al modelo, el sistema mide cuánto se parece la mejor coincidencia. Si no alcanza, no llama al LLM: ni inventa una cercanía que no existe, ni gasta una petición. Elige una pregunta y mira dónde cae la aguja.

Similitud del mejor momento · tramo 0,20 – 0,70
sin recuerdo < 0,43 vecindario 0,43 – 0,45 recuerdo claro ≥ 0,45
{ "consulta": "¿qué ropa me pongo para una boda?" }

{ "banda":     "lejano",     # ○ 0,262 < 0,43
  "respuesta": null,         # «no guardo ese recuerdo»
  "fuentes":   [],
  "cercanos":  [ # lo más próximo, no concluyente ] }

0 llamadas al LLM El umbral cortó antes del modelo: ni invención ni gasto. La honestidad es una característica del diseño, no un accidente — y además sale gratis.

El umbral tiene historia, y no la escribí yo a ojo. Las fronteras vivían en 0,40 hasta que el harness del Artefacto 3 cazó un falso positivo: contenido ausente del corpus colándose en «posible» con similitud 0,421. Subir el listón a 0,43 llevó la métrica de decisión del 86 % al 100 %, con cero regresiones en el golden set. El instrumento calibró al instrumento — con su caveat honesto anotado en el código: n pequeño, vigilar.

De script a servicio

Cuatro capas y una caja en la nube

El sistema está desacoplado en capas que solo se hablan por un contrato (un JSON). Cambiar la cara no toca el motor; cambiar el modelo no toca la web.

motor rag_core.py — retrieval + umbral + síntesis. Carga el índice una sola vez. Devuelve un dict, no imprime.
API FastAPI + uvicorn — /preguntar protegido por token, /salud para el orquestador. Motor cargado en el lifespan.
cara frontend estático — chat que hace fetch y pinta el JSON: banda, respuesta y fuentes.
caja Docker → Cloud Run — imagen mínima construida en la nube (Cloud Build), serverless con escala a cero, claves en Secret Manager.
Privacidad por diseño

Un corpus personal, protegido por capas

El corpus es material personal, así que la privacidad no se deja al azar: el repositorio público no contiene ni el corpus ni los vectores (un .gitignore los blinda), la imagen vive en un registro privado, las claves se inyectan desde Secret Manager —nunca en el código— y la consulta exige token.

Demo real, acceso por token. La URL está viva y abierta para cargar la web, pero preguntar al corpus requiere un token que se comparte de forma selectiva. Así se puede enseñar el sistema funcionando sin abrir el contenido personal a cualquiera.

Lo que se entregó

Los tres criterios, cumplidos

Respuestas ancladas a fragmentos reales, con fuente citadaCada afirmación trae [#momento · página]; si no puedes ver de dónde sale, no cuenta.
No alucina: el umbral manda antes que el LLMSin recuerdo claro → lo dice y no gasta el modelo. Verificado con prueba ciega, y recalibrado por el harness del Artefacto 3.
Desplegado en producción con URL públicaFastAPI + Docker + Cloud Run serverless; secretos gestionados; verificado de punta a punta.
Python · NumPy OpenAI embeddings gpt-4o-mini síntesis FastAPI + uvicorn Docker Cloud Run serverless Secret Manager Cloud Build + Artifact Registry
Por qué este artefacto importa

Un RAG fácil contesta siempre; uno bueno sabe cuándo callar. Poner el umbral antes del modelo convierte «no alucinar» en una decisión de ingeniería — y eso, además, no cuesta dinero.