decoderesearch/circuit-tracer

GitHub: decoderesearch/circuit-tracer

基于跨层 MLP transcoder 特征的大语言模型电路发现、可视化与干预分析库。

Stars: 2823 | Forks: 330

# circuit-tracer 本库实现了相关工具,用于利用(跨层)MLP transcoder 的特征来寻找电路,该方法最初由 [Ameisen et al. (2025)](https://transformer-circuits.pub/2025/attribution-graphs/methods.html) 和 [Lindsey et al. (2025)](https://transformer-circuits.pub/2025/attribution-graphs/biology.html) 提出。 我们的库主要执行三项任务: 1. 给定一个带有预训练 transcoder 的模型,它能找到电路 / 归因图;即计算每个非零 transcoder 特征、transcoder 误差节点和输入 token 对其他每个非零 transcoder 特征及输出 logit 的直接效应。 2. 给定一个归因图,它能将此图可视化,并允许你对这些特征进行标注。 3. 利用从归因图中获得的洞察,对模型的 transcoder 特征进行干预;即你可以将特征设置为任意值,并观察模型输出的变化。 ## 入门指南 一个快速开始的方法是尝试我们的[教程笔记本](https://github.com/safety-research/circuit-tracer/blob/main/demos/circuit_tracing_tutorial.ipynb)! 你还可以通过以下三种方式之一来寻找电路并将其可视化: 1. 在 [Neuronpedia](https://www.neuronpedia.org/gemma-2-2b/graph?slug=gemma-fact-dallas-austin&pinnedIds=27_22605_10%2C20_15589_10%2CE_26865_9%2C21_5943_10%2C23_12237_10%2C20_15589_9%2C16_25_9%2C14_2268_9%2C18_8959_10%2C4_13154_9%2C7_6861_9%2C19_1445_10%2CE_2329_7%2CE_6037_4%2C0_13727_7%2C6_4012_7%2C17_7178_10%2C15_4494_4%2C6_4662_4%2C4_7671_4%2C3_13984_4%2C1_1000_4%2C19_7477_9%2C18_6101_10%2C16_4298_10%2C7_691_10&supernodes=%5B%5B%22state%22%2C%226_4012_7%22%2C%220_13727_7%22%5D%2C%5B%22preposition+followed+by+place+name%22%2C%2219_1445_10%22%2C%2218_6101_10%22%5D%2C%5B%22Texas%22%2C%2220_15589_10%22%2C%2220_15589_9%22%2C%2219_7477_9%22%2C%2216_25_9%22%2C%224_13154_9%22%2C%2214_2268_9%22%2C%227_6861_9%22%5D%2C%5B%22capital+%2F+capital+cities%22%2C%2215_4494_4%22%2C%226_4662_4%22%2C%224_7671_4%22%2C%223_13984_4%22%2C%221_1000_4%22%2C%2221_5943_10%22%2C%2217_7178_10%22%2C%227_691_10%22%2C%2216_4298_10%22%5D%5D&pruningThreshold=0.6&clickedId=21_5943_10&densityThreshold=0.99) 上使用 `circuit-tracer` —— 无需安装!只需点击 `+ New Graph` 来创建你自己的图表,或使用下拉菜单选择现有的图表。 2. 通过 Python 脚本或 Jupyter 笔记本运行 `circuit-tracer`。从我们的[教程笔记本](https://github.com/safety-research/circuit-tracer/blob/main/demos/circuit_tracing_tutorial.ipynb)开始。这可以在默认免费提供的 GPU 资源的 Colab 上运行——只需点击 Colab 徽章!查看下方的 **Demos** 部分以获取更多教程。你也可以在本地使用自己的算力运行这些演示笔记本。 3. 通过命令行界面运行 `circuit-tracer`。这只能在你自己的算力上完成。有关如何执行此操作的更多信息,请参阅 **Command-Line Interface**。 在 GPU 资源相对有限的情况下,也可以处理 Gemma-2 (2B) 模型;Colab GPU 拥有 15GB 的 RAM。更多的 GPU RAM 将允许你减少卸载,并使用更大的 batch size。 目前,无论你是在脚本或笔记本中使用 `circuit-tracer`,还是在 Neuronpedia 上处理 Gemma-2 (2B),都可以针对你在图中发现的 transcoder 特征对模型进行干预。要在 Neuronpedia 上执行干预,请确保至少固定一个节点,然后点击子图中的“Steer”。 ### 安装 要安装此库,请克隆它并在其目录中运行命令 `pip install .`。 ### 示例 我们在 `demos` 文件夹中包含了一些演示,展示了如何使用我们的库。主要演示是 [`demos/circuit_tracing_tutorial.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/circuit_tracing_tutorial.ipynb),它使用 Gemma 2 (2B) 复现了[这篇论文](https://transformer-circuits.pub/2025/attribution-graphs/biology.html)中的两项发现。除了 Llama 演示外,所有演示均可在 Colab 上运行。 我们还提供了两个关于归因和干预的简单演示,供希望进一步了解如何使用该库的用户参考: - [`demos/attribute_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/attribute_demo.ipynb):演示如何寻找电路并将其可视化。 - [`demos/attribution_targets_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/attribution_targets_demo.ipynb):演示如何通过指定归因目标(即你希望从其进行归因的特定 logit 或相关量)来寻找电路。 - [`demos/intervention_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/intervention_demo.ipynb):演示如何对模型执行干预。 最后,我们提供了深入研究特定的、预计算和预标注归因图的演示,通过执行干预来证明所标注图表的正确性: - [`demos/gemma_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/gemma_demo.ipynb):探索 Gemma 2 (2B) 的图表。 - [`demos/gemma_it_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/gemma_it_demo.ipynb):使用基础模型的 transcoder,探索经过指令微调的 Gemma 2 (2B) 的图表。 - [`demos/llama_demo.ipynb`](https://github.com/safety-research/circuit-tracer/blob/main/demos/llama_demo.ipynb):探索 Llama 3.2 (1B) 的图表。Colab 不支持此演示。 我们还为这两个模型提供了大量带标注的归因图,可以在它们各自的两个演示笔记本的顶部找到。 ## 用法 ### 可用的 Transcoder **在 HuggingFace 上** 以下 transcoder 可用于 `circuit-tracer`;这意味着 transcoder 的权重和特征均可用(因此当你运行可视化服务器时,特征将正确加载)。你可以使用 HuggingFace 仓库名称(例如 `mntss/gemma-scope-transcoders`)作为 `ReplacementModel.from_pretrained` 的 `transcoders` 参数,或在 CLI 中作为 `--transcoder_set` 的参数。 - Gemma-2 (2B):[PLTs](https://huggingface.co/mntss/gemma-scope-transcoders)(最初来自 [GemmaScope](https://huggingface.co/google/gemma-scope))以及具有 2 种特征数量的 CLT:[426K](https://huggingface.co/mntss/clt-gemma-2-2b-426k) 和 [2.5M](https://huggingface.co/mntss/clt-gemma-2-2b-2.5M) - Llama-3.2 (1B):[PLTs](https://huggingface.co/mntss/transcoder-Llama-3.2-1B) 和 [CLTs](https://huggingface.co/mntss/clt-llama-3.2-1b-524k) - Qwen-3 PLT:适用于 Qwen-3 [0.6B](https://huggingface.co/mwhanna/qwen3-0.6b-transcoders-lowl0), [1.7B](https://huggingface.co/mwhanna/qwen3-1.7b-transcoders-lowl0), [4B](https://huggingface.co/mwhanna/qwen3-4b-transcoders), [8B](https://huggingface.co/mwhanna/qwen3-8b-transcoders) 和 [14B](https://huggingface.co/mwhanna/qwen3-14b-transcoders-lowl0) - [GPT-OSS (20B) CLT](https://huggingface.co/mntss/clt-131k) - Gemma-3 PLT(最初来自 [GemmaScope-2](https://huggingface.co/google/gemma-scope-2))可在[此处找到大小为 270M、1B、4B、12B 和 27B 的 PT 及 IT 模型](https://huggingface.co/collections/mwhanna/gemma-scope-2-transcoders-circuit-tracer)。这些需要使用 `nnsight` 后端。 - Llama 3.1 (8B) Instruct:[TopK PLTs](https://huggingface.co/facebook/crv-8b-instruct-transcoders) **本地保存的 Transcoder** 通过使用 `ReplacementModel.from_pretrained` 并将完整的根路径(而非相对路径)作为 `transcoders` 参数(例如 `/path/to/local_transcoders/`),可以加载本地保存的 transcoder。在这种情况下,要启用特征可视化,你必须通过将 `serve` 中的可选 `features_dir` 参数设置为相同目录,来将可视化服务器指向本地特征数据;例如: `serve(data_dir=graph_path, port=port, features_dir='/path/to/local_transcoders/')` ### 选择后端 默认情况下,`circuit-tracer` 会创建一个继承自 `TransformerLens` `HookedTransformer` 类的 `ReplacementModel`。然而,`TransformerLens` 并不支持所有的 HuggingFace 模型;它仅支持在 `TransformerLens` 中实现的那些模型。 使用 `backend='nnsight'` 创建 `ReplacementModel` 将创建一个由 `nnsight` 支持的 `ReplacementModel`,它继承自其 `LanguageModel` 类;这支持大多数 HuggingFace 模型。也就是说,你可以使用 `ReplacementModel.from_pretrained(model_name, backend='nnsight')` 来创建一个 `nnsight` `ReplacementModel`。但请注意,`nnsight` 后端仍处于实验阶段:它的速度较慢,内存效率较低,并且可能无法提供 `TransformerLens` 版本的所有功能。 ### 缓存 为了在 transcoder 上使用 `lazy_decoder` 和 `lazy_encoder` 选项,它们必须以 `circuit-tracer` 兼容的格式存储。虽然许多 transcoder 已经以该格式上传到 HuggingFace,但这需要大量的存储空间。现在,`circuit-tracer` 支持转而创建模型的本地缓存,只需调用例如: ``` from circuit_tracer.utils.caching import save_transcoders_to_cache hf_ref = "mwhanna/gemma-scope-2-27b-pt/transcoder_all/width_262k_l0_small" cache_dir = '~/.cache/' save_transcoders_to_cache(hf_ref, cache_dir=cache_dir) ``` 你还可以使用 `circuit_tracer.utils.caching.empty_cache` 清空缓存。 ## 命令行界面 统一的 CLI 执行寻找和可视化电路的完整 3 步流程: ### 3 步流程 1. **归因**:运行归因算法以寻找电路/归因图,计算 transcoder 特征、误差节点、token 和输出 logit 之间的直接效应。 2. **创建图表文件**:修剪归因图以移除低效应的节点和边,然后将其转换为适合可视化的 JSON 格式。 3. **本地服务器**:启动本地 Web 服务器,以便在你的浏览器中可视化图表并与之交互。 ### 基本用法 要寻找电路、创建图表文件并启动本地服务器,请使用以下命令: ``` circuit-tracer attribute --prompt [prompt] --transcoder_set [transcoder_set] --slug [slug] --graph_file_dir [directory] --slug [slug] --graph_file_dir [graph_file_dir] --server ``` 它会告诉你服务器的服务位置(类似于 `localhost:[port]`)。如果你在远程机器上运行此命令,请确保启用端口转发,以便你在本地查看图表! ### 必需参数 **归因** - `--prompt` (`-p`):要分析的输入提示词 - `--transcoder_set` (`-t`):用于归因的 transcoder 集合。选项: - HuggingFace 仓库 ID(例如 `mntss/gemma-scope-transcoders`、`username/repo-name@revision`) - 方便的快捷方式:`gemma`(GemmaScope transcoder)或 `llama`(ReLU transcoder) - 本地保存的 transcoder 的路径:`/path/to/local_transcoders/` **创建图表文件** 如果你想运行本地 Web 服务器进行可视化,则需要这些参数: - `--slug`:你的分析运行的名称/标识符 - `--graph_file_dir`:保存 JSON 图表文件的目录路径 你也可以保存原始归因图(以便稍后在 Python 中加载和使用): - `--graph_output_path` (`-o`):保存原始归因图(`.pt` 文件)的路径 你必须设置 `--slug` 和 `--graph_file_dir`,或者 `--graph_output_path`,或者两者都设置!否则 CLI 将不输出任何内容。 **本地服务器** - `--server`:启动用于图表可视化的本地 Web 服务器 ### 可选参数 **归因参数:** - `--model` (`-m`):模型架构(对于 `gemma` 和 `llama` 预设自动推断) - `--max_n_logits`(默认值:10):要从其进行归因的最大 logit 节点数 - `--desired_logit_prob`(默认值:0.95):top logit 的累积概率阈值 - `--batch_size`(默认值:256):反向传递的 batch size - `--max_feature_nodes`:特征节点的最大数量(默认为 7500) - `--dtype`:加载模型/transcoder 的数据类型(允许的值:`float32/fp32`、`float16/fp16`、`bfloat16/bf16`) - `--offload`:内存优化选项(`cpu`、`disk` 或 `None`) - `--verbose`:显示详细的进度信息 **图表修剪参数:** - `--node_threshold`(默认值:0.8):保留累积影响 ≥ 阈值的最少节点 - `--edge_threshold`(默认值:0.98):保留累积影响 ≥ 阈值的最少边 **服务器参数:** - `--port`(默认值:8041):本地服务器的端口 - `--features_dir`(默认值:None):如果使用本地 transcoder,包含本地服务器特征文件的目录路径 ### 示例 **包含可视化的完整工作流:** ``` circuit-tracer attribute \ --prompt "The International Advanced Security Group (IAS" \ --transcoder_set gemma \ --slug gemma-demo \ --graph_file_dir ./graph_files \ --server ``` **仅归因(保存原始图表):** ``` circuit-tracer attribute \ --prompt "The capital of France is" \ --transcoder_set llama \ --graph_output_path france_capital.pt ``` ### 图表标注 使用 `--server` 选项时,你的浏览器将打开一个本地可视化界面。该界面与[原论文](https://transformer-circuits.pub/2025/attribution-graphs/methods.html)中的相同(前端可在[此处](https://github.com/anthropics/attribution-graphs-frontend)获取)。 - **选择节点**:点击一个节点。 - **将节点固定/取消固定到子图窗格**:Ctrl+点击/Command+点击该节点。 - **标注节点**:选中节点后,点击窗口右侧的“Edit”按钮以编辑其标注。 - **节点分组**:按住 G 并点击节点,将它们组合成一个 supernode。按住 G 并点击 supernode 旁边的 x 将它们全部取消分组。 - **标注 supernode / 节点组**:点击 supernode 下方的标签以编辑 supernode 标注。 ## 引用 你可以按如下方式引用此库: ``` @misc{circuit-tracer, author = {Hanna, Michael and Piotrowski, Mateusz and Lindsey, Jack and Ameisen, Emmanuel}, title = {circuit-tracer}, howpublished = {\url{https://github.com/decoderesearch/circuit-tracer}}, note = {The first two authors contributed equally and are listed alphabetically.}, year = {2025} } ``` 或在此处[引用该论文](https://aclanthology.org/2025.blackboxnlp-1.14/)。
标签:DLL 劫持, 人工智能, 凭据扫描, 大语言模型, 归因分析, 模型可解释性, 用户模式Hook绕过, 稀疏自编码器, 逆向工具