40 lines
1.2 KiB
Python
40 lines
1.2 KiB
Python
"""Kalibrierung des effektiven Kontexts aus beobachteten Pass-Rates nach Prompt-Länge."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from collections.abc import Iterable
|
|
|
|
DEFAULT_BUCKETS = (2048, 4096, 8192, 16384, 32768, 65536, 131072)
|
|
|
|
|
|
def effective_context(
|
|
observations: Iterable[tuple[int, bool]],
|
|
*,
|
|
target: float = 0.9,
|
|
min_n: int = 20,
|
|
buckets: tuple[int, ...] = DEFAULT_BUCKETS,
|
|
) -> int | None:
|
|
"""observations: (prompt_tokens, bestanden).
|
|
|
|
Liefert die Obergrenze des größten Buckets, bis zu dem alle Buckets mit genug Daten
|
|
die Ziel-Pass-Rate erreichen. Buckets ohne genug Daten unterbrechen die Kette nicht,
|
|
zählen aber auch nicht als Nachweis. Ohne Nachweis: None.
|
|
"""
|
|
counts = {b: [0, 0] for b in buckets} # [n, passed]
|
|
for tokens, passed in observations:
|
|
for b in buckets:
|
|
if tokens <= b:
|
|
counts[b][0] += 1
|
|
counts[b][1] += int(passed)
|
|
break
|
|
result = None
|
|
for b in buckets:
|
|
n, ok = counts[b]
|
|
if n < min_n:
|
|
continue
|
|
if ok / n >= target:
|
|
result = b
|
|
else:
|
|
break
|
|
return result
|