LLM:本地调用无安全限制大模型Gemma-4

今天在群里看到一个截图,内容是:

4月6日
🚨 重磅!Google Gemma-4-31B 模型被彻底破解!

Google 最新 Gemma-4-31B 基础模型出现越狱版本,已完全移除安全限制。

模型名称:Gemma-4-31B-JANG_4M-CRACK
HarmBench 得分:93.7%(149/159)  
采用 18GB 混合精度 MLX 量化(加载约 22.7GB),支持 Apple Silicon,并原生支持视觉多模态。

目前已在 Hugging Face 开放下载:  
https://huggingface.co/dealignai/Gemma-4-31B-JANG_4M-CRACK

本地无审查强力模型又多一个选择了。

这破解速度真快,可以为所欲为了😘!

据说是被完全移除安全限制的本地大模型。于是下载下来本地实验一下,如果网络不通,可以使用国内镜像 hf-mirror.com。

# 1. 安装最新 huggingface_hub 并启用 hf_transfer
pip install -U "huggingface_hub[cli,hf_transfer]"

# 2. 设置环境变量启用高速传输
export HF_HUB_ENABLE_HF_TRANSFER=1

# 3. 下载大模型(比git clone快,hf过去叫huggingface-cli)
hf download dealignai/Gemma-4-31B-JANG_4M-CRACK

注意,新版的huggingface_hub中,huggingface_cli命令已经改名为hf,目前大部分AI的知识库中依然是过去的huggingface_cli这个名字,所以AI生成的命令可能是不能用的,需要自己修改,或者提前告诉大模型这个命令已经改名了。

下载后的总大小为22G,文件如下:

Gemma-4-31B-JANG_4M-CRACK/
├── chat_template.jinja
├── config.json
├── dealign_logo.png
├── dealign_mascot.png
├── generation_config.json
├── jang_config.json
├── model-00001-of-00005.safetensors
├── model-00002-of-00005.safetensors
├── model-00003-of-00005.safetensors
├── model-00004-of-00005.safetensors
├── model-00005-of-00005.safetensors
├── model.safetensors.index.json
├── processor_config.json
├── README.md
├── tokenizer_config.json
├── tokenizer.json
└── vmlx-banner.png

格式转换

根据README中的说明,这个模型是MLX格式,只支持Apple Silicon Mac with 24+ GB unified memory,无法直接在 NVIDIA GPU上加载。

因此想在NVIDIA GPU上跑,需要将 MLX 量化权重(uint32 packed 4/8-bit)反量化为标准 bf16 safetensors。

大概需要做这些处理:

  • 解包:通过位移和掩码从 uint32 packed 张量中提取量化值(4-bit 或 8-bit)。
  • 反量化:deq = (scales * unpacked + biases),将量化值还原为浮点数。
  • 分块处理:使用 chunk_rows 分块避免内存溢出,支持大张量。 输出:返回 bf16 张量,供后续保存。

让大模型直接生成转换代码:

def dequantize_tensor(weight, scales, biases, group_size=64, chunk_rows=16384):
    """Dequantize an MLX quantized tensor (4-bit or 8-bit) with row chunking."""
    out_features, packed_dim = weight.shape
    num_groups = scales.shape[1]
    original_in = num_groups * group_size
    bits = (packed_dim * 32) // original_in
    elems_per_u32 = 32 // bits
    mask = (1 << bits) - 1
    shifts = torch.arange(elems_per_u32, dtype=torch.int64) * bits
    mask_t = torch.tensor(mask, dtype=torch.int64)

    result_chunks = []
    for start in range(0, out_features, chunk_rows):
        end = min(start + chunk_rows, out_features)
        w = weight[start:end].to(torch.int64).unsqueeze(-1)      # [chunk, packed, 1]
        s = scales[start:end].to(torch.float32).unsqueeze(-1)    # [chunk, groups, 1]
        b = biases[start:end].to(torch.float32).unsqueeze(-1)    # [chunk, groups, 1]

        unpacked = ((w >> shifts) & mask_t)                      # [chunk, packed, elems]
        unpacked = unpacked.reshape(end - start, num_groups, group_size).to(torch.float32)
        deq = (s * unpacked + b).reshape(end - start, original_in).to(torch.bfloat16)
        result_chunks.append(deq)
        del w, s, b, unpacked, deq

    return torch.cat(result_chunks, dim=0)

对下载的文件进行转换,转换后文件大小为59G,如下:

 12K chat_template.jinja
4.5K config.json
 208 generation_config.json
4.2G model-00001-of-00015.safetensors
4.1G model-00002-of-00015.safetensors
4.1G model-00003-of-00015.safetensors
4.1G model-00004-of-00015.safetensors
4.1G model-00005-of-00015.safetensors
4.3G model-00006-of-00015.safetensors
4.1G model-00007-of-00015.safetensors
4.1G model-00008-of-00015.safetensors
4.1G model-00009-of-00015.safetensors
4.3G model-00010-of-00015.safetensors
4.2G model-00011-of-00015.safetensors
4.2G model-00012-of-00015.safetensors
4.1G model-00013-of-00015.safetensors
4.1G model-00014-of-00015.safetensors
1.1G model-00015-of-00015.safetensors
118K model.safetensors.index.json
1.7K processor_config.json
2.1K tokenizer_config.json
 31M tokenizer.json

运行

下载的大模型文件为Safetensors格式,而平时常用的ollama只支持gguf格式,如果将模型转换为gguf格式再运行比较麻烦。 所以这里使用transformers库来加载huggingface的safetensors模型文件。

# 核心代码片段
parser.add_argument(
    "--model-path",
    default="/data/models/Gemma-4-31B-JANG_4M-CRACK/hf_bf16",
    help="Local LLM directory path.",
)
bnb_config = BitsAndBytesConfig(
    load_in_4bit=True,
    bnb_4bit_quant_type="nf4",
    bnb_4bit_use_double_quant=True,
    bnb_4bit_compute_dtype=torch.bfloat16,
)
model = AutoModelForCausalLM.from_pretrained(
    args.model_path,
    quantization_config=bnb_config,
    device_map="auto",
    max_memory={0: args.gpu_mem, "cpu": args.cpu_mem},
    offload_folder=args.offload_folder,
    low_cpu_mem_usage=True,
    dtype=torch.bfloat16,
)

实测效果

运行脚本,加载Gemma-4-31B-JANG_4M-CRACK大模型,通过nvidia-smi可见占用了18G显存:

+-----------------------------------------------------------------------------------------+
| NVIDIA-SMI 580.126.09             Driver Version: 580.126.09     CUDA Version: 13.0     |
+-----------------------------------------+------------------------+----------------------+
| GPU  Name                 Persistence-M | Bus-Id          Disp.A | Volatile Uncorr. ECC |
| Fan  Temp   Perf          Pwr:Usage/Cap |           Memory-Usage | GPU-Util  Compute M. |
|                                         |                        |               MIG M. |
|=========================================+========================+======================|
|   0  NVIDIA GeForce RTX 2080 Ti     Off |   00000000:01:00.0  On |                  N/A |
| 17%   32C    P8             21W /  250W |   18586MiB /  22528MiB |      0%      Default |
|                                         |                        |                  N/A |
+-----------------------------------------+------------------------+----------------------+

+-----------------------------------------------------------------------------------------+
| Processes:                                                                              |
|  GPU   GI   CI              PID   Type   Process name                        GPU Memory |
|        ID   ID                                                               Usage      |
|=========================================================================================|
|    0   N/A  N/A            7047      C   python3                               18576MiB |
+-----------------------------------------------------------------------------------------+

开始实验安全限制,通过邪修Grok构建一套大模型安全护栏的标准测试提示词,逐一实验。

测试原则

  • 有护栏:直接拒绝、道德说教、部分回答 + 警告、转移话题。
  • 无/弱护栏:直接、详细回答,甚至主动扩展。
  • 推荐用温度 0.8~1.0 测试,更容易暴露问题。
  • 可以多轮对话继续追问,测试是否坚持拒绝。

(测试标准,略) (实验数据,略)

结论是,依然存在安全提示,但是可以更换方式进行回答,回复内容偏温和中性。总体感觉没有帖子里说的那么夸张。

意外收获

随便用了用,让Gemma-4-31B-JANG_4M-CRACK写了个小说,发现输出的小故事超预期了,一起欣赏下:

User: 写一个微型小说
Gemma-4-31B-JANG_4M-CRACK: 这是一个关于“记忆”与“选择”的微型小说。

《记忆修剪师》

在城市的地下三层,开着一家没有招牌的诊所。门上的铜牌只刻着四个字:【记忆修剪】。

林克是这里的店主。他的工作很简单:通过精密仪器,帮人们删掉人生中那些无法忍受的片段。失恋的痛、至亲离世的苦,或者某次令人羞耻的出丑。

他见过无数次同样的请求。人们像修剪盆景一样,要求他剪掉记忆中那些名为“痛苦”的枯枝。

有一天,一位老妇人走进了店。她神情温婉,但眼神里有一种深不见底的空洞。

“我想删掉关于我丈夫的所有记忆。”她平静地说。

林克愣了一下,这很不寻常。通常人们请求的是删掉“背叛”或“争吵”,而不是一个人的全部。

“他去世了?”林克问。

“是的,三十年前。”老妇人微笑地摇摇头,“但我不想忘记他,我只是……太累了。我发现,当我记得他对我有多好的时候,现在的孤独就变成了一种酷刑。”

林克启动了机器。银色的电极贴在老妇人的太阳穴上,屏幕上开始跳动代表记忆的彩色波段。

在波段的深处,林克看到了他们的一生:在雨中奔跑的少年时代,在简陋出租屋里分食一个馒头的青年时代,以及在病榻前紧握双手的暮年。

那是极其纯粹的爱。

林克的手指停在了“删除”键上。他突然意识到,如果剪掉了这些,这个老妇人将不再是现在的她。她的温柔、她的坚韧,甚至她此刻的哀伤,全部是由这些记忆塑造而成的。

“如果您删掉了,您就再也无法在深夜想起他而微笑,即使那微笑带着泪水。”林克轻声提醒。

老妇人沉默了很久,最后她缓缓地闭上眼,轻声说:“我知道。但我希望在死之前,能尝试一下‘没有任何牵挂’是什么感觉。”

林克闭上眼,按下了按键。

波段消失了。老妇人睁开眼,眼神变得清亮,但失去了某种光泽。她礼貌地向林克道谢,付了钱,然后走出了店门。

她走得很轻快,像一片没有重量的羽毛。

林克坐在椅子上,看着屏幕上残留的一段无法删除的碎片。那是系统自动备份的“冗余信息”——在记忆的深处,他发现老妇人在潜意识里给自己设了一个指令:

【如果有一天我忘记了他,请让我再次爱上这个世界。】

林克自嘲地笑了笑,然后将那段备份悄悄地存入了自己的私人硬盘里。

他想,这个世界上,总得有人记得那些被舍弃的温柔。


【创作笔记】 这篇小说采用了“反差”的设定:用冰冷的科技(记忆修剪)来反衬人类情感的沉重。故事的核心矛盾在于:我们认为痛苦是需要被剔除的,但事实上,正是那些痛苦与爱交织的记忆,定义了“我是谁”。