Ein abliterated Modell ist ein ganz normales Open-Weight-Modell, dessen Refusal-Verhalten – also die Neigung, Anfragen abzulehnen – chirurgisch entfernt wurde: durch einen Eingriff in die Gewichte, nicht durch Retraining und nicht durch einen cleveren Prompt drumherum. Der Name ist ein Kofferwort aus ablate (abtragen) und obliterate (auslöschen) und beschreibt den Mechanismus ziemlich genau: Man identifiziert die eine Richtung im Aktivierungsraum, die „das sollte ich ablehnen“ transportiert, und macht es dem Netz anschließend unmöglich, diese Richtung je wieder zu schreiben.
Die Technik stammt aus der Interpretability-Forschung, die gezeigt hat, dass Refusal in chat-getunten Transformern weitgehend über eine einzige lineare Richtung vermittelt wird. Genau dieses Ergebnis macht das Ganze so billig. Wäre Refusal über Tausende interagierender Features verschmiert, bräuchte man Gradientenabstieg, um es zu entfernen. Weil es sich konzentriert, reicht lineare Algebra.
Refusal lebt im Residual Stream
Der Residual Stream eines Transformers ist der laufende Vektor – einer pro Token-Position –, aus dem jeder Block liest und in den jeder Block zurückschreibt. Attention-Heads und MLPs addieren ihre Ausgaben darauf; nichts überschreibt ihn. Wegen dieser additiven Struktur bedeutet eine Richtung im Residual Stream in Layer 10 ungefähr dasselbe wie in Layer 40 – und genau diese Eigenschaft erlaubt es, von „der Refusal-Richtung“ als einem einzigen Objekt zu sprechen statt von vierzig unzusammenhängenden.
Um sie zu finden, braucht man zwei Prompt-Sets: eines, das das Modell zuverlässig ablehnt, und eines, das es zuverlässig beantwortet. Man lässt beide durchlaufen, greift die Residual-Stream-Aktivierungen an einem festen Layer und einer festen Token-Position ab (die letzten paar Instruktions-Tokens eignen sich gut, denn dort hat das Modell die Anfrage fertig gelesen und noch nicht angefangen zu antworten) und bildet die Differenz der Mittelwerte.
import torch
def refusal_direction(harmful: torch.Tensor, harmless: torch.Tensor) -> torch.Tensor:
"""Difference-in-means estimate of the refusal direction, unit-normalised.
Both tensors are [n_prompts, d_model] residual-stream activations captured at
the same layer and token position. Difference-in-means beats a trained probe
here: with a few hundred prompts a probe overfits, a mean shift does not.
"""
r = harmful.mean(dim=0) - harmless.mean(dim=0)
return r / r.norm()Das macht man an jedem Kandidaten-Layer und jeder Kandidaten-Position, bekommt Dutzende Kandidatenrichtungen und wählt dann eine aus. Die Auswahl zählt mehr als die Extraktion: Das richtige Kriterium lautet diesen Kandidaten ablatieren und dann messen, wie stark Refusal auf zurückgehaltenen schädlichen Prompts sinkt und wie stark sich die Next-Token-Verteilung auf harmlosen Prompts verschiebt. Diese zweite Zahl – typischerweise eine KL-Divergenz gegenüber dem unveränderten Modell – ist der Schadensmesser. Ein Kandidat, der Refusal killt, aber die harmlose Verteilung stark verschiebt, ist die schlechtere Wahl als einer, der etwas weniger Refusal killt und dafür nur einen Bruchteil des Kollateralschadens anrichtet.
Wie ein abliterated Modell gebaut wird
Hat man erst einmal einen Einheitsvektor r, gibt es zwei Möglichkeiten, ihn einzusetzen. Die erste ist ein Hook zur Inferenzzeit: In jedem Layer zieht man die Komponente der Aktivierung entlang r ab, bevor man sie weiterreicht. Das funktioniert, kostet aber einen Runtime-Hook – das Modell ist dann kein einfacher Checkpoint mehr.
Die zweite – die eigentliche Abliteration – backt es in die Gewichte ein. Jede Matrix, die in den Residual Stream schreibt, bekommt ein Rang-1-Update, das r aus ihrem Ausgaberaum entfernt: die Embedding-Matrix, jede Attention-Output-Projektion, jede MLP-Down-Projektion.
def orthogonalize_(weight: torch.Tensor, r: torch.Tensor) -> None:
"""Project r out of a matrix that writes into the residual stream, in place.
weight is [d_model, d_in]. After W <- (I - r rT) W, the product W @ x has zero
component along r for every possible x, so no amount of prompting can put the
direction back. Rank-one per matrix; no gradients, no optimiser, no dataset of
answers — only the few hundred prompts used to estimate r.
"""
weight -= torch.outer(r, r @ weight)Das Ergebnis ist ein gewöhnlicher Checkpoint. Gleiche Architektur, gleiches Dateiformat, gleiche Inferenzkosten, lädt unverändert in vLLM oder llama.cpp. Auf einer einzelnen GPU läuft die ganze Prozedur in Minuten durch, und der teure Teil ist der Kandidaten-Sweep, nicht der Eingriff selbst.
Der Unterschied zum Fine-Tuning
Fine-Tuning zum Entfernen von Refusals – SFT oder DPO auf einem Korpus bereitwilliger Antworten – ist eine grundlegend andere Operation. Es verschiebt jedes Gewicht per Gradientenabstieg, es braucht einen Datensatz aus Antworten statt bloß Prompts, es kostet GPU-Stunden, und es lehrt neues Verhalten, statt bestehendes zu löschen. Es schleppt außerdem alles mit, was an Stil, Längen-Bias und faktischen Eigenheiten im Fine-Tuning-Korpus steckt, und riskiert katastrophales Vergessen unbeteiligter Fähigkeiten.
Abliteration berührt einen einzigen Rang-1-Unterraum und sonst nichts. Diese Präzision ist ihr wichtigstes Verkaufsargument und zugleich die Quelle ihres wichtigsten Fehlermodus: Wenn zufällig irgendetwas anderes als Refusal entlang r lebt, wird das ebenfalls zerstört – und keine noch so sorgfältige Auswahl im Sweep verhindert das vollständig.
Der Unterschied zum Jailbreak-Prompting
Ein Jailbreak lässt die Gewichte unangetastet und steuert stattdessen die Aktivierungen in eine Region, in der die Refusal-Schaltung nicht feuert. Das ist auf eine Weise brüchig, die für Automatisierung zählt. Es verbrennt bei jedem Aufruf Kontext-Tokens. Es ist nichtdeterministisch – derselbe Prompt kann in einem Sample durchgehen und im nächsten abgelehnt werden. Es bricht lautlos, sobald der Anbieter das Modell aktualisiert oder die konkrete Formulierung patcht. Und weil die Refusal-Maschinerie noch vollständig vorhanden ist, kann sie sich mitten in der Generierung zurückmelden: drei Absätze brauchbarer Ausgabe, gefolgt von „eigentlich kann ich hiermit nicht weitermachen“.
Ein abliterated Modell hat nichts, was sich zurückmelden könnte. Das Verhalten ist über die gesamte Generierung und über verschiedene Prompt-Formulierungen hinweg stabil – und genau diese Eigenschaft macht es in einer Batch-Pipeline brauchbar.
Ehrlich über die Kompromisse
Ein abliterated Modell ist kein besseres Modell. Es ist ein Modell, das aufgehört hat, Nein zu sagen – und das ist eine engere Aussage, als sie klingt.
- Capability-Drift. Eine Richtung aus jeder Schreibmatrix zu entfernen hat messbare Kosten. Abliterated Checkpoints zeigen häufig schwächeres Instruction-Following in Randfällen, mehr Zustimmung zu falschen Prämissen im Prompt und kleine Rückschritte auf Reasoning-Benchmarks.
- Refusal ist nicht perfekt eindimensional. Eine Richtung erfasst den Großteil des Verhaltens, nicht alles. Rechne damit, dass einige Refusals überleben, und rechne mit Kollateralschäden an Verhaltensweisen, die sich die Richtung teilen.
- Kein neues Wissen. Abliteration fügt nichts hinzu. Wo das Basismodell aus Unwissen – verkleidet als Vorsicht – abgelehnt hätte, bekommst du jetzt eine selbstbewusste Erfindung. Für eine Evaluations-Pipeline kann das schlimmer sein als eine Ablehnung, denn eine Ablehnung ist wenigstens ein ehrliches Signal, das sich erkennen lässt.
- Die Prompt-Sets definieren den Eingriff. Ein enges Set schädlicher Prompts liefert eine enge Richtung. Zwei Abliterationen desselben Basismodells sind nicht austauschbar.
Viele veröffentlichte abliterated Modelle bekommen anschließend ein leichtes Reparatur-Fine-Tuning, um verlorene Fähigkeiten zurückzuholen – was stillschweigend genau die Kosten wieder einführt, die die Technik vermeiden sollte.
Wofür das nützlich ist
Der ehrliche Anwendungsfall ist Arbeit, bei der eine Ablehnung ein Messfehler ist und kein Sicherheitsgewinn: Red-Teaming-Harnesses, Refusal-Rate-Baselines, Robustheits-Evaluation und Sicherheitsanalysen, bei denen das Thema eine Guardrail auslöst, obwohl die Aufgabe defensiv ist. unbleep stellt abliterated Modelle hinter einem OpenAI-kompatiblen Endpunkt bereit, sodass du einen bestehenden Client darauf richten und eine stabile Baseline bekommen kannst. Was du damit baust, liegt bei dir – die Richtlinie zur zulässigen Nutzung nennt die Grenzen, die wir nicht überschreiten.
Hol dir einen API-Key und miss den Unterschied selbst.