
Incrusta y detecta marcas de agua basadas en estilo y con clave en código Python, Java y C++ generado por LLM mediante reescritura de CST, preservando la corrección funcional y resistiendo ataques de edición de código.
| Característica | Watermarks a nivel de token (KGW, SWEET, Unigram, STONE, STA-1) | Watermarks post-hoc (ACW, SrcMarker, RoSeMary) | ✨ SEW |
|---|---|---|---|
| Acceso | En tiempo de decodificación (sesga la selección de tokens) | Post-hoc (reescribe código ya finalizado) | Post-hoc (reescribe código ya finalizado, agnóstico al modelo) |
| Corrección funcional | Modifica el programa (compromiso detección–corrección) | Puede romper programas (pass@1 en Java/C++ ≈ 12% con reescritura neuronal) | Preservada (pass@1 igual al del código sin watermark) |
| Previsibilidad | — | Patrones recurrentes (recuperados de 10 programas con watermark) | Dependiente de la clave y del contexto (las elecciones varían con la estructura de cada programa) |
| Detección (TPR@FPR5%) | 14–60% | 31–98% | ⚡ 98.7–99.5% |
El watermarking de código generado por LLM permite el seguimiento de procedencia. Los watermarks que modifican la selección de tokens durante la generación intercambian detectabilidad por corrección funcional, y requieren control sobre el modelo generador. Los métodos post-hoc, en cambio, marcan código ya completado con transformaciones predefinidas o modelos neuronales entrenados, pero sus patrones recurrentes hacen que el watermark sea predecible entre programas, y los patrones que ya son comunes en código sin watermark se cuentan como evidencia de watermark, lo que provoca detecciones falsas. SEW plantea: ¿puede el estilo de código de un programa ya generado portar un watermark que sea correcto por construcción, difícil de predecir y calibrado frente a código escrito por humanos?
SEW (Style-Encoded Watermarking) inserta y detecta watermarks en código ya generado mediante tres componentes:
x += 1 / x = x + 1, range(n) / range(0, n), if (c) s; / if (c) { s; }) se emparejan sobre el árbol de sintaxis concreta (CST). Qué variante toma un sitio lo decide una clave secreta y el contexto estructural del sitio.La detección solo necesita el código sospechoso y la clave — no el modelo generador, el código original ni ningún registro de la inserción.
✅ Agnóstico al modelo y correcto por construcción — SEW solo reescribe sitios de estilo donde ambas variantes tienen la misma semántica, por lo que funciona sobre la salida de cualquier modelo y mantiene el pass@1 igual al del código sin watermark.
✅ Evidencia calibrada — Una prueba Poisson-binomial con probabilidades de estilo estimadas a partir de código escrito por humanos (soluciones de LeetCode, disjuntas de los datos de evaluación) mantiene bajas las detecciones falsas sobre código humano.
✅ Robusto y difícil de inferir — SEW mantiene su detección bajo formateo, linting, eliminación de comentarios y renombrado de variables, y un adversario que observa programas con watermark no puede recuperar sus elecciones de estilo como recupera las de las líneas base post-hoc.
Resultado principal — detección en CodeContests (TPR@FPR5% / AUROC, %), promediado sobre tres LLM (Qwen3.5-9B, gemma-4-12B-it, gpt-oss-20b).
| Tipo | Método | Python | Java | C++ |
|---|---|---|---|---|
| A nivel de token | KGW | 48.33 / 80.56 | 43.30 / 72.31 | 59.31 / 84.54 |
| SWEET | 59.92 / 85.18 | 41.19 / 76.56 | 60.01 / 87.24 | |
| Unigram | 57.45 / 88.97 | 36.54 / 71.37 | 47.05 / 71.13 | |
| STONE | 28.09 / 62.33 | 14.38 / 62.95 | 23.65 / 64.79 | |
| STA-1 | 35.26 / 66.26 | 20.93 / 61.48 | 44.71 / 73.72 | |
| Post-hoc | ACW | 90.10 / 95.05 | – | – |
| SrcMarker | 90.21 / 97.86 | 71.52 / 93.58 | 69.88 / 81.55 | |
| RoSeMary | 97.86 / 97.32 | 31.00 / 95.46 | 81.26 / 89.44 | |
| SEW | 99.49 / 99.64 | 98.70 / 98.99 | 99.22 / 99.38 |
Corrección funcional (pass@1 del código con watermark, %; código sin watermark: 57.63 / 52.05 / 53.74).
| Método | Python | Java | C++ |
|---|---|---|---|
| ACW | 56.00 | – | – |
| SrcMarker | 56.78 | 11.87 | 11.82 |
| RoSeMary | 56.39 | 11.71 | 11.52 |
| SEW | 57.63 | 52.05 | 53.74 |
Robustez frente a ataques de edición de código (TPR@FPR5%, %, promediado sobre tres LLM y tres lenguajes; ACW: solo Python).