Una app que recibe un texto normal y lo devuelve hablado como Perico Delgado. Por qué rechazamos el atajo del few-shot y construimos un corpus propio con un pipeline RAG de verdad.
Leer la etapaConstruir desde cero un traductor que pasa cualquier texto al estilo de Perico Delgado. Scraping real, corpus propio y un pipeline RAG que funciona — nada de few-shot y a correr.
00 Qué construimos y por qué así
Saber programar en algún lenguaje. Cuál da igual: aquí no se da por supuesto nada de Python. El intérprete, el entorno virtual, los paquetes y la sintaxis que va apareciendo se explican sobre la marcha, empezando por cero en la etapa 1.
Donde una comparación ayuda, está hecha con JavaScript, por ser la referencia más compartida. Si no lo conoces, sáltatela: cada explicación se sostiene sin ella.
Una app que recibe un texto normal y lo devuelve hablado como Perico Delgado. Por qué rechazamos el atajo del few-shot y construimos un corpus propio con un pipeline RAG de verdad.
Leer la etapaPython instala los paquetes en un sitio que sorprende a casi todo el mundo la primera vez, y conviene entenderlo antes de instalar nada.
Leer la etapaCasi no hay código en esta etapa, y aun así es donde se decide el resultado. En un proyecto RAG el corpus es el producto.
Leer la etapaEn la etapa anterior comprobamos que los subtítulos de YouTube existen y se bajan. Eso responde a «¿se puede?». Falta la pregunta que decide si el proyecto sale bien: ¿cuánto material hay realmente? Y, con ese número delante, si merece la pena ir a buscar más.
Leer la etapaVamos a extraer un hilo de foro entero: 137 mensajes repartidos en varias páginas, guardados en un fichero que el resto del pipeline pueda leer.
Leer la etapaEl inventario dejó dos agujeros. Uno evidente: 33 vídeos sin subtítulos automáticos, 17,3 horas de material invisible. Y otro que solo apareció al medir la calidad de lo que ya teníamos.
Leer la etapaEl scraper dejó 137 mensajes de foro. Dentro de esos mensajes hay frases de Perico, pero mezcladas con la conversación de los usuarios. Toca separarlas.
Leer la etapaQuedan 63 candidatas y ninguna regla las separa. Toca pedirle criterio a un modelo.
Leer la etapaUna entrevista de 117 minutos transcrita en 1.737 palabras, casi todas la misma frase. Whisper no falla con un error: cuando no tiene nada que transcribir se inventa algo plausible y lo repite. Encontrarlo, diagnosticarlo, y medir cuánto corpus se había llevado por delante.
Leer la etapaCuánto cuesta ejecutar un pipeline así — y qué parte del coste real no sale en la factura. Por qué el modelo caro rindió peor que el barato en la única medición que hicimos, y cuál es la decisión que más ahorra, que no es elegir modelo.
Leer la etapaUn barrido de 3.500 peticiones, seis horas de transcripción y una segmentación de 400.000 palabras tienen el mismo problema: corren durante horas contra máquinas que no son tuyas y se van a cortar. Cómo escribirlos para que eso no importe.
Leer la etapaLas transcripciones son un chorro de texto donde hablan varios y nadie va etiquetado. Este paso decide de una vez dónde empieza y acaba cada frase, si es suya, y si merece la pena guardarla. Es el que fija el tamaño real del corpus.
Leer la etapaConvertir 3.531 frases en vectores, meterlas en Postgres y —antes de construir nada encima— comprobar con dos medidas gratuitas que la recuperación funciona de verdad.
Leer la etapaJuntarlo todo: embeber la petición, recuperar por similitud, montar el prompt y generar. La primera salida real de la app, y las sesenta líneas que unen dos mitades que ya estaban construidas y medidas.
Leer la etapaCómo se mide algo que no tiene respuesta correcta. La escalera que subió este proyecto para contestar a su pregunta de fondo — si la recuperación se gana su sitio —, por qué el peldaño intermedio, un juez a ciegas, no zanjó nada, y qué medida objetiva sí lo hizo.
Leer la etapaRETRIEVE_N = 12 parecía configuración y era el experimento entero: comparaba doce frases recuperadas contra cincuenta de núcleo y a eso lo llamaba «¿aporta el RAG?». Seis configuraciones barriendo los dos lados, y lo que sale cuando la comparación por fin es justa.
Sacar el pipeline del script de terminal donde vivía, partirlo en piezas reutilizables y montar encima una API que traduce en streaming y una interfaz que la consume. La parte más convencional del proyecto, con dos trampas nada convencionales: un refactor que no podía cambiar ni un byte del prompt y una herramienta de pruebas que decía que el streaming no funcionaba.
Leer la etapaAbrir la app al público es decidir cuánto estás dispuesto a perder. El modelo «local» hospedado resulta ser la opción más cara, cambiar de modelo a estas alturas resulta ser un error, y el tope de gasto que de verdad protege es un acantilado: corta en seco y no vuelve hasta el mes siguiente. Tres techos, de fuera adentro, para no llegar nunca a él.
Leer la etapaUn fallo traído por el dueño del proyecto —«me la devuelve en tercera persona y sin ninguna gracia»— resulta ser dos fallos, con dos causas distintas y una raíz común: el prompt se contradecía a sí mismo. Y de los tres cambios que se probaron para arreglarlo, uno hubo que retirarlo porque los números dijeron que empeoraba.
Leer la etapaUna tarde mirando los cimientos en vez de la fachada. Aparecen cuatro expresiones que Perico no ha dicho nunca y que el clasificador llevaba meses dando por suyas, una etiqueta que no clasificaba nada pero decidía el 42 % del núcleo, y un fichero que la aplicación usa en cada petición y que ningún código sabía reconstruir.
Leer la etapaTres commits en nueve minutos, los tres etiquetados «fix», los tres revertidos un minuto después del último. La misma tarea, repetida con un método distinto, sale bien en siete. Lo que cambia no es el código: es quién mira antes de que algo llegue a producción.
Leer la etapa