Vuelta a la simplicidad: ganan los scores, no las features.
● en vivo
Mistral 24B + Llama 4 Scout + Gemma 3
Prompt minimalista
argmax de scores
Benchmark solo real
Por qué existe esta versión
- El benchmark v3-vs-v4 sobre 35 imágenes sintéticas dio un golpe duro:
v3 CODETEX (prompt simple) obtuvo 60.0 % de precisión global,
v4 HOYUELO (con prompt anatómico estructurado, pesos +30/+20 y feature
extraction) bajó a 42.9 %. La sofisticación nos salió mal.
- Diagnóstico: el prompt anatómico de HOYUELO volvió a los
modelos sobre-escépticos. Penalizaciones tipo "+15 a 'otra' si es
extreme_zoom", "+20 a 'otra' si rotation_unclear" y "+15 si no se
ven features" hicieron que los 3 modelos descartasen culos válidos
(rotados, en zoom, recortados) y a la vez metiesen "culo" en distractores
abstractos. Por categoría: 73 % en culos (vs 100 % de v3), 0 % en codos
(igual que v3, no es solucionable a nivel de prompt) y 50 % en distractores
(vs 75 % de v3).
- Decisión: v5 quita lo que rompió v4 y conserva lo que ya
funcionaba en v3.
Qué cambia respecto a HOYUELO
- Prompt minimalista en inglés, sin listas de features ni
pesos explícitos. Las features anatómicas (hoyuelos de Venus, olécranon,
triángulo de Hueter, queratinización…) se mencionan como pistas opcionales,
no como un checklist de obligado cumplimiento.
- Sin
rotation_unclear → +neither. Una
hendidura vertical sigue siendo culo aunque la imagen esté rotada o sea
un primer plano extremo.
- Veredicto por argmax de scores promediados (en vez de
tally discreta). Si dos modelos dicen
{culo:55, codo:30, otra:15}
y un tercero dice {codo:40, culo:35, otra:25}, el promedio
sigue dando culo y respeta la confianza relativa entre modelos. La tally
discreta sigue calculándose para reportar el tipo de consenso
(unanimous / majority / split /
weighted).
- max_tokens reducido a 200 (de 800 en HOYUELO),
temperature 0.1. Salida JSON pura sin features estructuradas.
Más rápido, más barato, igual de informativo.
- Mismos 3 modelos que v3/v4: Mistral 3.1 24B + Llama 4
Scout 17B + Gemma 3 12B. Mantenemos el ensemble para comparar manzanas
con manzanas.
El benchmark también cambia
- Solo imágenes reales a partir de ahora. Las 35 sintéticas
de v4 se eliminan: distorsionaban la lectura porque los 3 modelos fallan el
100 % de los codos sintéticos, lo cual no representa el comportamiento
real de la app.
- Fuentes priorizadas para poblar el dataset real (ver
tools/benchmark.manifest.yaml): Wikimedia Commons categorías
"Elbows" / "Anatomy of the human elbow" / "Buttocks" / "Gluteal region"
(CC-BY-SA), MPII Human Pose con crops automáticos por keypoints
(académico) y Pexels/Pixabay CC0 recortados sin caras para evitar
identificación.
- Hasta poblar el dataset, el benchmark muestra "Dataset vacío"
en vez de mentir con números sintéticos.
IA con conocimiento anatómico real.
Mistral 24B + Llama 4 Scout + Gemma 3
Prompt anatómico
Feature extraction
Anti-rotación
⤓ regresión: 60 % → 43 %
Qué cambia respecto a CODETEX
- Conocimiento anatómico fundamentado: el system prompt está construido a partir de Gray's Anatomy 41ed (Standring, 2016), Atlas de Netter, Borges (1973) sobre Langer lines, Blume-Peytavi (2008) sobre tricología y Bharti et al. (2015) sobre fossae lumbales laterales (hoyuelos de Venus).
- Razonamiento estructurado en 4 pasos: extracción de features → consideración de la trampa de rotación → scoring con pesos → veredicto. Cada modelo enumera qué ve antes de decidir.
- Detección explícita de features: la API devuelve booleanos por hoyuelo de Venus, olécranon, triángulo de Hueter, queratinización, hiperpigmentación, topología cóncava/convexa, patrón del vello, etc. La UI los muestra como chips → puedes auditar el razonamiento.
- Anti-rotación: si el modelo solo ve "una rajita" sin más contexto, marca
rotation_unclear: true y baja la confianza. Una raja vertical podría ser un culo en orientación normal, pero también un codo girado 90°.
- Scoring con pesos derivados de literatura: hoyuelo de Venus = +30 culo (rotation-invariant, 100% específico), olécranon visible = +30 codo, queratinización = +15 codo, etc. Sin más adivinanza autoreporte.
- Hallazgo anatómico real: el vello del codo crece asimétrico — más denso del lado medial (cubital) que del lateral (radial), por la inervación del nervio cutáneo medial. El prompt usa esta señal para distinguir codos de glúteos en zooms extremos.
- Benchmark sintético ampliado a 35 imágenes (antes 15): añade culos rotados 90°/45°, simulación de hoyuelos de Venus, vello asimétrico medial>lateral, parches de hiperpigmentación, distractores (rodillas, espaldas).
Investigación que llevó a esta versión
- Juan observó que su codo derecho tiene más pelo en un lado que en el otro de la rajita — y eso resultó ser un patrón anatómico documentado (territorio del nervio cutáneo medial del antebrazo).
- Un agente de investigación profundizó en literatura anatómica: el cleft glúteo es cóncavo entre dos masas convexas; el codo es lo opuesto, una prominencia convexa sobre superficie plana. Esa topología, no la orientación, es la señal robusta.
- Los hoyuelos de Venus (presentes en 20-40% de la población) son rotation-invariant: si los ves, es un culo. No hay análogo en codo.
Tres modelos votan; el consenso decide.
Mistral 24B + Llama 4 Scout + Gemma 3
Multi-LLM voting
Consenso server-side
Few-shot ready
Qué cambia respecto a MOFLETE
- 3 modelos en paralelo en lugar de 1: Mistral 24B + Llama 4 Scout 17B + Gemma 3 12B. Cada uno se equivoca en cosas distintas — el consenso de 3 supera al mejor individual.
- Consensus voting en server-side: el endpoint cuenta votos y devuelve
unanimous, majority o split. Si los tres discrepan, la app reconoce que la imagen es genuinamente ambigua en lugar de inventarse un veredicto.
- Confianza basada en grado de acuerdo, no en lo que dice cada modelo: 95 % si los 3 coinciden, ~70 % si 2/3, ~35 % si discrepan.
- Infraestructura few-shot lista: el endpoint puede inyectar imágenes de referencia anatómicas en el prompt (preparado en
functions/_shared/few-shot.js). Pendiente de poblar con imágenes CC.
- Benchmark medible: nueva página /benchmark que ejecuta un dataset etiquetado contra v1, v2 y v3 y muestra precisión real. El dataset empieza vacío y se rellena con material curado de quizzes ingleses + clips de El Hormiguero (uso evaluativo).
- UI con votos individuales: en cada clasificación ves cómo votó cada uno de los 3 modelos, su confianza individual y razonamiento.
El coste real
- 3 llamadas en paralelo ≈ 12-18 K neuronas por clasificación (vs ~5-8 K en MOFLETE).
- Free tier de Cloudflare Workers AI: ~10 K/día → menos clasificaciones gratis al día.
- A cambio: precisión real superior y honesto cuando duda.
Razona antes de decidir.
Mistral Small 3.1 24B
2 pasadas
JSON estructurado
1024 px
Qué cambia respecto a CULIBARA
- Modelo 3,4× más grande: pasamos de LLaVA 1.5 (7 B parámetros) a Mistral Small 3.1 (24 B), francés y sin restricciones en la UE.
- Prompt comparativo: ya no le pedimos elegir A/B/C a ciegas. Le obligamos a enumerar evidencia anatómica concreta para cada opción (cleft glúteo, olécranon, dirección del vello, textura de piel) antes de decidir.
- Salida JSON estructurada: scores 0-100 por cada clase, con razonamiento en español. Permite mostrar las tres barras de confianza al usuario.
- Doble pasada con prompt alternativo: si la confianza de la primera pasada es < 65 %, lanza una segunda con prompt distinto (focado en pelo y forma del pliegue) y promedia los scores.
- Razonamiento visible: el usuario ve la justificación de la IA en la propia tarjeta del resultado.
- Cadena de fallback de 4 modelos: si Mistral falla, prueba Llama 4 Scout → Gemma 3 → LLaVA hasta que alguno responda.
- Imagen a 1024 px (antes 768): los pelos finos y poros pequeños se pierden por debajo de los 1000 px.
- Parser JSON robusto: 5 estrategias de reparación para casos donde el modelo devuelve markdown con escapes raros (
\_, comas finales, comillas mixtas).
La primera generación que funcionó: pequeñita y honesta.
LLaVA 1.5 7B
1 pasada
Prompt A/B/C
768 px
Qué la hace simple
- Un único modelo de 7 B parámetros, sin fallback.
- Prompt directo: "elige A, B o C". Sin razonamiento intermedio.
- Una sola llamada al modelo por imagen → barata y rápida.
- Sin parsing JSON: deduce el veredicto buscando palabras clave en la respuesta.
Por qué fallaba en casos difíciles
- En primeros planos extremos (solo se ve la "rajita" y los pelos), el modelo pequeño no tiene suficiente capacidad para distinguir cleft glúteo (vertical, simétrico, profundo) de pliegue del codo (horizontal o con olécranon).
- Sin razonamiento explícito, el modelo "saltaba" al veredicto por intuición visual y se equivocaba.
- Una sola pasada → cuando la confianza es baja, no tiene segunda oportunidad.