🍑 Culo o Codo IA
← Volver a la app

📜 Changelog

Cómo ha ido evolucionando la habilidad de la IA para distinguir un culo de un codo.

Sobre los nombres: cada versión lleva nombre en clave en mayúsculas, como los modelos de IA grandes (Llama, Mistral, Capybara…), pero relacionado con el problema. Así es fácil hablar de ellas: "esto lo acertaba MOFLETE pero CULIBARA fallaba."

Cómo probar versiones antiguas: usa el selector "v… ▾" arriba a la derecha en cualquier página de la app, o entra directamente a /v1/, /v2/, etc.

v5.0
CACHETE

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.
v4.0
HOYUELO

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.
v3.0
CODETEX

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.
v2.0
MOFLETE

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).
v1.0
CULIBARA

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.
Próximas ideas (post-CACHETE): Poblar el benchmark con ~200 imágenes reales (60 Wikimedia + 80 MPII Human Pose crops + 60 Pexels/Pixabay sin cara) para una medición creíble · Few-shot multi-imagen (3 culos + 3 codos + 3 otras inyectadas en cada llamada) para enseñar invariancia de rotación/zoom — Mistral 3.1 admite hasta 10 imágenes, Llama 4 Scout y Gemma 3 también lo soportan · Pasar de Llama 4 Scout a Gemma 4 26B-a4b-it (modelo nuevo, abr-2026) para tener un ensemble 100 % EU-clean sin riesgo de licencia Meta · v6 con dos pasadas: zero-shot rápido + grounded CoT solo cuando los 3 modelos discrepan.