ML Atlas

08 · LLM · 4 min czytania · aktualizacja

Co to jest okno kontekstu w LLM i dlaczego ma ograniczoną długość?

W skrócie

Okno kontekstu to maksymalna liczba tokenów, które model widzi naraz: polecenie, historia rozmowy, dokumenty i jego odpowiedź. Poza nim model nic nie pamięta.

Co to jest

Okno kontekstu (ang. context window, context length) to największa liczba tokenów, jaką model językowy może przetworzyć w jednym wywołaniu. Obejmuje wszystko: instrukcję systemową, historię rozmowy, wklejone dokumenty, wyniki narzędzi i tokeny, które model właśnie generuje. Tekst spoza okna dla modelu nie istnieje.

LLM nie ma pamięci między wywołaniami. Wrażenie, że czat „pamięta” rozmowę, bierze się stąd, że aplikacja za każdym razem wysyła modelowi całą dotychczasową historię. Gdy historia przekroczy okno, najstarsze fragmenty trzeba uciąć albo streścić.

Długości okien bardzo urosły: GPT-2 miał 1024 tokeny, Llama 2 — 4096 (Touvron i in., 2023), a współczesne modele obsługują od kilkudziesięciu tysięcy do miliona tokenów i więcej. Deklarowana długość nie oznacza jednak, że model równie dobrze korzysta z każdego jej fragmentu.

Mechanizm — dlaczego tak działa

Koszt samouwagi rośnie z kwadratem długości. W transformerze każda pozycja porównuje się z każdą wcześniejszą. Dla n tokenów to około n²/2 par na warstwę i głowę. Ośmiokrotnie dłuższy kontekst oznacza 64 razy więcej par. Algorytmy takie jak FlashAttention (Dao i in., 2022) nie zmieniają tej liczby, ale liczą ją bez zapisywania całej macierzy n×n w pamięci, co znacznie przesuwa praktyczne granice.

Pamięć podręczna kluczy i wartości. Przy generowaniu model zapamiętuje dla każdego już przetworzonego tokenu wektory kluczy (K) i wartości (V) w każdej warstwie, żeby nie liczyć ich ponownie. Ta pamięć (KV cache) rośnie liniowo z długością i przy długich kontekstach potrafi przekroczyć rozmiar samych wag modelu. Techniki takie jak grupowana uwaga zapytań (GQA), w której kilka głów dzieli te same klucze i wartości, zmniejszają ją kilkukrotnie.

Pozycja musi być zakodowana. Samouwaga sama z siebie nie wie, który token był pierwszy. Kolejność wprowadza kodowanie pozycji. Model trenowany na tekstach do 4096 tokenów nigdy nie widział pozycji 10 000 i zwykle radzi sobie tam źle. Kodowania względne, takie jak RoPE (Su i in., 2021) czy ALiBi (Press i in., 2022), oraz ich skalowanie z krótkim dotrenowaniem pozwalają wydłużać okno, ale model trzeba na dłuższych tekstach douczyć.

Długi kontekst to nie to samo co dobry kontekst. Liu i in. (2024) pokazali zjawisko „zagubienia w środku”: modele najlepiej wykorzystują informację z początku i końca kontekstu, a fakty schowane w środku długiego wejścia odnajdują wyraźnie gorzej. Do tego każdy nieistotny fragment rozprasza uwagę i może być źródłem błędnych odpowiedzi. Więcej tekstu w oknie bywa więc gorsze niż mniej, ale lepiej dobranego — stąd popularność RAG.

Na przykładzie

Policzmy KV cache dla modelu Llama 2 7B: 32 warstwy, szerokość 4096, zwykła uwaga wielogłowa, zapis w 16 bitach (Touvron i in., 2023). Na jeden token potrzeba 2 (K i V) × 32 warstwy × 4096 liczb × 2 bajty = 524 288 bajtów, czyli dokładnie 0,5 MiB. Pełne okno 4096 tokenów to 2 GiB na jedną rozmowę.

Gdyby ten sam model rozciągnąć do 32 768 tokenów, sam cache zająłby 16 GiB — więcej niż wagi modelu (6,7 mld parametrów × 2 B ≈ 13,5 GB). A liczba par w samouwadze wzrosłaby (32 768 / 4096)² = 64 razy. To wyjaśnia, dlaczego długi kontekst jest drogi, czemu dostawcy liczą opłaty za każdy token wejścia i po co architektury takie jak GQA.

W praktyce

  • Licz tokeny tokenizerem danego modelu przed wysłaniem zapytania i zostaw zapas na odpowiedź (max_new_tokens).
  • Najważniejsze instrukcje i pytanie stawiaj na początku lub na końcu, nie w środku długiego dokumentu.
  • Zamiast wklejać całe archiwum, wybieraj fragmenty przez wyszukiwanie (RAG) albo streszczaj starszą historię rozmowy.
  • Sprawdzaj długi kontekst na własnych danych, np. testem „igły w stogu siana” z faktem wstawionym w różnych miejscach — deklarowana długość to górna granica, nie gwarancja.
  • Przy własnym serwowaniu modeli pamięć GPU dla KV cache ogranicza liczbę równoległych użytkowników; pomagają biblioteki z paged attention.

Najczęstsze pytania

Czy dłuższe okno kontekstu zastępuje RAG?
Częściowo. Jeśli wszystkie dokumenty mieszczą się w oknie, można je wkleić i pominąć wyszukiwanie. Przy dużych zbiorach RAG jest tańszy, szybszy i często dokładniejszy, bo model dostaje tylko trafne fragmenty.
Co się dzieje, gdy przekroczę okno?
API zwykle zwraca błąd, a aplikacje czatowe po cichu ucinają albo streszczają starsze wiadomości. Model nie „zapomina stopniowo” — tekst spoza okna po prostu do niego nie trafia.
Czy odpowiedź modelu też zużywa okno?
Tak. Wygenerowane tokeny dopisują się do kontekstu, bo każdy kolejny token jest liczony na podstawie wszystkiego, co było wcześniej, łącznie z dotychczasową odpowiedzią.

Źródła

  • Su J. i in., 2021, „RoFormer: Enhanced Transformer with Rotary Position Embedding”, arXiv:2104.09864.
  • Touvron H. i in., 2023, „Llama 2: Open Foundation and Fine-Tuned Chat Models”, arXiv:2307.09288.
  • Dao T. i in., 2022, „FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness”, NeurIPS 2022.
  • Press O., Smith N. A., Lewis M., 2022, „Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation”, ICLR 2022.
  • Liu N. F. i in., 2024, „Lost in the Middle: How Language Models Use Long Contexts”, Transactions of the ACL 12.

Zobacz też