| name | steer2adapt |
| title | Steer2Adapt: Dynamically Composing Steering Vectors for Efficient LLM Adaptation |
| version | 0.0.2 |
| engine | skillxiv-v0.0.2-claude-opus-4.6 |
| license | MIT |
| url | https://arxiv.org/abs/2602.07276 |
| keywords | ["Activation Steering","Domain Adaptation","Bayesian Optimization","Semantic Subspace","Inference-Time Adaptation"] |
| description | Adapt LLMs efficiently by composing multiple pre-existing semantic steering vectors via Bayesian optimization, balancing adaptation gain and safety without retraining model parameters. |
Steer2Adapt: Dynamically Composing Steering Vectors for Efficient LLM Adaptation
Problem Context
Existing activation steering approaches suffer from inflexibility. Single static directions cannot adapt across task variations; complex tasks requiring multiple coordinated capabilities cannot be captured by one vector; and vectors optimized for one task may harm performance on related tasks.
Core Concept
Steer2Adapt shifts steering from discovering individual task-specific directions to dynamically composing multiple reusable semantic vectors. Rather than learning new steering vectors from scratch for each task, the method finds optimal linear combinations of pre-existing concept vectors within a domain-specific subspace.
Architecture Overview
- Semantic Subspace Construction: Identify k behavioral concepts and extract corresponding steering vectors using representation engineering
- Composed Vector Search: Use Bayesian Optimization to find optimal coefficients balancing adaptation gain and safety
- Inference-Time Application: Inject composite steering vector into model activations without parameter updates
Implementation
Phase 1: Semantic Subspace Construction
def construct_semantic_subspace(domain, concepts=None):
if concepts is None:
concepts = ['Openness', 'Conscientiousness', 'Extroversion',
'Agreeableness', 'Neuroticism']
vectors = []
for concept in concepts:
positive = generate_examples(concept, valence='positive')
negative = generate_examples(concept, valence='negative')
pos_acts = get_activations(model, positive, layer=target_layer)
neg_acts = get_activations(model, negative, layer=target_layer)
steering_vec = np.mean(pos_acts) - np.mean(neg_acts)
vectors.append(steering_vec)
V = np.column_stack(vectors)
V, concepts