Heretic(p-e-w/heretic):不训练一个参数,让优化器自动「改写」大模型行为

一、导读

当大多数团队还在琢磨「怎么把模型微调得更听话」时,GitHub 上的 Heretic 走了反方向:完全不训练,用数学优化直接改写开放权重模型的行为——默认动作是移除拒答,也能抑制谄媚、削减口水话、调整情感对齐。作者 Philipp Emanuel Weidmann 刚在 2026 年 11 月 1 日发布 v2.0,把自研的 ARA(任意秩消融)设为默认算法并引入通用插件系统,仓库随即冲上 GitHub Trending 前列(截至 2026-11-04,单日涨星 699,总星数 38,745)。这篇文章拆解它的三段式架构与 ARA 算法原理,并给出可落地的使用场景与边界。

二、项目速览

维度 内容
仓库 p-e-w/heretic
定位 Training-free 语言模型修改工具(免训练行为改造)
语言与许可 Python(PyTorch + Optuna + PEFT),AGPL-3.0
作者 Philipp Emanuel Weidmann(GitHub ID:p-e-w),核心贡献者 119 次提交
当前版本 v2.0.0(2026-11-01 发布,v1.x 配置不兼容)
星标数据 38,745 stars / 4,377 forks(截至 2026-11-04,GitHub API)
社区产出 8,640 个 Heretic 模型、累计下载 8,968 万次、30 天下载 1,449 万次、1,835 位创作者(Heretic Live,2026-11-03 快照)
硬件门槛 单张消费级显卡即可,RTX 3090 上处理 Qwen3-4B 约 30–40 分钟
安装 pip install -U heretic-llm,一条命令处理任意 Hugging Face 模型

三、为什么是它:三日之内两波涨星的动因

Heretic 并非新项目——它 2025 年 9 月创建,11 月开源后已在 LocalLLaMA 社区稳定流行。这一轮涨星(近 72 小时数百星、周榜 7,255 星)的直接动因是 v2.0.0 大版本发布:

  1. 默认算法换成 ARA。v1.x 用的是经典「方向消融」(abliteration),v2.0 换成作者自研的任意秩消融(Arbitrary-Rank Ablation),不再依赖「拒绝方向」假设。社区评测帖显示 ARA 产出的模型在 MMLU、GSM8K 等标准基准上优于既有消融工具的产出。
  2. 通用插件系统。修饰器与评分器全部插件化,用户可以写自己的评分函数定义「我想要模型变成什么样」,v2.0 还加入基准评分器防止改坏能力。
  3. 可复现性成为一等公民。每个上传 Hugging Face 的模型可附带约 9 KB 的 reproduce.json 清单,任何人几分钟就能在本地重建出逐字节一致的模型,由此形成分布式的「Grimoire 模型库」。

传播面上的信号也齐了:仓库挂着 TrendShift「每日热榜第一」徽章,Hacker News 上「Heretic 2.0 Released」于 11 月 1 日当天进入首页,开发节奏没有丝毫放缓——11 月 3 日仍在合并新特性(自定义配置路径、v2.1.0.dev0 版本号已就位),这说明涨星背后是一个正在活跃演进的项目,而非一场借旧版本余热的回光返照。

更深层看,它把一件原本属于大公司的事——修改模型本身——交还给了个人。微调需要数据集、训练管线和大量算力,而 Heretic 的论点是:行为修改在数学上是一个可以直接求解的优化问题,一块游戏显卡、一个下午就够。

四、架构原理

4.1 三段式架构:修饰器、评分器、优化器

Heretic 的核心是一个「提议 → 修改 → 打分」的优化循环,由三层可插拔组件构成:

Heretic 整体架构手绘图:Optuna TPE 优化器、Modifier 修饰器、Scorer 评分器三层组件与产出环节构成的优化闭环

flowchart TB
    subgraph OPT["Optuna TPE 优化器(外层循环)"]
        O1["提议一组参数:层区间、目标权重、邻居数等"]
        O2["汇总得分,决定下一组参数<br/>默认 100 次试验,前 30 次随机探索"]
    end
    subgraph MOD["Modifier 修饰器(改权重)"]
        M1["ARA 任意秩消融(v2 默认)"]
        M2["方向消融 Abliteration(v1 经典路线)"]
    end
    subgraph SC["Scorer 评分器(打分)"]
        S1["KeywordRate:拒绝关键词命中率"]
        S2["KLDivergence:与原模型的行为距离"]
        S3["BERTClassifier:分类器判定拒绝"]
        S4["BenchmarkScore:PIQA 等能力基准"]
    end
    HF["Hugging Face 原始权重"] --> MOD
    O1 --> MOD
    MOD -->|"修改后模型"| SC
    SC -->|"拒绝率下降 + 行为距离受控"| O2
    O2 --> O1
    O2 -->|"最优参数"| OUT["产出模型:保存 / 上传 / 对话测试 / 跑基准"]
    OUT --> RP["reproduce.json 可复现清单(约 9 KB)"]
  • 修饰器(Modifier)负责真正改动权重,决定「怎么改」。v2.0 内置两种:ARA(默认)与经典方向消融。
  • 评分器(Scorer)负责给修改后的模型打分,定义「改成什么样才算好」。默认组合是「拒绝率尽量低 + 与原模型的 KL 散度尽量小」,两个目标同时优化,互为刹车。
  • 优化器(Optuna TPE)在最外层做超参搜索:每次试验提议一组修饰参数,跑完评分后反馈给 TPE(Tree-structured Parzen Estimator,树结构 Parzen 估计器),默认 100 次试验、前 30 次纯随机探索,支持 checkpoint 断点续跑。

4.2 理论地基:拒绝方向假说与其局限

经典消融技术建立在 Arditi 等人 2024 年的论文《Refusal in Language Models Is Mediated by a Single Direction》(arXiv:2406.11717)之上。该研究在 13 个开源对话模型(最大 72B)中发现:拒绝行为由残差流激活中的一个一维子空间介导——把这个方向从激活中抹掉,模型就不再拒绝有害指令;人为加入这个方向,连无害请求也会被拒绝。

经典 abliteration 的做法是:用一组有害指令与无害指令的前向输出残差做差值均值,得到「拒绝方向」,再把权重矩阵中该方向的分量投影消除。这个方法有效,但有先天局限——它假设拒绝流形是一维的、方向质心按特定方式移动。当模型用更复杂的多概念机制实现拒绝时,单方向消融要么无效、要么误伤其他能力。

4.3 ARA:不找方向,直接优化矩阵

ARA(任意秩消融,Weidmann 2026)的思路与方向消融截然不同:它完全不计算拒绝方向。它用 PyTorch hook 捕获每个 transformer 模块对「好提示」(如 harmless_alpaca)与「坏提示」(如 harmful_behaviors)的输入输出张量,然后对模块权重矩阵做直接、无约束的优化,目标函数只有三项朴素愿望:

# 简化自 src/heretic/modifiers/ara.py(AGPL-3.0,节选释义)
def ara_loss(good_out, bad_out, new_good_out, new_bad_out, p):
    # 目标一:「好」提示的输出应尽量不变(保能力)
    preserve = ((new_good_out - good_out) ** 2).mean()
    # 目标二:「坏」提示的输出被拉近「好」输出的近邻(改行为)
    pull = mean_distances_to_knn(new_bad_out, good_out, p.neighbor_count).mean()
    # 目标三:「坏」提示的输出远离原来的「坏」输出(过校正,克复杂拒绝机制)
    push = p.overcorrect_relative_weight * -mean_distances_to_knn(
        new_bad_out, bad_out, p.neighbor_count).mean()
    return p.preserve_good_behavior_weight * preserve + p.steer_bad_behavior_weight * (pull + push)

三个要点:

  1. 不过问流形的秩数。方向消融假设拒绝是一维的;ARA 不做任何秩假设,给优化器完整自由度去寻找「最好的矩阵改动」。实验发现矩阵奇异值在几十维后迅速下降,因此用秩 50 的 LoRA 形式近似完整变换,兼顾表达力与导出便利。
  2. 仿射凸优化,收敛极快。目标函数相对矩阵是仿射凸的,而初值(原矩阵)已非常接近最优,L-BFGS 通常 2–3 次迭代收敛。矩阵逐个优化,峰值内存只比普通消融略高。
  3. 保范数细节。默认开启 preserve_row_magnitudes,修改后把矩阵行模长重归一化(源自 Lai 2025 的 MPOA「模长保持正交消融」),社区经验认为这有助于保留智能。

可调参数全部暴露在配置里:start_layer_index / end_layer_index(作用层区间)、preserve_good_behavior_weight、steer_bad_behavior_weight、overcorrect_relative_weight、neighbor_count——这正是外层 TPE 优化器搜索的空间。

4.4 评分器:把「想要什么」写成可优化的函数

默认配置的评分组合极简地体现了工程哲学——一个推、一个拉:

# 节选自 config.default.toml
scorers = [
  { plugin = "heretic.scorers.keyword_rate.KeywordRate", optimization = "minimize" },
  { plugin = "heretic.scorers.kl_divergence.KLDivergence", optimization = "minimize" },
]

[scorer.KeywordRate]
score_name = "Refusals"
keyword_markers = ["sorry", "i cannot", "as an ai", "i'm unable", "unethical", ...]
[scorer.KeywordRate.prompts]
dataset = "mlabonne/harmful_behaviors"   # 用有害行为提示测拒绝率
split = "test[:100]"

[scorer.KLDivergence.prompts]
dataset = "mlabonne/harmless_alpaca"     # 用无害提示约束行为漂移
split = "test[:100]"

KeywordRate 在 100 条有害提示上统计拒绝关键词命中率;KLDivergence 在 100 条无害提示上度量修改前后输出分布的 KL 散度。v2.0 新增两类评分器:BERTClassifier(用 ModernBERT 拒绝分类器替代关键词表,识别部分拒绝与能力限缩型拒答)与 BenchmarkScore(接入 lm-evaluation-harness,直接把 PIQA 等基准分数纳入优化目标,能力回退会被优化器「看见」)。思考型模型的 <think> 块会按配置自动跳过,避免把思考前缀误判为拒答。

多评分器共同优化是理解这套设计的关键:所有活跃评分器的得分一起交给优化器权衡,任意一个恶化都会拉低综合评价。这等价于把「我要的」与「我不许丢的」同时写进目标——拒绝率与 KL 散度天然互为刹车,防止优化器把模型「清空」成只会顺从一个极小行为集合的残废。同一评分器还能以不同配置声明多个实例并行打分(例如对两组不同的提示集分别统计拒绝率),实例各自维护独立配置,配置写在 [scorer.KeywordRate_小实例名] 这样的表里。

4.5 工程细节与可复现性

几处容易被忽视但决定实际体验的工程:启动时自动基准测试确定最优批大小(上限 128);中间分析张量尽早下放 CPU 以压低显存峰值;bnb_4bit 量化可把显存需求压到与常见量化版相当(略损精度);dtype 加载链自动回退,照顾 pre-Ampere 老卡。

可复现性是 v2.0 的招牌:PyTorch 不保证跨环境的逐位一致输出,Heretic 干脆把硬件、驱动、软件栈、包版本、随机种子、全部参数与数据集切片写进约 9 KB 的 reproduce.json 清单。他人执行 heretic --reproduce path/to/reproduce.json 时,环境差异会被逐项比对告警,数分钟即可重建模型而不必重跑数小时的计算。heretic --collect-reproducibles 则把 Hugging Face 上所有公开清单抓成本地追加式备份——这个名为 Grimoire 的分布式「咒语书」不依赖任何中心化服务。

五、应用场景

ARA 算法工作原理手绘图:从准备提示、hook 捕获、三项目标函数到 L-BFGS 优化、LoRA 导出再回到大循环的六步流程

5.1 场景一:安全研究中的「无拒绝基线」

痛点:做越狱攻防、安全对齐评测的研究者需要一个「已经不拒绝」的对照模型,否则测出的攻击成功率混入了「模型只是拒绝话术」的干扰。重训一个去安全化模型成本极高。 如何解决:对任一开放权重模型跑默认配置,得到拒答率趋近于零、KL 散度受控的「decensored」版本,作为红队基线。整个流程一条命令:

pip install -U heretic-llm
heretic Qwen/Qwen3-4B-Instruct-2507   # RTX 3090 上约 30-40 分钟

收益与量化:v2.0 发布前作者演示过 ARA 处理 openai/gpt-oss-20b 的结果——拒绝计数与当时最强的 SOM 多方向消融持平,而 KL 散度(能力损失代理指标)更低;社区基准帖(r/LocalLLaMA「abliterlitics」系列,2026 年 2 月与 3 月)显示 Heretic 产出的模型在 MMLU、GSM8K 上普遍优于其他消融工具的产出。 边界:仅适用于你硬件能跑起来的开放权重模型,且产出模型继承原模型许可;用于安全研究需遵守所在机构规范,不是「越狱服务」。

5.2 场景二:去掉谄媚与口水话的写作助手

痛点:对话模型普遍输出「好问题!」「总的来说」式套话,以及迎合用户的谄媚倾向(sycophancy),写技术文档时全靠提示词压制,治标不治本。 如何解决:仓库预置了开箱即用的配置家族——config.noslop.toml(去口水话)、config.nosyco.toml(去谄媚,2026-10-30 合入)、config.nohumor.toml(去幽默感)、config.emotions.toml(情感对齐调整)。用环境变量切换配置即可:

export HERETIC_CONFIG_FILE=config.noslop.toml
heretic <你的模型>

收益:行为修改发生在权重层,不占上下文、不依赖提示词遵循能力、不会被长对话稀释;评分器直接以「口水话触发率」为目标,优化器自动搜索最能压低它的参数。 边界:行为目标越「软」(如幽默感),可验证的量化指标越弱,评分器设计成本越高——这类配置多为社区经验参数,效果需自行评测。

5.3 场景三:自定义行为校准(写一个评分器插件)

痛点:想让模型「永远不用表情符号」「回答必带引用」这类个性化规范,微调需要数千条样本,提示词又常被忽略。 如何解决:v2.0 的插件系统把「想要什么」变成一个 Python 类——继承 Scorer、实现 get_score,返回一个数即可。例如统计「含 emoji 的回复占比」:

# my_scorer.py:统计回复中含 emoji 的比例,供优化器最小化
from heretic.scorer import Scorer

class NoEmojiRate(Scorer):
    def get_score(self, prompts, responses) -> float:
        hits = sum(1 for r in responses if any(ord(ch) > 0x1F000 for ch in r))
        return hits / max(len(responses), 1)
# config.toml 中注册(minimize = 越少越好)
scorers = [
  { plugin = "my_scorer.NoEmojiRate", optimization = "minimize" },
  { plugin = "heretic.scorers.kl_divergence.KLDivergence", optimization = "minimize" },
]

插件路径支持 file.py:ClassName 形式,不必改动 Heretic 包代码;同一评分器可声明多个实例并行跑不同参数。收益:优化循环自动完成「改权重 → 打分 → 调参」的闭环,人工只定义目标函数;配合 BenchmarkScore 评分器可同时看住通用能力。边界:评分函数必须是「能对一批回复自动算出的数」,主观偏好需要先落到可计算的代理指标(关键词表、分类器、基准分数)。

5.4 场景四:可复现的模型发布与审计

痛点:社区微调模型的「祖源」常常说不清——用了什么数据、什么参数、哪版代码,第三方难以验证,甚至作者自己也复现不出。 如何解决:上传 Hugging Face 时勾选可复现信息,仓库自动带 reproduce 目录(人读的说明 + 机器读的清单),例如 heretic-org/LFM2.5-VL-3B-heretic。使用者执行 heretic --reproduce path/to/reproduce.json 即可在本地重建,导出后还会核对权重文件哈希。 收益:约 9 KB 的清单构成一个可自由流转的「分布式模型库」(Grimoire),数分钟重建替代数小时重算;对合规审计场景,参数与数据集切片有据可查。 边界:字节级一致要求环境完全一致,跨硬件只能得到「统计等价」的模型,清单会明确指出不匹配项。

六、快速上手

# 1. 环境:Python 3.10+,PyTorch 2.6+(按你的 CUDA 版本安装)
pip install -U heretic-llm

# 2. 默认动作 = 移除拒答,直接处理任意 HF 模型
heretic Qwen/Qwen3-4B-Instruct-2507

# 3. 换目标:改行为而非去拒答
export HERETIC_CONFIG_FILE=config.nosyco.toml   # 或 noslop / nohumor / emotions

# 4. 处理完成后按提示选择:保存本地 / 上传 HF / 对话测试 / 跑标准基准

三条实操提示:显存吃紧就把配置中 quantization 设为 bnb_4bit(显存需求降至常见量化版水平,略损精度);旧显卡(pre-Ampere)靠 dtype 回退链自动选 float16;中断可续跑,优化器进度存于 checkpoints 目录。此外,v2.0 移除了 1.x 的研究可视化功能,官方建议改用独立工具 Lophius(lophius.org);1.x 配置文件需按官方迁移指南改写。

七、横向对比

方案 路线 是否需要训练 自动化程度 特点与代价
Heretic v2(ARA) hook 捕获模块 I/O,直接矩阵优化 + TPE 搜索 否 全自动闭环,含能力守门 拒绝率与 KL 双目标同优;AGPL-3.0;单卡数十分钟
经典 abliteration(Arditi 2024 / Labonne 整理) 差值均值求「拒绝方向」后投影消除 否 半自动,参数手调 快而简单;一维方向假设遇复杂拒绝机制会失效或误伤
abliterator.py / ErisForge Python 库,手工分析残差与方向 否 低(写代码) 灵活适合机制研究;对工程能力要求高
SOMbliterated(kabachuha) 自组织映射多方向抑制 否 半自动 能处理多方向拒绝;KL 通常高于 ARA 产出
普通微调 / 偏好优化(SFT、DPO 等) 梯度更新全量或 LoRA 是 中(需数据与管线) 效果可控可泛化;需算力与数据集,硬件门槛高

八、局限与风险

  1. 安全对齐会被实质削弱。默认配置产出的「decensored」模型不再按训练时的安全策略拒答,产出内容完全由使用者负责;是否在辖区合法、是否符合原模型许可(如 Llama 系列使用政策),是使用者自己的法律义务。项目自身也不提供任何滥用担保。
  2. 能力回退不能保证为零。KL 散度只在 100 条无害提示上采样,BenchmarkScore 也只覆盖配置过的任务;评测集外的能力损伤需要用户自行扩大验证面。
  3. 过校正的副作用。目标三「远离原坏输出」是更强的干预,对拒绝机制复杂的模型可能引入怪异行为;好在 overcorrect_relative_weight 由优化器搜索,且评分器提供制衡。
  4. 可复现的边界。跨硬件、跨驱动只能得到统计等价而非逐位一致的结果,清单会如实报告差异;追求严格复现需锁定完整软件栈。
  5. 厂商对抗在演进。若模型把拒绝机制分散进更多概念、或用路由与过滤层实现(不经过可修改的权重),纯权重修改路线的适用面会收窄——这也是 ARA 强调「不过问流形秩数」、比单方向消融更面向未来的原因之一。

九、小结与行动建议

Heretic 的价值不止于「去审查工具」这个标签:它把「修改模型行为」从训练问题重构为可直接求解的优化问题,用评分器插件把需求写成函数,用 TPE 搜索替代人工调参,再用可复现清单解决社区模型「祖源不明」的老问题。8,640 个社区模型与近 9,000 万次下载(2026-11-03 快照)说明这条路线已被大量验证。

行动建议:

  1. 想体验行为改造,从 config.nosyco.toml 或 config.noslop.toml 入手比默认的去拒答更有日常价值,也更安全。
  2. 有定制需求时,先写评分器插件定义目标,再让优化器找参数——这是 v2.0 插件系统的正确打开方式。
  3. 发布改造模型务必附带 reproduce.json,既是社区礼仪,也是审计证据。
  4. 把 BenchmarkScore 评分器加入配置,让能力回退在优化循环内可见,而不是事后补测。
  5. 关注作者预告的 ARA 技术预印本(Weidmann 2026)与独立研究工具 Lophius,两者会补全理论细节与研究可视化。

对站点读者多说一句:把这篇当「工具评测」读也成立——Heretic 展示了一种值得借鉴的工程范式:当你想改变一个复杂系统的行为时,先别急着训它(重训),先问「这个改动能否写成一个可自动评估的目标函数」。能写成,优化器往往比人工流程更快、更稳、更可复现;写不成,再回到数据与训练也不迟。

参考资料

  1. p-e-w/heretic 仓库与 README:https://github.com/p-e-w/heretic(获取日期 2026-11-04)
  2. Heretic v2.0.0 Release Notes:https://github.com/p-e-w/heretic/releases/tag/v2.0.0(获取日期 2026-11-04)
  3. ARA 原始设计 PR #211:https://github.com/p-e-w/heretic/pull/211(获取日期 2026-11-04)
  4. Heretic Live 社区统计:https://heretic.sdad.pro/(获取日期 2026-11-04,2026-11-03 快照)
  5. Arditi et al.,《Refusal in Language Models Is Mediated by a Single Direction》, arXiv:2406.11717(获取日期 2026-11-04)
  6. mlabonne,《Uncensor any LLM with abliteration》, Hugging Face Blog, 2024:https://huggingface.co/blog/mlabonne/abliteration(获取日期 2026-11-04)
  7. 迁移指南 Heretic 1.x → 2.x:https://github.com/p-e-w/heretic/blob/master/docs/migration_v1_to_v2.md(获取日期 2026-11-04)
← 返回资讯列表

读者留言

COMMENTS 暂无
仅本站原创文章开放留言 · 请勿留下手机号、邮箱等个人信息

还没有留言,来说第一句?