chore(nlp): los ids de modelo viven en un solo sitio (#116) - #118
Merged
Conversation
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 #116.
Tres modelos, ocho declaraciones de su identificador repartidas por el
backend. Cambiar el modelo de una señal en un sitio y no en los otros dejaba las
dos fachadas —REST y MCP— respondiendo con modelos distintos al mismo titular,
y sin que nada fallara: los dos caminos seguían devolviendo una etiqueta válida.
Salió al preparar #115, que es precisamente un cambio de modelo.
Por qué no se había hecho antes
El
TODOque lo registraba nombraba también el obstáculo: unificar leyendo deMODEL_CARDS["name"]exigía normalizar antes ese campo, que valía"facebook/bart-large-mnli"en tres fichas y"Léxico por reglas (…)"en dos.Un solo campo intentando ser identificador de máquina y etiqueta para personas.
La separación
signal/analyze, para buscar la ficha de cada resultadodetect_clickbaitmodel_idfacebook/bart-large-mnlinameBART-large MNLI (zero-shot por inferencia)model_idesNoneen el léxico y el lineal: no son modelos descargables, y esadistinción se consulta desde fuera. El campo entra también en
FichaModelo, elTypedDictque MCP publica comooutputSchemadedescribe_models— si sóloestuviera en el diccionario, el contrato publicado y la realidad divergirían.
Una divergencia que ya estaba ahí
IncoherenceDetector.MODELdecía"all-MiniLM-L6-v2"mientras su ficha decía"sentence-transformers/all-MiniLM-L6-v2". Dos cadenas distintas para el mismomodelo. Resolvían igual, así que no rompía nada y podía durar indefinidamente
con la divulgación diciendo una cosa y el código cargando otra.
Es el caso que mejor ilustra la issue: el daño de la duplicación no es que falle,
es que no falla.
Unificar no basta
Poner el id en un sitio no impide que vuelva a salir de ahí. Lo que lo impide es
un test que capture con qué modelo se llama de verdad por cada camino:
sustituye el backend por un espía, invoca las tools por el protocolo y las
señales por el orquestador, y compara lo capturado contra la ficha.
Y como un test de regresión que nunca se ha visto fallar no demuestra nada, se
verificó introduciendo cada divergencia posible:
Lo que sigue duplicado, a propósito
Las etiquetas candidatas
["clickbait", "factual news"]siguen enorchestrator.pyy entool.py. Una ficha divulga qué es una señal, no cómose la invoca; y #115 sustituye ese modelo por un clasificador, que no lleva
etiquetas candidatas. Queda anotado en el código como decisión, no como olvido.
Un fichero que viaja de más
Incluye
backend/evaluation/eval_candidatos.py, la comparativa de modelos quesustenta la decisión de #115. No pertenece a esta issue; se adelanta aquí porque
#115 arranca inmediatamente después y el módulo ya está medido y verificado.
Verificación
192 tests pasan (dos nuevos), ruff y formato limpios.