37 lines
933 B
Python
37 lines
933 B
Python
"""Token-Budget: Passt Prompt + Ausgabe in den effektiven Kontext eines Slots?"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import math
|
|
from collections.abc import Callable
|
|
from dataclasses import dataclass
|
|
|
|
MESSAGE_OVERHEAD = 64
|
|
|
|
Tokenizer = Callable[[str], int]
|
|
|
|
|
|
def estimate_tokens(text: str) -> int:
|
|
"""Konservative Schätzung (eher zu hoch): ~3 Zeichen pro Token."""
|
|
return math.ceil(len(text) / 3)
|
|
|
|
|
|
@dataclass(frozen=True)
|
|
class Budget:
|
|
prompt_tokens: int
|
|
output_tokens: int
|
|
limit: int
|
|
|
|
@property
|
|
def required(self) -> int:
|
|
return self.prompt_tokens + self.output_tokens + MESSAGE_OVERHEAD
|
|
|
|
@property
|
|
def fits(self) -> bool:
|
|
return self.required <= self.limit
|
|
|
|
|
|
def compute(system: str, user: str, max_output_tokens: int, limit: int,
|
|
tokenizer: Tokenizer = estimate_tokens) -> Budget:
|
|
return Budget(tokenizer(system) + tokenizer(user), max_output_tokens, limit)
|