Skip to content

v0.3.0

Choose a tag to compare

@emiehling emiehling released this 07 Aug 14:29
· 9 commits to main since this release
1d7c843

Expands the output-control category from four methods to fourteen, factored onto a shared component library, and reworks the generation contract shared across all categories.

New methods

Ten new output-control methods, alongside a shared _common component library that they and the four existing methods (DeAL, RAD, SASA, ThinkingIntervention) are now built on:

  • best_of_n: Best-of-N sampling; draw N continuations and keep the highest-scoring on
  • budget_forcing: Test-time control of reasoning length by capping, shortening, or extending the thinking phase (s1)
  • contrastive_decoding: Contrast a base "expert" against a weaker "amateur" LM, favor
  • contrastive_guidance: Config-based contrastive mixing of next-token distributions (umbrella for DExperts, contrastive decoding, proxy-tuning, CFG)
  • dexperts: Reweight logits with a small expert and anti-expert LM
  • phased_decoding: Config-based phase-shape driver splicing forced and generated segments into one stream
  • routed_decoding: Route each prompt to a response strategy (respond / prefix / generisions
  • search_decoding: Config-based segment-shape driver (propose, score, keep, iterate; umbrella for best-of-N, self-consistency, DeAL)
  • stopping_rules: Substring, token, and budget stopping criteria as configuration
  • value_guidance: Config-based value-guided decoding; score candidate tokens with a value function and shift their logits (umbrella for FUDGE, ARGS, RAD, SASA)

Breaking changes

  • Output-control API restructured. OutputControl.generate() is removed; controls now contribute composable get_logits_processors() and get_stopping_criteria() stacks, and controls that own the decoloop subclass the new DecodingDriver (with decode()). NoOutputControl is removed;ult HFGenerateDriver (#20)
  • Output moved from aisteer360/algorithms/core/types.py (now deleted) to aisteer360/algorithms/core/output.py, and re-exported from aisteer360.algorithms.core. The runtime_kwargs and metadatafields are removed; finish_reason is now one of "eos", "length", or None
  • SteeringPipeline.generate() dispatches on explicit keyword source (text=, messages=, input_ids=); the positional argument is text-only. Positional chat/tensor input now raises, input_ids= is tokens-only, and attention_mask is valid only with input_ids=
  • Pipeline control attributes are now plural lists (input_controls, structural_controls, state_controls, output_controls); the singular attributes and the deprecated state_control property are removed. Every category now admits multiple controls in list order, except that at mostDriver` is allowed
  • LabeledExamples, ContrastivePairs, and contrastive rendering consolidated into a new aisteer360/algorithms/core/internals/ package; control constructors consolidated into a shared
    aisteer360/algorithms/core/base_control.py
  • Method auto-discovery now raises RegistryError on internal import failures, malformed STEERING_METHOD exports, and duplicate method names within a category (previously skipped silently)
  • Evaluation helpers chat_generate_model() and chat_generate_pipeline() return (te_retry_generate() gains return_outputs; plot_tradeoff_with_pareto removed fromaisteer360.evaluation.utils
  • Packaging: mergekit, econml, matplotlib, and seaborn moved out of core dependpo, plots, and allextras;gdowndropped;[tool.uv] override-dependencies`removed

What's Changed

  • Output control refactor and control consolidation by @emiehling in #20 and #21

Full Changelog: v0.2.0...v0.3.0