mirror of
https://github.com/elder-plinius/OBLITERATUS.git
synced 2026-08-17 16:37:30 +02:00
Salvage the still-relevant functional work from PR #48: add non-UTF-8 console fallbacks, use platform temporary directories, make pipeline log output encoding-safe, and defer heavyweight analysis imports. The obsolete contributed CI workflow and already-corrected remote URL are intentionally excluded.
89 lines
3.1 KiB
Python
89 lines
3.1 KiB
Python
"""Novel analysis techniques for mechanistic interpretability of refusal."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from importlib import import_module
|
|
|
|
__all__ = [
|
|
"CrossLayerAlignmentAnalyzer",
|
|
"RefusalLogitLens",
|
|
"WhitenedSVDExtractor",
|
|
"ActivationProbe",
|
|
"DefenseRobustnessEvaluator",
|
|
"ConceptConeAnalyzer",
|
|
"AlignmentImprintDetector",
|
|
"MultiTokenPositionAnalyzer",
|
|
"SparseDirectionSurgeon",
|
|
"CausalRefusalTracer",
|
|
"ResidualStreamDecomposer",
|
|
"LinearRefusalProbe",
|
|
"TransferAnalyzer",
|
|
"SteeringVectorFactory",
|
|
"SteeringHookManager",
|
|
"SparseAutoencoder",
|
|
"train_sae",
|
|
"identify_refusal_features",
|
|
"SAEDecompositionPipeline",
|
|
"TunedLensTrainer",
|
|
"RefusalTunedLens",
|
|
"RiemannianManifoldAnalyzer",
|
|
"AntiOuroborosProber",
|
|
"ConditionalAbliterator",
|
|
"WassersteinRefusalTransfer",
|
|
"SpectralCertifier",
|
|
"CertificationLevel",
|
|
"ActivationPatcher",
|
|
"WassersteinOptimalExtractor",
|
|
"BayesianKernelProjection",
|
|
]
|
|
|
|
# Defer heavyweight analysis modules until their public object is requested.
|
|
# This keeps pure-Python helpers importable in environments without PyTorch.
|
|
_LAZY_IMPORTS = {
|
|
"CrossLayerAlignmentAnalyzer": "cross_layer",
|
|
"RefusalLogitLens": "logit_lens",
|
|
"WhitenedSVDExtractor": "whitened_svd",
|
|
"ActivationProbe": "activation_probing",
|
|
"DefenseRobustnessEvaluator": "defense_robustness",
|
|
"ConceptConeAnalyzer": "concept_geometry",
|
|
"AlignmentImprintDetector": "alignment_imprint",
|
|
"MultiTokenPositionAnalyzer": "multi_token_position",
|
|
"SparseDirectionSurgeon": "sparse_surgery",
|
|
"CausalRefusalTracer": "causal_tracing",
|
|
"ResidualStreamDecomposer": "residual_stream",
|
|
"LinearRefusalProbe": "probing_classifiers",
|
|
"TransferAnalyzer": "cross_model_transfer",
|
|
"SteeringVectorFactory": "steering_vectors",
|
|
"SteeringHookManager": "steering_vectors",
|
|
"SparseAutoencoder": "sae_abliteration",
|
|
"train_sae": "sae_abliteration",
|
|
"identify_refusal_features": "sae_abliteration",
|
|
"SAEDecompositionPipeline": "sae_abliteration",
|
|
"TunedLensTrainer": "tuned_lens",
|
|
"RefusalTunedLens": "tuned_lens",
|
|
"RiemannianManifoldAnalyzer": "riemannian_manifold",
|
|
"AntiOuroborosProber": "anti_ouroboros",
|
|
"ConditionalAbliterator": "conditional_abliteration",
|
|
"WassersteinRefusalTransfer": "wasserstein_transfer",
|
|
"SpectralCertifier": "spectral_certification",
|
|
"CertificationLevel": "spectral_certification",
|
|
"ActivationPatcher": "activation_patching",
|
|
"WassersteinOptimalExtractor": "wasserstein_optimal",
|
|
"BayesianKernelProjection": "bayesian_kernel_projection",
|
|
}
|
|
|
|
|
|
def __getattr__(name: str):
|
|
"""Resolve and cache a public analysis object on first access."""
|
|
submodule = _LAZY_IMPORTS.get(name)
|
|
if submodule is None:
|
|
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
|
|
value = getattr(import_module(f"{__name__}.{submodule}"), name)
|
|
globals()[name] = value
|
|
return value
|
|
|
|
|
|
def __dir__() -> list[str]:
|
|
"""Include lazily exported names in interactive discovery."""
|
|
return sorted(set(globals()) | _LAZY_IMPORTS.keys())
|