库名称:transformers
许可证:其他
许可证名称:MNPL
许可证链接:https://mistral.ai/licences/MNPL-0.1.md
标签:
Codestral-22B-v0.1-abliterated-v3 模型卡片
我原始的Jupyter“烹饪书”用于复制方法可以在这里找到
我使用的个人代码库(进行中,希望改进和通用化)
这是mistralai/Codestral-22B-v0.1的正交化bfloat16 safetensor权重版本,基于预览论文/博客文章《LLM中的拒绝由单一方向介导》中描述的方法进行了改进生成,我鼓励你阅读以了解更多。
感谢bullerwins以HF格式重新上传原始模型。
等等,“abliteration”?正交化?消融?这是什么?
简而言之:这个模型的某些权重被操纵以“抑制”模型表达拒绝的能力。这并不以任何方式保证它不会拒绝你,理解你的请求,它可能仍然会就伦理/安全等问题对你进行说教。在其他所有方面,它与原始的22B模型调整相同,只是最强的拒绝方向被正交化移除。
更简短的简而言之:这是我所能做到的最纯粹的未审查形式——与原始模型相比,在其他任何方面都没有新的或改变的行为。
至于“abliteration”:这只是对原始论文中使用的“ablation”一词的有趣文字游戏,指的是移除特征,我特别创造了这个词来区分模型与“未审查”的微调。
Ablate + obliterated = Abliterated
无论如何,正交化/消融在这里都是指同一件事,即通过正交化技术将拒绝特征从模型中“消融”掉。
为什么要对代码模型进行未审查处理?
老实说,这个模型在代码之外似乎相当强大,而且一旦量化,它是一个适合24GB的完美大小模型。
通过消融拒绝,模型总体上更符合用户的请求,无论其伦理性如何。值得记住的是,有时即使是“良好对齐”的请求也可能被拒绝,必须通过提示工程绕过。
关于方法的更多内容,以及为什么这很有趣
对我来说,消融(或应用方法进行反向“增强”)似乎适用于诱导/移除非常特定的特征,这些特征你需要在系统提示中花费太多标记来鼓励或阻止。
相反,你只需在消融脚本中对空白系统提示应用你的系统提示,并在最终模型权重中正交化以获得所需的行为。
为什么选择这个而不是微调?
消融在本质上更具外科手术性质,同时执行时使用的数据比微调少得多,我认为这是它的主要优势。
此外,它最有价值的方面是它保持了原始模型的大部分知识和训练完整性,同时移除了它以一种非常特定的不良方式行为的倾向(在这种情况下,拒绝用户请求)。
微调仍然非常有用,是广泛行为改变的首选;然而,使用消融/增强技术,你可能可以用非常少的样本接近你期望的行为。
它也可能是添加到模型精炼中的有用步骤:正交化 -> 微调,或反之亦然。
我还没有真正探索这个模型与微调的结合,我鼓励有能力的其他人尝试一下。
好吧,但是为什么是V3?没有70B的V2?
嗯,我之前在Cognitive Computations下为8B发布了一个V2。
最终不值得为70B尝试V2,我想在浪费计算周期在可能不是更好的模型之前精炼模型。
然而,我对这个最新的方法感到非常满意,它似乎诱导了更少的幻觉。
因此,为了表明这是一个比8B V2更高级的新方法,我决定像微软一样加倍版本跳跃,因为这是一个如此大的进步(或者借口是这样的,实际上是因为太多遗留但仍在使用的微软库检查操作系统名称中的“Windows 9”以检测Windows 95/98。)
怪异特性通知
这个模型可能带有有趣的怪癖,因为方法还很新。我鼓励你玩这个模型,并在社区标签中发布你注意到的任何怪癖,因为这将帮助我们进一步理解这种正交化有哪些副作用。
如果你设法开发出进一步的改进,请分享!这是使用消融的最基本方式,但我相信还有其他尚未探索的可能性。
此外,随时以任何方式联系我。我在Cognitive Computations Discord上,我关注社区标签,联系我!我很乐意看到这种方法以其他方式使用,因此会尽我所能支持任何人。
Codestral-22B-v0.1的原始模型卡片
Codestrall-22B-v0.1在80多种编程语言的多样化数据集上训练,包括最流行的语言,如Python、Java、C、C++、JavaScript和Bash(更多细节见博客文章)。该模型可以查询:
- 作为指导,例如回答关于代码片段的任何问题(编写文档、解释、分解)或根据特定指示生成代码
- 作为中间填充(FIM),预测前缀和后缀之间的中间标记(对于像VS Code这样的软件开发插件非常有用)
安装
建议将mistralai/Codestral-22B-v0.1
与mistral-inference一起使用。
pip install mistral_inference
下载
from huggingface_hub import snapshot_download
from pathlib import Path
mistral_models_path = Path.home().joinpath('mistral_models', 'Codestral-22B-v0.1')
mistral_models_path.mkdir(parents=True, exist_ok=True)
snapshot_download(repo_id="mistralai/Codestral-22B-v0.1", allow_patterns=["params.json", "consolidated.safetensors", "tokenizer.model.v3"], local_dir=mistral_models_path)
聊天
安装mistral_inference
后,你的环境中应该有一个mistral-chat
CLI命令。
mistral-chat $HOME/mistral_models/Codestral-22B-v0.1 --instruct --max_tokens 256
将生成对“给我写一个计算斐波那契数列的Rust函数”的答案,应该会给出类似以下的内容:
当然,这里有一个简单的Rust函数实现,用于计算斐波那契数列。这个函数接受一个整数`n`作为参数,并返回第`n`个斐波那契数。
fn fibonacci(n: u32) -> u32 {
match n {
0 => 0,
1 => 1,
_ => fibonacci(n - 1) + fibonacci(n - 2),
}
}
fn main() {
let n = 10;
println!("第{}个斐波那契数是: {}", n, fibonacci(n));
}
这个函数使用递归来计算斐波那契数。然而,这不是最有效的解决方案,因为它执行了很多冗余计算。一个更有效的解决方案是使用循环迭代计算斐波那契数。
中间填充(FIM)
安装mistral_inference
并运行pip install --upgrade mistral_common
以确保安装了mistral_common>=1.2:
from mistral_inference.model import Transformer
from mistral_inference.generate import generate
from mistral_common.tokens.tokenizers.mistral import MistralTokenizer
from mistral_common.tokens.instruct.request import FIMRequest
tokenizer = MistralTokenizer.v3()
model = Transformer.from_folder("~/codestral-22B-240529")
prefix = """def add("""
suffix = """ return sum"""
request = FIMRequest(prompt=prefix, suffix=suffix)
tokens = tokenizer.encode_fim(request).tokens
out_tokens, _ = generate([tokens], model, max_tokens=256, temperature=0.0, eos_id=tokenizer.instruct_tokenizer.tokenizer.eos_id)
result = tokenizer.decode(out_tokens[0])
middle = result.split(suffix)[0].strip()
print(middle)
应该会给出类似以下的内容:
num1, num2):
# 两个数相加
sum = num1 + num2
# 返回和
限制
Codestral-22B-v0.1没有任何审查机制。我们期待与社区合作,找到使模型精细尊重护栏的方法,允许在需要审查输出的环境中部署。
许可证
Codestral-22B-v0.1在MNLP-0.1
许可证下发布。
Mistral AI团队
Albert Jiang, Alexandre Sablayrolles, Alexis Tacnet, Antoine Roux, Arthur Mensch, Audrey Herblin-Stoop, Baptiste Bout, Baudouin de Monicault, Blanche Savary, Bam4d, Caroline Feldman, Devendra Singh Chaplot, Diego de las Casas, Eleonore Arcelin, Emma Bou Hanna, Etienne Metzger, Gianna Lengyel, Guillaume Bour, Guillaume Lample, Harizo Rajaona, Henri Roussez, Jean-Malo Delignon, Jia Li, Justus Murke, Kartik Khandelwal, Lawrence Stewart, Louis Martin, Louis Ternon, Lucile Saulnier, Lélio Renard Lavaud, Margaret Jennings, Marie Pellat, Marie Torelli, Marie-Anne Lachaux, Marjorie Janiewicz, Mickael Seznec, Nicolas Schuhl, Patrick von Platen, Romain Sauvestre, Pierre Stock, Sandeep Subramanian, Saurabh Garg, Sophia Yang, Szymon Antoniak, Teven Le Scao, Thibaut Lavril, Thibault Schueller, Timothée Lacroix, Théophile Gervet, Thomas Wang, Valera Nemychnikova, Wendy Shang, William El Sayed, William Marshall