Skip to content

chore(nlp): los ids de modelo viven en un solo sitio (#116) - #118

Merged
g-garciac2022 merged 1 commit into
devfrom
chore/116-ids-modelo
Aug 26, 2026
Merged

chore(nlp): los ids de modelo viven en un solo sitio (#116)#118
g-garciac2022 merged 1 commit into
devfrom
chore/116-ids-modelo

Conversation

@g-garciac2022

Copy link
Copy Markdown
Collaborator

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 TODO que lo registraba nombraba también el obstáculo: unificar leyendo de
MODEL_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

Campo Quién lo consume Ejemplo
signal /analyze, para buscar la ficha de cada resultado detect_clickbait
model_id el orquestador y la tool, para construir la llamada facebook/bart-large-mnli
name la interfaz BART-large MNLI (zero-shot por inferencia)

model_id es None en el léxico y el lineal: no son modelos descargables, y esa
distinción se consulta desde fuera. El campo entra también en FichaModelo, el
TypedDict que MCP publica como outputSchema de describe_models — si sólo
estuviera en el diccionario, el contrato publicado y la realidad divergirían.

Una divergencia que ya estaba ahí

IncoherenceDetector.MODEL decía "all-MiniLM-L6-v2" mientras su ficha decía
"sentence-transformers/all-MiniLM-L6-v2". Dos cadenas distintas para el mismo
modelo. 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:

tool MCP con otro id                                       lo caza
orquestador REST con otro id                               lo caza
detector con el nombre desnudo (la divergencia que HABÍA)  lo caza

Lo que sigue duplicado, a propósito

Las etiquetas candidatas ["clickbait", "factual news"] siguen en
orchestrator.py y en tool.py. Una ficha divulga qué es una señal, no cómo
se 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 que
sustenta 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.

@g-garciac2022
g-garciac2022 merged commit 93d25b9 into dev Aug 26, 2026
1 check passed
@g-garciac2022
g-garciac2022 deleted the chore/116-ids-modelo branch August 26, 2026 14:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant