← 전체 글 보기

Abliterated 모델이란 무엇인가?

2026-08-20 · 4 분 소요 · abliteration, uncensored-models

abliterated 모델이란 평범한 오픈 웨이트 모델에서 거부(refusal) 동작만을 가중치 편집으로 외과적으로 제거한 모델입니다. 재학습을 한 것도 아니고, 교묘한 프롬프트로 감싼 것도 아닙니다. 이름은 ablate(절제하다)와 obliterate(말소하다)를 합친 조어이고, 메커니즘을 정확히 담고 있습니다. 활성화 공간에서 "이 요청은 거절해야 한다"는 신호를 실어 나르는 단 하나의 방향을 찾아낸 뒤, 네트워크가 그 방향을 두 번 다시 쓸 수 없게 만드는 것입니다.

이 기법은 채팅용으로 튜닝된 트랜스포머의 거부가 대체로 하나의 선형 방향에 의해 매개된다는 해석 가능성(interpretability) 연구에서 나왔습니다. 전체 과정을 저렴하게 만드는 것이 바로 이 결과입니다. 거부가 서로 얽힌 수천 개의 피처에 흩어져 있었다면 이를 제거하는 데 경사 하강법이 필요했을 것입니다. 한곳에 집중되어 있기 때문에, 선형대수만으로 제거할 수 있습니다.

거부는 잔차 스트림에 산다

트랜스포머의 잔차 스트림(residual stream)은 토큰 위치마다 하나씩 존재하는 누적 벡터로, 모든 블록이 여기서 읽고 여기에 다시 씁니다. 어텐션 헤드와 MLP는 자기 출력을 여기에 더할 뿐, 무엇도 이를 덮어쓰지 않습니다. 이 덧셈 구조 덕분에 잔차 스트림의 한 방향은 10번째 레이어에서나 40번째 레이어에서나 대략 같은 의미를 가지며, 바로 이 성질 때문에 "거부 방향"을 서로 무관한 마흔 개가 아니라 하나의 대상으로 이야기할 수 있습니다.

이를 찾으려면 두 개의 프롬프트 세트가 필요합니다. 하나는 모델이 안정적으로 거부하는 것, 다른 하나는 안정적으로 답하는 것입니다. 둘을 모두 실행하고, 고정된 레이어와 토큰 위치에서 잔차 스트림 활성화를 수집한 뒤(지시문의 마지막 몇 토큰이 잘 맞습니다. 모델이 요청을 다 읽었지만 아직 답을 시작하지 않은 지점이기 때문입니다), 두 평균의 차이를 구합니다.

python
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()

이 작업을 후보가 될 만한 모든 레이어와 위치에서 반복하면 수십 개의 후보 방향이 나오고, 그중 하나를 고릅니다. 선택이 추출보다 중요합니다. 올바른 기준은 이 후보를 절제한 뒤, 별도로 남겨 둔 유해 프롬프트에서 거부가 얼마나 줄었는지와 무해한 프롬프트에서 다음 토큰 분포가 얼마나 움직였는지를 함께 측정하는 것입니다. 두 번째 수치 — 보통 수정하지 않은 모델과의 KL 발산 — 가 손상의 척도입니다. 거부는 없애지만 무해한 분포를 크게 흔드는 후보는, 거부를 조금 덜 없애더라도 부수 피해가 몇 분의 일에 그치는 후보보다 나쁜 선택입니다.

abliterated 모델은 어떻게 만들어지는가

단위 벡터 r을 손에 넣었다면 쓰는 방법은 두 가지입니다. 첫째는 추론 시점 훅입니다. 모든 레이어에서 활성화의 r 방향 성분을 빼고 다음으로 넘깁니다. 동작은 하지만 런타임 훅이 하나 필요하므로, 모델이 더 이상 평범한 체크포인트가 아니게 됩니다.

둘째 — 진짜 abliteration — 는 이를 가중치에 굽습니다. 잔차 스트림에 쓰는 모든 행렬에 랭크-1 업데이트를 적용해 출력 공간에서 r을 제거합니다. 임베딩 행렬, 모든 어텐션 출력 프로젝션, 모든 MLP 다운 프로젝션이 대상입니다.

python
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)

결과물은 평범한 체크포인트입니다. 같은 아키텍처, 같은 파일 형식, 같은 추론 비용이며 vLLM이나 llama.cpp에서 수정 없이 그대로 로드됩니다. GPU 한 장이면 전체 절차가 몇 분 안에 끝나고, 비용이 드는 부분은 편집이 아니라 후보 스윕입니다.

파인튜닝과 무엇이 다른가

거부를 없애기 위한 파인튜닝 — 순응적 응답 코퍼스에 대한 SFT나 DPO — 은 근본적으로 다른 작업입니다. 경사 하강법으로 모든 가중치를 움직이고, 프롬프트만이 아니라 답변 데이터셋이 필요하며, GPU 시간이 들고, 기존 동작을 삭제하는 것이 아니라 새 동작을 가르칩니다. 파인튜닝 코퍼스에 깃든 문체, 길이 편향, 사실 관계의 버릇까지 함께 끌고 오며, 무관한 능력의 파국적 망각(catastrophic forgetting) 위험도 있습니다.

abliteration은 랭크-1 부분공간 하나만 건드리고 다른 것은 손대지 않습니다. 이 정밀함이 주된 장점이자 주된 실패 양상의 근원입니다. 거부 이외의 무언가가 우연히 r 방향에 함께 살고 있다면 그것도 같이 파괴되며, 스윕을 아무리 신중하게 해도 이를 완전히 피할 수는 없습니다.

탈옥 프롬프트와 무엇이 다른가

탈옥(jailbreak)은 가중치를 건드리지 않고, 대신 거부 회로가 발화하지 않는 영역으로 활성화를 유도합니다. 이는 자동화에서 중요한 방식으로 취약합니다. 호출마다 컨텍스트 토큰을 소모합니다. 비결정적이어서 같은 프롬프트가 한 샘플에서는 따르고 다음 샘플에서는 거부할 수 있습니다. 제공자가 모델을 업데이트하거나 특정 표현을 패치하면 소리 없이 깨집니다. 그리고 거부 장치가 여전히 온전히 남아 있기 때문에 생성 도중에 되살아나, 유용한 세 문단 뒤에 "사실 이 이상은 계속할 수 없습니다"가 따라오기도 합니다.

abliterated 모델에는 되살아날 것이 없습니다. 동작이 생성 전체에 걸쳐, 그리고 프롬프트 표현이 달라져도 안정적이며, 바로 이 성질이 배치 파이프라인에서 쓸 수 있게 해 줍니다.

트레이드오프를 솔직하게 말하면

abliterated 모델은 더 나은 모델이 아닙니다. 거절을 그만둔 모델일 뿐이고, 이는 들리는 것보다 좁은 주장입니다.

공개된 abliterated 모델 상당수는 저하된 능력을 되찾기 위해 사후에 가벼운 보수 파인튜닝을 거치는데, 이는 이 기법이 피하려던 바로 그 비용을 조용히 다시 불러들입니다.

어디에 유용한가

정직한 사용처는 거부가 안전상의 성과가 아니라 측정 오류인 작업입니다. 레드티밍 하네스, 거부율 기준선, 견고성 평가, 그리고 작업 자체는 방어적이지만 주제가 가드레일을 건드리는 보안 분석이 그렇습니다. unbleep은 abliterated 모델을 OpenAI 호환 엔드포인트 뒤에서 제공하므로, 기존 클라이언트를 그대로 연결해 안정적인 기준선을 얻을 수 있습니다. 그것으로 무엇을 만들지는 여러분의 책임입니다 — 우리가 넘지 않는 선은 허용 사용 정책을 참고하세요.

API 키를 발급받고 차이를 직접 측정해 보세요.