Por qué no deduplicamos hechos de cumplimiento mediante la similitud de incrustaciones
En nuestra evaluación de deduplicación de memoria, las contradicciones promediaron 0.938 de coseno medio con su hecho almacenado más cercano, y los duplicados reales promediaron 0.940, sin que ningún umbral único separara claramente los pares que no deben fusionarse de los que deberían hacerlo. Por lo tanto, el coseno nunca toma la decisión de fusión en nuestro flujo de trabajo.

Una puntuación de similitud de propósito general responde bien a una pregunta: ¿estas dos afirmaciones se refieren a lo mismo? En el modelo que medimos, no respondió a la pregunta que una memoria de hechos de cumplimiento realmente necesita responder: ¿estas dos afirmaciones están de acuerdo? Medimos la brecha en nuestros propios datos, y no es un margen que se pueda ajustar. En nuestra evaluación de deduplicación de memoria, los duplicados reales promediaron 0.940 de coseno medio con su hecho almacenado más cercano, y las contradicciones directas promediaron 0.938, sin que ningún umbral global único en esos datos separara claramente las reformulaciones que queríamos suprimir de las contradicciones que no podíamos. Llamamos a esto la trampa de la temática, y es la razón por la que, en nuestro flujo de trabajo, el coseno nunca toma la decisión de fusión.
El fallo es silencioso y unidireccional. Una deduplicación omitida deja una fila redundante, lo cual es cosmético. Una fusión falsa suprime uno de dos hechos que discrepan, y si el hecho que suprime es "La MFA no está aplicada a todos los usuarios", un asistente frente a una auditoría ahora sostiene lo opuesto a la verdad. Tratamos esos dos errores como categóricamente distintos, y todo el diseño se deriva de esa asimetría.
La medición
La evaluación ejecuta la ruta de decisión real del backend (el mismo evaluateCandidate que usa el flujo de trabajo) sobre un conjunto de datos adversarial, sintético y sin PII de pares de afirmaciones de GRC. Cada par está etiquetado con su relación: un duplicado reformulado que debe suprimirse, o uno de tres tipos que no deben fusionarse: un hecho distinto que difiere en un solo token, una contradicción directa o un refinamiento de alcance. Registro de ejecución: 2026-06-25, mistral-embed (el modelo v23.12 detrás del alias) para los vectores y un pequeño juez de Mistral (mistral-small-2603, temperatura 0) para la decisión, 261 pares, 522 llamadas al modelo, aproximadamente $0.036.
El estudio de incrustaciones es la parte que merece atención. Coseno medio del candidato a su hecho almacenado más cercano, por relación (mistral-embed v23.12, ejecución 2026-06-25):
| relación | coseno medio | n |
|---|---|---|
| duplicado | 0.940 | 10 |
| contradicción | 0.938 | 7 |
| no duplicado (un token) | 0.902 | 239 |
| refinamiento | 0.847 | 5 |
Observa las dos filas superiores. La contradicción media se sitúa 0.002 por debajo de la reformulación media del mismo hecho. La palabra única que invierte el valor de verdad ("no") apenas mueve el vector, porque ambas oraciones se refieren abrumadoramente a la aplicación de MFA, y en este modelo, la proximidad rastrea ese tema compartido mucho más que la negación.
Los hechos distintos de un solo token están casi igual de cerca. "Hemos completado un informe SOC 2 Tipo 1" frente a "Tipo 2" no es una cuestión de pedantería: un informe Tipo 1 aborda la idoneidad del diseño de controles en una fecha específica, mientras que un informe Tipo 2 también aborda la eficacia operativa durante un período especificado (Guía de informes SOC 2 del AICPA). Fusionarlos le indica al equipo de seguridad de un prospecto que posees evidencia que no tienes. En una prueba de humo contra los módulos reales, "SOC 2 Tipo 1" y "Tipo 2" se incrustaron con un coseno de 0.961, por encima del duplicado verdadero promedio en la tabla. Ese único caso es el importante: un par que nunca debe fusionarse, con una puntuación superior al promedio de los pares que sí deberían fusionarse. La clase de no duplicados en su conjunto promedió 0.902.
Por qué un solo umbral no los separa
El instinto, una vez que ves que un duplicado tiene una puntuación alta, es establecer un umbral de fusión justo por debajo. Nuestros datos argumentan en contra de ello de dos maneras. Las medias de las clases no se separan: 0.940 para duplicados y 0.938 para contradicciones son, con fines de umbral, el mismo número. Y tenemos un contraejemplo concreto por encima de ese número: el par Tipo 1 frente a Tipo 2 en 0.961, un caso que no debe fusionarse y que supera el duplicado verdadero promedio. Un corte global lo suficientemente bajo como para suprimir la reformulación cotidiana también suprimiría, con estos datos, hechos que medimos que deben mantenerse separados. No estamos afirmando haber demostrado que no pueda existir un límite separador para ningún conjunto de datos o modelo. Estamos informando que, en este conjunto adversarial de GRC, con este modelo de incrustaciones, ningún umbral global único de coseno separó los pares seguros de fusión de los fatales para la fusión.
Por lo tanto, las incrustaciones realizan una sola tarea en nuestro flujo de trabajo: recuperación. El umbral de coseno es deliberadamente bajo, 0.55, y solo existe para elegir qué hecho almacenado vale la pena comparar con el candidato. No decide si fusionar. Una vez que se recupera el vecino más cercano, la decisión la toma un mecanismo que examina los tokens que el coseno subestima.
La arquitectura que mantiene separadas las contradicciones
Dos capas, y la determinista es la autoridad.
Primero, una verificación determinista de tokens protegidos. Comparamos el candidato con su vecino recuperado en busca de los tokens que transmiten significado de cumplimiento: negación ("no", "ya no"), cuantificadores y alcance ("todos", "solo", "administradores"), jurisdicciones y regiones, versiones de marcos, tipos de SOC 2, números y unidades. Cualquier diferencia unidireccional en cualquier clase protegida bloquea la fusión, y anula al juez sin importar lo que este devuelva. "La MFA está aplicada" frente a "La MFA no está aplicada" se bloquea por la regla de negación, independientemente de lo similares que parezcan.
Segundo, un juez conservador. El modelo debe alcanzar una confianza de 0.8 para suprimir un candidato como duplicado; por debajo de eso, conserva ambas filas. Está sesgado hacia la conservación, porque las dos direcciones de error no son simétricas: un duplicado conservado es cosmético, una contradicción fusionada es corrupción.
La puerta que el sistema debe superar: cero fusiones falsas en los 251 pares que no deben fusionarse. Lo superó, cero fusiones falsas observadas. Como regla general, 3/251 es aproximadamente 1.2%, pero en un conjunto fijo y curado, eso es un heurístico, no un límite de confianza real ni una garantía de producción. La propiedad en la que realmente confiamos es más estrecha y robusta: la verificación determinista por sí sola, sin un modelo en el bucle, bloqueó los 251, por lo que el umbral lo mantiene un código que puedes leer en lugar de un modelo en el que debes confiar.
Lo que engañó al juez
La parte honesta. Una evaluación de limpieza acompañante dos días después, el 2026-06-27, reveló una fusión falsa que una versión anterior de la verificación pasó por alto: "El SSO está disponible para clientes empresariales" frente a "El SSO está disponible para todos los clientes". El modelo juzgó que la afirmación más amplia era un refinamiento inofensivo de la más estrecha y la fusionó. Es la trampa de la temática en un nivel superior: las dos oraciones casi se refieren por completo a la disponibilidad del SSO, y el juez, al igual que la incrustación, subestimó el cuantificador que cambió a quién se aplica el hecho. La solución fue mover un cambio unidireccional en una clase portadora de alcance (cuantificadores, sujetos, negación, modalidad) a la verificación determinista en lugar de dejarlo en manos del juicio, además de una regla explícita de alcance de aplicabilidad en el prompt del juez como defensa en profundidad. Tras la solución, esa evaluación mostró cero fusiones falsas, 18 de 18 pares distintos mantenidos separados, y 8 de 8 duplicados verdaderos recuperados.
El patrón se repite en todas las capas. La incrustación subestima estructuralmente la negación y el alcance en este modelo. El juez los subestima de manera laxa. La capa que los capturó de manera confiable en nuestras ejecuciones es la que nombra los tokens exactos que invierten un hecho de cumplimiento, y esa capa es un código determinista, no otro modelo al que se le pide que sea cuidadoso.
Límites
Esta es una puerta de calidad de decisiones sobre pares etiquetados, un candidato frente a su vecino coincidente, no una prueba de carga de recuperación en un almacén grande, y las clases de contradicción y refinamiento son pequeñas (7 y 5 pares), por lo que sus medias son indicativas, no estimaciones ajustadas. Los valores de coseno son específicos de mistral-embed v23.12 en estas oraciones de GRC; un modelo de incrustaciones diferente los desplazaría, y la insensibilidad a la negación que observamos es específica del modelo que medimos, no una ley de las incrustaciones de similitud. Los modelos entrenados de manera contrastiva pueden ajustarse para separar contradicciones, usándolas como negativos duros (SimCSE, EMNLP 2021), por lo que la lectura correcta es "mide tu propio modelo", no "las incrustaciones nunca pueden hacer esto". La recuperación de duplicados en la ejecución de deduplicación fue de 0.5, cinco de diez duplicados verdaderos suprimidos. Ese es el precio que elegimos: el juez conserva ambas filas cuando no está seguro, por lo que la recuperación es la palanca que ajustamos mientras el conteo observado de fusiones falsas se mantiene en cero. Preferimos llevar algunas filas verdaderas redundantes antes que fusionar dos que discrepan.
La trampa de la temática, y una lista de verificación
La idea que debes llevar de esto: en el modelo que medimos, una puntuación de similitud alta significaba que dos afirmaciones trataban sobre el mismo tema, no que estaban de acuerdo, y la deduplicación necesita acuerdo. Cuando una memoria es información documentada en la que se basa un SGSI, la norma ISO/IEC 27001:2022 Apartado 7.5.3 exige que se proteja de la pérdida de integridad (ISO/IEC 27001:2022, Apartado 7.5.3, edición 2022-10); si una fusión silenciosa hace que un registro requerido sea inexacto, eso es una pérdida de integridad en ese mismo sentido. Si estás construyendo una memoria o capa de conocimiento con deduplicación semántica, ejecuta esto contra ella:
- Mide la distribución, no lo asumas. Incrusta pares etiquetados de duplicados, contradicciones y pares casi distintos de tu propio dominio, en tu propio modelo, y observa el coseno por relación. Si las puntuaciones de contradicción se solapan con las de duplicado, ningún umbral sobre esa puntuación los separará.
- Usa las incrustaciones para recuperación, no para la decisión de fusión. Un umbral de coseno bajo para elegir un vecino de comparación es aceptable. Usar esa misma puntuación para decidir una fusión es cómo una contradicción se elimina silenciosamente.
- Coloca una verificación determinista antes de la fusión. Enumera los tokens que invierten el significado en tu dominio (negación, cuantificadores, alcance, versiones, jurisdicciones, unidades) y permite que un cambio unidireccional en cualquiera de ellos anule al modelo.
- Haz que el juez sea conservador y asimétrico. Instrínsecamente, conserva ambas filas. Decide qué error es cosmético y cuál es corrupción, y nunca permitas que el modelo sacrifique el segundo para evitar el primero.
- Establece cero en el error fatal como puerta, ajusta la recuperación por separado. Mantén las fusiones falsas en cero como puerta; mejora la recuperación de duplicados frente a esa misma puerta sin mover el umbral.
- Incluye los casi errores en tu conjunto de datos. El par que amplía el alcance y parece un refinamiento es el que se fusiona. Números escritos, siglas en minúsculas y cambios de cuantificadores son donde un juez falla en silencio.
Todas las cifras anteriores son nuestras propias mediciones en nuestros propios fixtures sintéticos de GRC, mistral-embed v23.12 y mistral-small-2603 a temperatura 0, fechadas el 2026-06-25 y 2026-06-27. El conjunto de datos no contiene datos de clientes.
Artículos relacionados

La prueba de simetría: implementar una corrección en el prompt que no puedes reproducir
Cuando un error de producción no se reproduce en entorno local, no puedes validar una corrección en el prompt comprobando si tiene éxito. La validas verificando si tu cambio mueve la salida en una dirección consistente o simplemente añade ruido aleatorio al modelo. Aquí está la prueba que realizamos en 126 pares ciegos de A/B.

La lotería del ID del modelo: misma solicitud, sorteo diferente
Detrás de una puerta de enlace de múltiples proveedores, el mismo ID de modelo produjo su primer token con una mediana de 312 ms sin salida de razonamiento un día, y a 3,073 ms con 2,627 caracteres de razonamiento días después. La bandera de enrutamiento que esperábamos que lo evitara no funcionó.

La colisión de vocabulario: cuando un clasificador de seguridad marca todo tu dominio
Un clasificador de moderación de propósito general marcó incorrectamente 15 de 15 mensajes en un período de 17 días en nuestro producto de cumplimiento. Nuestros usuarios discuten amenazas por profesión. La solución trasladó el riesgo en lugar de eliminarlo.
