Prompt Engineering Avanzado: Chain-of-Thought, ReAct y Tree-of-Thoughts

Descubre cómo los patrones Chain-of-Thought, ReAct y Tree-of-Thoughts llevan el prompt engineering al siguiente nivel, mejorando el razonamiento y la capacidad de resolución de problemas de los LLMs.

AI & ML
LLMRAGAgents

Prompt Engineering Avanzado: Chain-of-Thought, ReAct y Tree-of-Thoughts

¿Tu empresa está lista para IA? Descargá nuestro checklist gratuito →

Descargar checklist

Introducción

El prompt engineering ha evolucionado más allá de simples instrucciones. Técnicas avanzadas como Chain-of-Thought (CoT), ReAct y Tree-of-Thoughts (ToT) permiten a los modelos de lenguaje (LLMs) razonar paso a paso, interactuar con herramientas externas y explorar múltiples caminos de pensamiento. En este artículo, exploraremos cada técnica con ejemplos prácticos en Python.

Chain-of-Thought (CoT)

Chain-of-Thought consiste en pedir al modelo que razone paso a paso antes de dar la respuesta final. Esto mejora resultados en problemas aritméticos, lógicos y de sentido común.

Ejemplo: Problema aritmético

import openai

prompt = """
Resuelve el siguiente problema paso a paso:

Un granjero tiene 12 manzanas. Le da 3 manzanas a su vecino y luego compra 5 más. ¿Cuántas manzanas tiene ahora?

Paso a paso:
1. El granjero empieza con 12 manzanas.
2. Da 3 manzanas -> 12 - 3 = 9.
3. Compra 5 manzanas -> 9 + 5 = 14.
4. Resultado: 14 manzanas.

Ahora resuelve:
Un estudiante tiene 15 lápices. Pierde 2 y luego encuentra 7. ¿Cuántos lápices tiene?
"""

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)

Variantes

  • Zero-shot CoT: simplemente añadir "Pensemos paso a paso" al prompt.
  • Few-shot CoT: proporcionar ejemplos de razonamiento paso a paso.

ReAct (Reasoning + Acting)

ReAct combina el razonamiento con la capacidad de actuar, permitiendo al modelo consultar fuentes externas (como APIs o bases de conocimiento) para responder preguntas complejas.

¿Querés un diagnóstico personalizado? Completá el checklist gratuito →

Descargar checklist

Ejemplo: Búsqueda en Wikipedia

import openai
import requests

def search_wikipedia(query):
    url = "https://es.wikipedia.org/w/api.php"
    params = {
        "action": "query",
        "list": "search",
        "srsearch": query,
        "format": "json"
    }
    response = requests.get(url, params=params)
    data = response.json()
    if data["query"]["search"]:
        return data["query"]["search"][0]["snippet"]
    return "No encontrado."

prompt = """
Pregunta: ¿Cuál es la capital de Francia y cuál es su población?

Razonamiento: Debo buscar la capital de Francia y su población.

Acción: Buscar en Wikipedia: "capital de Francia"
Observación: París es la capital de Francia.

Razonamiento: Ahora necesito la población de París.

Acción: Buscar en Wikipedia: "población de París"
Observación: La población de París es de aproximadamente 2.1 millones.

Respuesta: La capital de Francia es París, con una población aproximada de 2.1 millones.
"""

response = openai.ChatCompletion.create(
    model="gpt-4",
    messages=[{"role": "user", "content": prompt}]
)
print(response.choices[0].message.content)

En la práctica, se implementa un bucle que permite al modelo elegir acciones, ejecutarlas, y continuar razonando con la nueva información.

Tree-of-Thoughts (ToT)

ToT extiende CoT explorando múltiples ramas de razonamiento en un árbol, evaluando cada paso y permitiendo backtracking. Es ideal para problemas de planificación y creatividad.

Implementación conceptual

import openai
from typing import List, Dict

# Define funciones para generar y evaluar pensamientos
def generar_pensamientos(estado_actual: str, prompt_base: str) -> List[str]:
    prompt = f"{prompt_base}\nEstado actual: {estado_actual}\nGenera 3 posibles siguientes pasos:"
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}
    )
    # Parsear la respuesta en una lista de pensamientos
    pensamientos = response.choices[0].message.content.split('\n')
    return [p for p in pensamientos if p]

def evaluar_pensamiento(pensamiento: str) -> float:
    prompt = f"Evalúa la calidad del siguiente paso en una escala del 1 al 10: {pensamiento}"
    response = openai.ChatCompletion.create(
        model="gpt-4",
        messages=[{"role": "user", "content": prompt}
    )
    score = float(response.choices[0].message.content.strip())
    return score

# Búsqueda en árbol con poda
estado_inicial = "Inicio"
mejor_camino = []
niveles = 3
for nivel in range(niveles):
    pensamientos = generar_pensamientos(estado_inicial, prompt)
    puntuaciones = [evaluar_pensamiento(p) for p in pensamientos]
    # Seleccionar el mejor pensamiento
    mejor = max(zip(pensamientos, puntuaciones), key=lambda x: x[1])
    mejor_camino.append(mejor[0])
    estado_inicial = mejor[0]

print("Mejor camino:", mejor_camino)

Comparación y cuándo usar cada técnica

TécnicaUso principalComplejidad
CoTProblemas de razonamiento linealBaja
ReActTareas que requieren información externaMedia
ToTProblemas complejos con múltiples caminosAlta

Conclusión

Chain-of-Thought, ReAct y Tree-of-Thoughts son herramientas poderosas para mejorar las capacidades de los LLMs. CoT es sencillo y efectivo para razonamiento paso a paso. ReAct permite interacción con el mundo exterior, y ToT explora múltiples posibilidades. La elección depende del problema y los recursos disponibles.

Recursos adicionales

¡Experimenta con estas técnicas y lleva tus aplicaciones de IA al siguiente nivel!

¿Listo para dar el próximo paso? Evaluá tu empresa con nuestro checklist gratuito →

Descargar checklist

Publicaciones relacionadas