Casi no hay código aquí, y aun así es donde se decide el resultado. En un proyecto RAG, el corpus es el producto: un pipeline impecable sobre un corpus pobre da una app que repite las mismas cuatro frases y aburre a la segunda visita.
La regla: averigua cuánto material hay antes de construir nada. Es media hora que te ahorra rehacer el proyecto entero.
Primer instinto, y por qué falla
Lo natural es buscar páginas de citas — «las mejores frases de X». Existen, se scrapean fácil, y tienen un techo bajísimo: entre 30 y 100 frases cada una, y se copian entre sí. Todas juntas no pasan de unos cientos, la mayoría duplicados.
Dónde está el volumen de verdad
En los subtítulos automáticos de YouTube. La herramienta es yt-dlp, y lo bueno es que baja solo el texto — nunca el vídeo. El formato que le pedimos, .vtt, es el estándar de subtítulos de la web: texto plano con una marca de tiempo delante de cada línea.
brew install yt-dlp
# ¿tiene subtitulos en español?
yt-dlp --list-subs "https://www.youtube.com/watch?v=1dNftj7NZRk"
# bajar solo el .vtt, sin tocar el video
yt-dlp --write-auto-subs --skip-download \
--sub-lang es --sub-format vtt \
"https://www.youtube.com/watch?v=1dNftj7NZRk"Estas son las cifras reales que dieron las fuentes que probamos. La última columna, la densidad, es qué proporción de esas palabras suena de verdad a él — porque bajar mucho texto y que casi nada valga es el resultado más habitual. Es la columna que decide, y en la etapa 3 la medimos en serio en vez de estimarla:
| Fuente | Duración | Palabras | Densidad |
|---|---|---|---|
| Podcast El Pinganillo #28 | |||
1dNftj7NZRk | 108 min | 20.004 | Muy alta |
| Entrevista en Late Motiv | |||
D0AcsBquY0U | 16 min | 2.615 | Alta |
| Recopilatorio de retransmisiones | |||
pNKQzSTRK2U | 9 min | 1.503 | Baja |
| Página de citas recopiladas | — | ~600 | Alta, pero se agota |
Un solo podcast rinde treinta veces más que un recopilatorio de vídeo, y él habla casi todo el rato. Cinco o seis vídeos así superan el objetivo de miles de frases.
La sorpresa: los recopilatorios de fans no sirven
Parecía el filón — vídeos tipo «las perlas de Perico», ya curados por aficionados. Pero están curados por momentos de ciclismo, no por su forma de hablar. Esto es lo que salió del recopilatorio:
«Cambia el ritmo Armstrong. Quiere reaccionar también Alejandro Valverde. Vamos a ver si puede cogerle la rueda. Lo está consiguiendo. Fantástico Valverde.»
Recopilatorio de retransmisiones — narración deportiva normalCorrecto, pero no tiene estilo. Ahora el podcast, mismo método de extracción:
«…ostras que yo tenía unas condiciones para la bicicleta. Yo, del hecho de un chico de Segovia ir a Madrid o ir a Valladolid, era ese gran día. […] Trato de reírme de mí mismo para no cortarme las venas, para no ponerme de una mala leche.»
El Pinganillo #28 — Perico sin diluirAntes de dar por buena una fuente, extrae una muestra y léela. «Recopilatorio de las mejores frases» sonaba a oro y era narración deportiva. Diez minutos de comprobación evitan semanas construyendo sobre material equivocado.
Tres limitaciones de los subtítulos automáticos
- No dicen quién habla. En un podcast donde él lleva el 70% del tiempo, un LLM puede separarlo por contexto. En una retransmisión el reparto es 50/50 con el otro comentarista y el riesgo de meter frases ajenas en el corpus es alto. Es la razón principal para priorizar podcasts.
- La calidad depende de la antigüedad del vídeo. Los recientes traen puntuación y mayúsculas; los antiguos son un chorro continuo en minúscula. Ambos sirven, el segundo da más trabajo.
- YouTube censura los tacos, que salen como
[ __ ]. Pierdes parte del registro coloquial y no hay arreglo desde esta fuente.
Los nombres propios salen destrozados — Armstrong aparece como «Amstrong» y «Lamstron» — pero para extraer estilo da igual.
Lo que decidimos no scrapear
Forocoches tiene Cloudflare delante, muchos hilos piden login y sus condiciones de uso prohíben el scraping automatizado. Coste alto, botín pequeño y ya duplicado en otras fuentes. Si aparece un hilo que merezca la pena, se copia a mano al mismo formato JSONL — un objeto JSON por línea, que montamos en la etapa 4. Para cuarenta frases, esa es la herramienta correcta.
Esto no es un pipeline recurrente. Perico lleva treinta años hablando igual: no seguimos un feed de noticias, capturamos un estilo estable. Cada Tour nuevo aportará un 3-5% más de frases y ningún cambio de estilo. Recarga manual anual, nada de cron.
El riesgo real es que las fuentes desaparecen. Por eso se archiva el texto crudo en cuanto se extrae, y por eso la lista de fuentes vive en un sources.json y no en el código: añadir material el próximo julio será añadir líneas a un fichero.