Estrategias de gestión de contexto y tokens

Resumen

Cuando el historial de una conversación con Claude se vuelve pesado, necesitas optimizar el manejo del contexto para que tu chatbot no colapse ni gaste tokens de más. Aquí verás tres formas concretas de hacerlo en Python, ideal si estás construyendo tu propio asistente conversacional con la API de Anthropic.

La idea central es simple: dejas de mandar todo a ciegas y empiezas a decidir con criterio qué entra al contexto y qué no. Eso ya es diseño, no solo código.

¿Por qué necesitas optimizar el historial de tu chatbot?

Cada vez que le hablas a Claude, mandas los mensajes previos para que mantenga el hilo. El problema es que ese historial crece y crece. Si no lo controlas, terminas enviando conversaciones enormes en cada llamada.

Existen tres caminos para resolverlo, y cada uno tiene su costo y su beneficio:

  • Cortar los mensajes viejos y quedarte solo con los últimos. Es rápido y simple, pero pierdes lo que se dijo al principio.
  • Resumir la conversación entera en un párrafo y mandar ese resumen. Conservas el sentido de todo, aunque gastas una llamada extra en generarlo.
  • Usar max tokens, que juega en el otro lado de la ecuación poniéndole un límite a lo que Claude responde.

¿Cuál te conviene? Depende del tipo de chatbot que estés armando. Ninguna de las tres es complicada de implementar.

¿Qué es un token en la API de Claude? Es la unidad mínima con la que el modelo mide texto. Los tokens de entrada son lo que le mandas y los de salida lo que responde. En el ejemplo se registraron 312 de input y 246 de output.

¿Cómo se prepara el archivo en Python para el manejo de tipos?

El trabajo arranca en el archivo main.py, justo donde quedó la clase anterior, con tres iteraciones de conversación: usuario, asistente y usuario [00:53].

Lo primero es agregar el import de annotations [01:02]. Esto le dice a Python que respete todas las anotaciones de tipo como texto y las ignore al ejecutar, lo que te permite escribir código de manera más moderna. Es específico para el manejo de tipos en Python.

python from future import annotations

¿Cómo mantener solo los mensajes más recientes?

La primera forma de optimizar es leer un número limitado de los mensajes más nuevos. Para eso se define una función que mantiene los mensajes recientes [01:28].

Esta función recibe como parámetros los mensajes y un máximo de mensajes con tipo número, fijado directamente en 12. Devuelve la lista recortada a ese tope. Para manejarlo de forma más ordenada, se crea una variable max_history_messages definida arriba con valor 12 al inicio [02:04].

Así evitas hardcodear el número en varios lugares y puedes ajustarlo cuando quieras.

¿Cómo resumir el historial de la conversación?

La segunda forma es resumir todo lo anterior en un bloque de texto. Aquí entra la función summarize history [02:23].

Esta función recibe tres cosas:

  • El client, que es el de Anthropic.
  • Los messages, el mismo listado de diccionarios que ya venías usando.
  • Un transcript con todos los mensajes recibidos y generados hasta ese momento.

El transcript se arma en un loop y se envía al API de messages con el mismo modelo que venías usando, un máximo de tokens de 400 y un system prompt que dice: "Resume en una conversación para preservar contexto importante" [02:52]. El resultado es toda la conversación comprimida en un solo bloque de texto que después usas como contexto.

¿Cortar mensajes o resumir el historial? Cortar es más rápido pero pierdes el inicio de la charla. Resumir preserva el sentido completo pero cuesta una llamada extra a la API. Elige según cuánto contexto necesite tu chatbot.

¿Cómo se integran las funciones en la función principal?

Con las dos funciones listas, se combinan dentro de la función principal, la misma que venías trabajando en clases anteriores [03:15].

Ya no basta con una sola respuesta del endpoint de messages. Ahora aparece un summary que se genera con la función summarize history, pasándole el cliente y el listado de mensajes. Ese resumen alimenta un control_history que se construye en tres partes [03:44]:

  • Un mensaje con el resumen previo, que es el summary recién generado.
  • La extensión con la función de mantener los mensajes recientes.
  • Un mensaje adicional que pregunta: "¿Qué decisión importante debo recordar?".

Ese último mensaje actúa como una instrucción extra sobre todo lo trabajado antes. La respuesta original con client.messages.create mantiene el mismo modelo, pero el max tokens sube a 500 porque ahora le pasas más información en la llamada [04:20]. Y el parámetro de mensajes ya no es el listado crudo, sino el control_history ya procesado.

¿Cómo revisar el uso de tokens en la terminal?

El bloque for anterior ya no se necesita porque la estructura de impresión cambió [04:36]. Ahora primero imprimes la respuesta, uniendo cada bloque de texto que llega en response.content, pero solo si ese bloque es de tipo texto.

Como valor referencial, se agrega el uso de tokens para ver en la terminal cuántos entran y cuántos salen por cada input [05:00]. Al ejecutar main.py de la clase tres, la salida muestra la respuesta y luego el conteo: input tokens 312 y output tokens 246 [05:59].

¿Ese número es mucho o poco? Depende del modelo. La documentación de Claude lo especifica por modelo. Con Claude Sonnet 4.6 encuentras el precio y la ventana de contexto, que en este caso es de un millón de tokens, equivalente a unas 750.000 palabras o 3.4 millones de caracteres Unicode [06:34].

Ese límite varía según el modelo que uses, así que revisa siempre la documentación oficial para el tuyo.

¿Qué sigue después de optimizar el contexto?

Hay un detalle que no tiene que ver con la funcionalidad, sino con cómo se siente tu chatbot al responder. Ahora mismo te quedas mirando la terminal en silencio hasta que aparece la respuesta completa de golpe. Funciona, pero comparado con cualquier chat moderno se siente lento.

El siguiente paso es mejorar esa experiencia mostrando respuestas en tiempo real con streaming. ¿Ya probaste combinar el resumen con el límite de mensajes recientes en tu propio proyecto? Cuéntame cómo te fue en los comentarios.