Unikanie limitu Context Window w budowie Agentów AI – Jak to zrobić?

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?

  1. Pobranie tokenizera – Klasa TokenCounter inicjalizuje tokenizer dla modelu.
  2. 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.
  3. Liczenie tokenów – Po sformatowaniu wiadomości wywoływana jest metoda encode, a następnie funkcja len(), zwracająca liczbę tokenów.
Scroll to Top