¿Qué es la ventana de contexto de un Gran Modelo de Lenguaje?

En este artículo exploraremos el concepto de la ventana de contexto en los Grandes Modelos de Lenguaje, que determina la cantidad de texto que estos modelos pueden manejar.

¡Así que listo, comencemos!

Video

Como siempre, en el canal de YouTube se encuentra el video de este post:

Introducción

El término “ventana de contexto” es de gran importancia en los Grandes Modelos de Lenguaje, pues determina en últimas la cantidad de texto que estos modelos pueden procesar y generar.

Así que es fundamental entender este concepto si queremos desarrollar aplicaciones que hagan uso de estos Grandes Modelos de Lenguaje.

Entonces en este artículo vamos a entender qué es la ventana de contexto, qué ocurre cuando se superan los límites establecidos por esta ventana y qué alternativas tenemos cuando queremos procesar texto que es más extenso que el tamaño de la ventana de contexto.

¿Qué es el “contexto”?

Para entender qué son las ventanas de contexto necesitamos primero entender el significado de la palabra “contexto” cuando hablamos de Grandes Modelos de Lenguaje.

Recordemos que en un artícuo anterior vimos que estos grandes modelos de lenguaje se basan en las Redes Transformer, un tipo de Red Neuronal especializada en el procesamiento de secuencias, como lo es precisamente el texto.

Y recordemos que al momento de procesar el texto estas redes no analizan cada palabra de manera individual sino que por el contrario tienen en cuenta la relación de la palabra con las otras palabras del texto, y dependiendo de esto codifican numéricamente esta información para luego realizar el procesamiento.

Por ejemplo, en la frase “El perro está jugando mientras que el gato acaba de comer y ahora duerme plácidamente” para determinar a qué sujeto se refiere la palabra “duerme” la Red Transformer debe analizar la totalidad del texto y la relaciones entre palabras a diferentes niveles para determinar en últimas que el sujeto es el gato y no el perro.

Así que en últimas el contexto es la relación que existe entre las diferentes palabras y que permite interpretar y codificar adecuadamente la información del texto analizado por el modelo.

Teniendo claro este sencillo concepto, ahora sí podemos ver qué son las ventanas de contexto.

¿Qué es la ventana de contexto?

De forma sencilla podemos definir la ventana de contexto de un Gran Modelo de Lenguaje como la cantidad de tokens que el modelo puede procesar al momento de interpretar una secuencia de texto.

Y acá es necesario que veamos algunos detalles de esta definición.

En primer lugar hablemos del término tokens al cual ya dediqué un artículo anteriormente. Recordemos que un Gran Modelo de Lenguaje antes de procesar el texto lo divide en pequeños segmentos que pueden corresponder a una palabra o a una porción de una palabra.

Estos segmentos son precisamente los tokens y la cantidad de tokens que se obtendrá a partir de un texto depende del idioma. Por ejemplo, para GPT-4 en promedio 1 token equivale a 7 caracteres en Inglés, a 9 en Español y a 12 en Chino.

En segundo lugar, el término “procesamiento” se refiere a la cantidad de tokens que el modelo puede recibir a la entrada y generar a la salida.

Así que en últimas la ventana de contexto es el número total de tokens que el modelo de lenguaje podrá procesar en un momento determinado.

Entendamos esto con un ejemplo:

El modelo GPT-3.5 de OpenAI, que es la base de la aplicación ChatGPT, tiene una ventana de contexto de 4.097 tokens. Esto quiere decir que si escribo una pregunta y espero una respuesta de esta aplicación, al sumar el texto introducido y generado este no podrá sobrepasar los 4.097 tokens (que son poco menos de 37.000 caracteres en Español).

Así que la ventana de contexto nos impone un límite en la cantidad de texto que podemos introducir y esperar a la salida del modelo.

Y esto es súper importante porque nos indica que al momento de desarrollar una aplicación con este tipo de modelos no podemos simplemente introducir una cantidad arbitraria de texto y esperar que el modelo “mágicamente” genere la respuesta deseada.

¿Y si el texto es demasiado extenso?

Bien, ya tenemos claro qué es la ventana de contexto. Pero entonces, ¿qué sucedería si en una cierta aplicación que estemos desarrollando introducimos un texto que supere el tamaño de la ventana de contexto del modelo de lenguaje?

Pues simplemente el modelo no logrará ni siquiera procesar este texto, y mucho menos generar una respuesta.

Por ejemplo, supongamos que queremos usar ChatGPT para que nos genere el resumen del texto completo de “Don Quijote de la Mancha”. Entonces copiamos y pegamos el texto completo y le pedimos que haga el resumen.

Y al hacer la solicitud a ChatGPT vemos que nos genera un mensaje de error indicando que el texto introducido es demasiado extenso. Es decir que ni siquiera nos genera una respuesta.

Lo que ocurre en este caso es que el texto completo de “Don Quijote” contiene más de 2 millones de caracteres, es decir más de 226.000 tokens. Y como la ventana de contexto de GPT-3.5, el modelo usado por ChatGPT, es de 4.096 tokens pues simplemente no resulta posible procesar este texto.

En otras ocasiones lo que puede ocurrir es que si el texto excede el límite de la ventana de contexto, el modelo simplemente lo trunca a la entrada para asegurar que exista espacio para generar la respuesta. Sin embargo, es muy probable que la respuesta del modelo no sea la esperada pues el texto de entrada estará incompleto.

¿Cómo procesar textos muy extensos?

Acabamos de ver que es clave que el texto a procesar o generar sea acorde con el tamaño de la ventana de contexto.

Pero en ocasiones tendremos un texto relativamente extenso y queremos que sea procesado por uno de estos modelos. Así que siempre el primer paso es asegurarnos de que el modelo tenga una ventana de contexto adecuada para la longitud del texto a procesar.

Por ejemplo, modelos como GPT-3.5 y 4.0 tienen ventanas de contexto que van de los 4.096 a los 32.768 tokens, pero recientemente modelos como Claude, de la empresa Anthropic, tienen ventanas de contexto de hasta 100.000 tokens. Así que en principio existen diferentes alternativas y tamaños de ventanas de contexto que se ajustan a nuestras necesidades.

Sin embargo, en ocasiones el texto a procesar puede incluso superar estos límites de los modelos existentes, así que en estos casos existen algunas alternativas para lograr hacer el procesamiento.

La primera de ellas es simplemente dividir el texto en pequeños fragmentos (lo que se conoce como chunking) donde cada fragmento que no supera el de la ventana de contexto del modelo a usar.

Otra alternativa es combinar el chunking con la generación de resúmenes: por cada fragmento de texto se genera un breve resumen y luego todos los resúmenes se concatenan en un nuevo texto, de menor extensión que el original y que puede caber en la ventana de contexto.

Y una tercera alternativa es el uso de bases de datos vectoriales. En un próximo artículo hablaré de este tipo de bases de datos pero la idea general es que lo que se hace es tomar el texto extenso y representarlo usando lo que se conoce como embeddings que son simplemente vectores o arreglos de números.

De estos embeddings también hablé en detalle anteriormente en un artículo, pero lo importante acá es que al usarlos logramos representar el texto de forma compacta a través de vectores.

Y generalmente con estas técnicas lograremos evitar las limitaciones impuestas por las ventanas de contexto.

Conclusión

Muy bien, acabamos de entender qué son las ventanas de contexto de los Grandes Modelos de Lenguaje y por qué resultan importantes cuando queremos construir aplicaciones haciendo uso de estos modelos.

En últimas la idea general es que todos los modelos de lenguaje tienen un límite máximo de tokens que pueden llegar a procesar, así que no podemos ni introducir ni esperar que generen una cantidad de texto totalmente arbitraria.

Y este límite lo pone precisamente la ventana de contexto. Entonces, si sobrepasamos ese límite lo que generalmente hará el modelo será truncar el texto de entrada y esto inevitablemente va a terminar afectando la respuesta generada por el modelo.

Así que, al desarrollar una aplicación, lo es importante determinar el tamaño del texto (medido en tokens) que se quiere introducir y obtener del modelo y con base en esto escoger un modelo de lenguaje con la ventana de contexto adecuada, o usar alguna de las técnicas que mencioné hace un momento para lograr procesar el texto incluso cuando sobrepase estos límites.