feat(nlp): un modelo dedicado y entrenado con etiqueta humana para la señal de clickbait (#115) - #120
Merged
Merged
Conversation
…elated components
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Cierra #115.
detect_clickbaitusabafacebook/bart-large-mnli, elegido en E3-02 poreliminación —era lo único que el serverless de HuggingFace servía— y nunca por
medida. El aplazamiento traía condición explícita, «si llega la infra», y la
infra llegó en la Épica 5 con
LocalNLPClient. Nadie volvió a la nota durantedos épicas, porque nadie tenía motivo para releerla.
Medido en #109, aquel modelo acertaba el 63,7 %: la señal más floja de
forma.El sustituto obvio era el equivocado
E3-02 dejaba nombre:
elozano/bert-base-cased-clickbait-news. Da 99,7 % enChakraborty dev y F1 0,185 en Webis-17, contra una mayoritaria del 69,0 %.
Memorización, no capacidad.
Eso obligó a buscar con criterios: licencia clara, procedencia de la etiqueta
(humana, no por-fuente) e independencia del par acoplado.
Y ahí salió el hallazgo que no se buscaba
39 datasets candidatos en el Hub; cinco en inglés con licencia permisiva. Los
cinco son Chakraborty reempaquetado, medido por solapamiento de titulares: 100 %,
86 %, 86 %, 57 % y 56 %.
La variedad de corpus de clickbait es ilusoria: un dataset con cinco envoltorios.
Explica estructuralmente el caso de elozano —casi todo lo que hay arrastra las
mismas etiquetas por-fuente— y responde el bullet de #78 «búsqueda de corpus
adicionales» con un no medido en vez de con un «no encontré».
El elegido
Stremie/roberta-base-clickbait(Apache-2.0). Su README declara entrenamientosobre Webis-17 y
postText— el mismo campo que tenemos vendorizado — con~0,7 F1 en su test.
elozanoStremieAlto fuera y más bajo dentro: el patrón inverso, que es el de generalizar.
Y ese 0,946 supera al 0,865 que el lineal saca dentro de su propio dominio —
el argumento de #78, la palanca es la supervisión, medido desde el otro lado.
El voto vuelve, y no es marcha atrás
formaAMBIGUOCuatro de cada cinco ambigüedades pasan de ruido a discrepancia legítima. #109
declaró ese silencio condicional en la ficha —«placeholder pendiente de
#115»— precisamente para poder encontrarlo cuando llegara el momento.
dedicated.py: faltaba un móduloTres de las cinco señales tenían módulo propio (
lexical,linear,incoherence); ésta no, y llamaba al backend desde las dos fachadas. Por eso suid y sus etiquetas acabaron duplicados (#116): no había dónde ponerlos.
El módulo nuevo contiene el id (leído de la ficha), el mapeo de etiquetas y la
normalización. El vocabulario del modelo no sale hacia fuera: la tool sigue
publicando
clickbait/factual news, contrato leído por el LLM, así que elpróximo cambio de modelo no se propaga a quien consume la señal.
Y el mapeo falla en vez de dejar pasar una etiqueta desconocida. Si se
colara, el extractor la compararía con
clickbait, no coincidiría, y todos lostitulares saldrían factuales sin levantar ninguna excepción.
Auditoría de requisitos: R3.9 no se cumple, y el código decía que sí
Cambiar de modelo es la prueba de fuego de R3.9 («intercambiarlos por
configuración, sin cambios de código»). No se cumple: hizo falta tocar la tabla
de fichas, escribir un módulo y añadir un mapeo.
Lo llamativo es que el docstring de
model_cards.pyafirmaba lo contrario,confundiendo
nlp_backend—que decide dónde corre el modelo— con cuál es.Llevaba dos épicas dándolo por cumplido, invisible porque hasta ahora nunca se
había cambiado un modelo. Corregido aquí; el hueco queda en #119, con la
tensión de fondo planteada: el id se configura fácil, el mapeo de etiquetas y el
modo de invocación no.
Del resto de lo auditado: R3.5 sale reforzado y R3.8 gana evidencia propia
a favor. R3.6 probablemente mejora al pasar de BART-large a roberta-base, pero
no se ha medido y no se apunta como mejora.
Lo que no arregla
Sigue siendo una señal opaca:
formagana acierto, no transparencia. Y suindependencia del par acoplado es desconocida, que no es lo mismo que buena —
su único test honesto es Chakraborty, donde tres clasificadores competentes
coinciden por fuerza. Declarado así en la ficha. La segunda señal interpretable e
independiente sigue siendo #75.
Verificación
193 tests pasan, ruff y formato limpios. Además, verificación de humo con el
modelo real —los dobles sólo prueban lo que uno cree que devuelve el modelo—:
los cuatro casos correctos, etiquetas normalizadas al contrato, y el camino
completo de
orchestrator.analyzeresolviendoformacon las tres señales.Un test se cayó y estuvo bien que lo hiciera:
test_una_señal_que_revienta_no_tumba_a_las_demassaboteaba
zero_shot, y la señal ya no pasa por ahí. Ahora rompe sólo esemodelo, no el método, porque el tono comparte
classifydesde este cambio.