0Pricing
AI Prompt Engineering · Lección

Muestreo Top-k

Limitar la elección a los k tokens más probables y su efecto en la diversidad de la salida.

Muestreo Top-k es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 3 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.

¿Qué es el muestreo top-k?

El muestreo top-k restringe el modelo a muestrear de los k tokens más probables en cada paso. A todos los tokens fuera de top-k se les asigna una probabilidad de cero y no pueden seleccionarse.

k=1 es la decodificación greedy (solo el token más probable). k=50 es un intervalo creativo habitual. k=vocabulary_size equivale al muestreo sin restricciones.

Algoritmo de top-k

El algoritmo es más sencillo que el de top-p:

  1. Calcule las probabilidades de softmax sobre todo el vocabulario
  2. Ordene los tokens por probabilidad descendente
  3. Conserve solo los k tokens principales y establezca todos los demás en 0
  4. Renormalice las probabilidades de los top-k para que sumen 1
  5. Muestree de la distribución renormalizada
import numpy as np

def softmax(logits, temperature=1.0):
    scaled = logits / temperature
    e = np.exp(scaled - np.max(scaled))
    return e / e.sum()

def top_k_sample(logits, k=50, temperature=1.0):
    probs = softmax(logits, temperature)

    # Find top-k indices
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]

    # Renormalize
    top_k_probs = top_k_probs / top_k_probs.sum()

    # Sample
    chosen = np.random.choice(top_k_indices, p=top_k_probs)
    return chosen

# With a 10-token vocabulary:
logits = np.random.randn(10)
print('Chosen token:', top_k_sample(logits, k=3))

k=1: decodificación greedy

Cuando k=1, solo el token más probable forma parte del conjunto de candidatos. Muestrear de un conjunto de tamaño 1 es determinista: el modelo siempre selecciona ese token. Esto es idéntico a la decodificación greedy (temperature=0).

logits = np.array([3.0, 2.0, 1.0, 0.5, -1.0])

# k=1: greedy
top_1 = top_k_sample(logits, k=1)
print(f'k=1 always picks: {np.argmax(logits)}')  # index 0, the highest logit
print(f'top_k_sample result: {top_1}')  # always 0

# Multiple runs
for _ in range(5):
    print(top_k_sample(logits, k=1), end=' ')
# Output: 0 0 0 0 0 — perfectly deterministic

Intervalo creativo habitual: k=50

k=50 es un valor predeterminado habitual para la generación de texto creativo. Permite explorar 50 tokens en cada paso, al tiempo que evita que el modelo seleccione tokens sobre los que tiene muy poca confianza.

Con un vocabulario de 50 000 tokens, k=50 significa que el modelo considera solo el 0.1 % superior de los tokens en cada paso. Es una restricción considerable: se excluye la mayor parte del vocabulario.

import openai
client = openai.OpenAI(api_key='sk-...')

# Note: OpenAI API does not expose top_k directly in chat completions.
# Top-k is primarily a parameter in Hugging Face Transformers and Anthropic's API.

# Hugging Face example:
from transformers import pipeline
generator = pipeline('text-generation', model='gpt2')
output = generator(
    'Once upon a time',
    max_new_tokens=100,
    do_sample=True,
    top_k=50,
    temperature=1.0
)
print(output[0]['generated_text'])

Top-k en la API de Claude de Anthropic

La API de Claude de Anthropic expone top_k como parámetro directo. Esto facilita experimentar con el efecto de la truncación fija del vocabulario en las salidas de Claude.

import anthropic
claude = anthropic.Anthropic(api_key='sk-ant-...')

# top_k limits the number of tokens considered
message = claude.messages.create(
    model='claude-opus-4-5',
    max_tokens=256,
    temperature=1.0,
    top_k=50,  # sample from top 50 most probable tokens
    messages=[{
        'role': 'user',
        'content': 'Write a short poem about debugging code.'
    }]
)
print(message.content[0].text)

El problema de k fijo

La limitación fundamental de top-k es que k es fijo, independientemente de la confianza del modelo en ese paso.

Cuando el modelo tiene mucha confianza (un token tiene una probabilidad del 95 %), k=50 sigue incluyendo 49 tokens en gran medida irrelevantes. Cuando el modelo no está seguro (50 tokens tienen cada uno una probabilidad aproximada del 2 %), k=50 puede ser adecuado.

El problema es que k=50 puede ser demasiado restrictivo y demasiado permisivo al mismo tiempo, dependiendo del contexto. Top-p resuelve esto con un tamaño de núcleo dinámico.

# Illustrating the fixed-k problem
logits_confident = np.array([5.0] + [0.1] * 9)  # model is very sure
logits_uncertain = np.array([1.0] * 10)           # model has no idea

probs_conf = softmax(logits_confident)
probs_unc = softmax(logits_uncertain)

print('Confident — top 3 tokens cover:', np.sort(probs_conf)[::-1][:3].sum().round(3))
# ~0.998 — k=50 is extremely wasteful, includes near-zero probability tokens

print('Uncertain — top 3 tokens cover:', np.sort(probs_unc)[::-1][:3].sum().round(3))
# ~0.30 — k=50 may actually be needed to cover a reasonable nucleus

Top-k en las colas de la distribución

Top-k y top-p se diferencian sobre todo en las colas de la distribución:

  • Con top-k=50, el token número 50 podría tener una probabilidad del 0.001 % (es extremadamente improbable, pero sigue formando parte del conjunto de candidatos)
  • Con top-p=0.9, se excluye cualquier token fuera del núcleo del 90 %, incluidos los tokens que formarían parte de top-k

Top-p ofrece un enfoque más fundamentado para el comportamiento de la cola: excluye los tokens improbables según su probabilidad, no según su posición en la clasificación.

# Tail behavior comparison
import numpy as np

# Highly skewed distribution (one dominant token)
skewed_logits = np.array([4.0, 2.0, 1.5, 1.0, 0.5,
                           0.1, 0.0, -0.1, -0.5, -1.0])
probs = softmax(skewed_logits)

print('Probability of tokens 6-9 (tail):')
for i in range(6, 10):
    print(f'  Token {i}: {probs[i]:.4%}')
# These tokens are very unlikely but are included in top-k=10
# Top-p=0.9 would exclude them entirely

Combinar top-k y top-p

Algunas implementaciones aplican top-k y top-p conjuntamente: primero truncan a top-k y después aplican el muestreo de núcleo top-p dentro de ese conjunto. Esto proporciona un límite máximo estricto para el tamaño del vocabulario (top-k) y aplica a la vez un filtrado basado en la probabilidad (top-p).

def top_k_top_p_sample(logits, k=50, p=0.9, temperature=1.0):
    probs = softmax(logits, temperature)

    # First apply top-k
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]

    # Then apply top-p within top-k
    sorted_k = np.sort(top_k_probs)[::-1]
    cumulative = np.cumsum(sorted_k)
    nucleus_size = np.searchsorted(cumulative, p) + 1

    final_indices = top_k_indices[:nucleus_size]
    final_probs = top_k_probs[:nucleus_size]
    final_probs = final_probs / final_probs.sum()

    return np.random.choice(final_indices, p=final_probs)

Cuándo se prefiere top-k frente a top-p

A pesar de las ventajas teóricas de top-p, top-k se prefiere en algunos casos:

  • Tareas con vocabulario restringido: cuando el modelo solo debe producir resultados de un conjunto fijo (por ejemplo, opciones múltiples A/B/C/D), un top-k pequeño (4) lo impone directamente
  • Reproducibilidad: el comportamiento de top-k es más fácil de razonar: «siempre considerar exactamente 50 tokens»
  • Implementaciones optimizadas para hardware: algunos motores de inferencia implementan top-k de forma más eficiente que top-p
# Constrained output with top-k=4
# For a multiple choice task (A, B, C, D)
# If A/B/C/D tokens have indices 32, 33, 34, 35
# top-k=4 with those as the top-4 logits forces selection from those 4 only

multiple_choice_prompt = (
    'Answer with only A, B, C, or D.\n'
    'What is the capital of France?\n'
    'A) Berlin\n'
    'B) Paris\n'
    'C) Rome\n'
    'D) Madrid\n'
    'Answer:'
)

# With temperature=0, top_k=1: always picks the highest logit token

Directrices prácticas sobre top-k

Cuándo usar top-k y qué valores elegir:

  • k=1: tareas greedy / fácticas
  • k=5–20: tareas creativas enfocadas, con variación mínima
  • k=40–100: intervalo creativo estándar en la mayoría de los modelos de lenguaje
  • k=500+: exploración muy abierta (rara vez es necesario; use top-p en su lugar)

En la mayoría de las API modernas de LLM, top-p es el parámetro preferido. Use top-k cuando necesite un límite máximo estricto para el vocabulario o cuando la API lo exponga, pero no top-p.

TOP_K_GUIDELINES = {
    'factual_qa': 1,           # greedy
    'code_generation': 10,     # near-greedy, correct syntax
    'summarization': 20,       # slightly varied but focused
    'chat': 50,                # natural variation
    'creative_writing': 100,   # wider vocabulary exploration
    'poetry': 200,             # unusual word choices encouraged
}

def call_with_top_k(task, prompt, model='claude-opus-4-5'):
    k = TOP_K_GUIDELINES.get(task, 50)
    claude = anthropic.Anthropic(api_key='sk-ant-...')
    return claude.messages.create(
        model=model,
        max_tokens=512,
        top_k=k,
        messages=[{'role': 'user', 'content': prompt}]
    )

Top-k y temperatura en conjunto

Top-k y la temperatura se aplican en secuencia: primero, la temperatura modifica la distribución de logits y, después, top-k la trunca para conservar los k tokens más probables. Usar ambos parámetros en conjunto es habitual en los pipelines de Hugging Face Transformers.

Combinación habitual: temperature=0.9 (diversidad moderada) + top_k=50 (límite estricto del vocabulario). Esto evita tanto la falta de definición que produce usar únicamente una temperatura alta como el problema del muestreo de la cola.

from transformers import pipeline

generator = pipeline('text-generation', model='gpt2')

# Combined top-k + temperature
output = generator(
    'The future of AI is',
    max_new_tokens=80,
    do_sample=True,
    top_k=50,
    temperature=0.9
)
print(output[0]['generated_text'])

# Compare: top-k=1 (greedy)
greedy_output = generator(
    'The future of AI is',
    max_new_tokens=80,
    do_sample=False  # greedy, equivalent to top_k=1
)
print(greedy_output[0]['generated_text'])

Comprobación de conocimientos

En el muestreo top-k, ¿qué comportamiento presenta el modelo si se establece k=1?

Repaso: muestreo top-k

El muestreo top-k trunca el vocabulario para conservar los k tokens más probables antes de realizar el muestreo:

  • k=1: decodificación greedy: determinista, siempre elige el token principal
  • k=50: intervalo creativo habitual: equilibrio entre diversidad y coherencia
  • Limitación principal: k permanece fijo independientemente de la confianza del modelo, por lo que puede ser demasiado permisivo o demasiado restrictivo
  • Frente a top-p: el núcleo dinámico de top-p se adapta a la confianza; top-k no lo hace

Use top-k cuando necesite un límite estricto del vocabulario. Prefiera top-p para la mayoría de las aplicaciones en producción. Próxima lección: elección de parámetros para su caso de uso específico.

Preguntas frecuentes

¿La lección «Muestreo Top-k» es gratis?

Sí — el texto completo de «Muestreo Top-k» 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 «Muestreo Top-k»?

Limitar la elección a los k tokens más probables y su efecto en la diversidad de la salida. 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 3 de 4.

¿Cuánto tiempo toma la lección «Muestreo Top-k»?

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

  1. ¿Qué es la temperatura en los LLM?
  2. Muestreo de núcleo Top-p
  3. Muestreo Top-k
  4. Elección de parámetros para su caso de uso
← Volver a AI Prompt Engineering