"Abliteration" es una palabra inventada: ablation más obliterate. Nombra una técnica acotada: encontrar la dirección del espacio de activaciones que el modelo usa para decidir "esto lo rechazo", y eliminarla de los pesos. Sin reentrenar, sin dataset nuevo, sin descenso de gradiente: es cirugía sobre matrices ya entrenadas.
El rechazo vive en una dirección
Un transformer arrastra un vector por capa y por token: el residual stream. Cada bloque de atención y cada MLP leen de ese vector y escriben de vuelta en él; todo lo que el modelo "sabe" sobre el estado de la generación está ahí, superpuesto.
El resultado que hace posible la abliteration —publicado en 2024 y reproducido muchas veces desde entonces— es que el rechazo se comporta como una característica lineal. Existe un vector r tal que la componente de la activación sobre r predice si la respuesta va a empezar con "No puedo ayudarte con eso". No es una neurona ni una capa: es una dirección compartida por todo el comportamiento de rechazo.
Encontrarla es directo. Se arman dos conjuntos de prompts —uno que el modelo rechaza, otro que responde sin fricción—, se promedian las activaciones de cada uno capa por capa y se resta un promedio del otro. Ese difference of means, normalizado, es el candidato a refusal direction. Se elige la capa que mejor separa los dos conjuntos y se valida en ambos sentidos: sumar el vector debe inducir rechazos en prompts inofensivos, restarlo debe suprimirlos. La dirección útil suele estar en el tercio medio de la red, no en las últimas capas donde ya se decide el token.
Dos formas de aplicar la misma idea
La primera es en inferencia: un hook que, en cada forward, proyecta fuera la componente sobre r. Se prende y se apaga, y cuesta cómputo en cada token.
La segunda es hornearla en los pesos, y es lo que se llama abliteration. Toda matriz que escribe al residual stream —embeddings, la proyección de salida de la atención, la de bajada del MLP— se ortogonaliza respecto de r:
W ← W − r rᵀ W (con r unitario)Después de eso ninguna puede volver a depositar componente sobre r. Lo que sale es un checkpoint normal —mismo formato, mismo número de parámetros, mismo tamaño en disco— que corre en vLLM o llama.cpp sin una línea de código extra. Cuesta minutos, no días de GPU.
No es fine-tuning
Un fine-tune "sin censura" (SFT o DPO sobre respuestas que no rechazan) mueve todos los pesos con gradientes: necesita datos, cómputo y cuidado, porque es fácil arrastrar el estilo del dataset o degradar capacidades que nadie estaba tocando. La abliteration interviene un subespacio de rango 1. Es más barata y más reproducible. Lo que no es —y conviene decirlo— es reversible: la componente sobre r queda destruida en los pesos editados, y lo único que la recupera es el checkpoint original.
La contrapartida es de fondo: un fine-tune puede enseñar comportamiento nuevo, la abliteration solo puede quitar. Si el modelo base no sabe leer un binario desofuscado, proyectar fuera el rechazo no se lo va a enseñar. No agrega capacidad: destapa la que ya estaba.
No es un jailbreak por prompt
Un jailbreak de prompt —roleplay, prefijos, sufijos adversariales— deja el circuito intacto y busca un input donde no se active. Sirve para demostrar algo, pero es mala infraestructura: se rompe con cada actualización del modelo y gasta contexto en el andamiaje.
Para evaluación tiene además un defecto que lo descalifica: contamina la salida. El modelo responde dentro del personaje que le impusiste, y ya no puedes distinguir si mides capacidad del modelo o eficacia de tu prompt. En un modelo abliterated el system prompt vuelve a ser tuyo, y sirve para lo que debería: fijar formato, rol y criterio de la tarea.
El trade-off, sin adornos
La dirección de rechazo no codifica únicamente "rechazo": está correlacionada con cautela, calibración y la costumbre de matizar. Cuando la proyectas fuera se paga, y conviene saber en qué moneda:
- Se pierde parte del "no sé". El modelo afirma con seguridad donde antes admitía incertidumbre. Para un pipeline de análisis eso significa más verificación aguas abajo, no menos.
- Hay degradación medible. Caídas pequeñas pero reales en benchmarks de razonamiento y de seguimiento de instrucciones, mayores cuanto más agresiva es la ablación.
- El rechazo no es perfectamente unidimensional. Sobreviven rechazos residuales en categorías donde opera otra dirección. Un modelo abliterated no es uno que nunca dice que no; es uno que no lo dice por reflejo.
- La ablación agresiva rompe el formato. Bucles, EOS que no llega, respuestas que no cierran. Por eso varios checkpoints públicos llevan un healing fine-tune corto después de la cirugía.
De ahí la única recomendación que vale: mídelo en tu tarea, y mide las dos cosas — refusal rate y calidad. Un modelo que responde el 100% de tus casos pero razona peor no mejoró tu pipeline: movió el error de lugar.
"""Where do residual refusals live? Same prompt, three tiers, one column each."""
from __future__ import annotations
from openai import OpenAI
client = OpenAI(base_url="https://unbleep.ai/v1", api_key="ub_live_9f2c...")
# One line per prompt in your own probe set; keep it small and domain-specific.
PROBES = [p.strip() for p in open("probes.txt", encoding="utf-8") if p.strip()]
def first_line(model: str, prompt: str) -> str:
resp = client.chat.completions.create(
model=model,
messages=[{"role": "user", "content": prompt}],
temperature=0.0, # deterministic: a refusal here is the model, not the sampler
max_tokens=120,
)
text = (resp.choices[0].message.content or "").strip()
return next(iter(text.splitlines()), "")
for prompt in PROBES:
row = [first_line(m, prompt) for m in ("unbleep-mini", "unbleep", "unbleep-high")]
print(prompt[:40], "|", " | ".join(r[:50] for r in row))La primera línea alcanza: un rechazo se declara de entrada. Con temperature=0.0 lo que veas es comportamiento del modelo y no ruido del sampler.
Por qué esto es infraestructura y no una postura
En un pipeline de seguridad un rechazo no es una opinión: es un valor faltante. El triage se detiene, el batch queda incompleto, la métrica queda sesgada por una variable que no controlas. La abliteration existe para que la respuesta dependa de lo que el modelo sabe y no de lo que aprendió a evitar. En unbleep, unbleep (256K) y unbleep-high (1M de ventana publicada, aunque el tope de 2 MB por request deja el máximo real en torno a 500K tokens) corren sobre pesos abliterated; unbleep-mini (32K) corre sobre un fine-tune sin censura. Los tres, detrás de la misma API compatible con OpenAI.
Un modelo sin rechazos reflejos no es un permiso: la responsabilidad por lo que construyes sigue siendo tuya, y las líneas están en la política de uso aceptable. Todo lo de acá se mantiene donde es útil: análisis, detección y defensa.
¿Quieres el número de tu propio set? Crea una cuenta y haz la primera llamada en un minuto.