Saltar al contenido principal

Prompting de paso atrás

Definición

El prompting de paso atrás es una técnica de prompting en dos pasos introducida por Zheng et al. (2023) en Google DeepMind. La idea central es engañosamente simple: antes de pedirle al modelo que responda una pregunta específica y potencialmente difícil, primero hazle una versión más abstracta y de nivel superior de la misma pregunta —y luego usa la respuesta del modelo a esa pregunta abstracta como contexto al responder la original. La técnica se fundamenta en la observación de que los LLM a menudo fallan en preguntas específicas de hechos o razonamiento no porque les falte el conocimiento relevante, sino porque la especificidad de la pregunta activa el "contexto de recuperación" incorrecto en las representaciones internas del modelo. Retroceder a un nivel superior de abstracción activa un conocimiento más amplio y fiable, que luego fundamenta la respuesta final.

La idea detrás del prompting de paso atrás se inspira en cómo los expertos abordan los problemas difíciles. Un físico al que se le pregunta "¿Qué le pasa a la presión en un gas si aumenta la temperatura a volumen constante?" podría primero recordar la ley del gas ideal (PV = nRT) como trasfondo general antes de aplicarla al caso específico —en lugar de saltar directamente a una respuesta que arriesga mezclar variables. El prompting de paso atrás instruye al modelo a hacer lo mismo: generar un principio o concepto general que subyace a la pregunta específica, luego razonar desde ese principio hasta la respuesta. Esto añade efectivamente un paso de andamiaje conceptual que reduce la posibilidad de que la coincidencia de patrones superficial lleve a una respuesta incorrecta.

En el artículo original, el prompting de paso atrás se demuestra con ejemplos de pocos disparos que enseñan al modelo cómo "dar un paso atrás" apropiadamente para un dominio dado. Para preguntas de física, la pregunta abstracta generalmente pregunta sobre la ley o principio físico relevante. Para preguntas de historia, pregunta sobre el contexto histórico más amplio. Para preguntas médicas, pregunta sobre la fisiología relevante. La técnica es agnóstica al modelo y no requiere ajuste fino —es puramente una intervención a nivel de prompt. En los benchmarks MMLU y TimeQA, el prompting de paso atrás supera tanto a la cadena de pensamiento estándar como a las líneas base de recuperación aumentada en preguntas difíciles e intensivas en conocimiento.

Cómo funciona

Paso 1 — Generación de la pregunta abstracta

El primer paso es hacer un prompt al modelo para que identifique una pregunta de nivel superior que subsuma la original. Esto típicamente se hace con un prompt de pocos disparos que contiene ejemplos específicos del dominio de pares (pregunta específica, pregunta abstracta). Por ejemplo, si la pregunta original es "¿Cuál es el punto de fusión del arseniuro de galio?", la pregunta abstracta podría ser "¿Cuáles son las propiedades termodinámicas y cristalográficas de los semiconductores III-V?" La pregunta abstracta debe ser lo suficientemente general para activar un amplio conocimiento relevante, pero no tan general como para ser poco informativa. Obtener el nivel correcto de abstracción es el principal desafío de ingeniería de prompts, y los ejemplos de pocos disparos son esenciales para guiar al modelo al nivel de abstracción apropiado para un dominio dado.

Paso 2 — Responder la pregunta abstracta

Con la pregunta abstracta generada, el modelo la responde. Esta respuesta típicamente toma la forma de un principio general, una definición, una ley física o un resumen del contexto de trasfondo relevante. La propiedad clave de este paso es que la pregunta abstracta generalmente es más fácil de responder de forma fiable para el modelo que la pregunta específica original —activa representaciones bien aprendidas y fundamentadas factualmente en lugar de casos extremos o hechos numéricos específicos que son más propensos a la alucinación. La respuesta a la pregunta abstracta se convierte en un bloque de contexto que restringe e informa el paso de razonamiento final.

Paso 3 — Responder la pregunta original usando la abstracción como contexto

El paso final combina el principio abstracto con la pregunta específica original en un solo prompt: "Dado este trasfondo: [respuesta abstracta], responde la pregunta específica: [pregunta original]." El modelo ahora razona desde una base conceptual sólida en lugar de intentar la recuperación directa de un hecho específico. Esto reduce el riesgo de alucinación en preguntas intensivas en hechos y mejora la consistencia lógica del razonamiento de múltiples pasos. En el artículo original, este paso final también usa cadena de pensamiento, haciendo que el prompting de paso atrás sea componible con CoT: el paso de abstracción fundamenta el razonamiento, y CoT lo hace explícito.

Cuándo usar / Cuándo NO usar

Usar cuandoEvitar cuando
La pregunta requiere conocimiento factual específico donde el modelo es propenso a la alucinaciónPreguntas simples donde el prompting directo ya funciona de forma fiable
El dominio tiene una jerarquía clara de principios generales a instancias específicas (física, química, historia)La pregunta abstracta es difícil de definir — tareas sin una distinción natural general/específico
El modelo responde preguntas específicas de forma inconsistente pero es fiable en principios generalesLa latencia es crítica — dos llamadas al LLM duplican el tiempo de respuesta
Quieres reducir la alucinación en benchmarks intensivos en conocimiento sin RAGLa pregunta es puramente matemática o simbólica — CoT solo generalmente es suficiente
Hay ejemplos de pocos disparos disponibles para el dominio para enseñar al modelo cómo dar un paso atrásEl presupuesto de tokens es ajustado — la respuesta abstracta añade tokens al prompt final

Comparaciones

CriterioPrompting de paso atrásCadena de pensamiento (CoT)Autoconsistencia
Número de llamadas al LLM2 (abstracta + final)1N (típicamente 10–40)
Mecanismo centralAbstracción a fundamentación a razonamientoRazonamiento explícito paso a pasoMúltiples caminos independientes + voto mayoritario
Beneficio principalReduce la alucinación en preguntas intensivas en conocimientoMejora el razonamiento lógico de múltiples pasosReduce la varianza en los resultados de razonamiento
Costo2x línea base1x línea baseNx línea base
Requiere ejemplos de pocos disparosSí — para enseñar el comportamiento de paso atrásSí — para mejores resultadosSí — CoT de pocos disparos como prompt base
Mejor tipo de tareaQA intensiva en conocimiento, ciencia, historiaMatemáticas, lógica, códigoMatemáticas, razonamiento simbólico, QA factual
Componible con CoTSí — recomendado combinar ambosN/ASí — el prompt base usa CoT
NotaComplementario a la autoconsistencia; ambos pueden apilarse para ganancias adicionalesLínea base más simple — probar antes del paso atrásMás costoso; usar cuando la alta precisión justifica el costo Nx

Ejemplos de código

Prompting de paso atrás con OpenAI — implementación de dos llamadas

# Step-back prompting: abstraction-then-answer, two API calls
# pip install openai

import os
from openai import OpenAI

client = OpenAI(api_key=os.environ["OPENAI_API_KEY"])

STEP_BACK_FEW_SHOT = """Help identify a broader abstract question underpinning a specific one.

Original: At what temperature does gallium arsenide melt?
Step-back: What are the thermodynamic properties of III-V semiconductors?

Original: What was the immediate cause of the US entering World War I?
Step-back: What geopolitical tensions shaped US foreign policy before WWI?

Original: Patient has peripheral edema, elevated JVP, orthopnea. Diagnosis?
Step-back: What are the hallmark signs of right-sided and left-sided heart failure?

Original: {question}
Step-back:"""

GROUNDED = """Using the background context below, answer the specific question step by step.

Background (general principles):
{background}

Specific question:
{question}

Let's think step by step:"""


def generate_step_back(question: str) -> str:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": STEP_BACK_FEW_SHOT.format(question=question)}],
temperature=0, max_tokens=150,
)
return resp.choices[0].message.content.strip()


def answer_abstract(abstract_q: str) -> str:
resp = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Answer with accurate background principles (3-5 sentences)."},
{"role": "user", "content": abstract_q},
],
temperature=0, max_tokens=300,
)
return resp.choices[0].message.content.strip()


def answer_with_step_back(question: str) -> str:
abstract_q = generate_step_back(question)
background = answer_abstract(abstract_q)
resp = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": GROUNDED.format(
background=background, question=question)}],
temperature=0, max_tokens=500,
)
return resp.choices[0].message.content.strip()


if __name__ == "__main__":
q = "Why did Soviet collectivization in the early 1930s lead to famine in Ukraine?"
print(answer_with_step_back(q))

Prompting de paso atrás con Anthropic — llamada única con salida estructurada

# Step-back prompting in one Anthropic call: structured three-part format
# pip install anthropic

import os
import anthropic

client = anthropic.Anthropic(api_key=os.environ["ANTHROPIC_API_KEY"])

SYSTEM = """You are an expert reasoning assistant. For each question, respond in three parts:

## Abstract question:
A broader, general question capturing the underlying principle.

## Background context:
Answer the abstract question with relevant principles and definitions (3-5 sentences).

## Final answer:
Use the background to reason step-by-step to the specific answer."""

EXAMPLE = [
{"role": "user", "content": "Ideal gas: 2 mol, 300 K, 0.05 m^3. What is the pressure?"},
{"role": "assistant", "content": """## Abstract question:
What is the ideal gas law and how does it relate P, V, n, and T?

## Background context:
PV = nRT, where P is pressure (Pa), V is volume (m^3), n is moles, R = 8.314 J/mol/K, T is Kelvin. Rearranged: P = nRT / V.

## Final answer:
P = (2 x 8.314 x 300) / 0.05 = 99,768 Pa (about 0.985 atm)."""},
]


def step_back(question: str) -> str:
response = client.messages.create(
model="claude-opus-4-5",
max_tokens=800,
system=SYSTEM,
messages=EXAMPLE + [{"role": "user", "content": question}],
)
return response.content[0].text


if __name__ == "__main__":
q = "A patient is given furosemide. How does it cause hypokalemia?"
print(step_back(q))

Recursos prácticos

Ver también