SSD Nodes Learn Hosting plans →
Przewodniki Matt ConnorAutor: Matt Connor

Prompt systemowy: czym jest i gdzie naprawdę siedzi

Prompt systemowy to stała instrukcja, która mówi agentowi AI, kim jest i jak ma działać. Zobacz, gdzie siedzi w API Claude, claude.ai, Claude Code i Ollama oraz ile kosztuje.

Czym jest prompt systemowy

Prompt systemowy (po angielsku system prompt, pisze się też „instrukcja systemowa”) to stała instrukcja, która mówi agentowi AI, kim jest i jak ma działać. Model dostaje ją przed rozmową i stosuje do każdej odpowiedzi. Jeśli pytanie z kursu brzmi „jak nazywa się instrukcja, która określa rolę i zachowanie agenta”, poprawna odpowiedź to właśnie prompt systemowy.

W praktyce ta instrukcja nie leży w jednym miejscu. Każda warstwa, z której korzystasz, ma własny prompt systemowy i własny sposób jego ustawiania: API, aplikacja czatu, agent do kodowania i lokalny model w Ollama. Ten poradnik pokazuje każde z tych miejsc. Wyjaśnia też, dlaczego prompt systemowy kosztuje przy każdym zapytaniu i dlaczego nie wolno w nim trzymać haseł ani kluczy.

Prompt systemowy, prompt użytkownika i instrukcje projektu

Rozmowa z modelem składa się z kilku warstw tekstu. Każda ma inny zasięg i innego autora.

  • Prompt systemowy ustawia rolę i zasady. Pisze go twórca aplikacji lub agenta, a nie osoba, która czatuje. Obowiązuje przez całą rozmowę.
  • Prompt użytkownika to konkretna wiadomość: pytanie albo polecenie. Zmienia się w każdej turze.
  • Instrukcje osobiste i instrukcje projektu to tekst, który użytkownik zapisuje w ustawieniach aplikacji. W claude.ai instrukcje z ustawień konta działają we wszystkich rozmowach, a instrukcje projektu tylko w czatach tego projektu.
  • Plik z kontekstem agenta, na przykład CLAUDE.md w Claude Code, opisuje zasady konkretnego repozytorium. Claude Code nie wkleja go do promptu systemowego. Szczegóły są niżej.

Prompt systemowy opisuje rolę na całą rozmowę. Prompt użytkownika opisuje jedno zadanie. Gdy ten sam model ma raz tłumaczyć dokumenty, a raz recenzować kod, zmieniasz prompt systemowy. Nie dopisujesz roli do każdego pytania. Anthropic w dokumentacji o pisaniu promptów radzi ustawiać rolę właśnie w prompcie systemowym i dodaje, że nawet jedno zdanie robi różnicę.

Gdzie jest prompt systemowy w API Claude: parametr system

W Messages API, czyli w API wiadomości Claude, prompt systemowy to parametr system na najwyższym poziomie żądania. Jest opcjonalny. Przyjmuje zwykły tekst albo tablicę bloków tekstu. Nie wkładasz go do listy messages, tylko obok niej.

Poniżej przykład do uruchomienia u siebie. Potrzebujesz klucza API w zmiennej ANTHROPIC_API_KEY. Adres, nagłówki i model pochodzą z przykładu w dokumentacji Anthropic. Treść obu promptów jest po polsku.

curl https://api.anthropic.com/v1/messages \
  -H "content-type: application/json" \
  -H "x-api-key: $ANTHROPIC_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -d '{
    "model": "claude-opus-5-5",
    "max_tokens": 1024,
    "system": "Jesteś asystentem programisty Pythona. Odpowiadasz po polsku, krótko i z przykładem kodu.",
    "messages": [
      {"role": "user", "content": "Jak posortować listę słowników według klucza?"}
    ]
  }'

Odpowiedź przychodzi jako obiekt JSON. Tekst modelu jest w tablicy content, w bloku o typie text. Teraz zmień tylko pole system, na przykład na „Odpowiadasz wyłącznie po angielsku, bez kodu”, i wyślij to samo pytanie jeszcze raz. Różnica między dwiema odpowiedziami to dokładnie to, co robi prompt systemowy.

Jedna uwaga o nagłówkach. Dokumentacja nie jest dziś spójna co do anthropic-version. Strona przeglądowa API (stan na 29 października 2026) oznacza go jako wymagany i podaje przykładową wartość 2026-10-21. Strona referencyjna Messages oznacza go jako opcjonalny, a przykłady cURL w poradnikach nadal wysyłają 2023-06-01. Ta sama strona przeglądowa podaje Authorization: Bearer jako główny nagłówek uwierzytelniania, a x-api-key jako starszą opcję, która nadal działa. Oficjalne SDK wysyłają te nagłówki same. Przy ręcznym cURL sprawdź aktualny stan na stronie przeglądowej API Claude.

Nowsze modele przyjmują też wiadomość z rolą system w środku listy messages. Dokumentacja opisuje ją jako sposób na nową instrukcję w trakcie rozmowy, bez edytowania pola system i bez unieważniania prefiksu zapisanego w cache. Taka wiadomość ma tę samą wagę co pole system, ale nie może być pierwszym wpisem w messages. Działa między innymi na Opus 5.5, Sonnet 5.5, Haiku 5.5 i Fable 5.1. Nie działa na Sonnet 5. Instrukcje, które obowiązują od początku rozmowy, nadal należą do pola system.

Ukryty prompt systemowy w claude.ai i aplikacjach mobilnych

Gdy piszesz w claude.ai albo w aplikacji Claude na iOS lub Androida, Twoja wiadomość nie trafia do modelu sama. Przed nią stoi prompt systemowy napisany przez Anthropic. Według Anthropic podaje on modelowi aktualne informacje, na przykład bieżącą datę, i zachęca do pewnych zachowań, takich jak podawanie fragmentów kodu w Markdownie. Anthropic co jakiś czas go aktualizuje.

Ten prompt nie jest tajny. Anthropic publikuje go na stronie System Prompts w notach wydań, osobno dla każdego modelu. Strona Sonnet 5.5 zawiera dziś dwa wpisy z datami: 28 września 2026 i 7 października 2026 (stan na 29 października 2026). Niektóre modele mają kilka wpisów, bo prompt się zmienia.

Najważniejsze zdanie na tej stronie dla programisty brzmi: „These system prompt updates do not apply to the Claude API”. Aktualizacje tych promptów nie dotyczą API Claude. Gdy wywołujesz model przez API, prompt z claude.ai nie jest częścią Twojego żądania. Model dostaje tylko to, co sam wpiszesz w system. Dlatego ten sam model w API może odpowiadać inaczej niż w aplikacji.

W claude.ai możesz dopisać własne instrukcje na dwa sposoby. Instrukcje w ustawieniach (Settings, potem „Your Claude”, w starszym układzie „Account”) działają we wszystkich rozmowach. Instrukcje projektu ustawiasz w projekcie przyciskiem „Set project instructions” i zapisujesz przyciskiem „Save instructions”. Działają tylko w czatach tego projektu. Centrum pomocy nie opisuje, jak dokładnie te teksty łączą się z promptem systemowym, więc nie zgaduj. Jedno potwierdzone połączenie widać w samym prompcie: wpis dla Sonnet 5.5 z 7 października 2026 mówi modelowi, że osobiste preferencje tonu, formatowania i funkcji zapisuje się w „user preferences”. Dostępność projektów w Twoim planie sprawdź w centrum pomocy Claude, bo jego artykuły nie są w tej sprawie zgodne.

Prompt systemowy w Claude Code: CLAUDE.md, AGENTS.md i style wyjściowe

Claude Code to harness agenta, czyli program wokół modelu. Daje modelowi narzędzia i pętlę pracy. Ma też własny prompt systemowy. Dokumentacja opisuje tę warstwę jako podstawowe instrukcje i definicje narzędzi, napisane pod zadania programistyczne. Z czego składa się taki program, wyjaśnia poradnik czym jest harness agenta AI.

Na ten prompt Claude Code nakłada kolejne warstwy. Tu łatwo o błąd, więc trzymamy się dokumentacji.

CLAUDE.md nie jest częścią promptu systemowego. Dokumentacja Claude Code mówi wprost: „CLAUDE.md content is delivered as a user message after the system prompt, not as part of the system prompt itself”. Treść CLAUDE.md trafia do modelu jako wiadomość użytkownika, za promptem systemowym. Claude traktuje ją jako kontekst, a nie jako wymuszoną konfigurację.

AGENTS.md Claude Code czyta bezpośrednio od wersji v2.1.277. Domyślnie robi to tylko wtedy, gdy w katalogu roboczym ani wyżej nie ma pliku CLAUDE.md ani CLAUDE.local.md. Jeśli masz oba pliki, wpisz w CLAUDE.md linię @AGENTS.md, a Claude Code zaimportuje treść AGENTS.md. Jak podzielić zasady między takie pliki, opisuje poradnik o plikach AGENTS.md i HUMAN.md dla agentów.

Style wyjściowe (output styles) zmieniają instrukcje, które Claude Code daje modelowi. Claude Code wysyła instrukcje aktywnego stylu z każdym żądaniem. Wbudowane style to Proactive, Concise, Explanatory i Learning. Styl własny usuwa wbudowane instrukcje programistyczne Claude Code, chyba że w jego nagłówku ustawisz keep-coding-instructions: true. Przykłady i pułapki opisuje poradnik o stylach wyjściowych w Claude Code.

Do zmiany samego promptu systemowego Claude Code ma flagi wiersza poleceń:

# Dopisuje tekst na końcu domyślnego promptu systemowego
claude --append-system-prompt "Odpowiadaj po polsku. Komentarze w kodzie pisz po angielsku."

# Zastępuje cały domyślny prompt systemowy
claude --system-prompt "Jesteś recenzentem kodu Pythona. Nie edytujesz plików."

Są też wersje --append-system-prompt-file i --system-prompt-file, które czytają tekst z pliku. Flagi działają w trybie interaktywnym i nieinteraktywnym. Claude Code buduje prompt systemowy raz, przy pierwszym żądaniu rozmowy, razem z tekstem z tych flag, i zapisuje go w sesji. W większości przypadków wybierz wariant „append”. --system-prompt zastępuje cały domyślny prompt, a w nim standardowe instrukcje do pracy nad kodem.

Krótka ściąga, co gdzie wpisać. Zasady projektu, których Claude ma zawsze przestrzegać, idą do CLAUDE.md. Stała persona lub sposób odpowiadania idzie do stylu wyjściowego. Instrukcja, która ma mieć wagę promptu systemowego, idzie do --append-system-prompt.

SYSTEM w pliku Modelfile w Ollama

Ollama to narzędzie do uruchamiania modeli językowych na własnym komputerze lub serwerze. Prompt systemowy ustawiasz tam w pliku Modelfile, instrukcją SYSTEM. Według dokumentacji Ollama SYSTEM określa wiadomość systemową, którą Ollama wstawia do szablonu modelu. Jedyną wymaganą instrukcją w Modelfile jest FROM, czyli model bazowy.

Przykład do uruchomienia. Zapisz plik Modelfile:

FROM llama3.2
PARAMETER temperature 0.3
SYSTEM """Jesteś pomocnikiem administratora serwerów Linux. Odpowiadasz po polsku. Najpierw podajesz polecenie, potem jednym zdaniem wyjaśniasz, co ono robi. Jeśli polecenie usuwa dane, ostrzegasz przed nim."""

Potem pobierz model bazowy, zbuduj własny model i uruchom go:

ollama pull llama3.2
ollama create admin-pl -f ./Modelfile
ollama run admin-pl
ollama show --modelfile admin-pl

ollama show --modelfile wypisuje Modelfile gotowego modelu. W wyniku powinna być linia SYSTEM z Twoim tekstem. Od tej chwili każda rozmowa z admin-pl zaczyna się od tej instrukcji, bez wpisywania jej ręcznie. Jeśli Ollama jeszcze nie działa na Twoim serwerze, zacznij od poradnika jak uruchomić Ollama na VPS i hostować własny model LLM.

API czatu Ollama (POST /api/chat) też przyjmuje w messages wiadomość z rolą system, obok ról user, assistant i tool. Dokumentacja nie opisuje, jak taka wiadomość łączy się z SYSTEM z Modelfile. Jeśli używasz obu naraz, sprawdź wynik na swoim modelu.

Przykład: krótki prompt systemowy po polsku

Dobry prompt systemowy jest krótki i konkretny. Mówi, kim jest model, dla kogo pracuje, czego nie robi i jak ma wyglądać odpowiedź. Poniższy tekst to przykład napisany na potrzeby tego poradnika, a nie fragment dokumentacji. Możesz go wkleić do pola system w API, do SYSTEM w Modelfile albo do flagi --append-system-prompt.

Jesteś asystentem działu wsparcia firmy hostingowej.
Rozmawiasz z klientami, którzy mają własny serwer VPS z Ubuntu.
Odpowiadasz po polsku, prostymi zdaniami.
Każde polecenie podajesz w bloku kodu i wyjaśniasz je jednym zdaniem.
Nie prosisz o hasła ani klucze prywatne. Jeśli klient je wklei, radzisz mu je zmienić.
Jeśli nie znasz odpowiedzi, mówisz to wprost i kierujesz klienta do zgłoszenia w panelu.

Pierwsze dwie linie ustawiają rolę i odbiorcę. Kolejne dwie ustalają formę odpowiedzi. Ostatnie dwie mówią, czego model ma nie robić i co zrobić, gdy nie wie. Zwróć uwagę, czego w tym prompcie nie ma: żadnego hasła, klucza API, tokenu ani wewnętrznego adresu. To celowe, a powód wyjaśnia sekcja o bezpieczeństwie.

Dlaczego prompt systemowy kosztuje przy każdym zapytaniu

Messages API jest bezstanowe. Serwer nie pamięta poprzednich żądań, więc w każdym żądaniu wysyłasz całą historię rozmowy. Prompt systemowy jedzie razem z nią i jest przetwarzany w każdym żądaniu. Płacisz za niego jak za tokeny wejściowe, chyba że trafi do cache.

Claude Code działa tak samo. Jego dokumentacja o cache mówi, że model nie pamięta niczego między żądaniami, więc Claude Code wysyła ponownie cały kontekst: prompt systemowy, kontekst projektu, wszystkie poprzednie wiadomości i wyniki narzędzi. Ta sama strona dodaje, że zmiana promptu systemowego unieważnia cały cache, bo wszystko, co jest dalej, stoi za innym prefiksem. Ile tokenów zajmuje sam harness, zanim napiszesz pierwsze słowo, opisuje poradnik o narzucie tokenów w harnessach agentów.

Prompt caching (zapisywanie początku promptu w pamięci podręcznej) zmniejsza ten koszt. W API Claude prefiks do cache powstaje w kolejności tools, potem system, potem messages. Prompt systemowy jest więc częścią prefiksu, który można zapisać. Najprostszy sposób to jedno pole cache_control na najwyższym poziomie żądania:

{
  "model": "claude-opus-5-5",
  "max_tokens": 1024,
  "cache_control": {"type": "ephemeral"},
  "system": "Tu długi, stały prompt systemowy.",
  "messages": [
    {"role": "user", "content": "Pierwsze pytanie"}
  ]
}

Według dokumentacji (stan na 29 października 2026) cache żyje domyślnie 5 minut, a każde użycie odnawia ten czas bez dodatkowej opłaty. Za dopłatą można ustawić 1 godzinę przez "ttl": "1h". Zapis do cache kosztuje 1,25 raza cenę bazowych tokenów wejściowych przy 5 minutach i 2 razy przy 1 godzinie. Odczyt kosztuje ułamek ceny bazowej, a dokładny mnożnik zależy od modelu. Krótki prompt może się w ogóle nie zapisać: dla Opus 5.5, Sonnet 5.5, Haiku 5.5 i Fable 5.1 minimum to 512 tokenów, a krótsze żądanie przechodzi bez cache i bez żadnego błędu. Czy zapis zadziałał, sprawdzisz w polu usage odpowiedzi: cache_creation_input_tokens rośnie przy zapisie, a cache_read_input_tokens przy odczycie. Kiedy cache zaczyna się opłacać, liczy poradnik o progu opłacalności cache promptów w Claude.

Czego prompt systemowy nie robi: nie jest zabezpieczeniem

Prompt systemowy to instrukcja. Model stara się jej przestrzegać, ale tekst z innego źródła może próbować ją obejść. Anthropic opisuje jailbreak i prompt injection jako próby zmuszenia Claude do zignorowania jego zasad albo Twoich instrukcji. Prompt injection to sytuacja, w której polecenie jest ukryte w treści, którą agent czyta: w stronie WWW, w pliku, w e-mailu albo w wyniku narzędzia. Anthropic pisze, że Claude jest odporny na takie ataki, ale nie nazywa tego gwarancją i podaje dodatkowe kroki ochrony.

Dwie rady z tej dokumentacji dotyczą wprost promptu systemowego. Treść od osób trzecich podawaj w blokach tool_result, nigdy w system ani w zwykłym tekście użytkownika. Stosuj też zasadę najmniejszych uprawnień: nie dawaj Claude dostępu do sekretów, których nie potrzebuje, i uruchamiaj narzędzia w piaskownicy z wąskimi uprawnieniami. Jak to wygląda w agentach, które same edytują pliki i uruchamiają polecenia, opisuje poradnik o prompt injection w agentach do kodowania.

Drugi problem to wyciek. Strona Anthropic o wyciekach promptów mówi, że prompt może ujawnić informacje, które miały być „ukryte”, i że żadna metoda nie jest niezawodna. Radzi też nie umieszczać w prompcie szczegółów, których model nie potrzebuje do zadania. Nasz wniosek jest prosty: skoro użytkownik może wyciągnąć prompt systemowy, nie trzymaj w nim haseł, kluczy API, tokenów ani wewnętrznych adresów. Sekret należy do zmiennej środowiskowej lub menedżera sekretów po stronie serwera, poza zasięgiem modelu.

W Claude Code obowiązuje ta sama zasada. Dokumentacja mówi, że CLAUDE.md i styl wyjściowy to instrukcje, które Claude stara się wykonać, a nie twarde reguły. Jeśli jakaś akcja ma być zablokowana bez względu na decyzję modelu, użyj hooka PreToolUse. Hook to kod, który uruchamia się przed użyciem narzędzia, więc działa niezależnie od tego, co model przeczytał.

FAQ

Czym jest prompt systemowy w jednym zdaniu?

Prompt systemowy to stała instrukcja, którą model dostaje przed rozmową i która określa, kim jest agent AI i jak ma działać, na przykład jaką ma rolę i czego ma nie robić. W API Claude to parametr system. W Ollama to instrukcja SYSTEM w pliku Modelfile. W aplikacjach czatu to tekst ustawiony przez producenta, którego zwykle nie widzisz.

Czy prompt systemowy z claude.ai działa też w API Claude?

Nie. Anthropic publikuje prompty z claude.ai i aplikacji mobilnych na stronie System Prompts w notach wydań i pisze tam, że ich aktualizacje nie dotyczą API Claude. W API model dostaje tylko to, co sam wpiszesz w parametr system. Dlatego ten sam model może w API odpowiadać inaczej niż w aplikacji.

Czy CLAUDE.md to prompt systemowy Claude Code?

Nie. Dokumentacja Claude Code mówi, że treść CLAUDE.md trafia do modelu jako wiadomość użytkownika, za promptem systemowym, a nie jako jego część. Claude traktuje ją jako kontekst. Jeśli instrukcja ma mieć wagę promptu systemowego, użyj flagi --append-system-prompt. Jeśli akcja ma być zablokowana zawsze, użyj hooka PreToolUse.

Czy mogę trzymać klucz API albo hasło w prompcie systemowym?

Nie rób tego. Anthropic pisze, że prompty mogą wyciekać i że żadna metoda ochrony nie jest niezawodna, a prompt injection może skłonić model do zignorowania instrukcji. Trzymaj sekrety w zmiennych środowiskowych lub menedżerze sekretów po stronie serwera i dawaj modelowi tylko te uprawnienia, których potrzebuje do zadania.

Czy płacę za prompt systemowy przy każdym zapytaniu?

Tak. W API Claude prompt systemowy jest wysyłany i przetwarzany w każdym żądaniu, bo API jest bezstanowe. Płacisz za niego jak za tokeny wejściowe, chyba że trafi do cache. Prompt caching zapisuje prefiks, w którym jest prompt systemowy, a odczyt z cache kosztuje ułamek ceny bazowej. Prompt krótszy niż minimum dla danego modelu (512 tokenów dla Opus 5.5, Sonnet 5.5 i Haiku 5.5) nie zapisze się w cache, a API nie zgłosi błędu.

Czy ten artykuł był przydatny?