model card
Aroa Index
Esto es lo que en un repo de machine learning normal sería el README del modelo: qué es, con qué se entrenó, qué decisiones se tomaron y dónde no hay que fiarse de él. Aquí también es, sin metáfora, mi «sobre mí».
Hay cuatro entradas porque se probaron cuatro cosas. Sólo una está en producción; las otras se quedaron documentadas en vez de borrarse, que es de donde se aprende algo.
Cada modelo lleva el nombre de su etapa en un motor de búsqueda: index construye el índice invertido, vector prueba con embeddings, rank puntúa con BM25, infer genera en tu navegador y serve generaría desde un servidor. Puestos en fila son el pipeline entero, y el nombre del que está en producción —index— dice lo que de verdad hay dentro: no un cerebro, una estructura de datos bien construida.
| modelo | qué es | peso | acc | cobertura | rechazo |
|---|---|---|---|---|---|
| Aroa Index en producción | Recuperación (TF-IDF) | 512 KB | 90% | 90% | 76% |
| Aroa Infer opcional | Lo anterior + un LLM que redacta | ~2 GB | — | — | — |
| Aroa Vector descartado | Embeddings (e5-small) | 1,1 MB | 88% | 82% | 76% |
| Aroa Rank descartado | BM25 | 561 KB | 86% | 92% | 76% |
Las tres cifras salen del mismo set de evaluación. Cobertura es cuántas preguntas legítimas contesta en vez de decir «no lo sé»; rechazo, cuántas preguntas fuera de su dominio rechaza correctamente. Todo el detalle en /eval.
Aroa Index Recuperación pura. El modelo de verdad de este sitio. en producción
index por el índice invertido: lo que sale del entrenamiento es literalmente un mapa de término a documentos, con pesos. No razona, busca — y el nombre lo dice para no prometer de más.
- versión
- 1.7.2
- arquitectura
- TF-IDF (palabras 1-2 + caracteres 3-5) + similitud del coseno
- documentos
- 112
- vocabulario
- 18125 términos
- entrenado
- 2026-08-17
- umbral
- 0.1812
Qué hace
Es un modelo de recuperación de información, no un modelo de lenguaje. Convierte cada pregunta en un vector TF-IDF (palabras 1-2 gramas + n-gramas de caracteres 3-5, para aguantar tildes ausentes y erratas), lo compara por similitud del coseno contra el corpus, y devuelve el documento más parecido. No genera texto: no puede decir nada que no esté ya escrito.
Lo entrenó Aroa Xinping con scikit-learn. La inferencia corre entera en tu navegador, sin servidor ni API: el artefacto se descarga como un JSON y a partir de ahí no vuelve a salir nada de tu dispositivo.
Datos de entrenamiento
El corpus es la trayectoria real de una persona, no un dataset genérico: bachiller científico, luego artístico, tres años de Bellas Artes, dos de FP de Dietética, y ahora el Grado en Data Science en la UOC junto al bootcamp de Ironhack. Cada etapa se dejó por un motivo concreto, y esos motivos están en el corpus tal cual se preguntarían.
Encima de eso: proyectos propios, opiniones técnicas, cómo funciona su contenido en redes, y metadatos sobre el propio modelo. Ningún documento sale de scraping — todos los escribió la persona a la que describen, y ella los ha revisado.
Decisiones de diseño
TF-IDF y no un LLM. Un modelo de lenguaje grande detrás de este dominio habría sido una API ajena con su nombre encima. TF-IDF es más simple, pero cada pieza — vectorizador, pesos, umbral — es suya, entrenada sobre sus propios datos.
Inferencia en el navegador. Sin backend no hay coste por visita, ni latencia de red, ni datos de nadie saliendo de su dispositivo. El precio: el modelo tiene que caber en un JSON razonable, así que los vectores se podan y redondean.
Umbral calibrado, no fijo a ojo. El entrenamiento evalúa contra preguntas parafraseadas y contra preguntas fuera de dominio, y elige el corte que mejor equilibra ambos errores. Prefiere callarse a inventar.
Interpretable por construcción, no por herramienta. Para saber qué «piensa» un modelo de lenguaje grande en una capa intermedia hay que inventarse técnicas como el logit lens, que traducen sus vectores internos a palabras. Existen porque una red neuronal es opaca por dentro. Aquí no hacen falta: cada respuesta llega con los cinco documentos candidatos, sus scores y los términos exactos que inclinaron la balanza. La interpretabilidad no es una capa añadida encima, es una propiedad de haber elegido un modelo que se puede leer.
Capacidades
- Responde sobre trayectoria, estudios, proyectos y opiniones técnicas del corpus.
- Tolera preguntas sin tildes, con erratas o formuladas distinto al documento original.
- Enseña su score de confianza en cada respuesta: nada de caja negra.
- Funciona offline una vez descargado; no depende de ninguna API.
- Acepta preguntas por voz donde el navegador lo soporte.
Limitaciones
- No tiene memoria entre preguntas: cada consulta se resuelve desde cero.
- Sólo sabe lo que hay en su corpus — decenas de documentos sobre una sola persona, no una base de conocimiento general.
- No genera texto: si la pregunta no encaja con nada, lo dice.
- Está sesgado hacia las opiniones de quien lo entrenó, porque los escribió ella. No es neutral y no pretende serlo.
- Los hechos son de Aroa y ella los ha revisado, pero la redacción es de quien montó el corpus.
Historial
- v1.7.2 2026-08-17 acc 90% · cob 90% · rech 76% · 112 docs
- v1.7.1 2026-08-17 acc 90% · cob 90% · rech 76% · 112 docs
Arreglados los 12 fallos del eval cubriendo los huecos de vocabulario que los causaban, más el colapso de letras repetidas en el analizador para que «holaaaa» encuentre el saludo. Pero el 100% que salió primero era falso: las variantes añadidas eran las preguntas del eval casi literales, o sea enseñarle el examen. Al auditarlo aparecieron 23 preguntas del eval español y 15 del inglés copiadas del corpus, algunas de antes — mientras /eval afirmaba que ninguna lo estaba. Reescritas todas como paráfrasis de verdad, y con scripts/fuga_eval.py para que no vuelva a pasar. Las cifras honestas: 88.5% → 90.4% en español y 88.1% → 94.0% en inglés, medidas contra un eval que ya no está contaminado.
- v1.7.0 2026-08-17 acc 100% · cob 98% · rech 76% · 112 docs
- v1.6.0 2026-08-17 acc 88% · cob 91% · rech 76% · 112 docs
112 documentos, con trece conceptos técnicos nuevos —regresión, estadística, visualización, git, la nube, notebooks, correlación— que es el pilar de contenido que ya hace en vídeo. Y seis fusiones más: el script scripts/solapes.py, escrito después de meter duplicados a mano dos tandas seguidas, encontró cuatro pares que se me habían pasado y una contradicción de verdad — un documento afirmaba que la estadística es la rama que mejor se le da mientras otro contaba que la inferencial la puso en su sitio. Buscar antes de escribir hace que añadir documentos SUBA la accuracy: 86.5% → 88.5% en español, 86.9% → 88.1% en inglés.
- v1.5.1 2026-08-17 acc 87% · cob 91% · rech 76% · 105 docs
Cuatro duplicados fuera. Al ampliar el corpus se habían escrito documentos que ya existían con otro id —«de dónde eres» estaba dos veces, y «dónde vives» también— y eso es justo lo que degrada un modelo de recuperación: dos documentos compitiendo por las mismas palabras. Fusionados, la accuracy sube de 85.6% a 86.5% en español y de 84.5% a 86.9% en inglés, con la cobertura intacta. La lección: antes de añadir, buscar si ya está.
- v1.5.0 2026-08-17 acc 86% · cob 71% · rech 96% · 109 docs
Corpus a 109 documentos y dos cambios de fondo. PESO_CHAR sube de 0.3 a 0.4 para aguantar faltas de ortografía: elegido con una rejilla medida contra dos sets a la vez, el normal y una copia con erratas metidas a propósito. Y la calibración del umbral se reescribió — maximizaba la media de aceptadas y rechazadas, y a esta escala dos cortes separados por una milésima daban 71% y 91% de cobertura. Ahora maximiza cobertura con un suelo duro de rechazo del 75%, que no se puede compensar.
- v1.4.0 2026-08-17 acc 88% · cob 93% · rech 76% · 96 docs
- v1.3.0 2026-08-17 acc 88% · cob 90% · rech 80% · 96 docs
Corpus de 69 a 96 documentos, con el hueco de «técnico» (6 → 16) y un tema nuevo, «opiniones», que no existía. Medido contra el eval anterior para que la comparación sea justa, el coste real es 2,3 puntos de accuracy y 4 de rechazo — a cambio de 27 temas que antes no tenían respuesta. La caída aparente de 7 puntos era un artefacto de haber ampliado el eval a la vez.
- v1.2.2 2026-08-17 acc 95% · cob 94% · rech 84% · 69 docs
- v1.2.0 2026-08-17 acc 95% · cob 94% · rech 84% · 69 docs
Corpus de 63 a 69 documentos: seis proyectos que existían en GitHub pero de los que el modelo no sabía nada. El documento de proyectos decía «ahora mismo tres» cuando la web ya enseñaba doce — el modelo contradecía a su propia web. Las descripciones salen de los README de cada repo, no de memoria. Accuracy 94.9% → 95.4%, pero el rechazo fuera de dominio baja de 88% a 84%: con más documentos, el umbral que mejor equilibra los dos errores cae, y el modelo se calla algo menos.
- v1.1.1 2026-08-17 acc 95% · cob 94% · rech 88% · 63 docs
- v1.1.0 2026-08-16 acc 95% · cob 94% · rech 88% · 63 docs
48 variantes de pregunta añadidas a los 16 documentos que sólo tenían tres formas de preguntarse — ningún hecho nuevo, sólo más maneras de preguntar lo mismo. La cobertura sube de 90% a 94% sobre un set de evaluación más grande (104 preguntas) y con paráfrasis deliberadamente distintas a las de entrenamiento.
- v1.0.0 2026-08-16 acc 97% · cob 90% · rech 88% · 63 docs
Corpus ampliado de 50 a 63 documentos con datos que dio Aroa, y corregidos dos datos falsos publicados (vivía en Valencia, no en Barcelona; y no escucha la música que decía /about). Cinco colisiones de vocabulario arregladas. La cobertura sube de 73% a 90% sin tocar el algoritmo: el mayor salto de todo el proyecto vino de trabajar los datos.
- v0.9.1 2026-08-13 acc 98% · cob 73% · rech 97% · 50 docs
Se añadieron 22 preguntas de conversación real al set fuera de dominio: «cómo estás» llegaba a devolver la arquitectura del modelo con la confianza de un acierto. El umbral recalibrado sube el rechazo de 93% a 97%, a costa de bajar la cobertura a 73%.
- v0.9.0 2026-08-13 acc 98% · cob 91% · rech 93% · 50 docs
Primera versión. La evaluación fuera de dominio eran ocho preguntas de trivia (capitales, recetas), así que el umbral estaba calibrado contra un problema que no era el real.
Aroa Infer Lo mismo, pero un LLM local redacta la respuesta. opcional
infer por la inferencia: es la única variante que ejecuta un modelo de lenguaje en tu máquina, en vez de consultar un índice ya calculado. De ahí los dos gigas y los dos minutos.
- modelo
- Qwen2.5-3B-Instruct
- dónde corre
- tu navegador (WebGPU)
- descarga
- ~2 GB
- primera respuesta
- > 2 min
- siguientes
- 10-20 s
El retrieval sigue eligiendo los documentos exactamente igual; el LLM sólo los reformula. Es RAG, no una conversación libre: no aporta datos, sólo redacta los que ya había. Si el retrieval no llega al umbral, esta variante tampoco genera nada — se da el mismo «no lo sé», porque darle contexto vacío a un LLM para que improvise es justo lo que este sitio promete no hacer.
Por qué Qwen y no Llama
La primera versión usaba Llama-3.2-1B. Medido en el navegador con el corpus real delante, se negaba a contestar un simple «hola» («no puedo cumplir con esa solicitud»), contradecía el documento que se le pasaba («No soy Aroa Xinping, soy un modelo de lenguaje») y mezclaba documentos: a «por qué dejaste Bellas Artes» respondió «me sentí más cómodo en el gimnasio», en masculino. Qwen2.5-3B contesta lo mismo de forma fiel.
Aviso honesto
El modelo que responde bien tarda demasiado y el que responde rápido no responde bien. Esta variante enseña algo real — un LLM corriendo entero en el navegador, sin servidor — pero no es una buena experiencia de uso, y no se vende como tal. Por eso hay que activarla a mano y por eso el modo por defecto es el otro.
Aroa Vector Embeddings en vez de TF-IDF. Peor rechazando. descartado
vector por el vector store: es la etapa de recuperación densa, la que compara significados en vez de palabras. Entendía mejor la paráfrasis y por eso mismo no sabía cuándo callarse.
- arquitectura
- embeddings (intfloat/multilingual-e5-small) + similitud del coseno
- accuracy@1
- 88%
- cobertura
- 82%
- rechazo
- 76%
Los embeddings entienden mejor la paráfrasis, pero les cuesta mucho más callarse: el coseno entre frases con estos modelos se comprime en una banda estrecha tanto si la pregunta encaja como si no — anisotropía. Con el umbral calibrado los dos rechazan lo mismo de fuera de dominio, y ahí está el detalle: para llegar a ese rechazo, el de embeddings tiene que poner el corte tan alto que se lleva por delante preguntas legítimas, y contesta bastantes menos que TF-IDF. El coste no aparece en el rechazo, aparece en la cobertura. TF-IDF, al comparar palabras literales, da similitud cero de verdad entre frases sin nada en común, y esa separación limpia es la que permite callarse con confianza.
Artefacto publicado en /model/aroa-vector.json.
Historial
- v1.2.0 2026-08-17 acc 88% · cob 82% · rech 76% · 112 docs
- v1.1.0 2026-08-17 acc 87% · cob 59% · rech 100% · 96 docs
Reentrenado a 96 documentos para comprobar si a esta escala los embeddings adelantaban a TF-IDF. No: la cobertura cae al 58,7% — pero medido con el set de evaluación anterior, el que todavía tenía preguntas copiadas del corpus, así que no se puede comparar con lo de después. Medido de nuevo con el examen actual, de 96 a 112 documentos la cobertura de los embeddings pasa de 80,8% a 81,7%: una pregunta, ruido. La anisotropía no se agrava con la escala en este rango, se mantiene — y con ella los nueve puntos de cobertura que le saca TF-IDF en las dos tallas.
- v1.0.1 2026-08-16 acc 97% · cob 63% · rech 100% · 63 docs
Reentrenado sobre el corpus actualizado, para que la comparativa contra aroa index se haga sobre el mismo corpus y el mismo eval. Sube en accuracy pero la cobertura sigue en 63%: el problema de los embeddings nunca fue entender, era saber callarse.
- v1.0.0 2026-08-14 acc 95% · cob 73% · rech 84% · 63 docs
Entienden mejor la paráfrasis pero son mucho peores diciendo «no lo sé», por la anisotropía del coseno entre frases. Descartado.
Aroa Rank BM25, el estándar de la industria. Empate técnico. descartado
rank por ranking function, que es la categoría formal a la que pertenece BM25. Su apellido, básicamente.
- arquitectura
- BM25 (k1=1.2, b=0.0) sobre palabras 1-2 + caracteres 3-5
- accuracy@1
- 86%
- cobertura
- 92%
- rechazo
- 76%
BM25 es lo que llevan dentro Elasticsearch, Lucene y Solr: satura la repetición de un término y modela la longitud del documento. Los parámetros se eligieron por búsqueda en rejilla sobre este corpus, no por los valores por defecto — y salió b=0, es decir, que aquí la normalización por longitud estorba. Tiene sentido: un documento largo lo es porque tiene contenido, no relleno.
Contesta más preguntas que TF-IDF —mejor cobertura— pero acierta menos cuál era el documento bueno, y con el mismo rechazo de lo que viene de fuera: lo que gana en cantidad lo pierde en puntería. Ninguno gana claro y la diferencia cabe en el ruido del set de evaluación, así que no compensaba reescribir la inferencia entera. Artefacto en /model/aroa-rank.json.
Historial
- v1.2.0 2026-08-17 acc 86% · cob 92% · rech 76% · 112 docs
- v1.1.0 2026-08-17 acc 86% · cob 82% · rech 96% · 96 docs
Reentrenado a 96 documentos. Sigue perdiendo en «útil», pero su rechazo sube al 96% mientras el de TF-IDF baja al 80%: la brecha pasa de 4 puntos a 16. Es el dato que habrá que volver a mirar si el corpus sigue creciendo.
- v1.0.1 2026-08-16 acc 94% · cob 86% · rech 92% · 63 docs
Reentrenado sobre el corpus actualizado por el mismo motivo que aroa vector. Sigue rechazando mejor lo que no sabe y cubriendo peor lo que sí: el reparto de errores que ya tenía.
- v1.0.0 2026-08-16 acc 95% · cob 95% · rech 80% · 63 docs
Probado contra TF-IDF con k1 y b elegidos por búsqueda en rejilla. Contesta más preguntas pero acierta menos el documento, con el mismo rechazo; ninguno gana claro. No se adopta.
La conclusión que más vale
Los dos cambios de algoritmo se movieron dentro del ruido. Ampliar el corpus, no: de 50 a 112 documentos, medido todo con el mismo examen, las preguntas que acaban con la respuesta correcta delante pasan del 35,9% al 81,7% — 45,7 puntos. Cambiar de algoritmo movió menos de 5, y hacia abajo. Pero el detalle importa: en las preguntas que ya tenían su documento a 50, ampliar apenas cambió nada (+4,3 puntos, casi ruido). Toda la ganancia está en poder contestar 42 preguntas que antes no tenían ni documento al que apuntar. Ampliar el corpus no mejora las respuestas que ya das: te deja dar las que faltaban.
Uso previsto
Portfolio y punto de contacto: conocer su trayectoria, ver sus proyectos, valorar una colaboración. Para prensa, colaboraciones o contratación, el propio modelo puede darte su contacto — pregúntaselo.