0Pricing
AI Prompt Engineering · Lezione

Lunghezza e rilevanza del contesto

Bilanci il contesto completo con i limiti dei token e la rilevanza

Lunghezza e rilevanza del contesto è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.

Il budget della finestra di contesto

Ogni modello dispone di una finestra di contesto massima: il numero totale di token che può elaborare in una singola chiamata API. Include sia l'input (il Suo prompt + la cronologia) sia l'output (la risposta del modello).

Comprendere questo budget è fondamentale: superarlo significa troncare il prompt o perdere parte dell'output. Sprecarlo in contesto irrilevante significa lasciare al modello meno spazio per ragionare su ciò che conta.

Dimensioni della finestra di contesto

Modelli diversi hanno limiti di contesto diversi. Nel 2025:

  • GPT-4o: 128.000 token
  • Claude Opus 4.5: 200.000 token
  • Gemini 1.5 Pro: 1.000.000 token
  • GPT-3.5 Turbo: 16.385 token

Le finestre più ampie consentono di includere più contesto, ma hanno un costo maggiore per chiamata. Per la maggior parte delle attività sono sufficienti 8.000-16.000 token. Più grande non significa sempre migliore se comporta l'inclusione di contenuti irrilevanti.

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')

Cosa includere: valutare la rilevanza

Prima di includere qualsiasi elemento di contesto, si chieda: Questa informazione modifica la risposta?

Un semplice schema mentale: assegni un punteggio a ogni elemento di contesto:

  • Rilevanza alta (includere): influisce direttamente sull'attività, determina il vocabolario, limita le opzioni
  • Rilevanza media (forse): fornisce dettagli utili, ma l'output sarebbe comunque valido senza
  • Rilevanza bassa (escludere): è vera, ma non influisce in alcun modo sulla risposta
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}')

Il problema del «lost in the middle»

La ricerca ha dimostrato che gli LLM prestano meno attenzione alle informazioni collocate nel mezzo di prompt molto lunghi. Il contesto critico collocato nel mezzo di un prompt di 50.000 token potrebbe essere ignorato parzialmente.

La prassi consigliata è collocare il contesto più importante all'inizio o alla fine del prompt: il modello presta maggiore attenzione a queste posizioni.

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)

Suddividere i documenti lunghi

Quando deve lavorare con un documento più lungo del Suo budget di token, ha tre possibilità:

  • Riassumere prima: chieda al modello di comprimere il documento, quindi lavori con il riepilogo
  • Suddividere ed elaborare: divida il documento in parti, elabori ogni parte, quindi combini i risultati
  • Estrarre e inserire: estragga solo le sezioni pertinenti prima di inserirle nel prompt

Non tenti mai di inserire a forza un documento che supera la finestra di contesto: viene troncato senza avviso.

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)

Filtrare la rilevanza nella pratica

Il filtraggio della rilevanza consiste nell'estrarre solo le parti pertinenti di un documento voluminoso prima di includerle in un prompt. È particolarmente importante per:

  • Report lunghi in cui è rilevante una sola sezione
  • File di codice in cui solo una funzione deve essere sottoposta a revisione
  • Conversazioni e-mail in cui contano solo gli ultimi 3 messaggi
  • Schemi di database in cui sono rilevanti solo 2 tabelle su 50
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)

Gestire la cronologia della conversazione

Nelle conversazioni a più turni, la cronologia cresce a ogni turno. Gestirla in modo intelligente mantiene sotto controllo il budget di token:

  • Finestra scorrevole: conservi solo gli ultimi N turni
  • Inserimento di un riepilogo: riassuma periodicamente i turni meno recenti in un unico messaggio
  • Estrazione dei fatti chiave: tenga traccia delle decisioni importanti in un elenco puntato, da inserire come contesto di sistema
  • Reimpostazione al cambio di argomento: avvii una nuova sessione quando passa a un argomento non correlato
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)

Tecniche di compressione del contesto

Quando deve includere molto contesto ma il budget di token è limitato, utilizzi tecniche di compressione:

  • Elenchi puntati invece della prosa: gli elenchi puntati sono più efficienti del 30-50% in termini di token rispetto alle frasi
  • Abbreviare i termini noti: «PostgreSQL 15» → «PG15» dopo il primo utilizzo
  • Rimuovere le frasi riempitive: «È importante notare che...» → si limiti a enunciare il fatto
  • Utilizzare formati strutturati: le coppie chiave:valore sono più dense delle frasi
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')

Selezione dinamica del contesto

Nelle applicazioni IA in produzione, il contesto viene spesso selezionato dinamicamente in base a ciò che è più pertinente alla query corrente. Questa tecnica si chiama Retrieval-Augmented Generation (RAG).

Invece di includere tutti i documenti, si recuperano solo quelli semanticamente più simili alla domanda dell'utente e li si inserisce nel prompt. In questo modo il contesto rimane essenziale e altamente pertinente.

# 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())

Pianificare il budget di contesto

Per le applicazioni in produzione, pianifichi esplicitamente il budget di contesto prima di iniziare lo sviluppo:

  • Riservi il 25% della finestra di contesto all'output
  • Destini il 10% al messaggio di sistema e alla persona
  • Destini il 30% alla cronologia della conversazione più recente
  • Lasci il 35% al contesto dinamico (documenti recuperati, dati inseriti)

Documenti queste allocazioni come costanti nel codice, in modo da poterle modificare facilmente con l'evolversi del Suo caso d'uso.

# 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')

Quando la rilevanza conta più della lunghezza

Un contesto di 500 token altamente pertinente è più efficace di uno di 5.000 token vagamente pertinente. Il modello produce un output migliore quando ha meno materiale irrilevante da esaminare.

Segnali che indicano che il contesto è troppo lungo e poco focalizzato:

  • Il modello ignora alcuni dei Suoi vincoli
  • L'output sembra generico nonostante il lungo contesto
  • Il modello affronta la parte sbagliata della domanda
  • La latenza e il costo sono superiori alle aspettative

Quando nota questi segnali, riduca il contesto ed esegua nuovamente l'attività.

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())

Verifica delle conoscenze

Uno sviluppatore sta costruendo un chatbot con una cronologia della conversazione di 20 turni. Dopo 20 turni, la finestra di contesto si sta riempiendo. Qual è la strategia MIGLIORE per continuare la conversazione senza perdere il contesto importante?

Lunghezza e rilevanza del contesto — riepilogo

Gestire efficacemente il contesto è una competenza fondamentale nella progettazione dei prompt, che diventa essenziale nelle applicazioni in produzione. Principi chiave:

  • Valuti ogni elemento di contesto: rilevanza alta / media / bassa; includa solo quelli ad alta rilevanza
  • Collochi i vincoli fondamentali all'inizio o alla fine, non nel mezzo
  • Utilizzi i formati a elenco puntato invece della prosa per risparmiare il 30-50% dei token
  • Riassuma o suddivida i documenti che superano il Suo budget
  • Nelle conversazioni a più turni, comprima la cronologia meno recente anziché ricominciare da capo
  • Pianifichi esplicitamente il Suo budget di contesto come costanti nel codice

Domande Frequenti

La lezione «Lunghezza e rilevanza del contesto» è gratuita?

Sì — il testo completo di «Lunghezza e rilevanza del contesto» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.

Cosa imparerò in «Lunghezza e rilevanza del contesto»?

Bilanci il contesto completo con i limiti dei token e la rilevanza Eserciti AI Prompt Engineering con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Prompt Engineering?

Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.

Quanto tempo richiede la lezione «Lunghezza e rilevanza del contesto»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Prompt Engineering?

Sì. Ogni lezione AI Prompt Engineering include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Che cosa significa contesto nei prompt per l'IA
  2. Fornire informazioni di base
  3. Impostare efficacemente lo scenario
  4. Lunghezza e rilevanza del contesto
← Torna a AI Prompt Engineering