Długość kontekstu i jego istotność
Równoważ obszerny kontekst z limitami tokenów i istotnością informacji.
Długość kontekstu i jego istotność to bezpłatna lekcja AI Prompt Engineering na CoddyKit. To lekcja 4 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.
Budżet okna kontekstu
Każdy model ma maksymalny rozmiar okna kontekstu — całkowitą liczbę tokenów, które może przetworzyć w jednym wywołaniu API. Obejmuje to zarówno dane wejściowe (Państwa prompt i historię), jak i dane wyjściowe (odpowiedź modelu).
Zrozumienie tego budżetu ma kluczowe znaczenie: jego przekroczenie oznacza skrócenie promptu lub utratę części wyniku. Marnowanie go na nieistotny kontekst oznacza, że model ma mniej miejsca na rozumowanie o tym, co naprawdę ważne.
Rozmiary okna kontekstu
Różne modele mają różne limity kontekstu. Stan na 2025 rok:
- GPT-4o: 128 000 tokenów
- Claude Opus 4.5: 200 000 tokenów
- Gemini 1.5 Pro: 1 000 000 tokenów
- GPT-3.5 Turbo: 16 385 tokenów
Większe okna pozwalają uwzględnić więcej kontekstu, ale kosztują więcej przy każdym wywołaniu. W przypadku większości zadań wystarcza 8 000–16 000 tokenów. Większy rozmiar nie zawsze oznacza lepszy wynik, jeśli wiąże się z uwzględnianiem nieistotnych treści.
import tiktoken
def estimate_tokens(text, model='gpt-4o'):
encoding = tiktoken.encoding_for_model(model)
return len(encoding.encode(text))
# Quick token budget calculator
models = {
'GPT-3.5 Turbo': 16385,
'GPT-4o': 128000,
'Claude Opus 4.5': 200000,
}
prompt = 'Explain the concept of technical debt in 500 words for a non-technical CEO.'
prompt_tokens = estimate_tokens(prompt)
for model_name, limit in models.items():
reserved_for_output = 1024
available = limit - prompt_tokens - reserved_for_output
print(f'{model_name}: limit={limit:,} | prompt={prompt_tokens} | '
f'context budget={available:,} tokens')Co uwzględniać: ocena istotności
Przed uwzględnieniem dowolnego fragmentu kontekstu proszę zadać sobie pytanie: Czy ta informacja zmienia odpowiedź?
Prosty schemat myślowy — proszę ocenić każdy element kontekstu:
- Wysoka istotność (uwzględnić): bezpośrednio wpływa na zadanie, kształtuje słownictwo lub ogranicza dostępne możliwości
- Średnia istotność (można uwzględnić): dostarcza przydatnego kolorytu, ale wynik byłby poprawny również bez tego elementu
- Niska istotność (pominąć): informacja jest prawdziwa, ale w żaden sposób nie wpływa na odpowiedź
def score_context_element(element, task):
'''
Heuristic: does this context element directly constrain or shape the answer?
Returns: HIGH / MEDIUM / LOW
'''
high_signals = ['stack', 'constraint', 'deadline', 'must', 'cannot', 'budget',
'audience', 'goal', 'version', 'scale', 'limit']
low_signals = ['founded', 'headquartered', 'fun fact', 'history', 'awards',
'team building', 'company culture', 'office location']
el_lower = element.lower()
if any(s in el_lower for s in high_signals):
return 'HIGH'
if any(s in el_lower for s in low_signals):
return 'LOW'
return 'MEDIUM'
context_elements = [
'Our stack is Python FastAPI and PostgreSQL',
'We cannot use any paid third-party APIs',
'Our company was founded in Berlin in 2020',
'We need the solution to handle 1000 requests/second',
'We won a startup award last year',
]
for el in context_elements:
score = score_context_element(el, task='optimize our API')
print(f'[{score:6}] {el}')Problem zagubienia w środku
Badania wykazały, że LLM-y poświęcają mniej uwagi informacjom umieszczonym w środku bardzo długich promptów. Krytyczny kontekst umieszczony w środku promptu zawierającego 50 000 tokenów może zostać częściowo pominięty.
Najlepsza praktyka: najważniejszy kontekst proszę umieszczać na początku lub końcu promptu — model zwraca największą uwagę właśnie na te pozycje.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Structure: critical constraint at the TOP, then the body, then the task
well_structured_prompt = (
# Critical constraint FIRST
'CRITICAL CONSTRAINT: Output must be under 50 words and contain no code.\n\n'
# Background in the middle
'Background: we are explaining our API rate limiting policy to non-technical support agents. '
'They handle billing inquiries and need to explain errors to customers. '
'Our rate limit is 100 requests per minute per API key.\n\n'
# Task at the end
'Task: Write the explanation.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=128,
messages=[{'role': 'user', 'content': well_structured_prompt}]
)
print(response.content[0].text)Dzielenie długich dokumentów na fragmenty
Gdy muszą Państwo pracować z dokumentem dłuższym niż dostępny budżet tokenów, mają Państwo trzy możliwości:
- Najpierw podsumować: poprosić model o skrócenie dokumentu, a następnie pracować z podsumowaniem
- Podzielić i przetworzyć: podzielić dokument na fragmenty, przetworzyć każdy z nich, a następnie połączyć wyniki
- Wyodrębnić i wstawić: wyodrębnić tylko odpowiednie sekcje przed umieszczeniem ich w prompcie
Proszę nigdy nie próbować wymuszać przetworzenia dokumentu, który przekracza rozmiar okna kontekstu — zostanie on po cichu skrócony.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
def chunk_and_summarize(long_text, chunk_size=2000):
'''Split text into chunks, summarize each, combine summaries.'''
words = long_text.split()
chunks = []
for i in range(0, len(words), chunk_size):
chunk = ' '.join(words[i:i + chunk_size])
chunks.append(chunk)
summaries = []
for idx, chunk in enumerate(chunks):
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=256,
messages=[{
'role': 'user',
'content': f'Summarize this section in 3 bullet points:\n\n{chunk}'
}]
)
summaries.append(f'Section {idx+1}:\n{response.content[0].text}')
return '\n\n'.join(summaries)
# Example usage
long_doc = 'word ' * 5000 # placeholder for a real document
print('Chunks needed:', len(long_doc.split()) // 2000 + 1)Filtrowanie istotności w praktyce
Filtrowanie istotności polega na wyodrębnieniu tylko odpowiednich fragmentów dużego dokumentu przed uwzględnieniem go w prompcie. Jest to szczególnie ważne w przypadku:
- długich raportów, w których istotna jest tylko jedna sekcja
- plików z kodem, w których należy przejrzeć tylko jedną funkcję
- wątków e-mailowych, w których znaczenie mają tylko 3 ostatnie wiadomości
- schematów baz danych, w których istotne są tylko 2 z 50 tabel
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Step 1: Filter first, then ask
full_schema = (
'Table: users (id, name, email, created_at, role)\n'
'Table: products (id, name, price, stock, category_id)\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
'Table: categories (id, name, parent_id)\n'
'Table: reviews (id, product_id, user_id, rating, body)\n'
'Table: sessions (id, user_id, token, expires_at)'
)
# Only include relevant tables for the specific question
relevant_context = (
'Relevant tables for this query:\n'
'Table: orders (id, user_id, total, status, created_at)\n'
'Table: order_items (id, order_id, product_id, quantity, unit_price)\n'
)
response = client.chat.completions.create(
model='gpt-4o',
messages=[{
'role': 'user',
'content': f'{relevant_context}\nWrite SQL to find the top 5 orders by total value this month.'
}]
)
print(response.choices[0].message.content)Zarządzanie historią rozmowy
W rozmowach wieloetapowych historia rośnie z każdą kolejną turą. Inteligentne zarządzanie nią pozwala utrzymać zdrowy budżet tokenów:
- Okno przesuwne: zachowanie tylko ostatnich N tur
- Wstawianie podsumowania: okresowe streszczanie starszych tur w jednej wiadomości
- Wyodrębnianie kluczowych faktów: śledzenie ważnych decyzji w formie listy punktowanej i wstawianie jej jako kontekstu systemowego
- Reset przy zmianie tematu: rozpoczęcie nowej sesji przy przejściu do niezwiązanego tematu
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
def summarize_history(old_history):
'''Compress old conversation turns into a brief summary.'''
history_text = '\n'.join(
f'{m["role"].upper()}: {m["content"]}' for m in old_history
)
response = client.chat.completions.create(
model='gpt-4o',
max_tokens=200,
messages=[{
'role': 'user',
'content': (
'Summarize this conversation history in 3 bullet points. '
'Focus on decisions made and key information established.\n\n'
+ history_text
)
}]
)
return response.choices[0].message.content
# Example: compressing old history before continuing
old_turns = [
{'role': 'user', 'content': 'We are building a Kanban app.'},
{'role': 'assistant', 'content': 'Great, what is your stack?'},
{'role': 'user', 'content': 'React + FastAPI + PostgreSQL.'},
{'role': 'assistant', 'content': 'Good choice for a Kanban app.'}
]
summary = summarize_history(old_turns)
print('Summary of old history:', summary)Techniki kompresji kontekstu
Gdy muszą Państwo uwzględnić dużo kontekstu, ale budżet tokenów jest napięty, proszę zastosować techniki kompresji:
- Lista punktowana zamiast prozy: listy punktowane są o 30–50% wydajniejsze pod względem liczby tokenów niż zdania
- Skracanie znanych terminów: „PostgreSQL 15” → „PG15” po pierwszym użyciu
- Usuwanie wypełniaczy: „Warto zauważyć, że…” → wystarczy podać sam fakt
- Stosowanie formatów strukturalnych: pary klucz:wartość są bardziej zwięzłe niż zdania
import tiktoken
def count_tokens(text):
enc = tiktoken.encoding_for_model('gpt-4o')
return len(enc.encode(text))
# Same information, different token counts
prose_context = (
'Our company is a startup that was founded recently and we are building '
'a data analytics platform. It is worth noting that we use Python for our backend. '
'Additionally, we have chosen PostgreSQL as our primary database. '
'Furthermore, we deploy on AWS using ECS containers.'
)
bullet_context = (
'Company: data analytics startup\n'
'Stack: Python backend, PostgreSQL, AWS ECS'
)
print('Prose context tokens: ', count_tokens(prose_context))
print('Bullet context tokens:', count_tokens(bullet_context))
print('Tokens saved:', count_tokens(prose_context) - count_tokens(bullet_context))
print('Same information? Yes — same facts, 60% fewer tokens')Dynamiczny wybór kontekstu
W produkcyjnych aplikacjach AI kontekst jest często wybierany dynamicznie na podstawie tego, co jest najbardziej istotne dla bieżącego zapytania. Nazywa się to Retrieval-Augmented Generation (RAG).
Zamiast uwzględniać wszystkie dokumenty, pobierane są tylko te, które są najbardziej podobne semantycznie do pytania użytkownika, a następnie wstawiane do promptu. Dzięki temu kontekst pozostaje zwięzły i bardzo istotny.
# Simplified RAG pattern: retrieve relevant chunks, inject into prompt
import openai
client = openai.OpenAI(api_key='sk-your-key-here')
# Simulated knowledge base (in production: vector database)
knowledge_base = [
{'id': 1, 'topic': 'billing', 'text': 'Refunds are processed within 5-7 business days.'},
{'id': 2, 'topic': 'shipping', 'text': 'Standard shipping takes 3-5 days.'},
{'id': 3, 'topic': 'returns', 'text': 'Returns accepted within 30 days with receipt.'},
{'id': 4, 'topic': 'warranty', 'text': 'All products come with a 1-year warranty.'},
]
def get_relevant_docs(user_query, kb, top_k=2):
'''Simplified relevance: keyword match. Production uses embeddings.'''
scored = [(doc, sum(w in user_query.lower() for w in doc['topic'].split())) for doc in kb]
scored.sort(key=lambda x: x[1], reverse=True)
return [doc['text'] for doc, _ in scored[:top_k]]
query = 'Can I return this and get my money back?'
relevant = get_relevant_docs(query, knowledge_base)
context = '\n'.join(relevant)
print('Injected context:', context)
response = client.chat.completions.create(
model='gpt-4o', max_tokens=80,
messages=[{'role': 'user', 'content': f'Context:\n{context}\n\nQuestion: {query}'}]
)
print('Answer:', response.choices[0].message.content.strip())Planowanie budżetu kontekstu
W przypadku aplikacji produkcyjnych proszę jawnie zaplanować budżet kontekstu przed rozpoczęciem budowy:
- zarezerwować 25% okna kontekstu na wynik
- przeznaczyć 10% na komunikat systemowy i personę
- przeznaczyć 30% na najnowszą historię rozmowy
- pozostawić 35% na kontekst dynamiczny (pobrane dokumenty i wstawione dane)
Proszę zapisać te wartości jako stałe w kodzie, aby można je było łatwo dostosować do zmieniających się potrzeb.
# Context budget planner
MODEL_LIMIT = 128000 # GPT-4o
BUDGET = {
'output_reserve': int(MODEL_LIMIT * 0.25), # 32,000 tokens
'system_message': int(MODEL_LIMIT * 0.05), # 6,400 tokens
'recent_history': int(MODEL_LIMIT * 0.30), # 38,400 tokens
'dynamic_context': int(MODEL_LIMIT * 0.35), # 44,800 tokens
'task_prompt': int(MODEL_LIMIT * 0.05), # 6,400 tokens
}
total_input = sum(v for k, v in BUDGET.items() if k != 'output_reserve')
print('Context budget plan:')
for key, tokens in BUDGET.items():
pct = round(tokens / MODEL_LIMIT * 100)
print(f' {key:<20}: {tokens:>7,} tokens ({pct}%)')
print(f' {"total input":<20}: {total_input:>7,} tokens')
print(f' {"+ output reserve":<20}: {BUDGET["output_reserve"]:>7,} tokens')
print(f' {"= model limit":<20}: {MODEL_LIMIT:>7,} tokens')Kiedy istotność jest ważniejsza niż długość
Kontekst o długości 500 tokenów, ale wysoce istotny, daje lepsze wyniki niż kontekst o długości 5 000 tokenów i luźnym związku z tematem. Model generuje lepsze wyniki, gdy ma mniej treści do przebrnięcia.
Sygnały świadczące o tym, że kontekst jest zbyt długi i nieukierunkowany:
- model ignoruje niektóre z Państwa ograniczeń
- wynik wydaje się ogólnikowy mimo obszernego kontekstu
- model odnosi się do niewłaściwej części pytania
- opóźnienie i koszt są wyższe, niż oczekiwano
Gdy zauważą Państwo te sygnały, proszę skrócić kontekst i uruchomić zapytanie ponownie.
import anthropic
client = anthropic.Anthropic(api_key='sk-ant-your-key-here')
# Demonstrating: lean context produces sharper output
lean_context = (
'Task: write a 50-word product tagline.\n'
'Product: CLI tool that auto-generates Git commit messages from your diff.\n'
'Audience: senior developers who hate writing commit messages.\n'
'Tone: dry, witty, technical.'
)
response = client.messages.create(
model='claude-opus-4-5',
max_tokens=100,
messages=[{'role': 'user', 'content': lean_context}]
)
print('Lean context output:')
print(response.content[0].text.strip())Sprawdzenie wiedzy
Programista buduje chatbota z historią rozmowy obejmującą 20 tur. Po 20 turach okno kontekstu zaczyna się zapełniać. Jaka jest NAJLEPSZA strategia kontynuowania rozmowy bez utraty ważnego kontekstu?
Długość i istotność kontekstu — powtórzenie
Skuteczne zarządzanie kontekstem jest podstawową umiejętnością w tworzeniu promptów, która nabiera kluczowego znaczenia w aplikacjach produkcyjnych. Najważniejsze zasady:
- oceniać każdy element kontekstu pod kątem wysokiej / średniej / niskiej istotności — uwzględniać tylko elementy o wysokiej istotności
- umieszczać krytyczne ograniczenia na początku lub końcu, a nie w środku
- stosować format listy punktowanej zamiast prozy, aby zaoszczędzić 30–50% tokenów
- podsumowywać lub dzielić na fragmenty dokumenty, które przekraczają dostępny budżet
- w rozmowach wieloetapowych kompresować starszą historię zamiast zaczynać od początku
- jawnie planować budżet kontekstu jako stałe w kodzie
Często zadawane pytania
Czy lekcja „Długość kontekstu i jego istotność” jest bezpłatna?
Tak — pełny tekst „Długość kontekstu i jego istotność” 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 „Długość kontekstu i jego istotność”?
Równoważ obszerny kontekst z limitami tokenów i istotnością informacji. Ć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 4 z 4.
Ile czasu zajmuje lekcja „Długość kontekstu i jego istotność”?
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
- Znaczenie kontekstu w promptowaniu AI
- Dostarczanie informacji kontekstowych
- Skuteczne określanie kontekstu
- Długość kontekstu i jego istotność