Show HN: Cactus Hybrid: 我们教会了Gemma 4识别自身错误
摘要
Cactus Hybrid是一款经过后训练的Gemma 4模型,可输出置信度分数,支持在设备端进行推理,并在置信度较低时路由至更大模型,以最少的大模型调用实现了与Gemini 3.1 Flash-Lite相当的性能。
查看缓存全文
缓存时间: 2026/07/22 23:24
cactus-compute/cactus-hybrid
来源: https://github.com/cactus-compute/cactus-hybrid
Cactus Hybrid
一个轻量级本地模型运行快速且保护隐私,但有时会出错。 在Cactus,我们通过后训练使模型知晓自身何时出错:我们在检查点内部植入探针,为每个答案打分,输出介于0到1之间的置信度,并以结构化数据形式返回(绝不从回答文本中解析)。当置信度高时,在设备本地作答;置信度低时,可将请求重新路由到更大的模型:
if confidence < 0.85:
answer = ask_a_bigger_model(prompt)
我们以Gemma 4 E2B Hybrid为起点推出此方案,所有构建版本均托管于Hugging Face上的Cactus Hybrid合集(https://huggingface.co/collections/Cactus-Compute/cactus-hybrid-6a60da4551074db058e8bb64)。
Gemma 4 E2B hybrid(Gemma系列最小模型)通过仅将15–35%的查询路由至Gemini 3.1 Flash-Lite,其余由自身处理,在大多数基准测试中与Gemini 3.1 Flash-Lite表现持平。
| 基准测试 | 匹配Flash-Lite (FP16) 的转交率 | 4-bit下 | 3-bit下 |
|---|---|---|---|
| ChartQA | 15–20% | 25–30% | 40–50% |
| MMBench | 30–35% | 40–45% | 50–55% |
| LibriSpeech | 25–30% | 35–40% | 55–65% |
| GigaSpeech | 30–35% | 40–45% | 50–55% |
| MMAU | 30–35% | 35–40% | 50–55% |
| MMLU-Pro | 45–55% | ~90% | n/a |
- 注意:量化质量依据Cactus Quants(https://github.com/cactus-compute/cactus/blob/main/docs/cactus_quants.md)衡量,该方案在均匀量化下表现良好。
- 建议开发者针对Unsloth、GGUF和MLX量化方案独立进行基准测试。
Cactus
# pip install cactus-compute
import json
from cactus.bindings.cactus import cactus_complete, cactus_init
from cactus.cli.download import download_bundle
lm = cactus_init(str(download_bundle("Cactus-Compute/gemma-4-E2B-it")))
result = cactus_complete(
lm,
[{"role": "user", "content": "What is the capital of France?"}],
json.dumps({"max_tokens": 512, "auto_handoff": False}),
None,
lambda *_: None,
)
print(result["response"].strip())
print("confidence:", result["confidence"])
MLX
# pip install mlx-lm
import re
from mlx_lm import load, generate
model, tokenizer = load(
"Cactus-Compute/gemma-4-e2b-it-hybrid-mlx",
tokenizer_config={"trust_remote_code": True},
)
messages = [{"role": "user", "content": "What is the capital of France?"}]
answer = generate(
model,
tokenizer,
prompt=tokenizer.apply_chat_template(messages, add_generation_prompt=True),
max_tokens=512,
)
# 检查点会在回答前进行推理;仅保留最终答案
answer = re.split(r"<\|?channel\|?>", answer)[-1]
answer = re.sub(r"^(thought|final)\b\s*", "", answer).strip()
print(answer)
print("confidence:", model.last_confidence)
Transformers
# pip install "transformers>=5.5.4,<5.6" torch (5.14及以上版本在该检查点上会导致段错误)
import torch
from transformers import AutoModelForCausalLM, AutoTokenizer
model_id = "Cactus-Compute/gemma-4-e2b-it-hybrid"
device = "cuda" if torch.cuda.is_available() else "mps" if torch.backends.mps.is_available() else "cpu"
tokenizer = AutoTokenizer.from_pretrained(model_id, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(model_id, trust_remote_code=True, dtype="auto").to(device)
messages = [{"role": "user", "content": "What is the capital of France?"}]
inputs = tokenizer.apply_chat_template(
messages, add_generation_prompt=True, return_tensors="pt", return_dict=True
).to(device)
out = model.generate(**inputs, return_confidence=True, max_new_tokens=512)
print(tokenizer.decode(out.sequences[0][inputs["input_ids"].shape[-1]:], skip_special_tokens=True))
print("confidence:", out.confidence)
加载模型时请使用显式的.to(device),而非device_map="auto":探针在模块的forward()路径之外对生成结果进行评分,因此加速卸载的权重(留在meta设备上)会导致置信度读取崩溃。
llama.cpp
llama.cpp基于C++,因此探针需要以补丁形式编译进引擎(参见patches/llama.cpp/)。一次性构建打过补丁的服务端:
git clone https://github.com/cactus-compute/cactus-hybrid && cd cactus-hybrid
./patches/llama.cpp/install.sh && rehash
然后像普通llama-server一样运行并查询——响应会携带一个顶层的confidence字段:
llama-server -hf Cactus-Compute/gemma-4-e2b-it-hybrid-GGUF:Q4_K_M --jinja
curl -s http://localhost:8080/v1/chat/completions \
-d '{"messages":[{"role":"user","content":"What is the capital of France?"}],"max_tokens":512}' \
| jq '{answer: .choices[0].message.content, confidence}'
路由质量 (AUROC)
Gemma 4 E2B Hybrid的AUROC衡量模型将错误答案与正确答案区分开来的能力(越高越好,0.5为随机,1.0为完美):
| 保留集 | 模态 | Cactus Hybrid | 令牌熵 |
|---|---|---|---|
| MMLU | 文本选择题 | 0.770 | 0.697 |
| MMLU-Pro | 文本选择题 | 0.771 | 0.692 |
| ARC-Easy | 文本选择题 | 0.888 | 0.655 |
| ARC-Challenge | 文本选择题 | 0.834 | 0.646 |
| GSM8K (3-shot) | 文本生成 | 0.782 | 0.731 |
| MMBench-EN-Dev | 视觉选择题 | 0.840 | 0.435 |
| ChartQA | 视觉问答 | 0.779 | 0.615 |
| DocVQA | 视觉问答 | 0.781 | 0.512 |
| MMAU | 音频选择题 | 0.789 | 0.517 |
| GigaSpeech | 音频 | 0.876 | 0.343 |
| Earnings-22 | 音频 | 0.839 | 0.323 |
| LibriSpeech | 音频 | 0.822 | 0.427 |
| 均值 | 0.814 | 0.549 |
最显著的结果:该探针在零音频数据上训练,却在四个音频基准测试(两个转录任务、一个音频选择题、一个领域外转录任务)上取得了0.79–0.88的AUROC。
这排除了表面解释的可能性——探针实际上是从隐层状态读取了一个与模态无关的正确性信号,而非记忆训练数据中的模式。
MIT许可证。Gemma模型的使用需遵守Gemma条款。
相似文章
Cactus Hybrid: 我们教会了Gemma 4识别自己的错误
谷歌的Gemma 4模型已被增强,能够识别自己何时出错,从而提高了其校准和可靠性。
Cactus Hybrid Router:通过将15-55%的任务路由到Gemini,其余在本地运行,Gemma4-2B可与Gemini-3.1-Flash-Lite匹敌。
Cactus Hybrid Router是一个65k参数的模型,它动态地在本地边缘模型(如Gemma4-2B)和前沿云模型(如Gemini-3.1-Flash-Lite)之间路由任务,以优化成本和性能,具有可调节的边缘-云比例,并支持文本、视觉和音频提示。
Gemma 4 发布:前沿多模态智能,端侧可用
Google DeepMind 发布 Gemma 4,这是一系列前沿多模态模型,已在 Hugging Face 上以 Apache 2 协议开源,针对端侧部署进行了优化,并支持多种推理框架。
@MiaAI_lab:我使用Fable-5风格推理和助手轨迹对Gemma 4 12B进行了微调,并将其发布为Gemmable 4 12b。**可用…
Mia-AiLab发布了Gemmable 4 12B,这是Google Gemma 4 12B模型的微调版本,使用了Fable-5风格推理和助手轨迹,提供GGUF和MLX格式用于本地推理。
推出 Gemma 3
Google 推出了 Gemma 3,这是一套轻量级开源模型集合(1B、4B、12B、27B),设计用于在单个 GPU 或 TPU 上运行,支持 140+ 种语言、128k 上下文窗口和多模态功能。这些模型在保持高效性能的同时,性能超越了 Llama 3 和 DeepSeek-V3 等更大的竞品,适合边缘设备部署。