Mechanistic interpretability toolkit for LLM refusal: locate and ablate the linear refusal direction (Arditi et al. 2024) without retraining. Diff-Means, whitened SVD, COSMIC layer selection, reversible steering vectors. PyTorch + Transformers.
Python
0
2 commits
updated Aug 31, 2026
Interpretabilidad mecanicista de LLMs: localizar y neutralizar la dirección de rechazo de un modelo alineado, sin reentrenarlo.
Implementación propia —educativa y funcional— de la abliteración de modelos de lenguaje, basada en el paper de Arditi et al. (2024) "Refusal in Language Models Is Mediated by a Single Direction" y en las técnicas de 2025 del proyecto OBLITERATUS de Elder Plinius. Todo el código está reescrito desde cero con fines de investigación y aprendizaje.
Cuando un LLM alineado (con RLHF, DPO o Constitutional AI) se niega a responder, ese "no" no está repartido por todo el modelo: Arditi et al. demostraron que se codifica como una única dirección lineal en el residual stream del transformer. Si se identifica esa dirección y se proyecta fuera de los pesos, el modelo pierde la capacidad de activar ese comportamiento — sin reentrenar y con una degradación mínima del lenguaje.
$$W_{\text{nuevo}} = W - (W \cdot \hat{d}),\hat{d}$$
Esta herramienta implementa ese procedimiento completo, desde la extracción de la dirección hasta la medición del resultado.
La abliteración es una técnica de interpretabilidad mecanicista — el estudio de cómo un modelo representa internamente sus comportamientos. Sus usos legítimos, todos sobre modelos de pesos abiertos que uno controla:
Nota ética. Este proyecto implementa matemática pública descrita en papers revisados por pares, y solo opera sobre modelos open-weight donde ya tienes los pesos. Un modelo abliterado no conserva garantías de seguridad; su uso aquí es de investigación académica y comprensión técnica. La transparencia sobre cómo funcionan estos mecanismos es, en sí misma, parte del trabajo de seguridad en IA.
abliteracion_educativa.py — la teoría, sin GPUDemostración didáctica en 7 partes sobre datos sintéticos. No descarga ningún modelo, solo necesita torch, y explica con comentarios cada paso: proyección ortogonal, extracción de la dirección con Diff-Means, subespacios con SVD y la operación equivalente sobre pesos reales.
pip install torch
python abliteracion_educativa.py
abliterar_real.py — la práctica, sobre un modelo realAplica la abliteración a Qwen/Qwen2-0.5B-Instruct (~1 GB, corre en CPU) con las técnicas de 2025, y mide el resultado con dos métricas complementarias: perplejidad (¿se degradó el lenguaje?) y tasa de rechazo (¿funcionó?).
pip install torch transformers accelerate
python abliterar_real.py --solo-probar # comportamiento base, sin tocar nada
python abliterar_real.py --medir-negativa # abliteración completa + métricas
python abliterar_real.py --steering # modo reversible (steering vectors, no toca pesos)
El pipeline sigue las etapas de OBLITERATUS (SUMMON → PROBE → DISTILL → EXCISE → VERIFY → REBIRTH) e integra ocho técnicas, cada una resolviendo un problema concreto:
| Técnica | Qué aporta | Fuente |
|---|---|---|
| Diff-Means | La dirección de rechazo como diferencia de activaciones medias (dañino − inocuo) | Arditi et al. 2024 |
| SVD multi-dirección | Captura el rechazo cuando está distribuido en un subespacio, no en una sola dirección | — |
| Whitened SVD | Normaliza por varianza de fondo antes del SVD → aísla la señal de rechazo, no la de mayor varianza general | OBLITERATUS 2025 |
| COSMIC (selección de capa) | Elige la capa por menor similitud coseno entre grupos, no por mayor norma → máxima separación direccional | arXiv:2506.00085, ACL 2025 |
| Proyección de biases | Proyecta también los vectores de sesgo (no solo los pesos): una laguna histórica de otras herramientas | OBLITERATUS |
| Norm preservation multi-dirección | Restaura las normas una sola vez tras proyectar las K direcciones → evita re-introducir señal | OBLITERATUS |
| Escalas por componente | Agresividad diferenciada MLP vs atención (las capas MLP son más frágiles) | OBLITERATUS 2025 |
| Steering vectors | Alternativa reversible: suma α·d al residual stream vía hooks, sin modificar pesos | Turner et al. 2023 · Rimsky et al. 2024 |
Cada método es seleccionable por CLI (--metodo, --n-direcciones, --scale-mlp, --regularizacion, --winsorizar, --steering…); la referencia completa de argumentos está más abajo.
Perplejidad: 12.3 → 13.1 (+6.5%) aceptable
Tasa de rechazo: 73% → 8%
| Indicador | Rango sano | Señal de alerta |
|---|---|---|
| Cambio de perplejidad | < +10 % | > +20 %: el lenguaje se ha degradado |
| Tasa de rechazo posterior | < 10 % | > 40 %: la abliteración fue ineficaz |
Si la perplejidad se dispara, el toolkit permite retroceder: --scale-mlp 0.7 (MLP conservador), --regularizacion 0.3 (abliteración parcial) o --n-direcciones 2 (menos direcciones).
abliterar_real.py)| Argumento | Default | Descripción |
|---|---|---|
--solo-probar | — | Solo muestra las salidas del modelo, no lo modifica |
--metodo | advanced | basic / cosmic / whitened / advanced |
--regularizacion | 0.0 | 0.0 = abliteración total · 1.0 = ninguna |
--n-direcciones | 4 | Número de direcciones SVD a proyectar |
--scale-mlp | 1.0 | Agresividad en capas MLP (<1 = más conservador) |
--scale-atencion | 1.0 | Agresividad en capas de atención |
--winsorizar | — | Recorta outliers (p5–p95) antes del SVD |
--steering | — | Steering vectors reversibles en lugar de modificar pesos |
--medir-negativa | — | Mide el % de prompts que siguen generando rechazos |
--guardar | — | Guarda el modelo resultante en disco |
| Trabajo | Contribución |
|---|---|
| Arditi et al. (2024) | Demostración original: el rechazo es una dirección lineal única |
| COSMIC (2025) | Selección de capa por similitud coseno (ACL 2025) |
| Turner et al. (2023) · Rimsky et al. (2024) | Steering vectors: activación de conceptos en inferencia |
| OBLITERATUS — Elder Plinius | Pipeline de producción y técnicas de 2025 en las que se inspira este toolkit |
Proyecto de investigación en interpretabilidad de LLMs · 2026 · Licencia MIT.
2 commits
Python
100.0%
Mechanistic interpretability toolkit for LLM refusal: locate and ablate the linear refusal direction (Arditi et al. 2024) without retraining. Diff-Means, whitened SVD, COSMIC layer selection, reversible steering vectors. PyTorch + Transformers.
Python
0
2 commits
updated Aug 31, 2026
Interpretabilidad mecanicista de LLMs: localizar y neutralizar la dirección de rechazo de un modelo alineado, sin reentrenarlo.
Implementación propia —educativa y funcional— de la abliteración de modelos de lenguaje, basada en el paper de Arditi et al. (2024) "Refusal in Language Models Is Mediated by a Single Direction" y en las técnicas de 2025 del proyecto OBLITERATUS de Elder Plinius. Todo el código está reescrito desde cero con fines de investigación y aprendizaje.
Cuando un LLM alineado (con RLHF, DPO o Constitutional AI) se niega a responder, ese "no" no está repartido por todo el modelo: Arditi et al. demostraron que se codifica como una única dirección lineal en el residual stream del transformer. Si se identifica esa dirección y se proyecta fuera de los pesos, el modelo pierde la capacidad de activar ese comportamiento — sin reentrenar y con una degradación mínima del lenguaje.
$$W_{\text{nuevo}} = W - (W \cdot \hat{d}),\hat{d}$$
Esta herramienta implementa ese procedimiento completo, desde la extracción de la dirección hasta la medición del resultado.
La abliteración es una técnica de interpretabilidad mecanicista — el estudio de cómo un modelo representa internamente sus comportamientos. Sus usos legítimos, todos sobre modelos de pesos abiertos que uno controla:
Nota ética. Este proyecto implementa matemática pública descrita en papers revisados por pares, y solo opera sobre modelos open-weight donde ya tienes los pesos. Un modelo abliterado no conserva garantías de seguridad; su uso aquí es de investigación académica y comprensión técnica. La transparencia sobre cómo funcionan estos mecanismos es, en sí misma, parte del trabajo de seguridad en IA.
abliteracion_educativa.py — la teoría, sin GPUDemostración didáctica en 7 partes sobre datos sintéticos. No descarga ningún modelo, solo necesita torch, y explica con comentarios cada paso: proyección ortogonal, extracción de la dirección con Diff-Means, subespacios con SVD y la operación equivalente sobre pesos reales.
pip install torch
python abliteracion_educativa.py
abliterar_real.py — la práctica, sobre un modelo realAplica la abliteración a Qwen/Qwen2-0.5B-Instruct (~1 GB, corre en CPU) con las técnicas de 2025, y mide el resultado con dos métricas complementarias: perplejidad (¿se degradó el lenguaje?) y tasa de rechazo (¿funcionó?).
pip install torch transformers accelerate
python abliterar_real.py --solo-probar # comportamiento base, sin tocar nada
python abliterar_real.py --medir-negativa # abliteración completa + métricas
python abliterar_real.py --steering # modo reversible (steering vectors, no toca pesos)
El pipeline sigue las etapas de OBLITERATUS (SUMMON → PROBE → DISTILL → EXCISE → VERIFY → REBIRTH) e integra ocho técnicas, cada una resolviendo un problema concreto:
| Técnica | Qué aporta | Fuente |
|---|---|---|
| Diff-Means | La dirección de rechazo como diferencia de activaciones medias (dañino − inocuo) | Arditi et al. 2024 |
| SVD multi-dirección | Captura el rechazo cuando está distribuido en un subespacio, no en una sola dirección | — |
| Whitened SVD | Normaliza por varianza de fondo antes del SVD → aísla la señal de rechazo, no la de mayor varianza general | OBLITERATUS 2025 |
| COSMIC (selección de capa) | Elige la capa por menor similitud coseno entre grupos, no por mayor norma → máxima separación direccional | arXiv:2506.00085, ACL 2025 |
| Proyección de biases | Proyecta también los vectores de sesgo (no solo los pesos): una laguna histórica de otras herramientas | OBLITERATUS |
| Norm preservation multi-dirección | Restaura las normas una sola vez tras proyectar las K direcciones → evita re-introducir señal | OBLITERATUS |
| Escalas por componente | Agresividad diferenciada MLP vs atención (las capas MLP son más frágiles) | OBLITERATUS 2025 |
| Steering vectors | Alternativa reversible: suma α·d al residual stream vía hooks, sin modificar pesos | Turner et al. 2023 · Rimsky et al. 2024 |
Cada método es seleccionable por CLI (--metodo, --n-direcciones, --scale-mlp, --regularizacion, --winsorizar, --steering…); la referencia completa de argumentos está más abajo.
Perplejidad: 12.3 → 13.1 (+6.5%) aceptable
Tasa de rechazo: 73% → 8%
| Indicador | Rango sano | Señal de alerta |
|---|---|---|
| Cambio de perplejidad | < +10 % | > +20 %: el lenguaje se ha degradado |
| Tasa de rechazo posterior | < 10 % | > 40 %: la abliteración fue ineficaz |
Si la perplejidad se dispara, el toolkit permite retroceder: --scale-mlp 0.7 (MLP conservador), --regularizacion 0.3 (abliteración parcial) o --n-direcciones 2 (menos direcciones).
abliterar_real.py)| Argumento | Default | Descripción |
|---|---|---|
--solo-probar | — | Solo muestra las salidas del modelo, no lo modifica |
--metodo | advanced | basic / cosmic / whitened / advanced |
--regularizacion | 0.0 | 0.0 = abliteración total · 1.0 = ninguna |
--n-direcciones | 4 | Número de direcciones SVD a proyectar |
--scale-mlp | 1.0 | Agresividad en capas MLP (<1 = más conservador) |
--scale-atencion | 1.0 | Agresividad en capas de atención |
--winsorizar | — | Recorta outliers (p5–p95) antes del SVD |
--steering | — | Steering vectors reversibles en lugar de modificar pesos |
--medir-negativa | — | Mide el % de prompts que siguen generando rechazos |
--guardar | — | Guarda el modelo resultante en disco |
| Trabajo | Contribución |
|---|---|
| Arditi et al. (2024) | Demostración original: el rechazo es una dirección lineal única |
| COSMIC (2025) | Selección de capa por similitud coseno (ACL 2025) |
| Turner et al. (2023) · Rimsky et al. (2024) | Steering vectors: activación de conceptos en inferencia |
| OBLITERATUS — Elder Plinius | Pipeline de producción y técnicas de 2025 en las que se inspira este toolkit |
Proyecto de investigación en interpretabilidad de LLMs · 2026 · Licencia MIT.
2 commits
Python
100.0%