Kontekstin pituus ja olennaisuus
Tasapainottakaa kattava konteksti, token-rajoitukset ja olennaisuus.
Kontekstin pituus ja olennaisuus on ilmainen Tekoälyn prompt engineering-oppitunti CoddyKitissä. Tämä on oppitunti 4/4. Voit lukea tästä oppimispolusta kokonaan mitkä tahansa 3 oppituntia ilmaiseksi — sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä käytännön harjoittelun sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Oppitunti kuuluu Tekoälyn prompt engineering-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Konteksti-ikkunan budjetti
Jokaisella mallilla on enimmäiskonteksti-ikkuna — API-kutsussa käsiteltävien tokenien kokonaismäärä. Tämä sisältää sekä syötteen (kehote + historia) että tuotoksen (mallin vastaus).
Tämän budjetin ymmärtäminen on kriittistä: sen ylittäminen tarkoittaa, että kehotetta typistetään tai tuotosta menetetään. Budjetin tuhlaaminen epäolennaiseen kontekstiin tarkoittaa, että mallille jää vähemmän tilaa päätellä olennaisesta.
Konteksti-ikkunoiden koot
Erilaisilla malleilla on erilaiset kontekstirajat. Vuonna 2025:
- GPT-4o: 128 000 tokenia
- Claude Opus 4.5: 200 000 tokenia
- Gemini 1.5 Pro: 1 000 000 tokenia
- GPT-3.5 Turbo: 16 385 tokenia
Laajempiin ikkunoihin voi sisällyttää enemmän kontekstia — mutta jokainen kutsu maksaa enemmän. Useimpiin tehtäviin riittää 8 000–16 000 tokenia. Suurempi ei aina ole parempi, jos mukaan otetaan epäolennaista sisältöä.
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')Mitä sisällyttää: relevanssin pisteyttäminen
Ennen kuin sisällytätte minkä tahansa kontekstin osan, kysykää: Muuttuuko vastaus tämän tiedon perusteella?
Yksinkertainen ajattelumalli: pisteyttäkää jokainen kontekstin osa:
- Korkea relevanssi (sisällyttäkää): vaikuttaa suoraan tehtävään, määrittää sanastoa, rajaa vaihtoehtoja
- Keskitasoinen relevanssi (ehkä): antaa hyödyllistä lisätietoa, mutta tuotos olisi kelvollinen ilman sitä
- Matala relevanssi (jättäkää pois): on totta, mutta ei vaikuta vastaukseen millään tavalla
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}')Keskelle hukkuvan tiedon ongelma
Tutkimukset ovat osoittaneet, että suuret kielimallit kiinnittävät vähemmän huomiota hyvin pitkien kehotteiden keskelle sijoitettuihin tietoihin. 50 000 tokenin kehotteen keskelle sijoitettu kriittinen konteksti saatetaan sivuuttaa osittain.
Suositeltu käytäntö: sijoittakaa tärkein konteksti kehotteen alkuun tai loppuun — malli kiinnittää näihin kohtiin eniten huomiota.
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)Pitkien asiakirjojen pilkkominen
Kun käsiteltävä asiakirja on tokenibudjettianne pidempi, teillä on kolme vaihtoehtoa:
- Tiivistäkää ensin: pyytäkää mallia tiivistämään asiakirja ja käsitelkää sitten tiivistelmää
- Pilkottakaa ja käsitelkää: jakakaa asiakirja osiin, käsitelkää kukin osa ja yhdistäkää tulokset
- Poimikaa ja lisätkää: poimikaa vain olennaiset osiot ennen niiden sisällyttämistä kehotteeseen
Älkää koskaan yrittäkö pakottaa konteksti-ikkunaa suurempaa asiakirjaa mukaan — se katkaistaan huomaamatta.
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)Relevanssin suodattaminen käytännössä
Relevanssisuodatus tarkoittaa, että suuresta asiakirjasta poimitaan vain olennaiset osat ennen niiden sisällyttämistä kehotteeseen. Tämä on erityisen tärkeää seuraavissa:
- Pitkissä raporteissa, kun vain yksi osio on olennainen
- Kooditiedostoissa, kun vain yksi funktio tarvitsee tarkistuksen
- Sähköpostiketjuissa, kun vain kolmella viimeisimmällä viestillä on merkitystä
- Tietokantakaavioissa, kun vain 2 taulua 50:stä on olennaisia
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)Keskusteluhistorian hallinta
Monikierroksisissa keskusteluissa historia kasvaa jokaisella kierroksella. Sen älykäs hallinta pitää tokenibudjetin hallinnassa:
- Liukuva ikkuna: säilyttäkää vain viimeiset N kierrosta
- Tiivistelmän lisääminen: tiivistäkää vanhemmat kierrokset aika ajoin yhdeksi viestiksi
- Keskeisten tietojen poiminta: seuratkaa tärkeitä päätöksiä luettelona ja lisätkää se järjestelmäkontekstiksi
- Nollatkaa aiheenvaihdoksen yhteydessä: aloittakaa uusi istunto, kun siirrytte aiheeseen, joka ei liity aiempaan
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)Kontekstin pakkaustekniikat
Kun paljon kontekstia on sisällytettävä mutta tokenibudjetti on tiukka, käyttäkää pakkaustekniikoita:
- Luettelot proosan sijaan: luettelot ovat 30–50 % tokenitehokkaampia kuin virkkeet
- Lyhentäkää tutut termit: 'PostgreSQL 15' → 'PG15' ensimmäisen käyttökerran jälkeen
- Poistakaa täyteilmaukset: 'On syytä huomata, että...' → ilmoittakaa vain fakta
- Käyttäkää jäsenneltyjä muotoja: avain:arvo-parit ovat tiiviimpiä kuin virkkeet
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')Dynaaminen kontekstin valinta
Tuotannossa käytettävissä tekoälysovelluksissa konteksti valitaan usein dynaamisesti sen perusteella, mikä on kulloisenkin kyselyn kannalta olennaisinta. Tätä kutsutaan hakuavusteiseksi generoinniksi (Retrieval-Augmented Generation, RAG).
Kaikkien asiakirjojen sisällyttämisen sijaan haette vain käyttäjän kysymystä semanttisesti muistuttavimmat asiakirjat ja lisäätte ne kehotteeseen. Tämä pitää kontekstin suppeana ja erittäin olennaisena.
# 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())Kontekstibudjetin suunnittelu
Suunnitelkaa tuotantosovellusten kontekstibudjetti selkeästi ennen rakentamisen aloittamista:
- Varatkaa 25% konteksti-ikkunasta tuotokselle
- Varatkaa 10% järjestelmäviestille ja persoonalle
- Varatkaa 30% viimeisimmälle keskusteluhistorialle
- Jättäkää 35% dynaamiselle kontekstille (haetut asiakirjat, lisätyt tiedot)
Dokumentoikaa nämä osuudet koodiin vakioina, jotta niitä on helppo säätää käyttötapauksen kehittyessä.
# 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')Milloin relevanssi voittaa pituuden
500 tokenin erittäin olennainen konteksti päihittää 5 000 tokenin löyhästi olennaisen kontekstin. Malli tuottaa parempia tuloksia, kun sen ei tarvitse kahlata yhtä suuren tietomäärän läpi.
Merkkejä siitä, että kontekstinne on liian pitkä ja hajanaisesti kohdistettu:
- Malli sivuuttaa osan rajoituksistanne
- Tuotos tuntuu yleisluontoiselta pitkästä kontekstista huolimatta
- Malli käsittelee kysymyksenne väärää osaa
- Viive ja kustannukset ovat odotettua suurempia
Kun havaitsette näitä merkkejä: karsikaa kontekstia ja suorittakaa uudelleen.
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())Tietotesti
Kehittäjä rakentaa keskustelubottia, jolla on 20 vuoron keskusteluhistoria. 20 vuoron jälkeen konteksti-ikkuna alkaa täyttyä. Mikä on PARAS strategia keskustelun jatkamiseksi ilman tärkeän kontekstin menettämistä?
Kontekstin pituus ja relevanssi — kertaus
Kontekstin tehokas hallinta on keskeinen kehotteiden laatimisen taito, joka korostuu tuotantosovelluksissa. Keskeiset periaatteet:
- Pisteyttäkää jokainen kontekstin osa: korkea / keskitasoinen / matala relevanssi — sisällyttäkää vain korkean relevanssin osat
- Sijoittakaa kriittiset rajoitukset alkuun tai loppuun, ei keskelle
- Käyttäkää luettelomuotoja proosan sijaan, jolloin säästätte 30–50 % tokeneita
- Tiivistäkää tai pilkkokaa budjettinne ylittävät asiakirjat
- Monikierroksisissa keskusteluissa tiivistäkää vanhaa historiaa sen sijaan, että aloittaisitte alusta
- Suunnitelkaa kontekstibudjetti nimenomaisesti koodivakioina
Opi Tekoälyn prompt engineering tekoälytuutorin avulla — ilmaiseksi
Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.
- Kurssit
- 53
- Oppitunnit
- 199
Usein kysytyt kysymykset
Onko oppitunti ”Kontekstin pituus ja olennaisuus” ilmainen?
Kyllä — voit lukea täällä verkossa kokonaan ilmaiseksi mitkä tahansa Tekoälyn prompt engineering-oppimispolun 3 oppituntia, myös oppitunnin “Kontekstin pituus ja olennaisuus”. Sen jälkeen CoddyKit PRO avaa kaikki oppitunnit sekä interaktiiviset harjoitukset sisäänrakennetulla koodieditorilla ja ympäri vuorokauden toimivalla tekoälytuutorilla. Tekoälyn prompt engineering-kurssilla on yhteensä 4 oppituntia.
Mitä opin oppitunnilla ”Kontekstin pituus ja olennaisuus”?
Tasapainottakaa kattava konteksti, token-rajoitukset ja olennaisuus. Harjoittelet Tekoälyn prompt engineering-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.
Tarvitsenko kokemusta aloittaakseni Tekoälyn prompt engineering-opiskelun?
Aiempi kokemus ei ole tarpeen. CoddyKitin Tekoälyn prompt engineering-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 4/4.
Kuinka kauan ”Kontekstin pituus ja olennaisuus”-oppitunnin suorittaminen kestää?
Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.
Voinko kirjoittaa ja suorittaa koodia tällä Tekoälyn prompt engineering-oppitunnilla?
Kyllä. Jokainen Tekoälyn prompt engineering-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.
Kaikki tämän kurssin oppitunnit
- Mitä konteksti tarkoittaa AI-promptauksessa
- Taustatietojen antaminen
- Tilanteen tehokas taustoittaminen
- Kontekstin pituus ja olennaisuus