0Pricing
AI Prompt Engineering · Lección

Muestreo de núcleo Top-p

Cómo top-p limita el muestreo al conjunto de tokens más probables.

Muestreo de núcleo Top-p es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 2 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-p?

El muestreo top-p (también llamado muestreo de núcleo) es una técnica que restringe el muestreo a un subconjunto dinámico del vocabulario. En lugar de muestrear entre todos los tokens, el modelo solo considera el conjunto más pequeño de tokens cuya probabilidad acumulada es como mínimo p.

Propuesto en el artículo «The Curious Case of Neural Text Degeneration» (Holtzman et al., 2019), supera al simple escalado de temperatura para generar texto diverso y coherente.

Cómo funciona top-p paso a paso

Algoritmo:

  1. Calcule las probabilidades de softmax sobre todo el vocabulario
  2. Ordene los tokens por probabilidad, de mayor a menor
  3. Recorra la lista ordenada acumulando probabilidades hasta que la suma acumulada alcance p
  4. Este conjunto de tokens es el núcleo
  5. Muestree únicamente del núcleo (renormalice las probabilidades para que sumen 1)
import numpy as np

def top_p_sample(logits, p=0.9):
    probs = softmax(logits, temperature=1.0)

    # Sort by probability descending
    sorted_indices = np.argsort(probs)[::-1]
    sorted_probs = probs[sorted_indices]

    # Find nucleus: smallest set with cumulative prob >= p
    cumulative = np.cumsum(sorted_probs)
    nucleus_size = np.searchsorted(cumulative, p) + 1
    nucleus_indices = sorted_indices[:nucleus_size]
    nucleus_probs = sorted_probs[:nucleus_size]

    # Renormalize
    nucleus_probs = nucleus_probs / nucleus_probs.sum()

    # Sample
    chosen = np.random.choice(nucleus_indices, p=nucleus_probs)
    return chosen

token = top_p_sample(logits, p=0.9)

El núcleo dinámico

La idea clave de top-p es que el tamaño del núcleo es dinámico. Cuando el modelo tiene mucha confianza (un token domina con una probabilidad de 0.95), el núcleo contiene solo 1 token. Cuando el modelo no está seguro (muchos tokens tienen probabilidades similares), el núcleo se amplía para incluir más tokens.

Esto se adapta automáticamente a la confianza del modelo: alta confianza → vocabulario reducido → salida enfocada. Baja confianza → vocabulario más amplio → mayor exploración.

# High-confidence situation: model strongly prefers 'the'
high_confidence_logits = np.array([5.0, 1.0, 0.5, 0.1, -0.5])
hc_probs = softmax(high_confidence_logits)
print('High confidence probs:', np.round(hc_probs, 3))
# [0.974, 0.018, 0.011, 0.007, 0.004]
# Top-p=0.9 nucleus: just 1 token (cumulative after token 0 = 97.4% > 90%)

# Low-confidence situation: model unsure
low_confidence_logits = np.array([1.1, 1.0, 0.9, 0.8, 0.7])
lc_probs = softmax(low_confidence_logits)
print('Low confidence probs:', np.round(lc_probs, 3))
# [0.218, 0.208, 0.199, 0.190, 0.181]
# Top-p=0.9 nucleus: all 5 tokens (need all to reach 90%)

Top-p en la API de OpenAI

Establezca top_p en su llamada a la API. El intervalo válido es 0.0–1.0. El valor predeterminado es 1.0 (vocabulario completo, sin restricción de núcleo).

OpenAI recomienda lo siguiente: si cambia top_p, deje la temperatura en 1.0, y viceversa. Ajustar ambos parámetros simultáneamente hace que el comportamiento efectivo del muestreo sea difícil de predecir.

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

# Nucleus sampling: top 90% of probability mass
resp = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Tell me an interesting fact about the ocean.'}],
    temperature=1.0,   # leave temperature at default
    top_p=0.9          # sample from top 90% nucleus
)
print(resp.choices[0].message.content)

p=1.0: muestreo sin restricciones

Cuando top_p=1.0, el núcleo incluye todos los tokens: el vocabulario completo. Esto equivale al muestreo puro basado en la temperatura, sin ninguna restricción de top-p. Todos los tokens, por improbables que sean, tienen una probabilidad distinta de cero de ser seleccionados.

Use p=1.0 cuando desee la máxima diversidad. Con p=1.0, solo la temperatura controla la forma de la distribución.

# p=1.0: all tokens in nucleus
resp_full = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
    temperature=1.0,
    top_p=1.0  # no nucleus restriction
)

# p=0.5: very focused nucleus
resp_focused = client.chat.completions.create(
    model='gpt-4o',
    messages=[{'role': 'user', 'content': 'Generate a creative story opening.'}],
    temperature=1.0,
    top_p=0.5  # only top 50% probability mass
)

Compromiso: top-p frente a temperatura

Ambos parámetros controlan la diversidad de la salida, pero de formas diferentes:

  • La temperatura modifica toda la distribución; cambia la probabilidad relativa de un token respecto de todos los demás
  • Top-p trunca la distribución; un token simplemente se excluye si está fuera del núcleo, independientemente de su probabilidad relativa

Top-p evita el problema del «muestreo de la cola»: con una temperatura alta, en ocasiones se seleccionan tokens extremadamente improbables (palabras incoherentes o no relacionadas). Top-p elimina estos tokens de la consideración por completo.

# The tail problem with temperature alone
high_temp_logits = np.array([3.0, 2.0, 1.0, 0.0, -1.0, -5.0, -10.0])
probs_high_temp = softmax(high_temp_logits, temperature=2.0)
print('High temp probs:', np.round(probs_high_temp, 4))
# The last token (logit=-10) still has a small probability
# With many tokens in a real vocab, these rare tokens accumulate
# and occasionally get sampled, producing incoherent output

# Top-p=0.9 cuts these off entirely
# ensuring only tokens contributing to the top 90% are considered

Combinar temperatura y top-p

Al combinar ambos parámetros, primero se aplica la temperatura (modifica la distribución) y después se aplica top-p a las probabilidades resultantes (las trunca al núcleo).

Configuraciones habituales en producción:

  • Escritura creativa: temp=1.0, top_p=0.95
  • Chat: temp=0.8, top_p=0.9
  • Código: temp=0.2, top_p=1.0 (top-p no es restrictivo con una temperatura baja)
def combined_sample(logits, temperature=1.0, top_p=0.9):
    # Step 1: apply temperature
    probs = softmax(logits, temperature=temperature)

    # Step 2: apply top-p nucleus
    sorted_idx = np.argsort(probs)[::-1]
    sorted_probs = probs[sorted_idx]
    cumulative = np.cumsum(sorted_probs)
    nucleus_size = np.searchsorted(cumulative, top_p) + 1
    nucleus_idx = sorted_idx[:nucleus_size]
    nucleus_probs = probs[nucleus_idx]
    nucleus_probs = nucleus_probs / nucleus_probs.sum()

    return np.random.choice(nucleus_idx, p=nucleus_probs)

Top-p y la repetición

Los valores bajos de top-p pueden causar repetición. Cuando el núcleo es muy pequeño (por ejemplo, p=0.5), el modelo muestrea repetidamente de un conjunto diminuto de tokens. La salida se vuelve repetitiva y predecible, justo lo contrario del efecto creativo buscado.

Esté atento a la repetición como señal de que top-p está configurado demasiado bajo para la tarea. Un diagnóstico útil: si el modelo repite las mismas frases en bucle, aumente top-p o la temperatura.

def detect_repetition(text, window=20):
    words = text.split()
    if len(words) < window * 2:
        return False
    # Check if any window of words repeats within the text
    for i in range(len(words) - window):
        phrase = ' '.join(words[i:i + window])
        rest = ' '.join(words[i + window:])
        if phrase in rest:
            return True
    return False

response = call_llm(prompt)
if detect_repetition(response):
    print('Warning: repetition detected — consider increasing top_p or temperature')

Top-p frente a top-k: una vista previa

Top-p y top-k truncan el vocabulario antes del muestreo, pero de formas diferentes:

  • Top-p: tamaño del núcleo dinámico; se amplía cuando el modelo no está seguro y se reduce cuando tiene confianza
  • Top-k: tamaño del núcleo fijo; siempre considera exactamente k tokens, independientemente de la confianza

Por lo general, se prefiere top-p porque se adapta a la confianza del modelo. Top-k se explica en detalle en la próxima lección.

# Top-k equivalent for comparison
def top_k_sample(logits, k=50):
    probs = softmax(logits)
    # Keep only top-k tokens
    top_k_indices = np.argsort(probs)[::-1][:k]
    top_k_probs = probs[top_k_indices]
    top_k_probs = top_k_probs / top_k_probs.sum()
    return np.random.choice(top_k_indices, p=top_k_probs)

# Key difference: k is always 50, regardless of model confidence
# Top-p nucleus size varies from 1 to thousands depending on confidence

Valores predeterminados y cuándo cambiarlos

Valores predeterminados de la API: top_p = 1.0 (sin restricción de núcleo). ¿Cuándo debería cambiarlo?

  • Reducir top_p (0.7–0.9): cuando las salidas parezcan incoherentes o contengan palabras sin sentido; hay demasiado muestreo de la cola
  • Mantenerlo en 1.0: cuando la temperatura ya sea baja; con una temperatura baja, la distribución ya es pronunciada y top-p tampoco es restrictivo
  • No reducirlo por debajo de 0.5: provoca repetición y pérdida de diversidad
# Guidance: what to adjust based on symptoms
TROUBLESHOOTING = {
    'output is incoherent or contains random words': {
        'fix': 'lower top_p to 0.9 or 0.85',
        'or': 'lower temperature'
    },
    'output is repetitive and looping': {
        'fix': 'increase top_p or temperature',
        'also': 'try adding frequency_penalty or presence_penalty'
    },
    'output is too predictable and boring': {
        'fix': 'increase temperature to 0.9-1.2',
        'keep': 'top_p at 0.95'
    },
    'output needs to be deterministic': {
        'fix': 'set temperature=0, top_p=1.0'
    }
}

Top-p en Anthropic Claude

La API de Claude de Anthropic también expone top_p como parámetro. El comportamiento es idéntico: el modelo construye un núcleo formado por el conjunto más pequeño de tokens cuya probabilidad acumulada alcanza el umbral p y después muestrea de ese núcleo.

Combínelo con la temperatura para obtener un control preciso: use la temperatura para dar forma a la distribución y top_p para limitar qué tokens pueden seleccionarse de ella.

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

# Creative writing with nucleus sampling
message = claude.messages.create(
    model='claude-opus-4-5',
    max_tokens=256,
    temperature=1.0,
    top_p=0.95,
    messages=[{
        'role': 'user',
        'content': 'Write a short poem about the ocean.'
    }]
)
print(message.content[0].text)

Comprobación de conocimientos

¿Cuál es la principal ventaja del muestreo top-p (de núcleo) frente al muestreo top-k?

Recapitulación: muestreo de núcleo top-p

El muestreo top-p construye un núcleo dinámico: el conjunto más pequeño de tokens que cubre al menos p de la probabilidad total:

  • p=1.0: vocabulario completo, sin restricciones
  • p=0.9: el 90 % superior de la masa de probabilidad; configuración creativa habitual
  • p=0.5: muy enfocado; riesgo de repetición

El núcleo se amplía cuando el modelo no está seguro y se reduce cuando tiene confianza. Esto evita el muestreo de la cola (texto incoherente procedente de tokens improbables) y conserva la diversidad. Próxima lección: muestreo top-k y sus diferencias con top-p.

Preguntas frecuentes

¿La lección «Muestreo de núcleo Top-p» es gratis?

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

Cómo top-p limita el muestreo al conjunto de tokens más probables. 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 2 de 4.

¿Cuánto tiempo toma la lección «Muestreo de núcleo Top-p»?

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