EasySteer¶
A unified framework for high-performance and extensible LLM steering, built on vLLM.
EasySteer applies steering vectors — directions in a model's hidden-state space — during inference to shift model behavior without changing model weights. It extends vLLM's V1 engine so that steering runs at serving speed, with continuous batching, prefix caching, and CUDA-graph support.
Get started Paper (arXiv:2509.25175)
Why EasySteer¶
- High performance — 10.8–22.3× faster than existing steering frameworks through vLLM integration.
- One spec, every backend — the same
SteeringSpecruns under eager, split, and in-graph CUDA-graph execution; declare your algorithms at launch and the engine picks the fastest tier that serves them, rejecting anything undeclared explicitly. - Fine-grained control — token-level, position-specific, phase-aware (prompt vs. generation), and multi-vector steering.
- Modular algorithms — direct addition, linear maps, LoReFT, LM-Steer, projection-based erase/replace, MoE router steering; new algorithms plug in with two methods.
- Full research loop — capture hidden states, extract vectors (DiffMean, PCA, LAT, linear probe, SAE), train interventions (ReFT), and serve them, all in one repo.
The pieces¶
| Component | What it is |
|---|---|
vllm-steer/ |
Fork of vLLM with the steering engine (vllm.steer_vectors) and hidden-state capture |
easysteer.hidden_states |
Capture hidden states / MoE router logits from a running vLLM engine |
easysteer.steer |
Extract steering vectors from captured hidden states (analysis-based) |
easysteer.reft |
Train parameterized interventions on frozen models (learning-based) |
frontend/ |
Web UI for interactive steering experiments |
replications/ |
Notebook reproductions of published steering papers |
A 30-second look¶
from vllm import LLM, SamplingParams
from vllm.steer_vectors import ApplySpec, SteeringSpec, VectorSpec
# Declare the steering algorithms this engine will serve; the engine
# derives the right CUDA-graph integration from the declaration.
llm = LLM(model="Qwen/Qwen2.5-1.5B-Instruct", enable_steer_vector=True,
steer_algorithms=["direct"])
spec = SteeringSpec(vectors=[VectorSpec(
source="vectors/happy_diffmean.gguf",
scale=2.0,
layers=list(range(10, 26)),
apply=ApplySpec(phases=["prompt", "generation"]),
)])
out = llm.generate("Comfort Alice about her dog.",
steering=spec,
sampling_params=SamplingParams(max_tokens=128))
See the Quickstart for the full example, and the Steering guide for the complete spec language.
Citation¶
@article{xu2025easysteer,
title={EasySteer: A Unified Framework for High-Performance and Extensible LLM Steering},
author={Xu, Haolei and Mei, Xinyu and Yan, Yuchen and Zhou, Rui and Zhang, Wenqi and Lu, Weiming and Zhuang, Yueting and Shen, Yongliang},
journal={arXiv preprint arXiv:2509.25175},
year={2025}
}
Responsible use
Steering is dual-use. EasySteer is a research tool for model safety and controllability; behavioral modifications must be disclosed to end users and comply with applicable guidelines and law.