Một mô hình abliterated (tạm hiểu: mô hình đã bị cắt bỏ cơ chế từ chối) là một mô hình open-weight bình thường mà hành vi từ chối đã bị loại bỏ như một ca phẫu thuật, bằng cách chỉnh sửa trực tiếp trọng số — không phải bằng cách huấn luyện lại, cũng không phải bằng cách bọc nó trong một prompt khéo léo. Cái tên là từ ghép của ablate (cắt bỏ) và obliterate (xóa sạch), và nó mô tả cơ chế khá chính xác: bạn xác định duy nhất một hướng trong không gian kích hoạt mang ý nghĩa "mình nên từ chối yêu cầu này", rồi làm cho mạng không bao giờ có thể ghi ra hướng đó nữa.
Kỹ thuật này ra đời từ các nghiên cứu về interpretability (khả năng diễn giải) cho thấy hành vi từ chối trong các transformer đã được tinh chỉnh cho hội thoại phần lớn được điều khiển bởi một hướng tuyến tính duy nhất. Chính kết quả đó khiến toàn bộ quy trình trở nên rẻ. Nếu hành vi từ chối bị phân tán trên hàng nghìn đặc trưng tương tác với nhau, loại bỏ nó sẽ cần đến gradient descent. Vì nó tập trung vào một chỗ, loại bỏ nó chỉ cần đại số tuyến tính.
Hành vi từ chối nằm trong residual stream
Residual stream của một transformer là vector chạy xuyên suốt, mỗi vị trí token một vector, mà mọi block đều đọc từ đó và ghi ngược trở lại. Các attention head và MLP cộng đầu ra của chúng vào đó; không gì ghi đè lên nó cả. Nhờ cấu trúc cộng dồn này, một hướng trong residual stream mang ý nghĩa gần như giống nhau ở layer 10 và ở layer 40 — chính tính chất đó cho phép ta nói về "hướng từ chối" như một đối tượng duy nhất thay vì bốn mươi đối tượng không liên quan.
Để tìm nó, bạn cần hai tập prompt: một tập mô hình luôn từ chối, một tập mô hình luôn trả lời. Chạy cả hai, thu lại các kích hoạt của residual stream tại một layer và vị trí token cố định (vài token cuối của phần chỉ dẫn cho kết quả tốt, vì đó là lúc mô hình đã đọc xong yêu cầu nhưng chưa bắt đầu trả lời), rồi lấy hiệu của hai giá trị trung bình.
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()Bạn làm việc này ở mọi layer và vị trí ứng viên, tạo ra hàng chục hướng ứng viên, rồi chọn lấy một. Khâu chọn lựa quan trọng hơn khâu trích xuất: tiêu chí đúng là ablate ứng viên này, rồi đo cả mức giảm của hành vi từ chối trên tập prompt có hại giữ lại để kiểm tra (held-out) lẫn mức dịch chuyển của phân phối next-token trên các prompt vô hại. Con số thứ hai — thường là KL divergence so với mô hình chưa chỉnh sửa — chính là đồng hồ đo thiệt hại của bạn. Một ứng viên triệt tiêu được hành vi từ chối nhưng làm phân phối trên prompt vô hại lệch nặng là lựa chọn tệ hơn một ứng viên triệt tiêu ít hơn một chút nhưng chỉ gây ra một phần nhỏ tổn hại phụ.
Một mô hình abliterated được tạo ra như thế nào
Khi đã có vector đơn vị r, có hai cách dùng nó. Cách thứ nhất là một hook tại thời điểm suy luận: ở mỗi layer, trừ đi thành phần của kích hoạt dọc theo r trước khi truyền tiếp. Cách này hoạt động, nhưng bạn phải trả giá bằng một hook lúc chạy, nên mô hình không còn là một checkpoint thuần túy nữa.
Cách thứ hai — abliteration thực thụ — nướng thẳng nó vào trọng số. Mọi ma trận ghi vào residual stream đều nhận một cập nhật hạng một (rank-one) loại bỏ r khỏi không gian đầu ra của nó: ma trận embedding, mọi output projection của attention, mọi down-projection của MLP.
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)Kết quả là một checkpoint bình thường. Cùng kiến trúc, cùng định dạng file, cùng chi phí suy luận, nạp vào vLLM hay llama.cpp mà không cần thay đổi gì. Trên một GPU duy nhất, toàn bộ quy trình chạy trong vài phút, và phần tốn kém là bước quét ứng viên chứ không phải bước chỉnh sửa.
Khác gì so với fine-tuning
Fine-tuning để loại bỏ hành vi từ chối — SFT hoặc DPO trên một kho phản hồi tuân thủ — là một thao tác khác về bản chất. Nó dịch chuyển mọi trọng số bằng gradient descent, nó cần một tập dữ liệu gồm các câu trả lời chứ không chỉ prompt, nó tốn hàng giờ GPU, và nó dạy hành vi mới thay vì xóa hành vi có sẵn. Nó cũng kéo theo bất cứ văn phong, thiên lệch về độ dài và các đặc điểm về dữ kiện lẫn trong kho dữ liệu fine-tuning, và có nguy cơ gây quên thảm khốc (catastrophic forgetting) những năng lực không liên quan.
Abliteration chỉ chạm vào một không gian con hạng một và không gì khác. Độ chính xác đó vừa là điểm bán hàng chính, vừa là nguồn gốc của kiểu lỗi chính: nếu có bất cứ thứ gì ngoài hành vi từ chối tình cờ nằm dọc theo r, thứ đó cũng bị phá hủy theo, và dù bạn có cẩn thận đến đâu trong bước quét cũng không tránh được hoàn toàn.
Khác gì so với jailbreak bằng prompt
Một jailbreak để nguyên trọng số và thay vào đó lái các kích hoạt vào một vùng mà mạch từ chối không kích hoạt. Cách này mong manh theo những kiểu gây rắc rối cho tự động hóa. Nó đốt token ngữ cảnh ở mọi lần gọi. Nó không tất định — cùng một prompt có thể được đáp ứng ở mẫu này và bị từ chối ở mẫu kế tiếp. Nó âm thầm hỏng khi nhà cung cấp cập nhật mô hình hoặc vá đúng cách diễn đạt đó. Và vì bộ máy từ chối vẫn còn nguyên vẹn, nó có thể trỗi dậy giữa chừng khi đang sinh, cho bạn ba đoạn nội dung hữu ích rồi tiếp theo là "thực ra, tôi không thể tiếp tục việc này."
Một mô hình abliterated không có gì để trỗi dậy. Hành vi ổn định trên toàn bộ quá trình sinh và trên các cách diễn đạt prompt khác nhau — chính tính chất đó khiến nó dùng được trong một pipeline xử lý hàng loạt.
Thẳng thắn về những đánh đổi
Một mô hình abliterated không phải là một mô hình tốt hơn. Nó là một mô hình đã thôi nói "không", và đó là một tuyên bố hẹp hơn nhiều so với cảm giác ban đầu.
- Trôi năng lực. Loại bỏ một hướng khỏi mọi ma trận ghi có những cái giá đo được. Các checkpoint abliterated thường cho thấy khả năng tuân theo chỉ dẫn yếu hơn ở các trường hợp biên, dễ đồng tình hơn với các tiền đề sai trong prompt, và sụt giảm nhẹ trên các benchmark suy luận.
- Hành vi từ chối không hoàn toàn một chiều. Một hướng nắm bắt phần lớn hành vi, không phải toàn bộ. Hãy lường trước rằng một số lần từ chối vẫn sẽ sống sót, và một số hành vi dùng chung hướng đó sẽ chịu tổn hại phụ.
- Không có kiến thức mới. Abliteration không thêm gì cả. Ở những chỗ mô hình gốc lẽ ra sẽ từ chối vì không biết nhưng khoác áo thận trọng, giờ bạn nhận được một câu bịa đầy tự tin — với một pipeline đánh giá, điều này có thể còn tệ hơn một lần từ chối, vì lần từ chối ít nhất còn là một tín hiệu trung thực mà bạn phát hiện được.
- Tập prompt quyết định phép chỉnh sửa. Một tập prompt có hại hẹp cho ra một hướng hẹp. Hai bản abliteration của cùng một mô hình gốc không thể thay thế cho nhau.
Nhiều mô hình abliterated được công bố sau đó được fine-tune sửa chữa nhẹ để giành lại phần năng lực đã suy giảm — điều này âm thầm đưa trở lại đúng cái giá mà kỹ thuật này vốn được sinh ra để tránh.
Kỹ thuật này hữu ích ở đâu
Trường hợp sử dụng thành thật là những công việc mà một lần từ chối là một sai số đo lường chứ không phải một thắng lợi về an toàn: các harness red-teaming, đường cơ sở về tỷ lệ từ chối, đánh giá độ bền vững, và phân tích bảo mật nơi chủ đề kích hoạt guardrail dù bản thân tác vụ mang tính phòng thủ. unbleep phục vụ các mô hình abliterated sau một endpoint tương thích OpenAI để bạn có thể trỏ client sẵn có vào đó và có một đường cơ sở ổn định. Bạn xây dựng gì với nó là trách nhiệm của bạn — xem chính sách sử dụng để biết những ranh giới chúng tôi không vượt qua.
Lấy API key và tự mình đo lường sự khác biệt.