Cargando

Conversaciones de múltiples turnos

Lección 47 min

El código que hemos escrito hasta ahora simula un intercambio muy simple con Claude. Pero ¿qué sucede cuando quieres continuar una conversación? Cuando haces una pregunta de seguimiento como "¿Y 3 más?" después de preguntar "¿Cuánto es 1+1?", podrías esperar que Claude entienda que estás preguntando sobre sumar 3 al resultado anterior de 2.

Sin embargo, hay algo crítico que necesitas entender sobre la API de Bedrock y sobre Claude mismo.

Sin almacenamiento de mensajes

Bedrock y Claude no almacenan ningún mensaje. Ninguno de los mensajes que envías se almacena, y ninguna de las respuestas que recibes se almacena tampoco. Cada llamada a la API es completamente independiente.

Para tener una conversación con múltiples mensajes que mantenga el contexto, necesitas:

  • Mantener manualmente una lista de todos los mensajes en tu código
  • Proporcionar esa lista completa de mensajes con cada solicitud de seguimiento

Por qué importa el contexto

Veamos qué sucede sin el contexto adecuado. Si envías solo "¿Y 3 más?" como un mensaje independiente, Claude no tiene idea a qué te refieres. Hará todo lo posible por responder, pero la respuesta no tendrá sentido porque carece del contexto de tu conversación anterior.

Cuando envías solo la pregunta de seguimiento, Claude ve únicamente ese mensaje aislado e intenta responder sin saber sobre el intercambio anterior de "¿Cuánto es 1+1?".

Construyendo el contexto de la conversación

Para mantener el contexto, necesitas incluir el historial completo de la conversación en cada solicitud. Así es como funciona:

Tu lista de mensajes debe contener todos los intercambios anteriores, tanto los mensajes del usuario como las respuestas del asistente. Cuando envías este contexto completo, Claude puede entender que "¿Y 3 más?" se refiere a sumar 3 al resultado anterior de 2.

Funciones auxiliares para la gestión de mensajes

Para facilitar la gestión de conversaciones, puedes crear funciones auxiliares:

python
def add_user_message(messages, text):
    user_message = {
        "role": "user",
        "content": [
            {"text": text}
        ]
    }
    messages.append(user_message)

def add_assistant_message(messages, text):
    assistant_message = {
        "role": "assistant", 
        "content": [
            {"text": text}
        ]
    }
    messages.append(assistant_message)

def chat(messages):
    response = client.converse(
        modelId=model_id,
        messages=messages
    )
    return response["output"]["message"]["content"][0]["text"]

Implementando conversaciones de múltiples turnos

Así es como se construye una conversación paso a paso:

python
# Crea una lista inicial de mensajes
messages = []

# Agrega la pregunta inicial del usuario "¿Cuánto es 1+1?"
add_user_message(messages, "What's 1+1?")

# Pasa la lista de mensajes a chat para obtener una respuesta
answer = chat(messages)

# Toma la respuesta y agrégala como mensaje del asistente en nuestra lista
add_assistant_message(messages, answer)

# Agrega la pregunta de seguimiento del usuario
add_user_message(messages, "And 3 more added to that?")

# Llama a chat de nuevo con la lista de mensajes para obtener una respuesta final
answer = chat(messages)
print(answer)

Este enfoque asegura que Claude tenga el contexto completo y pueda responder adecuadamente: "Comenzando con el resultado de 1+1 = 2, si sumamos 3 más a eso, obtenemos: 2 + 3 = 5"

Alternancia de roles de mensaje

Al construir tu lista de mensajes, siempre asegúrate de que los roles de los mensajes alternen correctamente:

Tu conversación debe seguir el patrón: usuario → asistente → usuario → asistente. Nunca tengas dos mensajes de usuario consecutivos ni dos mensajes de asistente consecutivos. Este patrón alternante es requerido por la API y refleja el flujo natural de una conversación.

Aunque esta gestión manual de mensajes pueda parecer tediosa al principio, te acostumbrarás rápidamente. Este patrón es fundamental para construir cualquier aplicación que necesite mantener el contexto conversacional con Claude.