Longitud y relevancia del contexto
Equilibre un contexto completo con los límites de tokens y la relevancia.
Longitud y relevancia del contexto es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.
El presupuesto de la ventana de contexto
Cada modelo tiene una ventana de contexto máxima: el número total de tokens que puede procesar en una sola llamada a la API. Esto incluye tanto la entrada (su prompt + el historial) como la salida (la respuesta del modelo).
Comprender este presupuesto es fundamental: excederlo implica truncar el prompt o perder parte de la salida. Desperdiciarlo en contexto irrelevante deja al modelo menos espacio para razonar sobre lo que importa.
Tamaños de la ventana de contexto
Los distintos modelos tienen límites de contexto diferentes. A fecha de 2025:
- GPT-4o: 128.000 tokens
- Claude Opus 4.5: 200.000 tokens
- Gemini 1.5 Pro: 1.000.000 de tokens
- GPT-3.5 Turbo: 16.385 tokens
Las ventanas más grandes permiten incluir más contexto, pero cuestan más por llamada. Para la mayoría de las tareas, entre 8.000 y 16.000 tokens es suficiente. Un tamaño mayor no siempre es mejor si implica incluir contenido irrelevante.
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')Qué incluir: evaluación de relevancia
Antes de incluir cualquier elemento de contexto, pregúntese: ¿Este elemento de información cambia la respuesta?
Un marco mental sencillo: evalúe cada elemento del contexto:
- Alta relevancia (incluir): afecta directamente a la tarea, determina el vocabulario o limita las opciones
- Relevancia media (quizá): aporta matices útiles, pero la salida sería adecuada sin él
- Baja relevancia (excluir): es verdadero, pero no afecta a la respuesta de ninguna manera
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}')El problema de la información perdida en el centro
Las investigaciones han demostrado que los LLM prestan menos atención a la información situada en el centro de los prompts muy largos. El contexto crítico situado en el centro de un prompt de 50.000 tokens puede ignorarse parcialmente.
Práctica recomendada: coloque el contexto más importante al principio o al final del prompt; el modelo presta más atención a estas posiciones.
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)División de documentos largos en fragmentos
Cuando necesite trabajar con un documento que supere su presupuesto de tokens, tiene tres opciones:
- Resumir primero: pida al modelo que comprima el documento y trabaje después con el resumen
- Dividir y procesar: divida el documento en fragmentos, procese cada uno y combine los resultados
- Extraer e insertar: extraiga solo las secciones relevantes antes de incluirlas en el prompt
Nunca intente forzar un documento que exceda la ventana de contexto: se trunca silenciosamente.
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)Filtrado de relevancia en la práctica
El filtrado de relevancia consiste en extraer solo las partes relevantes de un documento grande antes de incluirlo en un prompt. Es especialmente importante para:
- Informes largos en los que solo una sección es relevante
- Archivos de código en los que solo es necesario revisar una función
- Hilos de correo electrónico en los que solo importan los 3 últimos mensajes
- Esquemas de bases de datos en los que solo son relevantes 2 de 50 tablas
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)Gestión del historial de la conversación
En las conversaciones de varios turnos, el historial crece en cada turno. Gestionarlo de forma inteligente mantiene bajo control el presupuesto de tokens:
- Ventana deslizante: conserve solo los últimos N turnos
- Inyección de resúmenes: resuma periódicamente los turnos antiguos en un solo mensaje
- Extracción de datos clave: registre las decisiones importantes en una lista con viñetas e insértelas como contexto del sistema
- Restablecimiento al cambiar de tema: inicie una sesión nueva al cambiar a un tema no relacionado
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)Técnicas de compresión del contexto
Cuando deba incluir mucho contexto, pero el presupuesto de tokens sea limitado, utilice técnicas de compresión:
- Listas con viñetas en lugar de prosa: consumen entre un 30 y un 50 % menos tokens que las frases
- Abrevie los términos conocidos: «PostgreSQL 15» → «PG15» después del primer uso
- Elimine las frases de relleno: «Cabe señalar que...» → exponga directamente el hecho
- Utilice formatos estructurados: los pares clave:valor son más densos que las frases
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')Selección dinámica del contexto
En las aplicaciones de IA en producción, el contexto suele seleccionarse dinámicamente según lo relevante que sea para la consulta actual. Esto se denomina generación aumentada por recuperación (RAG).
En lugar de incluir todos los documentos, se recuperan únicamente los que son semánticamente más similares a la pregunta del usuario y se insertan en el prompt. Así, el contexto se mantiene reducido y muy relevante.
# 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())Planificación del presupuesto de contexto
Para las aplicaciones en producción, planifique explícitamente el presupuesto de contexto antes de desarrollarlas:
- Reserve el 25 % de la ventana de contexto para la salida
- Asigne el 10 % al mensaje del sistema y la persona
- Asigne el 30 % al historial de conversación más reciente
- Deje el 35 % para el contexto dinámico (documentos recuperados y datos insertados)
Documente estas asignaciones como constantes en el código para poder ajustarlas fácilmente a medida que evolucione su caso de 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')Cuando la relevancia supera a la longitud
Un contexto de 500 tokens muy relevante produce mejores resultados que uno de 5.000 tokens con relevancia limitada. El modelo genera mejores resultados cuando tiene menos contenido que procesar.
Señales de que su contexto es demasiado largo y poco concreto:
- El modelo ignora algunas de sus restricciones
- La salida parece genérica a pesar de la gran cantidad de contexto
- El modelo aborda una parte incorrecta de su pregunta
- La latencia y el coste son mayores de lo esperado
Cuando observe estas señales, reduzca el contexto y vuelva a ejecutar la solicitud.
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())Comprobación de conocimientos
Un desarrollador está creando un chatbot con un historial de conversación de 20 turnos. Después de 20 turnos, la ventana de contexto está casi llena. ¿Cuál es la MEJOR estrategia para continuar la conversación sin perder contexto importante?
Longitud y relevancia del contexto: repaso
Gestionar el contexto de forma eficaz es una habilidad fundamental para escribir prompts, y se vuelve crítica en las aplicaciones en producción. Principios clave:
- Evalúe cada elemento del contexto: relevancia alta / media / baja; incluya solo los de relevancia alta
- Coloque las restricciones críticas al principio o al final, no en el centro
- Utilice formatos con viñetas en lugar de prosa para ahorrar entre un 30 y un 50 % de tokens
- Resuma o divida en fragmentos los documentos que excedan su presupuesto
- En conversaciones de varios turnos, comprima el historial antiguo en lugar de empezar de cero
- Planifique explícitamente el presupuesto de contexto como constantes del código
Preguntas frecuentes
¿La lección «Longitud y relevancia del contexto» es gratis?
Sí — el texto completo de «Longitud y relevancia del contexto» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.
¿Qué aprenderé en «Longitud y relevancia del contexto»?
Equilibre un contexto completo con los límites de tokens y la relevancia. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar AI Prompt Engineering?
No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.
¿Cuánto tiempo toma la lección «Longitud y relevancia del contexto»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?
Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Qué significa el contexto al crear prompts para IA
- Proporcionar información de contexto
- Establecer el contexto de forma eficaz
- Longitud y relevancia del contexto