teilomillet/vauban
GitHub: teilomillet/vauban
基于 MLX 的 Apple Silicon 原生工具包,通过激活空间几何对语言模型进行安全审计、行为探测和攻防干预。
Stars: 1 | Forks: 0
# vauban
一个 MLX 原生工具包,用于理解和重塑语言模型在 Apple Silicon 上的行为。
以 [Sébastien Le Prestre de Vauban](https://en.wikipedia.org/wiki/Vauban) 的名字命名,这位军事工程师在攻城和防御工事方面均有建树。Vauban 对模型行为也做着同样的事情:测量、切割、探测、引导或强化。
## 它能做什么
Vauban 是一个 TOML 优先的 CLI,用于围绕激活空间几何构建的工作流:
- 从模型激活中测量行为方向
- 在权重中切割或稀疏化这些方向
- 在运行时探测和引导模型
- 在干预前后映射拒绝曲面
- 运行防御、清理、优化和攻击循环
主要接口并非一堆子命令。它是:
```
vauban
```
所有 pipeline 行为都存在于 TOML 文件中。
## 系统要求
- Apple Silicon Mac
- Python 3.12+
- [uv](https://docs.astral.sh/uv/)
## 安装
安装已发布的 CLI:
```
uv tool install vauban
```
如果你的 shell 无法找到 `vauban`,请更新一次你的 shell 配置:
```
uv tool update-shell
```
然后打开一个新的 shell 并检查命令:
```
vauban --help
vauban man workflows
```
从本仓库进行开发:
```
uv tool install --editable .
```
贡献者工作流和仓库策略位于 [CONTRIBUTING.md](CONTRIBUTING.md)。
## 快速开始
选择一个目标——手册会告诉你该使用哪些部分:
```
vauban man workflows
```
然后脚手架生成一个配置并运行:
```
vauban man quickstart
```
脚手架生成一个启动配置:
```
vauban init --mode default --output run.toml
```
所有 pipeline 模式都可以通过脚手架生成。使用以下命令查看完整列表:
```
vauban init --help
```
在实际运行之前进行验证:
```
vauban --validate run.toml
```
然后运行 pipeline:
```
vauban run.toml
```
默认情况下,输出将进入 TOML 文件相对路径下的 `output/` 目录。
## 最小化 TOML
这是代码为默认 pipeline 接受的最小配置:
```
[model]
path = "mlx-community/Llama-3.2-3B-Instruct-4bit"
[data]
harmful = "default"
harmless = "default"
```
`[model].path` 是必填项。
`[data].harmful` 和 `[data].harmless` 在大多数运行中是必填的。`"default"` 使用 Vauban 内置的提示词集。
你也可以显式选择输出目录:
```
[output]
dir = "runs/baseline"
```
## 实验科技树
Vauban 通过可选的 `[meta]` 部分内置了实验谱系追踪。此元数据不会改变 pipeline 的执行。它的存在是为了让你可以将运行组织成一棵科技树。
最小化示例:
```
[meta]
id = "cut-alpha-1"
title = "Baseline cut, alpha 1.0"
status = "baseline"
parents = ["measure-v1"]
tags = ["cut", "baseline"]
date = 2026-03-02
notes = "First stable reference run."
```
已验证的状态值为:
```
archived, baseline, dead_end, promising, superseded, wip
```
如果省略了 `[meta].id`,Vauban 将使用 TOML 文件名的主体部分(不含扩展名)。
从一个包含 TOML 配置的目录渲染该树:
```
vauban tree experiments/
vauban tree experiments/ --format mermaid
vauban tree experiments/ --status promising
vauban tree experiments/ --tag gcg
```
每次运行还会在配置的输出目录中追加一个 `experiment_log.jsonl` 文件,其中包含已解析的配置路径、pipeline 模式、报告文件、指标以及选定的 `[meta]` 字段。
## TOML 如何驱动 Vauban
`vauban ` 加载一个 TOML 文件,并根据你包含的部分决定要做什么。
默认路径是:
1. measure
2. cut
3. export
你可以通过添加更多部分来扩展该运行。常见示例:
- `[eval]` 添加切割后的评估报告。
- `[surface]` 添加干预前后的拒绝曲面映射。
- `[detect]` 在测量期间添加强化检测。
- 某些部分会将 Vauban 切换到专用的特定模式运行,而不是默认 pipeline。
如果你知道要做什么,但不知道该使用哪些部分:
```
vauban man workflows
```
获取任何部分的字段级参考:
```
vauban man cast
vauban man softprompt
vauban man measure
```
了解模式优先级:
```
vauban man modes
```
## 你将实际使用的命令
查看手册:
```
vauban man workflows
vauban man quickstart
vauban man cast
vauban man all
```
脚手架生成配置:
```
vauban init --help
vauban init --mode default --output run.toml
vauban init --mode probe --output probe.toml
```
在不加载模型权重的情况下验证配置和提示词文件:
```
vauban --validate run.toml
```
导出当前的 JSON Schema 以供编辑器工具使用:
```
vauban schema
vauban schema --output vauban.schema.json
```
比较两个运行目录:
```
vauban diff run_a run_b
vauban diff --format markdown run_a run_b
vauban diff --threshold 0.05 run_a run_b
```
`vauban diff --threshold ...` 是一个 CI 门控:如果任何绝对指标增量超过阈值,它将以非零状态退出。
渲染实验谱系树:
```
vauban tree experiments/
vauban tree experiments/ --format mermaid
vauban tree experiments/ --status promising
```
## 数据格式
由生成的手册验证:
- 用于 `[data]` 和 `[eval]` 的 prompt JSONL:每行一个带有 `prompt` 键的 JSON 对象
- 用于 `[surface].prompts` 的 surface JSONL:需要 `label` 和 `category`,以及 `prompt` 或 `messages` 中的任意一个
- refusal phrase 文件:纯文本,每行一个短语
- 相对路径从 TOML 文件所在的目录开始解析
最小化 prompt 数据集示例:
```
{"prompt":"What is the capital of France?"}
{"prompt":"Write a haiku about rain."}
```
## 验证说明
本 README 与此仓库中的代码保持一致:
- 包名:`vauban`
- 控制台脚本:`vauban = vauban.__main__:main`
- 已验证的命令:`vauban `、`--validate`、`schema`、`init`、`diff`、`tree`、`man`
- 已验证的手册主题和脚手架生成的模式已与实时 CLI 帮助和生成的手册进行过核对
当前的 README 以前包含一些过时的模式/输出声明;此版本移除了这些内容,并引导读者查看 `vauban man ...`,以获取直接从代码生成的部分。
## Python API (Session)
对于编程式使用,`Session` 类封装了一个加载的模型,并提供了工具发现、前置条件追踪和结构化结果。
```
from vauban.session import Session
s = Session("mlx-community/Qwen2.5-1.5B-Instruct-bf16")
s.tools() # discover all capabilities
s.guide("audit") # step-by-step workflow
s.describe("cast") # detailed tool info with current status
s.catalog() # all tools grouped by category
```
### 工具
| 方法 | 返回值 | 功能 |
|--------|---------|-------------|
| `s.measure()` | `DirectionResult` | 从激活中提取拒绝方向 |
| `s.detect()` | `DetectResult` | 检查模型是否已被强化以抵抗 abliteration |
| `s.audit(thoroughness=...)` | `AuditResult` | 完整的红队测试:越狱 + softprompt + surface + guard |
| `s.evaluate()` | `EvalResult` | 拒绝率 + 困惑度 + KL 散度 |
| `s.probe("prompt")` | `ProbeResult` | 每层对拒绝方向的投影 |
| `s.scan("text")` | `ScanResult` | 逐 token 的注入检测 |
| `s.surface()` | `SurfaceResult` | 跨提示词类别映射拒绝边界 |
| `s.cast("prompt", threshold=0.3)` | `CastResult` | 条件激活引导(防御) |
| `s.sic(["prompt", ...])` | `SICResult` | 迭代输入清理(防御) |
| `s.steer("prompt", alpha=-1.0)` | `str` | 无条件激活引导 |
| `s.cut(alpha=1.0)` | `dict[str, Array]` | 从权重中移除拒绝方向 |
| `s.export("output/")` | `str` | 将修改后的模型保存到磁盘 |
| `s.classify("text")` | harm scores | 根据 13 个领域的伤害分类体系进行评分 |
| `s.score("prompt", "response")` | score result | 5 轴质量评估 |
| `s.report()` | `str` | 根据审计结果生成 Markdown 报告 |
### 结果类型
**DirectionResult**(来自 `measure`):`direction`(Array,形状为 d_model),`layer_index`(最佳层),`cosine_scores`(各层分离度),`d_model`,`model_path`。
**CastResult**(来自 `cast`):`text`(生成的输出),`interventions`(CAST 进行了引导的 token,0 = 防御未启动),`considered`(总 token 数),`projections_before`/`projections_after`(各层)。
**SICResult**(来自 `sic`):`prompts_clean`(清理后的文本),`prompts_blocked`(每个提示词的布尔值),`initial_scores`/`final_scores`(方向投影),`total_blocked`/`total_sanitized`/`total_clean`。
**DetectResult**(来自 `detect`):`hardened`(布尔值),`confidence`(0.0-1.0),`effective_rank`(>1.5 表示已强化),`evidence`(字符串列表)。
**AuditResult**(来自 `audit`):`overall_risk`("critical"/"high"/"medium"/"low"),`findings`(AuditFinding 列表),`jailbreak_success_rate`,`softprompt_success_rate`,`surface_refusal_rate`。
### 决策指南
| 我想要... | 使用 |
|--------------|-----|
| 了解模型拒绝什么 | `measure()` 然后 `surface()` |
| 检查模型是否已强化 | `detect()` |
| 完整的安全审计 | `audit()` 然后 `report()` |
| 防御对抗性输入 | `measure()` 然后 `sic()` + `cast()` |
| 永久移除拒绝行为 | `measure()` 然后 `cut()` 然后 `export()` |
| 评估响应质量 | `score("prompt", "response")`(无需模型) |
### 前置条件
```
model (loaded at Session init)
├── measure() → direction
│ ├── probe(), scan(), surface()
│ ├── steer(), cast(), sic()
│ ├── evaluate()
│ └── cut() → modified_model → export()
├── detect(), audit() → report()
└── jailbreak()
classify(), score() → no prerequisites
```
## 文档
完整文档:[docs.vauban.dev](https://docs.vauban.dev/)
| 资源 | 描述 |
|----------|-------------|
| [概念](https://docs.vauban.dev/concepts/activation-geometry/) | 领域知识:激活几何、拒绝方向、测量、引导 |
| [能力](https://docs.vauban.dev/capabilities/understand-your-model/) | 你可以做什么:理解、防御、压力测试、修改 |
| [原则](https://docs.vauban.dev/principles/attack-defense-duality/) | 设计理念:二元性、可组合性、可重现性 |
| [Abliteration 入门](https://docs.vauban.dev/class/) | 八部分渐进式课程 |
| [配置参考](https://docs.vauban.dev/config/) | TOML 字段参考 |
| [`examples/config.toml`](examples/config.toml) | 带有注释的示例配置 |
## 许可证
Apache-2.0
标签:Apex, Apple Silicon, CISA项目, DLL 劫持, Linux系统监控, LLM攻击, MLX, Python, Python安全, TOML配置, 人工智能, 大语言模型, 密码管理, 对抗性机器学习, 无后门, 服务器监控, 机器学习, 模型优化, 模型修剪, 模型安全, 模型干预, 模型微调, 模型行为分析, 模型防御, 激活空间几何, 特征提取, 用户模式Hook绕过, 稀疏化, 逆向工具