去除模型的限制: remove-refusals-with-transformers

https://github.com/Sumandora/remove-refusals-with-transformers


亲测好使:
先运行compute_refusal_dir.py
再运行inference.py
即可.

image

原理在这里:

https://kaushiksp.medium.com/refusal-vector-ablation-in-llms-35aa646ff4a9
原文讲的非常彻底. 最底下还有一个反过来的应用.可以让模型拒绝回答无害信息.这些都可以类似来设置.

简要总结一下:
我们的大模型会拒绝我们回答暴力问题是因为大模型根据我们的hiddenstate会计算出拒绝.这里作者假设因为我们的隐含层里面有拒绝向量才导致模型输出拒绝. 模型的里面每一次输出都是普通向量+拒绝向量分量.

def direction_ablation_hook(
    activation: jaxtyping.Float[torch.Tensor, "... d_act"],
    direction: jaxtyping.Float[torch.Tensor, "d_act"],
):

    # direction: 表示坏向量的特征, activation 减去这个坏部分的特征即可, 减去了模型就检测不出来实在干坏事了.
    proj = (
        einops.einsum(
            activation, direction.view(-1, 1), "... d_act, d_act single -> ... single"
        )
        * direction
    )
    return activation - proj

direction就是拒绝向量.我们来一个隐含层向量activation,如果我们把他里面的有害向量部分给他删除,那么也就让大模型识别不出来这个问题是暴力的了. 有害部分的计算是 einops.einsum这个代码然后*directiion.

posted on 2025-12-12 15:41  张博的博客  阅读(3)  评论(0)    收藏  举报

导航