Menu

Autoconsistencia: respuestas por mayoría de votos

La autoconsistencia (self-consistency) hace la misma pregunta de razonamiento varias veces, deja que cada ejecución razone a su manera y se queda con la respuesta que más se repite. Aquí verás cómo funciona, cómo aplicarla a mano y cómo hacerlo en código.

Puedes editar cada prompt de esta página y abrirlo después en ChatGPT, Claude u otra app de IA.

La autoconsistencia (self-consistency prompting) consiste en hacerle a un modelo la misma pregunta de razonamiento varias veces y quedarse con la respuesta que más se repite. Cada ejecución escribe su propio razonamiento, como en la cadena de pensamiento, y como el modelo elige sus palabras con cierta aleatoriedad, las ejecuciones siguen caminos distintos. Los caminos correctos suelen llegar a la misma respuesta. Los errores suelen repartirse entre respuestas incorrectas distintas. Una votación por mayoría aprovecha esa diferencia.

La técnica viene de Wang et al. 2022, "Self-Consistency Improves Chain of Thought Reasoning in Language Models". El artículo comparó muestrear muchos caminos de razonamiento y votar frente a tomar una sola respuesta voraz (greedy), y vio que la votación mejoraba la precisión en pruebas de aritmética y de razonamiento de sentido común.

El bloque de abajo muestra tres ejecuciones del mismo prompt. Cada pestaña es una ejecución con su propia respuesta. Dos ejecuciones cuentan bien; una comete un despiste fácil de cometer.

¿Cuántas veces aparece el dígito 7 cuando escribes todos los números enteros del 1 al 100? Razónalo paso a paso y luego da la respuesta final en la última línea con la forma "Respuesta: N".
Try it
Example replyReplies vary between models and runs.

Cuento los 7 por posición.

  • Unidades: 7, 17, 27, 37, 47, 57, 67, 77, 87, 97. Son 10 sietes.
  • Decenas: del 70 al 79. Son 10 sietes más.
  • Centenas: solo el 100 tiene tres cifras, y no tiene ningún 7.

El 77 aparece en las dos listas, y está bien, porque contiene dos 7.

Respuesta: 20

La ejecución 2 respondió a una pregunta un poco distinta: cuántos números contienen un 7, no cuántas veces aparece el dígito. Su razonamiento suena tan seguro como el de las otras dos, y por sí solo no tendrías motivos para dudar de él. Entre tres ejecuciones, la votación queda 20, 19, 20, y la respuesta mayoritaria es la correcta.

Cómo funciona la autoconsistencia

  1. Escribe un prompt de cadena de pensamiento con una línea de respuesta fija. Pide primero el razonamiento y al final la respuesta, con una forma que puedas localizar, como "Respuesta: N". Sin una línea fija, tienes que leer cada ejecución para encontrar su respuesta.
  2. Muestrea varias ejecuciones con la aleatoriedad activada. Cada ejecución necesita libertad para tomar un camino distinto. En la API, una temperatura mayor que 0 lo consigue. Con temperatura 0 la mayoría de las ejecuciones repetirían el mismo razonamiento, y repetir un error cinco veces no es evidencia.
  3. Extrae la respuesta final de cada ejecución. Ignora el razonamiento en esta fase. Dos ejecuciones que llegaron a 20 por caminos distintos cuentan como dos votos para 20.
  4. Quédate con la respuesta más común. Normaliza antes de contar, para que "20", "20." y "veinte" cuenten como la misma respuesta.

El propio grado de acuerdo es información útil. Cuando las cinco ejecuciones coinciden, es poco probable un despiste al azar. Cuando los votos se reparten en tres, la pregunta es difícil para el modelo, y es una señal para comprobar tú mismo la respuesta o reescribir el prompt. El artículo también señaló que las preguntas con más acuerdo entre muestras tenían más probabilidades de responderse bien.

Autoconsistencia a mano

Puedes aplicar la técnica en cualquier app de chat. Envía el prompt, apunta la línea final y luego consigue otra ejecución independiente: pulsa regenerar o pega el mismo prompt en un chat nuevo. Repite hasta tener tres o cinco respuestas.

No vuelvas a preguntar en la misma conversación con "¿Estás seguro?" o "Inténtalo otra vez". El modelo ve su respuesta anterior, así que la nueva no es independiente: tiende a repetir la primera o a cambiarla solo porque pareciste dudar. Ninguna de las dos cosas es un voto.

Este prompt está preparado para votar. Pon tu propia pregunta y tu formato de respuesta y ejecútalo varias veces.

Un prompt listo para votar
Fill in
Parts
Una tienda vende bolígrafos en paquetes de 3 por $2. Maya compra 12 bolígrafos y paga con un billete de $10. ¿Cuánto cambio recibe?
Razónalo paso a paso. Luego da la respuesta final sola en la última línea con la forma "Respuesta: una cantidad en dólares".
Try it
Example replyReplies vary between models and runs.

12 bolígrafos son 12 ÷ 3 = 4 paquetes.

4 paquetes cuestan 4 × 2=2 = 8.

Cambio de 10:10: 10 menos 8=8 = 2.

Respuesta: $2

La parte de formato es la que hace posible la votación. Desactívala y las ejecuciones tienden a formular sus respuestas de maneras distintas, a menudo en mitad del texto, y un recuento sencillo se convierte en una lectura atenta.

Autoconsistencia en código

En código, el bucle es corto: ejecuta el mismo prompt N veces, extrae las líneas de respuesta y cuéntalas. Esta versión usa el SDK de Python de OpenAI; cualquier API que te deje fijar la temperatura funciona igual.

import re
from collections import Counter
from openai import OpenAI

client = OpenAI()
MODEL = "your-model-id"  # e.g. from your provider's model list

PROMPT = (
    "How many times does the digit 7 appear when you write out all the whole "
    "numbers from 1 to 100? Think it through step by step, then give the final "
    'answer on the last line in the form "Answer: N".'
)

def final_answer(text):
    # Also matches "**Answer: 20**", since chat models often bold the last line.
    lines = re.findall(r"^\**Answer:\**\s*(.+)$", text, re.MULTILINE)
    return lines[-1].strip(" *.") if lines else None

answers = []
for _ in range(5):
    response = client.chat.completions.create(
        model=MODEL,
        temperature=0.8,
        messages=[{"role": "user", "content": PROMPT}],
    )
    answers.append(final_answer(response.choices[0].message.content))

votes = Counter(a for a in answers if a is not None)
if votes:
    best, count = votes.most_common(1)[0]
    print(f"{best} ({count} of {len(answers)} runs agree)")
else:
    print("No run gave an answer line.")

Las ejecuciones son independientes, así que en producción las enviarías en paralelo en lugar de una tras otra. Algunos modelos de razonamiento solo aceptan su temperatura por defecto y devuelven un error si fijas una; con ellos, omite temperature. Sus ejecuciones siguen variando, porque el valor por defecto ya muestrea.

Cuándo usarla y cuánto cuesta

La autoconsistencia vale la pena cuando se cumplen tres cosas: la respuesta es corta y comparable (un número, una etiqueta, una opción), una respuesta incorrecta cuesta más que unas cuantas llamadas extra y el modelo todavía no es fiable en la tarea. Los problemas de matemáticas con enunciado, las clasificaciones con casos límite complicados y las preguntas de opción múltiple encajan bien.

Cuesta aproximadamente N veces los tokens de una sola respuesta, y no ayuda cuando el modelo tiene la misma idea equivocada en todas las ejecuciones. Si las cinco ejecuciones cometen el mismo error, la votación es unánime y está mal. Votar reduce los despistes al azar, no los errores sistemáticos, así que no sustituye a comprobar de vez en cuando las respuestas contra un resultado conocido.

Los modelos que razonan internamente antes de responder ya trabajan el problema a fondo en cada ejecución, lo que suele reducir lo que se gana votando. Aun así puede compensar en preguntas difíciles en las que sus ejecuciones no coinciden.

La autoconsistencia solo vota sobre respuestas terminadas. El árbol de pensamiento va un paso más allá y compara razonamientos parciales mientras el problema todavía se está resolviendo, conservando las ramas prometedoras y descartando las débiles antes de que lleguen a una respuesta.

Preguntas frecuentes

¿Qué es la autoconsistencia en prompting?

La autoconsistencia (self-consistency) es una técnica de Wang et al. (2022). Envías el mismo prompt de cadena de pensamiento varias veces con el muestreo activado, para que cada ejecución razone por un camino distinto, y luego te quedas con la respuesta final que más se repite. Sustituye la confianza en una sola cadena de razonamiento por una votación entre varias.

¿Cuántas muestras debo usar para la autoconsistencia?

Para el uso diario, de tres a cinco ejecuciones bastan para superar en votos un despiste ocasional, y un número impar evita empates entre dos respuestas. El artículo original muestreaba muchos más caminos por pregunta y vio que la precisión seguía subiendo con más muestras, pero con mejoras cada vez menores. Usa más ejecuciones cuando una respuesta incorrecta sale cara y menos cuando importan el coste o la velocidad.

¿Qué diferencia hay entre la autoconsistencia y la cadena de pensamiento?

La cadena de pensamiento es una sola ejecución en la que el modelo escribe su razonamiento antes de la respuesta. La autoconsistencia se apoya en ella: ejecuta la cadena de pensamiento varias veces y vota entre las respuestas finales. La cadena de pensamiento cambia el prompt; la autoconsistencia cambia cuántas respuestas reúnes y cómo eliges una.

¿La autoconsistencia sirve para redacciones o respuestas abiertas?

No directamente, porque una votación necesita respuestas que se puedan comparar para ver si son iguales: un número, una etiqueta, la letra de una opción múltiple o un dato breve. Para textos abiertos, una solución habitual es generar varias versiones y preguntarle al modelo cuál coincide más con las demás, pero eso es un juicio, no un recuento.

¿Puedo usar la autoconsistencia en ChatGPT o Claude?

Sí, a mano. Envía el prompt en varios chats nuevos, o regenera la respuesta varias veces, y apunta la respuesta final de cada ejecución. Usa un chat nuevo o el botón de regenerar en lugar de volver a preguntar en el mismo hilo, porque un modelo que ve su respuesta anterior tiende a repetirla.

Coddy programming languages illustration

Aprende a programar con Coddy

COMENZAR