Od GPT-1 do modeli rozumowania: co zmieniła się w każdej generacji dla programistów
Prześledź rodzinę GPT od wstępnego szkolenia z 2018 roku po modele umiejące rozumować, zobacz, jakie pomysły dodała każda generacja, oraz poznaj GPT-4o Vision i Structured Outputs od Pythona.
Źródła: The GPT Timeline: How OpenAI Built the Brains of Modern AI
Każde wezwanie API do nowoczesnego modelu językowego opiera się na kilku koncepcjach, które pojawiały się stopniowo: generatywnym szkoleniu wstępnym, skalowalności, uczeniu się w kontekście, dostosowywaniu na podstawie informacji od ludzi, natywnej multimodalności oraz dodatkowych obliczeniach wykonywanych podczas procesu inferencji. Znajomość tego, skąd pochodzi każda z tych koncepcji, znacznie ułatwia zrozumienie tego, co model potrafi robić, dlaczego zawodzi oraz jakie funkcje API należy wykorzystać. Ten przewodnik opisuje rozwój serii GPT od jej początków w 2018 roku aż po modele skupione na rozumowaniu, kończąc się dwoma praktycznymi przykładami w Pythonie dla GPT-4o.
Przed GPT: dlaczego Transformer był ważny
Aż do około 2018 roku większość zadań związanych z przetwarzaniem języka naturalnego opierała się na sieciach neuronowych rekurencyjnych oraz ich wersji LSTM. Modele te czytały tekst token po tokenie, co utrudniało paralelizację procesu szkolenia i powodowało, że informacje z początku długiego tekstu znikały przed jego zakończeniem.
W 2017 roku w artykule badawczym Google zatytułowanym „Attention Is All You Need” przedstawiono architekturę Transformer. Zastąpiono w niej mechanizm rekurencji samoudziałem, umożliwiając każdej pozycji w sekwencji bezpośredni kontakt z każdą inną. OpenAI oprzeło na tej architekturze serię modeli GPT (Generative Pre-trained Transformer) i w czerwcu 2018 roku opublikowało artykuł „Improving Language Understanding by Generative Pre-Training”, który wtedy niewielu ludzi uznało za początek istotnej zmiany w informatyce.
2018–2019: szkolenie wstępne i korzyści płynące z skali
GPT-1: najpierw szkolenie wstępne, potem dopracowanie
Pierwszy model był skromny według dzisiejszych standardów:
- 117 milionów parametrów
- Transformer zawierający tylko dekoder z 12 warstwami
- szkolony na BooksCorpus, około 5 GB tekstu
Jego wkładem była metoda dwuetapowa. Najpierw szkolenie wstępne bez nadzoru na surowym tekście pozwoliło modelowi opanować gramatykę, powiązania faktograficzne oraz strukturę języka poprzez prostą predykcję następnego tokena. Następnie niewielka ilość szkolenia z nadzorem na konkretnym zadaniu, takim jak analiza nastrojów lub klasyfikacja, wystarczyła do osiągnięcia wyników na najwyższym poziomie, bez konieczności projektowania specjalnej architektury dla każdego zadania.
GPT-2: pojawia się zachowanie typu zero-shot
Kolejny krok dotyczył głównie rozmiaru modelu:
- 1,5 miliarda parametrów, około dziesięć razy więcej niż w GPT-1
Dzięki odpowiedniej skali dopasowywanie stało się opcjonalne dla wielu zadań. GPT-2 wykazał umiejętność uczenia się bez przykładów: prompt taki jak „Przetłumacz na francuski:” mógł skierować go na zadanie, w którym nigdy nie był wyraźnie szkolony, wyłącznie dlatego, że kontynuowanie tego tekstu logicznie oznaczało stworzenie tłumaczenia.
GPT-2 jest również pamiętany ze względu na sposób jego ujawnienia. OpenAI początkowo powstrzymywało się od udostępnienia pełnego modelu, podając obawy, że może zostać on wykorzystany do masowej produkcji fałszywych wiadomości i spamu, i ujawniało go stopniowo. Ta decyzja wywołała trwałą debatę publiczną na temat bezpieczeństwa AI oraz tego, czy potężne modele powinny być otwarcie publikowane.
2020–2022: uczenie się w kontekście i dostosowywanie
GPT-3: przykłady wewnątrz promptu
GPT-3 przeniósł model z obszaru badań naukowych do produktu komercyjnego:
- 175 miliardów parametrów, ponad sto razy więcej niż w GPT-2
- szkolony na mieszance przefiltrowanego tekstu z Internetu, książek i Wikipedii, pochodzącej z około 45 TB surowych danych przed filtrowaniem
Jego główną zaletą była możliwość uczenia się na małej liczbie przykładów w skali masowej. Wystarczyło podać dwa lub trzy udane przykłady w instrukcji, a model kontynuował ten wzorzec – czy to pisząc kod, wiersze, czy wyodrębniając dane z nieuporządkowanych informacji. To jest uczenie się w kontekście: model dostosowuje się na podstawie samej instrukcji, bez żadnych aktualizacji wag.
Jednak podstawowa wersja GPT-3 miała poważną ograniczenie – była szkolona wyłącznie do kontynuowania tekstu, a nie do pełnienia roli pomocnego asystenta, dlatego często wymyślała fakty, odbiegała od tematu lub ignorowała postawione pytania. Poniższy diagram podsumowuje wprowadzoną naprawę: dostosowanie na podstawie informacji od ludzi przekształca prostego predyktera tekstu w model potrafiący wykonywać polecenia.
[Raw Pre-training] --> Predicts likely text continuations (often rambling or toxic)
│
▼ + RLHF (Human Feedback Alignment)
[InstructGPT Engine] --> Follows instructions safely and concisely
InstructGPT i ChatGPT: uczenie się na podstawie preferencji ludzi
Rozwiązaniem okazało się uczenie wzmacniające na podstawie informacji zwrotnych od ludzi (RLHF). Ludzie oceniali wyniki generowane przez modele, model nagród uczył się tych preferencji, a następnie model językowy został zoptymalizowany tak, by generować odpowiedzi preferowane przez ludzi. Wynikowe modele InstructGPT realizowały polecenia znacznie bardziej bezpośrednio i efektywnie.
30 listopada 2022 roku OpenAI uruchomił ChatGPT, oparty na serii GPT-3.5. Połączenie rozmów wieloetapowych z zachowaniem dostosowanym za pomocą RLHF sprawiło, że aplikacja ta została uznana za najszybciej rozwijającą się aplikację konsumencką do tego czasu – szacuje się, że w ciągu około dwóch miesięcy miała już 100 milionów użytkowników.
2023–2024: rozumowanie profesjonalne i multimodalność
GPT-4: silniejsze rozumowanie, obrazy i narzędzia
GPT-4, wprowadzony w marcu 2023 roku, przeniósł punkt ciężkości z płynnego generowania tekstu na rozumowanie w zadaniach akademickich i zawodowych. OpenAI przedstawiło wyniki takie jak ocena na poziomie około 90. percentyla w symulowanym egzaminie prawniczym oraz wysokie wyniki w wielu egzaminach AP. Dodatkowo umożliwił on rozumienie obrazów, a rodzina GPT-4 otrzymała funkcje, od których deweloperzy korzystają codziennie: wyniki w formacie JSON, wywoływanie funkcji oraz korzystanie z narzędzi takich jak wykonywanie kodu i wyszukiwanie w internecie.
Dwa szczegóły są często błędnie przedstawiane. OpenAI nie opublikowało oficjalnie architektury GPT-4; powszechnie rozpowszechnione twierdzenie, że jest to model typu Mixture of Experts, pochodzi z niepotwierdzonych doniesień. Natomiast okno kontekstowe o pojemności 128k tokenów pojawiło się w wersji GPT-4 Turbo później w 2023 roku, a nie w oryginalnej wersji z marca, która oferowała znacznie mniejsze okna kontekstowe.
GPT-4o: jedna sieć do tekstu, obrazu i dźwięku
Wcześniejsze rozwiązania do przetwarzania głosu opierały się na oddzielnych komponentach: jeden model transkrybował mowę, inny model językowy generował tekst, a odrębny silnik syntetyzował dźwięk. GPT-4o, gdzie „o” oznacza „omni”, obsługuje tekst, obrazy i dźwięk w ramach jednej sieci end-to-end. Usunięcie tych pośredników zmniejszyło opóźnienie w transmisji głosu do około 200 ms i umożliwiło modelowi percepcję oraz generowanie tonu głosu, a nie tylko słów.
Modele rozumowania: wykorzystanie mocy obliczeniowej podczas inferencji
Gdy osiągnięcie lepszych wyników dzięki coraz dłuższym sesjom treningowym stawało się trudniejsze, a wysokiej jakości dane treningowe przestały być dostępne w wystarczającej ilości, uwaga przeniosła się na obliczenia w czasie testowym: umożliwienie modelowi przemyślenia odpowiedzi przed jej udzieleniem. Różnica jest prosta – klasyczna odpowiedź GPT zaczyna generować tokeny zaraz po otrzymaniu promptu, natomiast model oparty na rozumowaniu najpierw przetwarza wewnętrzną sekwencję myśli, a dopiero potem podaje ostateczną odpowiedź.
Traditional GPT Response: Prompt ──> Immediate Word-by-Word Streaming
o-Series Response: Prompt ──> Internal Chain-of-Thought (Deliberation) ──> Final Answer
Serie o1 i o3 firmy OpenAI są zbudowane w ten sposób. Zamiast od razu decydować się na następne słowo, model poświęca dodatkowy czas na analizę przypadków granicznych, sprawdzanie kroków pośrednich oraz naprawianie błędów w swoim kodzie, co przynosi najlepsze rezultaty w matematyce, programowaniu konkurencyjnym oraz zadaniami wymagających wieloetapowej logiki. Kosztem jest wyższa latencja i koszt, dlatego należy je używać tylko w przypadkach, gdy potrzebna jest dłuższa refleksja.
Praca z GPT-4o w Pythonie
Historia wyjaśnia, dlaczego GPT-4o zmienił sposób codziennej rozwoju: zamiast łączyć model wizyjny, model językowy i silnik mowy, pojedyncze wezwanie API może przyjmować mieszane dane. Dwa przykłady pokazują najbardziej przydatne funkcje przeznaczone dla programistów.
Wysyłanie obrazu i tekstu w jednej prośbie
Z GPT-4o można umieścić tekst i obrazy obok siebie w tablicy content pojedynczej wiadomości użytkownika. Obraz może być przekazany jako publiczny URL lub jako dane zakodowane w formacie base64. Poniższy przykład wykorzystuje oficjalne SDK w Pythonie, odczytuje klucz API z zmiennej środowiskowej, prosi model o sprawdzenie zdjęcia betonu pod kątem pęknięć i ocenę ich stopnia poważności, ogranicza odpowiedź wartością max_tokens oraz wyświetla tekst pierwszego wyboru.
import os
from openai import OpenAI
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY"))
# Sending a visual inspection query directly to GPT-4o
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "Analyze this image for architectural structural damage. Identify any cracks and rate severity."
},
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/e/e1/Concrete_crack_example.jpg"
},
},
],
}
],
max_tokens=500,
)
print(response.choices[0].message.content)
Treść stanowi listę typowanych elementów (text i image_url), co umożliwia łączenie kilku obrazów i instrukcji w jednej próbie. Traktuj wynik jako ocenę do przeanalizowania; wszystko, co dotyczy bezpieczeństwa, nadal wymaga eksperta.
Otrzymywanie JSON zgodnego ze schematem przy użyciu Strukturyzowanych Wyników
Wiarygodne wydobywanie JSON z modelu wymagało wcześniej starannego formułowania zapytań oraz obronnego parsowania za pomocą wyrażeń regularnych. Strukturyzowane Wyniki rozwiązują ten problem na etapie dekodowania: próbkowanie modelu jest ograniczane tak, aby wynik musiał odpowiadać schematowi JSON, który podałeś. Dzięki ścisłym schematom OpenAI określa to jako gwarancję zgodności ze schematem, co jest silniejsze od starszego „trybu JSON”, który gwarantował jedynie składniowo poprawne JSON.
W Pythonie najwygodniejszym rozwiązaniem jest Pydantic. Przykład definiuje model Entity oraz model ArticleAnalysis zawierający tytuł, streszczenie, ocenę nastroju w zakresie od -1,0 do 1,0 oraz listę entytetów, a następnie przekazuje tę klasę jako response_format do funkcji pomocniczej parse SDK. Funkcja ta konwertuje klasę na schemat JSON, wysyła go wraz z żądaniem i zwraca obiekt typowany w polu message.parsed.
from openai import OpenAI
from pydantic import BaseModel, Field
from typing import List
client = OpenAI()
# Define the exact JSON schema required by your database
class Entity(BaseModel):
name: str
category: str = Field(description="Person, Organization, Location, or Date")
class ArticleAnalysis(BaseModel):
title: str
summary: str
sentiment_score: float = Field(description="Score between -1.0 and 1.0")
key_entities: List[Entity]
# Pass the schema directly into the completion request
completion = client.beta.chat.completions.parse(
model="gpt-4o",
messages=[
{"role": "system", "content": "You are an automated intelligence parser."},
{"role": "user", "content": "OpenAI CEO Sam Altman announced new developer tooling in San Francisco today."}
],
response_format=ArticleAnalysis,
)
# Extract type-safe output directly as a Python object
result: ArticleAnalysis = completion.choices[0].message.parsed
print(f"Summary: {result.summary}")
print(f"Entities: {result.key_entities}")
Dwie praktyczne uwagi. Funkcja pomocnicza znajdowała się pod nazwą client.beta, gdy uruchomiono tę funkcjonalność, a nowsze wersje SDK udostępniają ją również poza przestrzenią nazw beta, więc sprawdź wersję SDK używaną w twoim projekcie. Chociaż struktura jest gwarantowana, wartości nie są – wynik oceny nastroju będzie liczbą, ale to model decyduje, czy jest to sensowna liczba. Obsługuj odrzucenia i waliduj zasady biznesowe tak, jak robisz to w przypadku każdych danych wejściowych z zewnątrz.
Rodzina GPT w skrócie
- GPT-1 (2018): 117 mln parametrów; pokazało, że generatywne szkolenie wstępne w połączeniu z lekkim dopasowaniem działa skutecznie.
- GPT-2 (2019): 1,5 mld parametrów; możliwość wykonywania zadań bez przygotowania dodatkowych danych oraz stopniowe wypuszczanie nowych wersji ze względu na bezpieczeństwo.
- GPT-3 (2020): 175 mld parametrów; możliwość uczenia się w kontekście przy użyciu niewielkiej ilości danych na dużą skalę.
Co oznacza ta ewolucja dla Twojego stacku
- Sama skalowalność przestała być kluczowa. Początkowe postępy wynikały z liczby parametrów (117 mln, potem 1,5 mld, a następnie 175 mld); późniejszy rozwój opierał się również na technikach dostosowywania, takich jak RLHF, unifikacja multimodalna oraz analiza podczas testowania.
- Modele przeniesione z funkcji autodopasowywania na działanie. Obecne modele planują, wywołują funkcje i koordynują wieloetapowe procesy z użyciem narzędzi, dlatego projektowanie agentów jest obecnie istotnym zagadnieniem w inżynierii.
- Przewidywalność to funkcja, której możesz używać. Funkcja Structured Outputs umożliwia podłączenie wyników modelu do skonstruowanych ścieżek kodowych o ustalonej strukturze zamiast analizowania tekstu swobodnego.
- Wydajność teraz konkujuje z rozmiarem modelu. Mniejsze wersje, takie jak GPT-4o mini oraz modele do rozumowania celowego, często przewyższają największe modele pod względem kosztów i opóźnień przy wykonywaniu określonych zadań, dlatego należy wybierać modele w zależności od konkretnych wymagań, a nie tylko na podstawie ogólnych możliwości.
Budowanie z tych modeli coraz częściej polega na łączeniu systemów modeli, narzędzi i schematów, zamiast wysyłania pojedynczego polecenia.
Literatura pokrewna
- Budowanie tokenizera z kodowaniem par bajtowych od zera dla małego GPT — Implementacja tokenizera BPE na poziomie znaków w Pythonie, jego szkolenie na danych WikiText-2, zapisanie i stworzenie „odcisku palca”, a także ponowne szkolenie małego GPT na krótszych, bardziej gęstych sekwencjach tokenów.
- Diagnozowanie małego GPT w PyTorch: testy izolujące każdą awarię — Krok po kroku procedura diagnostyczna dla GPT na poziomie znaków w PyTorch, obejmująca ID tokenów i ich przesuwanie, gradienty, wartości błędów typu NaN oraz pliki checkpoint.