Source code for kernel_entropy.pipeline
"""
KLE Pipeline - end-to-end Kernel Language Entropy computation.
Single function that orchestrates: Generation -> NLI -> KLE calculation
"""
from __future__ import annotations
from kernel_entropy.entropy import kle_from_similarity
from kernel_entropy.generation import HydraGenerator
from kernel_entropy.nli import ModernBERTScorer
[docs]
def compute_kle(
prompt: str,
n_generations: int = 10,
temperature: float = 0.98,
lengthscale_t: float = 1.0,
verbose: bool = False,
) -> float:
"""
Compute Kernel Language Entropy for a prompt.
Pipeline:
1. Generate N responses via PoE (pure generation, no uncertainty head)
2. Compute pairwise NLI similarity matrix W
3. Calculate Von Neumann Entropy from W
Args:
prompt: Input prompt for generation
n_generations: Number of responses to generate (default: 10)
temperature: Generation temperature (default: 0.98)
lengthscale_t: Heat kernel lengthscale (default: 1.0)
verbose: Print each response after generation (default: False)
Returns:
Von Neumann Entropy (float). Higher = more semantic uncertainty.
"""
# TODO: rebuilds the full PoE ensemble on every call (~tens of seconds
# for 19 LoRA merges). Fine for one-shot CLI use, but blocker for any
# server that calls compute_kle on each request — cache the generator at
# module or app level before wiring into the frontend.
generator = HydraGenerator()
seeds = list(range(n_generations))
responses = generator.generate_batch(
prompt=prompt,
seeds=seeds,
temperature=temperature,
verbose=verbose,
)
scorer = ModernBERTScorer(responses)
W = scorer.compute()
entropy = kle_from_similarity(W, t=lengthscale_t) # type: ignore[arg-type]
return entropy