Poznawanie interfejsu czatu
Jak działają interfejsy czatu LLM: role, tury i kontekst sesji.
Poznawanie interfejsu czatu to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Prompt Engineering, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Trzy role
Każda rozmowa z LLM opiera się na trzech rolach: system, user i assistant.
Rola system określa zasady i personę przed rozpoczęciem rozmowy. Rola user oznacza wysyłane przez Państwa wiadomości. Rola assistant oznacza odpowiedzi modelu.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
message = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
system='You are a helpful cooking assistant.',
messages=[
{'role': 'user', 'content': 'What is mise en place?'}
]
)
print(message.content[0].text)Wiadomość systemowa
Wiadomość systemowa jest instrukcją obsługi modelu. Jest przetwarzana przed pierwszą wypowiedzią użytkownika i pozostaje aktywna przez całą sesję.
Należy używać jej do określania persony, tonu, ograniczeń dziedzinowych lub formatu danych wyjściowych. Model traktuje ją jako kontekst wyznaczający sposób działania przez całą rozmowę.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
response = client.chat.completions.create(
model='gpt-4o',
messages=[
{
'role': 'system',
'content': 'You are a senior Python engineer. '
'Always include type hints and docstrings in your examples.'
},
{
'role': 'user',
'content': 'Show me a function that parses JSON safely.'
}
]
)
print(response.choices[0].message.content)Wypowiedzi i przebieg rozmowy
Rozmowa jest sekwencją wypowiedzi. Każda wypowiedź następuje naprzemiennie: użytkownik mówi, asystent odpowiada, a następnie użytkownik znów mówi.
Model widzi całą historię wypowiedzi przy każdym żądaniu. Dzięki temu rozmowa sprawia wrażenie ciągłego dialogu — jednak technicznie każde wywołanie API jest bezstanowe i za każdym razem otrzymuje pełny kontekst.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Each call sends the FULL conversation history
history = [
{'role': 'system', 'content': 'You are a geography tutor.'},
{'role': 'user', 'content': 'What is the capital of France?'},
{'role': 'assistant', 'content': 'The capital of France is Paris.'},
{'role': 'user', 'content': 'And its population?'} # follow-up turn
]
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
print(response.choices[0].message.content)Kontekst sesji
Kontekst sesji to bieżąca pamięć rozmowy. Każda wiadomość użytkownika i asystenta jest dodawana do tablicy historii.
Model nie ma osobnego magazynu pamięci — rozumuje wyłącznie na podstawie tego, co widzi w bieżącym oknie kontekstu. Po rozpoczęciu nowej sesji model nie pamięta poprzednich sesji, chyba że te informacje zostaną ponownie przekazane.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Simulating 3-turn session context
conversation = [
{'role': 'user', 'content': 'My name is Alex.'},
{'role': 'assistant', 'content': 'Nice to meet you, Alex!'},
{'role': 'user', 'content': 'What is 5 times 7?'},
{'role': 'assistant', 'content': '5 times 7 is 35.'},
{'role': 'user', 'content': 'Can you repeat my name?'} # uses session context
]
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=conversation
)
print(response.content[0].text) # expects: Your name is Alex.Struktura historii wiadomości
Historia wiadomości to po prostu lista słowników, z których każdy zawiera klucz role oraz klucz content.
Ta lista jest zarządzana samodzielnie w kodzie. Po każdej odpowiedzi asystenta należy dodać jego odpowiedź, a następnie kolejną wiadomość użytkownika — przy następnym wywołaniu ponownie wysłać całą listę.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def chat(history, user_message):
history.append({'role': 'user', 'content': user_message})
response = client.chat.completions.create(
model='gpt-4o',
messages=history
)
reply = response.choices[0].message.content
history.append({'role': 'assistant', 'content': reply})
return reply, history
history = [{'role': 'system', 'content': 'You are a math tutor.'}]
reply, history = chat(history, 'What is a prime number?')
print(reply)
print('History length:', len(history))Wyjaśnienie limitów tokenów
Każdy model ma okno kontekstu wyrażane w tokenach. Token to w przybliżeniu 4 znaki lub 0,75 słowa w języku angielskim.
Zarówno dane wejściowe (system + cała historia), jak i dane wyjściowe modelu są wliczane do tego limitu. GPT-4o obsługuje 128k tokenów, a Claude Opus 4.5 — 200k. Po osiągnięciu limitu starsze wiadomości trzeba usunąć lub podsumować.
import tiktoken
# Count tokens before sending to avoid exceeding the limit
encoding = tiktoken.encoding_for_model('gpt-4o')
messages = [
{'role': 'system', 'content': 'You are a helpful assistant.'},
{'role': 'user', 'content': 'Explain quantum entanglement in simple terms.'}
]
total_tokens = 0
for msg in messages:
total_tokens += len(encoding.encode(msg['content']))
total_tokens += 4 # overhead per message
print(f'Estimated input tokens: {total_tokens}')
print(f'GPT-4o limit: 128,000 tokens')
print(f'Budget remaining: {128000 - total_tokens:,} tokens')Co dzieje się po osiągnięciu limitu tokenów
Gdy historia rozmowy wykracza poza okno kontekstu, mają Państwo trzy możliwości:
- Obcięcie — usunięcie najstarszych wiadomości
- Podsumowanie — poproszenie modelu o skompresowanie wcześniejszych tur do krótkiego podsumowania
- Okno przesuwne — zachowanie tylko ostatnich N wiadomości
Wybór niewłaściwej strategii może sprawić, że model utraci kluczowy kontekst i będzie generować niespójne odpowiedzi.
def trim_history(history, max_messages=10, keep_system=True):
'''Keep the system message and the last N non-system messages.'''
system_msgs = [m for m in history if m['role'] == 'system']
non_system = [m for m in history if m['role'] != 'system']
if len(non_system) > max_messages:
non_system = non_system[-max_messages:]
print(f'Trimmed to last {max_messages} messages.')
return system_msgs + non_system if keep_system else non_system
history = [{'role': 'system', 'content': 'You are a tutor.'}]
for i in range(15):
history.append({'role': 'user', 'content': f'Question {i}'})
history.append({'role': 'assistant', 'content': f'Answer {i}'})
trimmed = trim_history(history, max_messages=6)
print('Trimmed history length:', len(trimmed))Kontekst wieloturowy w praktyce
Zobaczmy, jak działa kontekst. W rozmowie wieloturowej model wykorzystuje każdą wcześniejszą wiadomość, aby poprawnie odpowiadać na pytania uzupełniające.
Dlatego można napisać „wyjaśnij to prościej” bez powtarzania, czym było „to” — model widzi całą historię i wie, do czego się Państwo odnoszą.
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a science teacher.'}]
# Turn 1
history.append({'role': 'user', 'content': 'What is photosynthesis?'})
r1 = client.chat.completions.create(model='gpt-4o', messages=history)
reply1 = r1.choices[0].message.content
history.append({'role': 'assistant', 'content': reply1})
# Turn 2 — refers to prior answer without repeating it
history.append({'role': 'user', 'content': 'Can you explain that using only 3 bullet points?'})
r2 = client.chat.completions.create(model='gpt-4o', messages=history)
print(r2.choices[0].message.content)Bezstanowe API, stanowy interfejs użytkownika
Oto kluczowy wniosek: API jest całkowicie bezstanowe. Serwer niczego nie pamięta między wywołaniami.
Produkty czatowe, takie jak ChatGPT, tworzą wrażenie pamięci, przechowując historię rozmowy we własnej bazie danych i wstrzykując ją z powrotem do każdego wywołania API. Mogą Państwo samodzielnie zbudować taki mechanizm.
# Illustration: two isolated API calls vs one with history
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# ❌ WITHOUT history — model has no memory
r1 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': 'My dog is named Biscuit.'}]
)
r2 = client.chat.completions.create(
model='gpt-4o',
messages=[{'role': 'user', 'content': "What's my dog's name?"}]
)
print('Without history:', r2.choices[0].message.content) # will not know
# ✅ WITH history injected
r3 = client.chat.completions.create(
model='gpt-4o',
messages=[
{'role': 'user', 'content': 'My dog is named Biscuit.'},
{'role': 'assistant', 'content': 'Got it, your dog is named Biscuit!'},
{'role': 'user', 'content': "What's my dog's name?"}
]
)
print('With history:', r3.choices[0].message.content)Praktyczne wskazówki dotyczące korzystania z interfejsu czatu
Aby jak najlepiej korzystać z interfejsu czatu:
- Trwałe instrukcje należy umieszczać w komunikacie systemowym, zamiast powtarzać je w każdej turze użytkownika
- Wcześniejsze tury powinny być zwięzłe — obszerna historia szybko zużywa tokeny
- Po zmianie tematu należy rozpocząć nową sesję, aby uniknąć zanieczyszczenia kontekstu
- Przy wznawianiu pracy nad długim projektem należy wstrzykiwać tylko istotny podzbiór wcześniejszego kontekstu
# Good practice: compact system message + focused history
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
system = (
'You are a concise Python code reviewer. '
'Reply with: 1) one-line verdict, 2) top 3 issues, 3) fixed snippet.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=512,
system=system,
messages=[
{'role': 'user', 'content': 'def add(a,b): return a+b\nprint(add(1,2))'}
]
)
print(response.content[0].text)Podsumowanie: interfejs czatu
Przejdźmy przez najważniejsze informacje o działaniu interfejsu czatu:
- Trzy role: system ustala reguły, użytkownik wysyła prompty, a asystent odpowiada
- Pełna historia jest wysyłana przy każdym wywołaniu API — serwer jest bezstanowy
- Limity tokenów ograniczają łączny kontekst; gdy zbliżają się Państwo do limitu, należy skrócić historię lub ją podsumować
- Kontekst sesji to po prostu lista, którą zarządzają Państwo we własnym kodzie
- Po zmianie tematu należy rozpoczynać nowe sesje, aby zachować porządek w kontekście
# Summary: minimal chat loop skeleton
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
history = [{'role': 'system', 'content': 'You are a helpful assistant.'}]
def ask(question):
history.append({'role': 'user', 'content': question})
res = client.chat.completions.create(model='gpt-4o', messages=history)
answer = res.choices[0].message.content
history.append({'role': 'assistant', 'content': answer})
return answer
print(ask('Hello! What can you help me with?'))Sprawdź swoją wiedzę
Sprawdźmy, czy rozumieją Państwo mechanikę interfejsu czatu.
Użytkownik rozpoczyna zupełnie nową sesję i pyta AI: „Co omawialiśmy wczoraj?” AI nie ma pamięci poprzedniej sesji. Dlaczego?
Czego się Państwo nauczyli
Znają już Państwo podstawy każdej interakcji z czatem AI:
- strukturę ról system/user/assistant, która kształtuje każdą rozmowę
- sposób, w jaki pełna historia wiadomości jest wysyłana przy każdym wywołaniu, aby symulować pamięć
- powód, dla którego API jest bezstanowe, oraz sposób, w jaki produkty czatowe budują na nim pamięć
- sposób, w jaki limity tokenów ograniczają kontekst, oraz metody zarządzania tymi limitami
Ten model mentalny pomoże Państwu tworzyć lepsze prompty i budować inteligentniejsze aplikacje wykorzystujące AI.
Często zadawane pytania
Czy lekcja „Poznawanie interfejsu czatu” jest bezpłatna?
Tak — pełny tekst „Poznawanie interfejsu czatu” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Prompt Engineering, przejdź na CoddyKit PRO. Kurs AI Prompt Engineering zawiera 4 lekcji w sumie.
Co nauczysz się w „Poznawanie interfejsu czatu”?
Jak działają interfejsy czatu LLM: role, tury i kontekst sesji. Ćwiczysz AI Prompt Engineering z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Prompt Engineering?
Nie wymagamy żadnego doświadczenia. AI Prompt Engineering w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Poznawanie interfejsu czatu”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Prompt Engineering?
Tak. Każda lekcja AI Prompt Engineering zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Poznawanie interfejsu czatu
- Typy żądań, które może obsługiwać AI
- Jak AI generuje odpowiedzi
- Czego AI nie potrafi