[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7AKJS2R2ZWSWRW9MDKCXJQV":3,"skill-same:01M7AKJS2R2ZWSWRW9MDKCXJQV":71},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":36,"commitSha":37,"skillDirectory":38,"forksCount":14,"repositoryHtmlUrl":39,"repositoryHomepageUrl":6,"ownerHtmlUrl":40,"ownerBlogUrl":6,"ownerDescription":41,"updatedAt":42,"install":43,"resources":56},"01M7AKJS2R2ZWSWRW9MDKCXJQV","pyvene-interventions",null,"Provides guidance for performing causal interventions on PyTorch models using pyvene's declarative intervention framework. Use when conducting causal tracing, activation patching, interchange intervention training, or testing causal hypotheses about model behavior.","GongYuanCaiJi\u002Fdsh-claude-code-templates","GongYuanCaiJi","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F129952120?v=4","01M7AK39Q4W3VPF7C1K8M58BFX","劉昱廷 Yu-Ting Liu","01M7AK39QPS2RAJKRQY0EPQJPZ",0,"MIT","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-pyvene\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: pyvene-interventions\ndescription: Provides guidance for performing causal interventions on PyTorch models using pyvene's declarative intervention framework. Use when conducting causal tracing, activation patching, interchange intervention training, or testing causal hypotheses about model behavior.\nversion: 1.0.0\nauthor: Orchestra Research\nlicense: MIT\ntags: [Causal Intervention, pyvene, Activation Patching, Causal Tracing, Interpretability]\ndependencies: [pyvene>=0.1.8, torch>=2.0.0, transformers>=4.30.0]\n---\n\n# pyvene: Causal Interventions for Neural Networks\n\npyvene is Stanford NLP's library for performing causal interventions on PyTorch models. It provides a declarative, dict-based framework for activation patching, causal tracing, and interchange intervention training - making intervention experiments reproducible and shareable.\n\n**GitHub**: [stanfordnlp\u002Fpyvene](https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fpyvene) (840+ stars)\n**Paper**: [pyvene: A Library for Understanding and Improving PyTorch Models via Interventions](https:\u002F\u002Faclanthology.org\u002F2024.naacl-demo.16) (NAACL 2024)\n\n## When to Use pyvene\n\n**Use pyvene when you need to:**\n- Perform causal tracing (ROME-style localization)\n- Run activation patching experiments\n- Conduct interchange intervention training (IIT)\n- Test causal hypotheses about model components\n- Share\u002Freproduce intervention experiments via HuggingFace\n- Work with any PyTorch architecture (not just transformers)\n\n**Consider alternatives when:**\n- You need exploratory activation analysis → Use **TransformerLens**\n- You want to train\u002Fanalyze SAEs → Use **SAELens**\n- You need remote execution on massive models → Use **nnsight**\n- You want lower-level control → Use **nnsight**\n\n## Installation\n\n```bash\npip install pyvene\n```\n\nStandard import:\n```python\nimport pyvene as pv\n```\n\n## Core Concepts\n\n### IntervenableModel\n\nThe main class that wraps any PyTorch model with intervention capabilities:\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\n# Load base model\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2\")\n\n# Define intervention configuration\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,\n            component=\"block_output\",\n            intervention_type=pv.VanillaIntervention,\n        )\n    ]\n)\n\n# Create intervenable model\nintervenable = pv.IntervenableModel(config, model)\n```\n\n### Intervention Types\n\n| Type | Description | Use Case |\n|------|-------------|----------|\n| `VanillaIntervention` | Swap activations between runs | Activation patching |\n| `AdditionIntervention` | Add activations to base run | Steering, ablation |\n| `SubtractionIntervention` | Subtract activations | Ablation |\n| `ZeroIntervention` | Zero out activations | Component knockout |\n| `RotatedSpaceIntervention` | DAS trainable intervention | Causal discovery |\n| `CollectIntervention` | Collect activations | Probing, analysis |\n\n### Component Targets\n\n```python\n# Available components to intervene on\ncomponents = [\n    \"block_input\",      # Input to transformer block\n    \"block_output\",     # Output of transformer block\n    \"mlp_input\",        # Input to MLP\n    \"mlp_output\",       # Output of MLP\n    \"mlp_activation\",   # MLP hidden activations\n    \"attention_input\",  # Input to attention\n    \"attention_output\", # Output of attention\n    \"attention_value_output\",  # Attention value vectors\n    \"query_output\",     # Query vectors\n    \"key_output\",       # Key vectors\n    \"value_output\",     # Value vectors\n    \"head_attention_value_output\",  # Per-head values\n]\n```\n\n## Workflow 1: Causal Tracing (ROME-style)\n\nLocate where factual associations are stored by corrupting inputs and restoring activations.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2-xl\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2-xl\")\n\n# 1. Define clean and corrupted inputs\nclean_prompt = \"The Space Needle is in downtown\"\ncorrupted_prompt = \"The ##### ###### ## ## ########\"  # Noise\n\nclean_tokens = tokenizer(clean_prompt, return_tensors=\"pt\")\ncorrupted_tokens = tokenizer(corrupted_prompt, return_tensors=\"pt\")\n\n# 2. Get clean activations (source)\nwith torch.no_grad():\n    clean_outputs = model(**clean_tokens, output_hidden_states=True)\n    clean_states = clean_outputs.hidden_states\n\n# 3. Define restoration intervention\ndef run_causal_trace(layer, position):\n    \"\"\"Restore clean activation at specific layer and position.\"\"\"\n    config = pv.IntervenableConfig(\n        representations=[\n            pv.RepresentationConfig(\n                layer=layer,\n                component=\"block_output\",\n                intervention_type=pv.VanillaIntervention,\n                unit=\"pos\",\n                max_number_of_units=1,\n            )\n        ]\n    )\n\n    intervenable = pv.IntervenableModel(config, model)\n\n    # Run with intervention\n    _, patched_outputs = intervenable(\n        base=corrupted_tokens,\n        sources=[clean_tokens],\n        unit_locations={\"sources->base\": ([[[position]]], [[[position]]])},\n        output_original_output=True,\n    )\n\n    # Return probability of correct token\n    probs = torch.softmax(patched_outputs.logits[0, -1], dim=-1)\n    seattle_token = tokenizer.encode(\" Seattle\")[0]\n    return probs[seattle_token].item()\n\n# 4. Sweep over layers and positions\nn_layers = model.config.n_layer\nseq_len = clean_tokens[\"input_ids\"].shape[1]\n\nresults = torch.zeros(n_layers, seq_len)\nfor layer in range(n_layers):\n    for pos in range(seq_len):\n        results[layer, pos] = run_causal_trace(layer, pos)\n\n# 5. Visualize (layer x position heatmap)\n# High values indicate causal importance\n```\n\n### Checklist\n- [ ] Prepare clean prompt with target factual association\n- [ ] Create corrupted version (noise or counterfactual)\n- [ ] Define intervention config for each (layer, position)\n- [ ] Run patching sweep\n- [ ] Identify causal hotspots in heatmap\n\n## Workflow 2: Activation Patching for Circuit Analysis\n\nTest which components are necessary for a specific behavior.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2\")\n\n# IOI task setup\nclean_prompt = \"When John and Mary went to the store, Mary gave a bottle to\"\ncorrupted_prompt = \"When John and Mary went to the store, John gave a bottle to\"\n\nclean_tokens = tokenizer(clean_prompt, return_tensors=\"pt\")\ncorrupted_tokens = tokenizer(corrupted_prompt, return_tensors=\"pt\")\n\njohn_token = tokenizer.encode(\" John\")[0]\nmary_token = tokenizer.encode(\" Mary\")[0]\n\ndef logit_diff(logits):\n    \"\"\"IO - S logit difference.\"\"\"\n    return logits[0, -1, john_token] - logits[0, -1, mary_token]\n\n# Patch attention output at each layer\ndef patch_attention(layer):\n    config = pv.IntervenableConfig(\n        representations=[\n            pv.RepresentationConfig(\n                layer=layer,\n                component=\"attention_output\",\n                intervention_type=pv.VanillaIntervention,\n            )\n        ]\n    )\n\n    intervenable = pv.IntervenableModel(config, model)\n\n    _, patched_outputs = intervenable(\n        base=corrupted_tokens,\n        sources=[clean_tokens],\n    )\n\n    return logit_diff(patched_outputs.logits).item()\n\n# Find which layers matter\nresults = []\nfor layer in range(model.config.n_layer):\n    diff = patch_attention(layer)\n    results.append(diff)\n    print(f\"Layer {layer}: logit diff = {diff:.3f}\")\n```\n\n## Workflow 3: Interchange Intervention Training (IIT)\n\nTrain interventions to discover causal structure.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\n\n# 1. Define trainable intervention\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=6,\n            component=\"block_output\",\n            intervention_type=pv.RotatedSpaceIntervention,  # Trainable\n            low_rank_dimension=64,  # Learn 64-dim subspace\n        )\n    ]\n)\n\nintervenable = pv.IntervenableModel(config, model)\n\n# 2. Set up training\noptimizer = torch.optim.Adam(\n    intervenable.get_trainable_parameters(),\n    lr=1e-4\n)\n\n# 3. Training loop (simplified)\nfor base_input, source_input, target_output in dataloader:\n    optimizer.zero_grad()\n\n    _, outputs = intervenable(\n        base=base_input,\n        sources=[source_input],\n    )\n\n    loss = criterion(outputs.logits, target_output)\n    loss.backward()\n    optimizer.step()\n\n# 4. Analyze learned intervention\n# The rotation matrix reveals causal subspace\nrotation = intervenable.interventions[\"layer.6.block_output\"][0].rotate_layer\n```\n\n### DAS (Distributed Alignment Search)\n\n```python\n# Low-rank rotation finds interpretable subspaces\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,\n            component=\"block_output\",\n            intervention_type=pv.LowRankRotatedSpaceIntervention,\n            low_rank_dimension=1,  # Find 1D causal direction\n        )\n    ]\n)\n```\n\n## Workflow 4: Model Steering (Honest LLaMA)\n\nSteer model behavior during generation.\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel = AutoModelForCausalLM.from_pretrained(\"meta-llama\u002FLlama-2-7b-hf\")\ntokenizer = AutoTokenizer.from_pretrained(\"meta-llama\u002FLlama-2-7b-hf\")\n\n# Load pre-trained steering intervention\nintervenable = pv.IntervenableModel.load(\n    \"zhengxuanzenwu\u002Fintervenable_honest_llama2_chat_7B\",\n    model=model,\n)\n\n# Generate with steering\nprompt = \"Is the earth flat?\"\ninputs = tokenizer(prompt, return_tensors=\"pt\")\n\n# Intervention applied during generation\noutputs = intervenable.generate(\n    inputs,\n    max_new_tokens=100,\n    do_sample=False,\n)\n\nprint(tokenizer.decode(outputs[0]))\n```\n\n## Saving and Sharing Interventions\n\n```python\n# Save locally\nintervenable.save(\".\u002Fmy_intervention\")\n\n# Load from local\nintervenable = pv.IntervenableModel.load(\n    \".\u002Fmy_intervention\",\n    model=model,\n)\n\n# Share on HuggingFace\nintervenable.save_intervention(\"username\u002Fmy-intervention\")\n\n# Load from HuggingFace\nintervenable = pv.IntervenableModel.load(\n    \"username\u002Fmy-intervention\",\n    model=model,\n)\n```\n\n## Common Issues & Solutions\n\n### Issue: Wrong intervention location\n```python\n# WRONG: Incorrect component name\nconfig = pv.RepresentationConfig(\n    component=\"mlp\",  # Not valid!\n)\n\n# RIGHT: Use exact component name\nconfig = pv.RepresentationConfig(\n    component=\"mlp_output\",  # Valid\n)\n```\n\n### Issue: Dimension mismatch\n```python\n# Ensure source and base have compatible shapes\n# For position-specific interventions:\nconfig = pv.RepresentationConfig(\n    unit=\"pos\",\n    max_number_of_units=1,  # Intervene on single position\n)\n\n# Specify locations explicitly\nintervenable(\n    base=base_tokens,\n    sources=[source_tokens],\n    unit_locations={\"sources->base\": ([[[5]]], [[[5]]])},  # Position 5\n)\n```\n\n### Issue: Memory with large models\n```python\n# Use gradient checkpointing\nmodel.gradient_checkpointing_enable()\n\n# Or intervene on fewer components\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,  # Single layer instead of all\n            component=\"block_output\",\n        )\n    ]\n)\n```\n\n### Issue: LoRA integration\n```python\n# pyvene v0.1.8+ supports LoRAs as interventions\nconfig = pv.RepresentationConfig(\n    intervention_type=pv.LoRAIntervention,\n    low_rank_dimension=16,\n)\n```\n\n## Key Classes Reference\n\n| Class | Purpose |\n|-------|---------|\n| `IntervenableModel` | Main wrapper for interventions |\n| `IntervenableConfig` | Configuration container |\n| `RepresentationConfig` | Single intervention specification |\n| `VanillaIntervention` | Activation swapping |\n| `RotatedSpaceIntervention` | Trainable DAS intervention |\n| `CollectIntervention` | Activation collection |\n\n## Supported Models\n\npyvene works with any PyTorch model. Tested on:\n- GPT-2 (all sizes)\n- LLaMA \u002F LLaMA-2\n- Pythia\n- Mistral \u002F Mixtral\n- OPT\n- BLIP (vision-language)\n- ESM (protein models)\n- Mamba (state space)\n\n## Reference Documentation\n\nFor detailed API documentation, tutorials, and advanced usage, see the `references\u002F` folder:\n\n| File | Contents |\n|------|----------|\n| [references\u002FREADME.md](references\u002FREADME.md) | Overview and quick start guide |\n| [references\u002Fapi.md](references\u002Fapi.md) | Complete API reference for IntervenableModel, intervention types, configurations |\n| [references\u002Ftutorials.md](references\u002Ftutorials.md) | Step-by-step tutorials for causal tracing, activation patching, DAS |\n\n## External Resources\n\n### Tutorials\n- [pyvene 101](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fpyvene_101.html)\n- [Causal Tracing Tutorial](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FCausal_Tracing.html)\n- [IOI Circuit Replication](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FIOI_Replication.html)\n- [DAS Introduction](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FDAS_Main_Introduction.html)\n\n### Papers\n- [Locating and Editing Factual Associations in GPT](https:\u002F\u002Farxiv.org\u002Fabs\u002F2202.05262) - Meng et al. (2022)\n- [Inference-Time Intervention](https:\u002F\u002Farxiv.org\u002Fabs\u002F2306.03341) - Li et al. (2023)\n- [Interpretability in the Wild](https:\u002F\u002Farxiv.org\u002Fabs\u002F2211.00593) - Wang et al. (2022)\n\n### Official Documentation\n- [Official Docs](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002F)\n- [API Reference](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Fapi\u002F)\n\n## Comparison with Other Tools\n\n| Feature | pyvene | TransformerLens | nnsight |\n|---------|--------|-----------------|---------|\n| Declarative config | Yes | No | No |\n| HuggingFace sharing | Yes | No | No |\n| Trainable interventions | Yes | Limited | Yes |\n| Any PyTorch model | Yes | Transformers only | Yes |\n| Remote execution | No | No | Yes (NDIF) |\n","# pyvene: Causal Interventions for Neural Networks\n\npyvene is Stanford NLP's library for performing causal interventions on PyTorch models. It provides a declarative, dict-based framework for activation patching, causal tracing, and interchange intervention training - making intervention experiments reproducible and shareable.\n\n**GitHub**: [stanfordnlp\u002Fpyvene](https:\u002F\u002Fgithub.com\u002Fstanfordnlp\u002Fpyvene) (840+ stars)\n**Paper**: [pyvene: A Library for Understanding and Improving PyTorch Models via Interventions](https:\u002F\u002Faclanthology.org\u002F2024.naacl-demo.16) (NAACL 2024)\n\n## When to Use pyvene\n\n**Use pyvene when you need to:**\n- Perform causal tracing (ROME-style localization)\n- Run activation patching experiments\n- Conduct interchange intervention training (IIT)\n- Test causal hypotheses about model components\n- Share\u002Freproduce intervention experiments via HuggingFace\n- Work with any PyTorch architecture (not just transformers)\n\n**Consider alternatives when:**\n- You need exploratory activation analysis → Use **TransformerLens**\n- You want to train\u002Fanalyze SAEs → Use **SAELens**\n- You need remote execution on massive models → Use **nnsight**\n- You want lower-level control → Use **nnsight**\n\n## Installation\n\n```bash\npip install pyvene\n```\n\nStandard import:\n```python\nimport pyvene as pv\n```\n\n## Core Concepts\n\n### IntervenableModel\n\nThe main class that wraps any PyTorch model with intervention capabilities:\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\n# Load base model\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2\")\n\n# Define intervention configuration\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,\n            component=\"block_output\",\n            intervention_type=pv.VanillaIntervention,\n        )\n    ]\n)\n\n# Create intervenable model\nintervenable = pv.IntervenableModel(config, model)\n```\n\n### Intervention Types\n\n| Type | Description | Use Case |\n|------|-------------|----------|\n| `VanillaIntervention` | Swap activations between runs | Activation patching |\n| `AdditionIntervention` | Add activations to base run | Steering, ablation |\n| `SubtractionIntervention` | Subtract activations | Ablation |\n| `ZeroIntervention` | Zero out activations | Component knockout |\n| `RotatedSpaceIntervention` | DAS trainable intervention | Causal discovery |\n| `CollectIntervention` | Collect activations | Probing, analysis |\n\n### Component Targets\n\n```python\n# Available components to intervene on\ncomponents = [\n    \"block_input\",      # Input to transformer block\n    \"block_output\",     # Output of transformer block\n    \"mlp_input\",        # Input to MLP\n    \"mlp_output\",       # Output of MLP\n    \"mlp_activation\",   # MLP hidden activations\n    \"attention_input\",  # Input to attention\n    \"attention_output\", # Output of attention\n    \"attention_value_output\",  # Attention value vectors\n    \"query_output\",     # Query vectors\n    \"key_output\",       # Key vectors\n    \"value_output\",     # Value vectors\n    \"head_attention_value_output\",  # Per-head values\n]\n```\n\n## Workflow 1: Causal Tracing (ROME-style)\n\nLocate where factual associations are stored by corrupting inputs and restoring activations.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2-xl\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2-xl\")\n\n# 1. Define clean and corrupted inputs\nclean_prompt = \"The Space Needle is in downtown\"\ncorrupted_prompt = \"The ##### ###### ## ## ########\"  # Noise\n\nclean_tokens = tokenizer(clean_prompt, return_tensors=\"pt\")\ncorrupted_tokens = tokenizer(corrupted_prompt, return_tensors=\"pt\")\n\n# 2. Get clean activations (source)\nwith torch.no_grad():\n    clean_outputs = model(**clean_tokens, output_hidden_states=True)\n    clean_states = clean_outputs.hidden_states\n\n# 3. Define restoration intervention\ndef run_causal_trace(layer, position):\n    \"\"\"Restore clean activation at specific layer and position.\"\"\"\n    config = pv.IntervenableConfig(\n        representations=[\n            pv.RepresentationConfig(\n                layer=layer,\n                component=\"block_output\",\n                intervention_type=pv.VanillaIntervention,\n                unit=\"pos\",\n                max_number_of_units=1,\n            )\n        ]\n    )\n\n    intervenable = pv.IntervenableModel(config, model)\n\n    # Run with intervention\n    _, patched_outputs = intervenable(\n        base=corrupted_tokens,\n        sources=[clean_tokens],\n        unit_locations={\"sources->base\": ([[[position]]], [[[position]]])},\n        output_original_output=True,\n    )\n\n    # Return probability of correct token\n    probs = torch.softmax(patched_outputs.logits[0, -1], dim=-1)\n    seattle_token = tokenizer.encode(\" Seattle\")[0]\n    return probs[seattle_token].item()\n\n# 4. Sweep over layers and positions\nn_layers = model.config.n_layer\nseq_len = clean_tokens[\"input_ids\"].shape[1]\n\nresults = torch.zeros(n_layers, seq_len)\nfor layer in range(n_layers):\n    for pos in range(seq_len):\n        results[layer, pos] = run_causal_trace(layer, pos)\n\n# 5. Visualize (layer x position heatmap)\n# High values indicate causal importance\n```\n\n### Checklist\n- [ ] Prepare clean prompt with target factual association\n- [ ] Create corrupted version (noise or counterfactual)\n- [ ] Define intervention config for each (layer, position)\n- [ ] Run patching sweep\n- [ ] Identify causal hotspots in heatmap\n\n## Workflow 2: Activation Patching for Circuit Analysis\n\nTest which components are necessary for a specific behavior.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\ntokenizer = AutoTokenizer.from_pretrained(\"gpt2\")\n\n# IOI task setup\nclean_prompt = \"When John and Mary went to the store, Mary gave a bottle to\"\ncorrupted_prompt = \"When John and Mary went to the store, John gave a bottle to\"\n\nclean_tokens = tokenizer(clean_prompt, return_tensors=\"pt\")\ncorrupted_tokens = tokenizer(corrupted_prompt, return_tensors=\"pt\")\n\njohn_token = tokenizer.encode(\" John\")[0]\nmary_token = tokenizer.encode(\" Mary\")[0]\n\ndef logit_diff(logits):\n    \"\"\"IO - S logit difference.\"\"\"\n    return logits[0, -1, john_token] - logits[0, -1, mary_token]\n\n# Patch attention output at each layer\ndef patch_attention(layer):\n    config = pv.IntervenableConfig(\n        representations=[\n            pv.RepresentationConfig(\n                layer=layer,\n                component=\"attention_output\",\n                intervention_type=pv.VanillaIntervention,\n            )\n        ]\n    )\n\n    intervenable = pv.IntervenableModel(config, model)\n\n    _, patched_outputs = intervenable(\n        base=corrupted_tokens,\n        sources=[clean_tokens],\n    )\n\n    return logit_diff(patched_outputs.logits).item()\n\n# Find which layers matter\nresults = []\nfor layer in range(model.config.n_layer):\n    diff = patch_attention(layer)\n    results.append(diff)\n    print(f\"Layer {layer}: logit diff = {diff:.3f}\")\n```\n\n## Workflow 3: Interchange Intervention Training (IIT)\n\nTrain interventions to discover causal structure.\n\n### Step-by-Step\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM\nimport torch\n\nmodel = AutoModelForCausalLM.from_pretrained(\"gpt2\")\n\n# 1. Define trainable intervention\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=6,\n            component=\"block_output\",\n            intervention_type=pv.RotatedSpaceIntervention,  # Trainable\n            low_rank_dimension=64,  # Learn 64-dim subspace\n        )\n    ]\n)\n\nintervenable = pv.IntervenableModel(config, model)\n\n# 2. Set up training\noptimizer = torch.optim.Adam(\n    intervenable.get_trainable_parameters(),\n    lr=1e-4\n)\n\n# 3. Training loop (simplified)\nfor base_input, source_input, target_output in dataloader:\n    optimizer.zero_grad()\n\n    _, outputs = intervenable(\n        base=base_input,\n        sources=[source_input],\n    )\n\n    loss = criterion(outputs.logits, target_output)\n    loss.backward()\n    optimizer.step()\n\n# 4. Analyze learned intervention\n# The rotation matrix reveals causal subspace\nrotation = intervenable.interventions[\"layer.6.block_output\"][0].rotate_layer\n```\n\n### DAS (Distributed Alignment Search)\n\n```python\n# Low-rank rotation finds interpretable subspaces\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,\n            component=\"block_output\",\n            intervention_type=pv.LowRankRotatedSpaceIntervention,\n            low_rank_dimension=1,  # Find 1D causal direction\n        )\n    ]\n)\n```\n\n## Workflow 4: Model Steering (Honest LLaMA)\n\nSteer model behavior during generation.\n\n```python\nimport pyvene as pv\nfrom transformers import AutoModelForCausalLM, AutoTokenizer\n\nmodel = AutoModelForCausalLM.from_pretrained(\"meta-llama\u002FLlama-2-7b-hf\")\ntokenizer = AutoTokenizer.from_pretrained(\"meta-llama\u002FLlama-2-7b-hf\")\n\n# Load pre-trained steering intervention\nintervenable = pv.IntervenableModel.load(\n    \"zhengxuanzenwu\u002Fintervenable_honest_llama2_chat_7B\",\n    model=model,\n)\n\n# Generate with steering\nprompt = \"Is the earth flat?\"\ninputs = tokenizer(prompt, return_tensors=\"pt\")\n\n# Intervention applied during generation\noutputs = intervenable.generate(\n    inputs,\n    max_new_tokens=100,\n    do_sample=False,\n)\n\nprint(tokenizer.decode(outputs[0]))\n```\n\n## Saving and Sharing Interventions\n\n```python\n# Save locally\nintervenable.save(\".\u002Fmy_intervention\")\n\n# Load from local\nintervenable = pv.IntervenableModel.load(\n    \".\u002Fmy_intervention\",\n    model=model,\n)\n\n# Share on HuggingFace\nintervenable.save_intervention(\"username\u002Fmy-intervention\")\n\n# Load from HuggingFace\nintervenable = pv.IntervenableModel.load(\n    \"username\u002Fmy-intervention\",\n    model=model,\n)\n```\n\n## Common Issues & Solutions\n\n### Issue: Wrong intervention location\n```python\n# WRONG: Incorrect component name\nconfig = pv.RepresentationConfig(\n    component=\"mlp\",  # Not valid!\n)\n\n# RIGHT: Use exact component name\nconfig = pv.RepresentationConfig(\n    component=\"mlp_output\",  # Valid\n)\n```\n\n### Issue: Dimension mismatch\n```python\n# Ensure source and base have compatible shapes\n# For position-specific interventions:\nconfig = pv.RepresentationConfig(\n    unit=\"pos\",\n    max_number_of_units=1,  # Intervene on single position\n)\n\n# Specify locations explicitly\nintervenable(\n    base=base_tokens,\n    sources=[source_tokens],\n    unit_locations={\"sources->base\": ([[[5]]], [[[5]]])},  # Position 5\n)\n```\n\n### Issue: Memory with large models\n```python\n# Use gradient checkpointing\nmodel.gradient_checkpointing_enable()\n\n# Or intervene on fewer components\nconfig = pv.IntervenableConfig(\n    representations=[\n        pv.RepresentationConfig(\n            layer=8,  # Single layer instead of all\n            component=\"block_output\",\n        )\n    ]\n)\n```\n\n### Issue: LoRA integration\n```python\n# pyvene v0.1.8+ supports LoRAs as interventions\nconfig = pv.RepresentationConfig(\n    intervention_type=pv.LoRAIntervention,\n    low_rank_dimension=16,\n)\n```\n\n## Key Classes Reference\n\n| Class | Purpose |\n|-------|---------|\n| `IntervenableModel` | Main wrapper for interventions |\n| `IntervenableConfig` | Configuration container |\n| `RepresentationConfig` | Single intervention specification |\n| `VanillaIntervention` | Activation swapping |\n| `RotatedSpaceIntervention` | Trainable DAS intervention |\n| `CollectIntervention` | Activation collection |\n\n## Supported Models\n\npyvene works with any PyTorch model. Tested on:\n- GPT-2 (all sizes)\n- LLaMA \u002F LLaMA-2\n- Pythia\n- Mistral \u002F Mixtral\n- OPT\n- BLIP (vision-language)\n- ESM (protein models)\n- Mamba (state space)\n\n## Reference Documentation\n\nFor detailed API documentation, tutorials, and advanced usage, see the `references\u002F` folder:\n\n| File | Contents |\n|------|----------|\n| [references\u002FREADME.md](references\u002FREADME.md) | Overview and quick start guide |\n| [references\u002Fapi.md](references\u002Fapi.md) | Complete API reference for IntervenableModel, intervention types, configurations |\n| [references\u002Ftutorials.md](references\u002Ftutorials.md) | Step-by-step tutorials for causal tracing, activation patching, DAS |\n\n## External Resources\n\n### Tutorials\n- [pyvene 101](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fpyvene_101.html)\n- [Causal Tracing Tutorial](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FCausal_Tracing.html)\n- [IOI Circuit Replication](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FIOI_Replication.html)\n- [DAS Introduction](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Ftutorials\u002Fadvanced_tutorials\u002FDAS_Main_Introduction.html)\n\n### Papers\n- [Locating and Editing Factual Associations in GPT](https:\u002F\u002Farxiv.org\u002Fabs\u002F2202.05262) - Meng et al. (2022)\n- [Inference-Time Intervention](https:\u002F\u002Farxiv.org\u002Fabs\u002F2306.03341) - Li et al. (2023)\n- [Interpretability in the Wild](https:\u002F\u002Farxiv.org\u002Fabs\u002F2211.00593) - Wang et al. (2022)\n\n### Official Documentation\n- [Official Docs](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002F)\n- [API Reference](https:\u002F\u002Fstanfordnlp.github.io\u002Fpyvene\u002Fapi\u002F)\n\n## Comparison with Other Tools\n\n| Feature | pyvene | TransformerLens | nnsight |\n|---------|--------|-----------------|---------|\n| Declarative config | Yes | No | No |\n| HuggingFace sharing | Yes | No | No |\n| Trainable interventions | Yes | Limited | Yes |\n| Any PyTorch model | Yes | Transformers only | Yes |\n| Remote execution | No | No | Yes (NDIF) |\n",{"name":5,"tags":24,"author":30,"license":15,"version":31,"description":7,"dependencies":32},[25,26,27,28,29],"Causal Intervention","pyvene","Activation Patching","Causal Tracing","Interpretability","Orchestra Research","1.0.0",[33,34,35],"pyvene>=0.1.8","torch>=2.0.0","transformers>=4.30.0","main","51493f354fd03e3f941d4df7fd64c0b8c7a2632d","skills\u002Fai-research\u002Fmechanistic-interpretability-pyvene","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi","漏洞研究、根因分析、黑箱測試｜做 AI agent 工具｜Vulnerability research, root-cause analysis, AI agent tooling","2026-08-16 02:24:07",{"source":8,"skillName":5,"commands":44,"prompt":54,"zipAvailable":55},[45,48,51],{"tool":46,"command":47},"npx","npx skills add GongYuanCaiJi\u002Fdsh-claude-code-templates --skill pyvene-interventions",{"tool":49,"command":50},"bunx","bunx skills add GongYuanCaiJi\u002Fdsh-claude-code-templates --skill pyvene-interventions",{"tool":52,"command":53},"pnpm","pnpm dlx skills add GongYuanCaiJi\u002Fdsh-claude-code-templates --skill pyvene-interventions","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-pyvene\u002FSKILL.md",true,[57,63,67],{"path":58,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":61,"sourceHtmlUrl":62},"references\u002Fapi.md","REFERENCE","参考文档",7871,"https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-pyvene\u002Freferences\u002Fapi.md",{"path":64,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":65,"sourceHtmlUrl":66},"references\u002FREADME.md",2105,"https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-pyvene\u002Freferences\u002FREADME.md",{"path":68,"resourceType":59,"resourceTypeDesc":60,"sizeBytes":69,"sourceHtmlUrl":70},"references\u002Ftutorials.md",10111,"https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fai-research\u002Fmechanistic-interpretability-pyvene\u002Freferences\u002Ftutorials.md",[72,79,88,95,102,109],{"skillNo":73,"name":74,"nameZh":6,"description":75,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":76,"categories":77,"keywords":78,"publishedAt":19},"01M7ARMYTZ5D4B7N5SKFXV345V","zapier-make-patterns","No-code automation democratizes workflow building. Zapier and Make (formerly Integromat) let non-developers automate business processes without writing code. But no-code doesn't mean no-complexity - these platforms have their own patterns, pitfalls, and breaking points.  This skill covers when to use which platform, how to build reliable automations, and when to graduate to code-based solutions. Key insight: Zapier optimizes for simplicity and integrations (7000+ apps), Make optimizes for power","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fzapier-make-patterns\u002FSKILL.md",[],[],{"skillNo":80,"name":81,"nameZh":6,"description":82,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":83,"licenseFileUrl":84,"sourceHtmlUrl":85,"categories":86,"keywords":87,"publishedAt":19},"01M7ARMX1BVNEAR98SBANMDF2V","yeet","Use only when the user explicitly asks to stage, commit, push, and open a GitHub pull request in one flow using the GitHub CLI (`gh`).","Apache-2.0","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fyeet\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fyeet\u002FSKILL.md",[],[],{"skillNo":89,"name":90,"nameZh":6,"description":91,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":92,"categories":93,"keywords":94,"publishedAt":19},"01M7ARMPR4RQ417MG1HMPGNQHH","workflow-automation","Workflow automation is the infrastructure that makes AI agents reliable. Without durable execution, a network hiccup during a 10-step payment flow means lost money and angry customers. With it, workflows resume exactly where they left off.  This skill covers the platforms (n8n, Temporal, Inngest) and patterns (sequential, parallel, orchestrator-worker) that turn brittle scripts into production-grade automation.  Key insight: The platforms make different tradeoffs. n8n optimizes for accessibility","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fworkflow-automation\u002FSKILL.md",[],[],{"skillNo":96,"name":97,"nameZh":6,"description":98,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":99,"categories":100,"keywords":101,"publishedAt":19},"01M7ARMHBERDMKGDMV7K6MQ6YP","trigger-dev","Trigger.dev expert for background jobs, AI workflows, and reliable async execution with excellent developer experience and TypeScript-first design. Use when: trigger.dev, trigger dev, background task, ai background job, long running task.","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Ftrigger-dev\u002FSKILL.md",[],[],{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":108,"publishedAt":19},"01M7ARME0A7KFT330Q2H25HE2B","slack-automation","Automate Slack workspace operations including messaging, search, channel management, and reaction workflows through Composio's Slack toolkit.","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fslack-automation\u002FSKILL.md",[],[],{"skillNo":110,"name":111,"nameZh":6,"description":112,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":113,"categories":114,"keywords":115,"publishedAt":19},"01M7ARM8D87V18WDG0GEZS11ZT","planning-with-files","Transforms workflow to use Manus-style persistent markdown files for planning, progress tracking, and knowledge storage. Use when starting complex tasks, multi-step projects, research tasks, or when the user mentions planning, organizing work, tracking progress, or wants structured output.","https:\u002F\u002Fgithub.com\u002FGongYuanCaiJi\u002Fdsh-claude-code-templates\u002Fblob\u002Fmain\u002Fskills\u002Fworkflow-automation\u002Fplanning-with-files\u002FSKILL.md",[],[]]