Podczas wykorzystywania modelu LLM koniecznym elementem, który trzeba brać pod uwagę jest jego context window czyli ilość tokenów które jest w stanie przetworzyć w jednej sesji. Jeśli korzystasz z LLM do małych zadań być może nawet nie wziąłeś pod uwagę tego aspektu, natomiast jest to bardzo ważne z punktu widzenia bardziej złożonych zadań. Przekroczenie limitu context window będzie prowadzić do błędów w działaniu agenta. Dlatego bardzo przydatnym aspektem jest zaimplementowania logiki pozwalającej na liczenie tokenów.
Context Window w modelach LLM – dlaczego jest ważne?
Każdy model LLM np. GPT-4o ma określony context window czyli maksymalną ilość tokenów które jest w stanie ogarnąć podczas jednej sesji. Tokeny to jednostki tekstu czyli litery, cyfry, słowa, frazy lub nawet znaki interpunkcyjne. Warto zaznaczyć, że każdy model korzysta z innego tokenizera, dlatego ten sam prompt może mieć różne liczby tokenów w zależności od modelu, np. GPT-4o, Claude 3.5 Sonnet czy Gemma.
Po co liczyć tokeny?
Jak już pewnie się domyślasz warto przed skorzystaniem z LLM policzyć tokeny promptów, ale jakie jeszcze są tego plusy?
- Oszczędność – wszystkie modele językowe rozliczają nas na podstawie zużytych tokenów. Krótko mówiąc mniej ich wydamy – mniej zapłacimy.
- Unikanie błędów – kontrolując tokeny nie doprowadzimy do sytuacji w której AI agent przekroczy swój limit context window, tym samym nie doprowadzimy do nieoczekiwanych błędów systemu.
- Lepsza kontrola nad generowanym tekstem – kiedy znamy liczbę tokenów jesteśmy w stanie zoptymalizować zapytania do modelu, tak aby uzyskać jak najbardziej precyzyjne odpowiedzi.
Przykład implementacji w Python
Do liczenia tokenów powstało wiele bibliotek. Przykładem takiej jest tiktoken, która obsługuje tokenizację dla np. modeli od OpenAI.
from typing import List, Dict
import tiktoken
class TokenCounter:
def __init__(self, model_name: str):
self.model_name = model_name
self.tokenizer = tiktoken.encoding_for_model(model_name)
self.IM_START = "<|im_start|>"
self.IM_END = "<|im_end|>"
self.IM_SEP = "<|im_sep|>"
def count_tokens(self, messages: List[Dict[str, str]]) -> int:
formatted_content = "".join(
[f"{self.IM_START}{msg['role']}{self.IM_SEP}{msg['content']}{self.IM_END}" for msg in messages]
)
formatted_content += f"{self.IM_START}assistant{self.IM_SEP}"
return len(self.tokenizer.encode(formatted_content))
messages = [
{"role": "user", "content": "Jak działa context window?"},
{"role": "assistant", "content": "Context window to maksymalna liczba tokenów..."}
]
counter = TokenCounter("gpt-4o")
print("Liczba tokenów:", counter.count_tokens(messages))

Jak to działa?
- Pobranie tokenizera – Klasa TokenCounter inicjalizuje tokenizer dla modelu.
- Formatowanie wiadomości – Każda wiadomość jest odpowiednio formatowana zgodnie z wymaganiami OpenAI, dodając specjalne znaczniki
<|im_start|>
,<|im_sep|>
,<|im_end|>
. Dla innych modeli prawdopodobnie będzie to wyglądało inaczej. - Liczenie tokenów – Po sformatowaniu wiadomości wywoływana jest metoda encode, a następnie funkcja len(), zwracająca liczbę tokenów.