Show HN: Cactus Hybrid: 我们教会了Gemma 4识别自身错误

Hacker News Top 模型

摘要

Cactus Hybrid是一款经过后训练的Gemma 4模型,可输出置信度分数,支持在设备端进行推理,并在置信度较低时路由至更大模型,以最少的大模型调用实现了与Gemini 3.1 Flash-Lite相当的性能。

嘿,HN,我们是Cactus的Henry和Roman。<p>小型设备端模型快速且私密,但有时会出错,而前沿模型又变得相当昂贵。因此,我们对Gemma 4 E2B进行了后训练,使其能够识别自身错误。每次响应都会给出一个0到1之间的置信度分数。开发者可以在置信度高时接受设备端结果,置信度低时则交由更大的云端模型处理。通过仅将15-35%的查询路由至Gemini 3.1 Flash-Lite,Gemma-4-E2B在大多数基准测试中与Gemini 3.1 Flash-Lite表现相当。<p>- ChartQA: 15-20%<p>- LibriSpeech: 25-30%<p>- MMBench, GigaSpeech, MMAU: 30-35%<p>- MMLU-Pro: 45-55%<p>我们一直对混合应用所依赖的路由信号感到困扰:让模型用文本自我评分(不可靠,而且还要解析文字),或者使用令牌熵启发式方法(在我们的测试中几乎不比抛硬币好)。因此,我们对小型模型(尤其是Gemma 4)进行了机制研究,发现不同层的隐藏状态在各种情况下都携带有意义的自我意识信号。<p>因此,我们为模型增加了一个68k参数探针层(包括LayerNorm、低秩投影、注意力池化、小型MLP头),在解码时读取一个中间层并预测p(错误);置信度 = 1 - p(错误),以结构化数据返回,无需从答案文本中解析。<p>在涵盖文本、视觉和音频的12个保留基准测试中,探针的平均AUROC为0.814,而令牌熵为0.549。让我们确信这一发现真实性的结果是:该探针在零音频数据上训练,却在四个音频基准测试上取得了0.79-0.88的AUROC,而熵在这些测试中接近随机或更差(0.32-0.52)。它从隐藏状态中读取了一种与模态无关的正确性信号,而不是记忆训练数据中的模式。<p>我们已在HuggingFace上发布了所有权重,并提供了可复制粘贴的代码,以在Transformers、MLX、Llama.cpp或Cactus上运行。Ollama、vLLM、SGLang等支持正在开发中。对于llama.cpp,我们提供了一系列需一次性编译的补丁(计划向上游提交)。代码采用MIT许可证;Gemma模型的使用仍受Gemma条款约束。<p>GitHub: <a href="https:&#x2F;&#x2F;github.com&#x2F;cactus-compute&#x2F;cactus-hybrid" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;cactus-compute&#x2F;cactus-hybrid</a><p>Weights: <a href="https:&#x2F;&#x2F;huggingface.co&#x2F;collections&#x2F;Cactus-Compute&#x2F;cactus-hybrid-6a60da4551074db058e8bb64" rel="nofollow">https:&#x2F;&#x2F;huggingface.co&#x2F;collections&#x2F;Cactus-Compute&#x2F;cactus-hyb...</a><p>一些说明:<p>- 探针仅适用于单序列解码,最多前1024个生成令牌。<p>- 在任务级的多步骤处理过程中进行路由时,切换效果最佳,而非每一步都切换。<p>- 分层路由仍在开发中:尝试设备端,然后DeepSeek v4 Flash,最后是Fable&#x2F;GPT5.5&#x2F;Gemini&#x2F;Muse&#x2F;Grok。<p>- 该技术针对每个模型定制,我们将在模型推出时分享相应的权重。<p>这些问题目前正在Cactus解决,更新后的权重将直接推送到HuggingFace集合和GitHub仓库。请告诉我们您的想法,这有助于我们逐步改进设计。<p>万分感谢!
查看原文
查看缓存全文

缓存时间: 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下
ChartQA15–20%25–30%40–50%
MMBench30–35%40–45%50–55%
LibriSpeech25–30%35–40%55–65%
GigaSpeech30–35%40–45%50–55%
MMAU30–35%35–40%50–55%
MMLU-Pro45–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.7700.697
MMLU-Pro文本选择题0.7710.692
ARC-Easy文本选择题0.8880.655
ARC-Challenge文本选择题0.8340.646
GSM8K (3-shot)文本生成0.7820.731
MMBench-EN-Dev视觉选择题0.8400.435
ChartQA视觉问答0.7790.615
DocVQA视觉问答0.7810.512
MMAU音频选择题0.7890.517
GigaSpeech音频0.8760.343
Earnings-22音频0.8390.323
LibriSpeech音频0.8220.427
均值0.8140.549

最显著的结果:该探针在零音频数据上训练,却在四个音频基准测试(两个转录任务、一个音频选择题、一个领域外转录任务)上取得了0.79–0.88的AUROC。

这排除了表面解释的可能性——探针实际上是从隐层状态读取了一个与模态无关的正确性信号,而非记忆训练数据中的模式。


MIT许可证。Gemma模型的使用需遵守Gemma条款。

相似文章

推出 Gemma 3

Google DeepMind Blog

Google 推出了 Gemma 3,这是一套轻量级开源模型集合(1B、4B、12B、27B),设计用于在单个 GPU 或 TPU 上运行,支持 140+ 种语言、128k 上下文窗口和多模态功能。这些模型在保持高效性能的同时,性能超越了 Llama 3 和 DeepSeek-V3 等更大的竞品,适合边缘设备部署。