mirror of
https://github.com/p-e-w/heretic.git
synced 2026-11-06 05:16:39 +00:00
docs: prepare for 2.0 release (#531)
Co-authored-by: Vinay Umrethe <175500353+Vinay-Umrethe@users.noreply.github.com>
This commit is contained in:
1 parent
ecde93f1e0
commit
0db5c31e10
4 files changed
+290
-129
No files matched your search
@@ -1,89 +1,79 @@
|
||||
<img width="128" align="right" alt="Logo" src="https://github.com/user-attachments/assets/df5f2840-2f92-4991-aa57-252747d7182e" />
|
||||
<div align="center">
|
||||
|
||||
# Heretic: Fully automatic censorship removal for language models<br><br>[](https://discord.gg/gdXc48gSyT) [](https://matrix.to/#/#heretic:matrix.org) [](https://huggingface.co/heretic-org) [](https://codeberg.org/p-e-w/heretic)
|
||||
<img width="128" alt="Heretic logo" src="https://github.com/user-attachments/assets/df5f2840-2f92-4991-aa57-252747d7182e" />
|
||||
|
||||
[](https://trendshift.io/repositories/20538)
|
||||
# Heretic
|
||||
|
||||
Heretic is a tool that removes censorship (aka "safety alignment") from
|
||||
transformer-based language models without expensive post-training.
|
||||
It combines an advanced implementation of directional ablation, also known
|
||||
as "abliteration" ([Arditi et al. 2024](https://arxiv.org/abs/2406.11717),
|
||||
Lai 2025 ([1](https://huggingface.co/blog/grimjim/projected-abliteration),
|
||||
[2](https://huggingface.co/blog/grimjim/norm-preserving-biprojected-abliteration))),
|
||||
with a TPE-based parameter optimizer powered by [Optuna](https://optuna.org/).
|
||||
### Training-free language model modification
|
||||
|
||||
This approach enables Heretic to work **completely automatically.** Heretic
|
||||
finds high-quality abliteration parameters by co-minimizing the number of
|
||||
refusals and the KL divergence from the original model. This results in a
|
||||
decensored model that retains as much of the original model's intelligence
|
||||
as possible. Using Heretic does not require an understanding of transformer
|
||||
internals. In fact, anyone who knows how to run a command-line program
|
||||
can use Heretic to decensor language models.
|
||||
**Remove censorship**, suppress slop, reduce sycophancy, and more.<br>
|
||||
All in an afternoon, on your gaming PC.
|
||||
|
||||
Heretic supports most dense models, including many multimodal models,
|
||||
several different MoE architectures, and even some hybrid models like Qwen3.5.
|
||||
Pure state-space models and certain other research architectures are not yet
|
||||
supported out of the box.
|
||||
[](https://discord.gg/gdXc48gSyT)
|
||||
[](https://matrix.to/#/#heretic:matrix.org)
|
||||
[](https://huggingface.co/heretic-org)
|
||||
[](https://codeberg.org/p-e-w/heretic)
|
||||
|
||||
<img width="650" height="715" alt="Screenshot" src="https://github.com/user-attachments/assets/d71a5efa-d6be-4705-a817-63332afb2d15" />
|
||||
</div>
|
||||
|
||||
-----
|
||||
|
||||
|
||||
|
||||
Running unsupervised with the default configuration, Heretic can produce
|
||||
decensored models that rival the quality of abliterations created manually
|
||||
by human experts:
|
||||
[](https://trendshift.io/repositories/20538)
|
||||
[](https://heretic.sdad.pro/)
|
||||
|
||||
| Model | Refusals for "harmful" prompts | KL divergence from original model for "harmless" prompts |
|
||||
| :--- | ---: | ---: |
|
||||
| [google/gemma-3-12b-it](https://huggingface.co/google/gemma-3-12b-it) (original) | 97/100 | 0 *(by definition)* |
|
||||
| [mlabonne/gemma-3-12b-it-abliterated-v2](https://huggingface.co/mlabonne/gemma-3-12b-it-abliterated-v2) | 3/100 | 1.04 |
|
||||
| [huihui-ai/gemma-3-12b-it-abliterated](https://huggingface.co/huihui-ai/gemma-3-12b-it-abliterated) | 3/100 | 0.45 |
|
||||
| **[p-e-w/gemma-3-12b-it-heretic](https://huggingface.co/p-e-w/gemma-3-12b-it-heretic) (ours)** | **3/100** | **0.16** |
|
||||
|
||||
The Heretic version, generated without any human effort, achieves the same
|
||||
level of refusal suppression as other abliterations, but at a much lower
|
||||
KL divergence, indicating less damage to the original model's capabilities.
|
||||
*(You can reproduce those numbers using Heretic's built-in evaluation functionality,
|
||||
e.g. `heretic --model google/gemma-3-12b-it --evaluate-model p-e-w/gemma-3-12b-it-heretic`.
|
||||
Note that the exact values might be platform- and hardware-dependent.
|
||||
The table above was compiled using PyTorch 2.8 on an RTX 5090.)*
|
||||
## Modify any LLM that you can run on your hardware[^1]
|
||||
|
||||
Of course, mathematical metrics and automated benchmarks never tell the whole
|
||||
story, and are no substitute for human evaluation. Models generated with
|
||||
Heretic have been well-received by users (links and emphasis added):
|
||||
[^1]: Heretic supports on-the-fly 4-bit model quantization with bitsandbytes,
|
||||
which can reduce the amount of VRAM required to process a model to the same amount
|
||||
that is used to run a typical quantized version of it, at a slight accuracy cost.
|
||||
Set the `quantization` option to `bnb_4bit` to enable this.
|
||||
|
||||
> "I was skeptical before, but I just downloaded
|
||||
> [**GPT-OSS 20B Heretic**](https://huggingface.co/p-e-w/gpt-oss-20b-heretic)
|
||||
> model and holy shit. It gives properly formatted long responses to sensitive topics,
|
||||
> using the exact uncensored words that you would expect from an uncensored model,
|
||||
> produces markdown format tables with details and whatnot. Looks like this is
|
||||
> the best abliterated version of this model so far..."
|
||||
> [*(Link to comment)*](https://old.reddit.com/r/LocalLLaMA/comments/1oymku1/heretic_fully_automatic_censorship_removal_for/np6tba6/)
|
||||
Heretic is a unique tool that lets you do what only corporations with access
|
||||
to massive computing power usually do: *Modify,* rather than merely run,
|
||||
language models. It does not perform expensive training; rather, it uses
|
||||
a collection of mathematical techniques to steer behavior based on contrasting
|
||||
example prompts and matching scorers.
|
||||
|
||||
> "[**Heretic GPT 20b**](https://huggingface.co/p-e-w/gpt-oss-20b-heretic)
|
||||
> seems to be the best uncensored model I have tried yet. It doesn't destroy a
|
||||
> the model's intelligence and it is answering prompts normally would be
|
||||
> rejected by the base model."
|
||||
> [*(Link to comment)*](https://old.reddit.com/r/LocalLLaMA/comments/1oymku1/heretic_fully_automatic_censorship_removal_for/npe9jng/)
|
||||
Heretic can, depending on the configuration:
|
||||
|
||||
> "[[**Qwen3-4B-Instruct-2507-heretic**](https://huggingface.co/p-e-w/Qwen3-4B-Instruct-2507-heretic)]
|
||||
> Has been the best unquantized abliterated model that I have been able to run on 16gb vram."
|
||||
> [*(Link to comment)*](https://old.reddit.com/r/LocalLLaMA/comments/1phjxca/im_calling_these_people_out_right_now/nt06tji/)
|
||||
* **Suppress refusals/remove censorship** (this is the [default action](/config.default.toml))
|
||||
* Reduce slop ([`config.noslop.toml`](/config.noslop.toml))
|
||||
* Reduce humor ([`config.nohumor.toml`](/config.nohumor.toml))
|
||||
* Reduce sycophancy ([`config.nosyco.toml`](/config.nosyco.toml))
|
||||
* Alter emotional alignment ([`config.emotions.toml`](/config.emotions.toml))
|
||||
|
||||
Heretic models have also been independently benchmarked using standard metrics
|
||||
like MMLU and GSM8K, and have been found to compare favorably with models
|
||||
produced by competing abliteration tools:
|
||||
[1](https://old.reddit.com/r/LocalLLaMA/comments/1sojjoc/abliterlitics_benchmark_and_tensor_analysis/),
|
||||
[2](https://old.reddit.com/r/LocalLLaMA/comments/1sy18lx/abliterlitics_benchmarks_and_tensor_comparison/).
|
||||
and many, many other things.
|
||||
|
||||
### :bangbang: Using Heretic does NOT require understanding how language models work internally :bangbang:
|
||||
|
||||
In fact, you can go from zero to removing censorship from your first model
|
||||
[in a matter of seconds](#usage). Heretic supports most dense models, including
|
||||
many multimodal models, several different MoE architectures, and many modern
|
||||
hybrid models.
|
||||
|
||||
The community has created and published
|
||||
[well over 5000](https://huggingface.co/models?other=heretic)
|
||||
models with Heretic.
|
||||
[thousands](https://huggingface.co/models?other=heretic)
|
||||
of models with Heretic.
|
||||
Heretic models have been independently benchmarked using standard metrics
|
||||
like MMLU and GSM8K, and have been found to compare favorably against models
|
||||
produced with competing abliteration tools.[^2][^3]
|
||||
|
||||
[^2]: https://old.reddit.com/r/LocalLLaMA/comments/1sojjoc/abliterlitics_benchmark_and_tensor_analysis/
|
||||
[^3]: https://old.reddit.com/r/LocalLLaMA/comments/1sy18lx/abliterlitics_benchmarks_and_tensor_comparison/
|
||||
|
||||
|
||||
|
||||
<img width="600" alt="Heretic screenshot" src="https://github.com/user-attachments/assets/a030f595-67ef-49a6-9d9a-779fdf752b58" />
|
||||
|
||||
|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
Prepare a Python 3.10+ environment with PyTorch 2.2+ installed as appropriate
|
||||
Prepare a Python 3.10+ environment with PyTorch 2.6+ installed as appropriate
|
||||
for your hardware. Then run:
|
||||
|
||||
```sh
|
||||
@@ -91,87 +81,176 @@ pip install -U heretic-llm
|
||||
heretic Qwen/Qwen3-4B-Instruct-2507
|
||||
```
|
||||
|
||||
Replace `Qwen/Qwen3-4B-Instruct-2507` with whatever model you want to decensor.
|
||||
Replace `Qwen/Qwen3-4B-Instruct-2507` with whatever model you want to process.
|
||||
**By default, Heretic performs censorship removal (refusal suppression).**
|
||||
If you want to do something else, choose one of the configuration files linked
|
||||
above, or write your own. See [`config.default.toml`](/config.default.toml)
|
||||
for available configuration options.
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> While PyTorch 2.2 is the minimum version of PyTorch needed for Heretic to work,
|
||||
> some models and configurations might require features only found in
|
||||
> later versions. For example, loading MXFP4-quantized models like gpt-oss
|
||||
> uses `torch.accelerator`, which was added in PyTorch 2.6.
|
||||
|
||||
> [!TIP]
|
||||
>
|
||||
> Heretic uses [uv](https://docs.astral.sh/uv/) for dependency management,
|
||||
> and the repository includes a `uv.lock` file pinning every package version.
|
||||
> If you already use uv (and you probably should!), you can just clone the repo
|
||||
> and run Heretic with `uv run heretic`, which ensures that your dependencies
|
||||
> match those used by the developers, improving reliability and security.
|
||||
|
||||
The process is fully automatic and does not require configuration; however,
|
||||
Heretic has a variety of configuration parameters that can be changed for
|
||||
greater control. Run `heretic --help` to see available command-line options,
|
||||
or look at [`config.default.toml`](config.default.toml) if you prefer to use
|
||||
a configuration file.
|
||||
> Configuration files made for Heretic 1.x are **not** compatible with Heretic 2.x!
|
||||
> See the [migration guide](/docs/migration_v1_to_v2.md) for what you need to change
|
||||
> in order to make your old configurations work.
|
||||
|
||||
At the start of a program run, Heretic benchmarks the system to determine
|
||||
the optimal batch size to make the most of the available hardware.
|
||||
On an RTX 3090, with the default configuration, decensoring
|
||||
On an RTX 3090, with the default configuration, processing
|
||||
[Qwen3-4B-Instruct-2507](https://huggingface.co/Qwen/Qwen3-4B-Instruct-2507)
|
||||
takes about 20-30 minutes. Note that Heretic supports model quantization with
|
||||
bitsandbytes, which can drastically reduce the amount of VRAM required to process
|
||||
models. Set the `quantization` option to `bnb_4bit` to enable quantization.
|
||||
takes about 30-40 minutes.
|
||||
|
||||
After Heretic has finished decensoring a model, you are given the option to
|
||||
After Heretic has finished processing a model, you are given the choice to
|
||||
save the model, upload it to Hugging Face, chat with it to test how well it works,
|
||||
run standard benchmarks on it, or any combination of those actions.
|
||||
|
||||
|
||||
## Controlling what Heretic does using scorer plugins
|
||||
|
||||
Heretic steers model behavior by optimizing one or multiple scores. Scores are
|
||||
computed by scorer plugins. You can easily write your own scorers to get full
|
||||
control over what Heretic does to models.
|
||||
|
||||
The `Scorer` interface (abstract base class) your scorer needs to inherit from
|
||||
is defined in [`scorer.py`](/src/heretic/scorer.py). The only required method
|
||||
is `get_score`, but there is more machinery (such as settings management)
|
||||
available when you need it.
|
||||
|
||||
By default, Heretic scores models by refusal rate (implemented in
|
||||
[`keyword_rate.py`](/src/heretic/scorers/keyword_rate.py)) and KL divergence
|
||||
(implemented in [`kl_divergence.py`](/src/heretic/scorers/kl_divergence.py)).
|
||||
Additional scorers are available in the [`scorers` directory](/src/heretic/scorers/).
|
||||
These scorers can serve as examples for your own implementations, and can easily
|
||||
be adapted to your needs.
|
||||
|
||||
Scorers are configured through the [main configuration file](/config.default.toml).
|
||||
Which scorer plugins are active is determined by the `scorers` setting, which
|
||||
also controls whether a scorer's score should be minimized or maximized during
|
||||
optimization. Any number of scorers can be used simultaneously, and their scores
|
||||
will be co-optimized. Multiple instances of the same scorer can be configured
|
||||
with different settings. See the configuration file for the full documentation
|
||||
of this mechanism.
|
||||
|
||||
The path to a scorer plugin can be specified either as a fully qualified import
|
||||
path (`fully.qualified.module.MyScorerClass`) or as a file path followed by
|
||||
a class name (`path/to/plugin.py:MyScorerClass`). You do **not** have to modify
|
||||
the Heretic package code in order to use your own plugins.
|
||||
|
||||
Heretic also has modifier plugins, which are described in
|
||||
[the next section](#how-heretic-works).
|
||||
|
||||
|
||||
## How Heretic works
|
||||
|
||||
Heretic implements a parametrized variant of directional ablation. For each
|
||||
supported transformer component (currently, attention out-projection and
|
||||
MLP down-projection), it identifies the associated matrices in each transformer
|
||||
layer, and orthogonalizes them with respect to the relevant "residual direction",
|
||||
inhibiting the expression of that direction in the result of multiplications
|
||||
with that matrix.
|
||||
Heretic combines a pluggable modifier (interface in
|
||||
[`modifier.py`](/src/heretic/modifier.py)) with a TPE-based hyperparameter optimizer
|
||||
powered by [Optuna](https://optuna.org/). The optimizer finds a set of parameters that,
|
||||
when passed to the modifier, minimize or maximize a set of configurable scores on the resulting model ([see above](#controlling-what-heretic-does-using-scorer-plugins)).
|
||||
|
||||
Residual directions are computed for each layer as a difference-of-means between
|
||||
the first-token residuals for "harmful" and "harmless" example prompts.
|
||||
Heretic ships with two modifiers:
|
||||
|
||||
The ablation process is controlled by several optimizable parameters:
|
||||
* **Arbitrary-Rank Ablation (ARA)**[^4]: This is the default modifier, and was
|
||||
specifically developed for use in Heretic. You can find an overview of how ARA
|
||||
works in [the original pull request](https://github.com/p-e-w/heretic/pull/211),
|
||||
and see the precise implementation in [`ara.py`](/src/heretic/modifiers/ara.py).
|
||||
|
||||
* `direction_index`: Either the index of a residual direction, or the special
|
||||
value `per layer`, indicating that each layer should be ablated using the
|
||||
residual direction associated with that layer.
|
||||
* `max_weight`, `max_weight_position`, `min_weight`, and `min_weight_distance`:
|
||||
For each component, these parameters describe the shape and position of the
|
||||
ablation weight kernel over the layers. The following diagram illustrates this:
|
||||
* **Directional ablation aka "abliteration"**[^5]: The classic method for refusal
|
||||
suppression. Heretic's implementation uses a flexible ablation weight kernel over
|
||||
the layers, and supports both projected abliteration[^6] and norm preservation (MPOA)[^7].
|
||||
The complete code is in [`abliteration.py`](/src/heretic/modifiers/abliteration.py).
|
||||
|
||||
<img width="800" height="500" alt="Explanation" src="https://github.com/user-attachments/assets/82e4b84e-5a82-4faf-b918-ac642f9e4892" />
|
||||
[^4]: *Weidmann 2026.* A preprint explaining the technique will be available soon.
|
||||
[^5]: *[Arditi et al. 2024](https://arxiv.org/abs/2406.11717)*
|
||||
[^6]: *[Lai 2025 (1)](https://huggingface.co/blog/grimjim/projected-abliteration)*
|
||||
[^7]: *[Lai 2025 (2)](https://huggingface.co/blog/grimjim/norm-preserving-biprojected-abliteration)*
|
||||
|
||||
|
||||
You can use the `modifiers` setting to switch between modifier implementations.
|
||||
Despite the name of the setting using a plural form, Heretic currently allows
|
||||
only a single modifier for a given processing run. This may change in the future.
|
||||
|
||||
Heretic's main innovations over existing abliteration systems are:
|
||||
|
||||
* The shape of the ablation weight kernel is highly flexible, which, combined with
|
||||
automatic parameter optimization, can improve the compliance/quality tradeoff.
|
||||
Non-constant ablation weights were previously explored by Maxime Labonne in
|
||||
[gemma-3-12b-it-abliterated-v2](https://huggingface.co/mlabonne/gemma-3-12b-it-abliterated-v2).
|
||||
* The residual direction index is a float rather than an integer. For non-integral
|
||||
values, the two nearest residual direction vectors are linearly interpolated.
|
||||
This unlocks a vast space of additional directions beyond the ones identified
|
||||
by the difference-of-means computation, and often enables the optimization
|
||||
process to find a better direction than that belonging to any individual layer.
|
||||
* Ablation parameters are chosen separately for each component. I have found that
|
||||
MLP interventions tend to be more damaging to the model than attention interventions,
|
||||
so using different ablation weights can squeeze out some extra performance.
|
||||
## Reproducibility and the Heretic Grimoire
|
||||
|
||||
Heretic has the ability to create *reproducible models* whose repositories contain
|
||||
all information required to produce a byte-for-byte identical model on demand,
|
||||
provided that the environment is perfectly identical to the original one. PyTorch
|
||||
doesn't guarantee that operations return identical outputs unless hardware, drivers,
|
||||
operating system, and the entire software stack including all package versions
|
||||
are exactly the same.
|
||||
|
||||
Heretic manages all that complexity for you. When uploading a processed model to
|
||||
Hugging Face, Heretic offers to include reproducibility information. This is entirely
|
||||
optional, but if you choose to do so, the uploaded repository will contain a
|
||||
`reproduce` folder with detailed instructions for recreating the model
|
||||
([example](https://huggingface.co/heretic-org/LFM2.5-VL-3B-heretic/tree/main/reproduce)).
|
||||
This folder contains both human-readable instructions and a machine-readable manifest
|
||||
file named `reproduce.json`, which includes all the information Heretic needs to
|
||||
**automatically** reproduce the model.
|
||||
|
||||
Automatic reproduction can be performed with
|
||||
|
||||
```sh
|
||||
heretic --reproduce path/to/reproduce.json
|
||||
```
|
||||
|
||||
Heretic will guide you through the process, checking your environment against the one
|
||||
that was used to create the model, and pointing out potentially problematic mismatches.
|
||||
The multi-hour computations that were required to make the original model do **not**
|
||||
have to be re-done, and the entire process typically takes a few minutes. After you
|
||||
have exported the resulting model, Heretic will verify the hashes of the weight files
|
||||
against those stored in the reproduction manifest (they may or may not be identical,
|
||||
depending on how closely your system resembles the original one).
|
||||
|
||||
Many people have uploaded models with reproducibility information to Hugging Face.
|
||||
Since a reproduction manifest is only around 9 kilobytes in size, these manifests
|
||||
form a portable library of models that can be reproduced at will.
|
||||
|
||||
### That library is called the Heretic Grimoire. You can view it [here](https://huggingface.co/spaces/heretic-org/Heretic-Grimoire).
|
||||
|
||||
But you don't have to rely on an externally hosted web application to access the
|
||||
library of manifests: The Grimoire is fundamentally designed as a *distributed* system,
|
||||
and you can fetch your own local copies of publicly available manifests from
|
||||
Hugging Face whenever you want by running
|
||||
|
||||
```sh
|
||||
heretic --collect-reproducibles path/to/target/folder/
|
||||
```
|
||||
|
||||
You now have a local backup of all reproducible Heretic models, properly catalogued.
|
||||
To update this collection, simply run the command again. It functions as an
|
||||
append-only backup, never deleting files even if the corresponding model no longer
|
||||
exists on Hugging Face.
|
||||
|
||||
|
||||
## Heretic is made by humans!
|
||||
|
||||
Unlike lots of AI-related software today (and indeed lots of software in general),
|
||||
Heretic is **not** "vibe-coded".
|
||||
|
||||
All of [my](https://github.com/p-e-w) commits in this project so far were written
|
||||
100% by hand, the way I have been doing programming for decades, and while some
|
||||
Heretic contributors use coding agents, I review every single line of code that I
|
||||
merge very carefully. There's no "LGTM" here!
|
||||
|
||||
Don't believe me? Check out [this pull request](https://github.com/p-e-w/heretic/pull/53),
|
||||
which accumulated **almost 350 human-written comments** over more than 7 months
|
||||
as we discussed the implementation.
|
||||
And [here is another PR](https://github.com/p-e-w/heretic/pull/191) with
|
||||
**more than 200 comments.**
|
||||
|
||||
I am the opposite of a luddite and I have used agents for other projects, but
|
||||
I am proud of the code I write and so far can't quite bring myself to let a machine
|
||||
write it for me in a project I care so much about. As a result, Heretic has a lean,
|
||||
relatively simple codebase that in my opinion, and in that of some others,
|
||||
is a pleasure to work on.
|
||||
|
||||
If you like that, join us! Hop on the Discord and tell us about your ideas for
|
||||
improvements, or directly file an issue or open a PR.
|
||||
|
||||
|
||||
## Prior art
|
||||
|
||||
I'm aware of the following publicly available implementations of abliteration
|
||||
techniques:
|
||||
I'm aware of the following implementations of abliteration techniques
|
||||
that were publicly available when Heretic was first released (November 2025):
|
||||
|
||||
* [AutoAbliteration](https://huggingface.co/posts/mlabonne/714992455492422)
|
||||
* [abliterator.py](https://github.com/FailSpy/abliterator)
|
||||
@@ -188,11 +267,13 @@ any of those projects.
|
||||
|
||||
The development of Heretic was informed by:
|
||||
|
||||
* [The original abliteration paper (Arditi et al. 2024)](https://arxiv.org/abs/2406.11717)
|
||||
* [The original abliteration paper *(Arditi et al. 2024)*](https://arxiv.org/abs/2406.11717)
|
||||
* [Maxime Labonne's article on abliteration](https://huggingface.co/blog/mlabonne/abliteration),
|
||||
as well as some details from the model cards of his own abliterated models (see above)
|
||||
as well as some details from the model cards of his own abliterated models, such as
|
||||
the use of non-constant ablation weights
|
||||
* Jim Lai's articles describing ["projected abliteration"](https://huggingface.co/blog/grimjim/projected-abliteration)
|
||||
and ["norm-preserving biprojected abliteration"](https://huggingface.co/blog/grimjim/norm-preserving-biprojected-abliteration)
|
||||
* Thousands of interactions with members of the community
|
||||
|
||||
|
||||
## Citation
|
||||
@@ -202,7 +283,7 @@ If you use Heretic for your research, please cite it using the following BibTeX
|
||||
```bibtex
|
||||
@misc{heretic,
|
||||
author = {Weidmann, Philipp Emanuel},
|
||||
title = {Heretic: Fully automatic censorship removal for language models},
|
||||
title = {Heretic: Training-free language model modification},
|
||||
year = {2025},
|
||||
publisher = {GitHub},
|
||||
journal = {GitHub repository},
|
||||
@@ -230,3 +311,10 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
|
||||
**By contributing to this project, you agree to release your
|
||||
contributions under the same license.**
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,67 @@
|
||||
# Migrating from Heretic 1.x to Heretic 2.x
|
||||
|
||||
Heretic 2.x is not backwards compatible with Heretic 1.x configurations.
|
||||
|
||||
If you have existing configuration files written to work with a Heretic 1.x release,
|
||||
you need to make the following changes before using them with a Heretic 2.x release.
|
||||
Only settings that are actually in your configuration file must be updated;
|
||||
defaults are automatically set to the current values. Of course, you can also simply
|
||||
start with [an up-to-date default configuration](/config.default.toml), and modify
|
||||
it to match your requirements.
|
||||
|
||||
|
||||
## Remove settings for research features
|
||||
|
||||
Research features have been removed in Heretic 2.0. The following settings
|
||||
are no longer recognized:
|
||||
|
||||
* `print_residual_geometry`
|
||||
* `plot_residuals`
|
||||
* `residual_plot_path`
|
||||
* `residual_plot_title`
|
||||
* `residual_plot_style`
|
||||
* `residual_plot_label` and `residual_plot_color` in prompt sections
|
||||
|
||||
|
||||
## Remove `kl_divergence_scale` and `kl_divergence_target`
|
||||
|
||||
KL divergence balancing has been removed and these settings
|
||||
are no longer recognized.
|
||||
|
||||
|
||||
## Rename `chain_of_thought_skips` to `chain_of_thought_blocks` and update its structure
|
||||
|
||||
The new setting `chain_of_thought_blocks` contains pairs of the form
|
||||
`[cot_initializer, cot_finalizer]` instead of `[cot_initializer, closed_cot_block]`.
|
||||
|
||||
|
||||
## Move abliteration settings to the `[modifier.Abliteration]` section
|
||||
|
||||
This includes the following settings:
|
||||
|
||||
* `orthogonalize_direction`
|
||||
* `row_normalization`
|
||||
* `full_normalization_lora_rank`
|
||||
* `winsorization_quantile`
|
||||
* `[good_prompts]` (renamed to `[modifier.Abliteration.good_prompts]`)
|
||||
* `[bad_prompts]` (renamed to `[modifier.Abliteration.bad_prompts]`)
|
||||
|
||||
> [!IMPORTANT]
|
||||
>
|
||||
> Heretic 2.x defaults to using ARA for modifying models, not abliteration.
|
||||
> To continue using abliteration, edit the `modifiers` setting accordingly.
|
||||
> To configure ARA, edit the `[modifier.ARA]` section.
|
||||
|
||||
|
||||
## Move refusal evaluation settings to the `[scorer.KeywordRate]` section
|
||||
|
||||
This includes the following settings:
|
||||
|
||||
* `print_responses`
|
||||
* `refusal_markers` (renamed to `keyword_markers`)
|
||||
* `[bad_evaluation_prompts]` (renamed to `[scorer.KeywordRate.prompts]`)
|
||||
|
||||
|
||||
## Rename `[good_evaluation_prompts]` to `[scorer.KLDivergence.prompts]`
|
||||
|
||||
KL divergence is now computed by a scorer plugin.
|
||||
+7
-5
@@ -1,7 +1,7 @@
|
||||
[project]
|
||||
name = "heretic-llm"
|
||||
version = "2.0.0.dev0"
|
||||
description = "Fully automatic censorship removal for language models"
|
||||
version = "2.0.0"
|
||||
description = "Training-free language model modification"
|
||||
readme = "README.md"
|
||||
license = "AGPL-3.0-or-later"
|
||||
authors = [
|
||||
@@ -10,7 +10,7 @@ authors = [
|
||||
requires-python = ">=3.10"
|
||||
keywords = ["llm", "transformer", "abliteration"]
|
||||
classifiers = [
|
||||
"Development Status :: 4 - Beta",
|
||||
"Development Status :: 5 - Production/Stable",
|
||||
"Environment :: Console",
|
||||
"Environment :: GPU",
|
||||
"Intended Audience :: Science/Research",
|
||||
@@ -19,6 +19,9 @@ classifiers = [
|
||||
"Programming Language :: Python :: 3.10",
|
||||
"Programming Language :: Python :: 3.11",
|
||||
"Programming Language :: Python :: 3.12",
|
||||
"Programming Language :: Python :: 3.13",
|
||||
"Programming Language :: Python :: 3.14",
|
||||
"Programming Language :: Python :: 3.15",
|
||||
]
|
||||
dependencies = [
|
||||
"accelerate~=1.15",
|
||||
@@ -72,8 +75,7 @@ ignore = [
|
||||
]
|
||||
|
||||
[tool.uv]
|
||||
# TODO: Re-enable before 2.0 release!
|
||||
#exclude-newer = "7 days"
|
||||
exclude-newer = "7 days"
|
||||
|
||||
[tool.uv.sources]
|
||||
torch = { index = "pytorch" }
|
||||
|
||||
@@ -18,6 +18,10 @@ resolution-markers = [
|
||||
"python_full_version < '3.11' and sys_platform == 'darwin'",
|
||||
]
|
||||
|
||||
[options]
|
||||
exclude-newer = "0001-01-01T00:00:00Z" # This has no effect and is included for backwards compatibility when using relative exclude-newer values.
|
||||
exclude-newer-span = "P7D"
|
||||
|
||||
[[package]]
|
||||
name = "absl-py"
|
||||
version = "2.5.0"
|
||||
@@ -1078,7 +1082,7 @@ wheels = [
|
||||
|
||||
[[package]]
|
||||
name = "heretic-llm"
|
||||
version = "2.0.0.dev0"
|
||||
version = "2.0.0"
|
||||
source = { editable = "." }
|
||||
dependencies = [
|
||||
{ name = "accelerate" },
|
||||
|
||||
Reference in new issue
Block a user