Source code for nlp_shap.value.logprob
"""Logprob-based value function."""
import hashlib
from ..domain.generation import GenerationRecord
from ..protocols.backend import GenerationResult
[docs]
class LogprobValue:
"""Score generations from summed token log probabilities."""
@property
def name(self) -> str:
"""Return the registered value-function identifier."""
return "logprob"
[docs]
def score(self, base: GenerationResult, candidate: GenerationResult) -> float:
"""Return utility from candidate logprobs relative to ``base``."""
_ = base
if isinstance(candidate, GenerationRecord) and candidate.logprobs:
return float(sum(candidate.logprobs))
return _stub_logprob(candidate)
def _stub_logprob(generation: GenerationResult) -> float:
"""Return a deterministic pseudo-logprob when the backend omits logprobs."""
digest = hashlib.sha256(generation.text.encode()).digest()
magnitude = int.from_bytes(digest[:8], byteorder="big", signed=False)
normalized = (magnitude % 10_000) / 10_000.0
return -1.0 - normalized