Creación de un canal de poda de contexto para agentes de larga duración

En este artículo, aprenderá cómo implementar una canalización de poda de contexto para agentes de IA de larga duración, permitiéndoles administrar la memoria conversacional de manera eficiente a través de la similitud semántica.

Los temas que cubriremos incluyen:

Por qué el historial de conversaciones ilimitado es un problema para los agentes creados sobre grandes modelos de lenguaje y cómo se ve una estrategia de poda de contexto. Cómo utilizar modelos de incrustación de transformadores de oraciones para calcular la similitud semántica entre un mensaje actual y los turnos de conversación archivados. Cómo ensamblar una ventana de contexto eliminada del turno más reciente, los turnos pasados ​​semánticamente relevantes y el mensaje actual.

Creación de un canal de poda de contexto para agentes de larga duración

Introducción

Los agentes de IA modernos creados sobre grandes modelos de lenguaje (LLM) están diseñados para ejecutarse de forma continua. Como resultado, su historial de conversaciones sigue creciendo indefinidamente. Pasar una historia tan completa como la ventana de contexto del LLM es la receta perfecta para costos prohibitivos de tokens, cuellos de botella de latencia y una eventual degradación del razonamiento.

La creación de una canalización de poda de contexto puede abordar este problema mediante la gestión dinámica de la memoria conversacional reciente. Este artículo describe los principios básicos para implementar una canalización de poda de contexto para agentes de larga duración.

Usamos una solución local totalmente accesible y gratuita basada en modelos de integración de código abierto en lugar de API pagas, pero puede reemplazarlas con API pagas si desea una solución más eficiente.

Estrategia de memoria propuesta

Las estrategias de memoria clásicas en los agentes se basan en una ventana deslizante que olvida la información antigua a medida que se queda atrás, incluidos detalles potencialmente críticos. Más allá de ese enfoque, es posible construir un canal selectivo y más inteligente que brinde al LLM precisamente lo que necesita como contexto.

En esencia, el contexto se puede reducir a los siguientes elementos básicos:

El mensaje actual, que contiene la solicitud o pregunta del usuario. El giro más reciente, es decir, el intercambio entrada-respuesta inmediatamente anterior, que es clave para mantener la continuidad conversacional. Las coincidencias semánticamente relevantes entre las K principales, calculadas en función de una puntuación de similitud. Estos son giros pasados ​​​​estrechamente relacionados con el mensaje actual, recuperados mediante incrustaciones de vectores.

Todo lo que hay en el historial de conversaciones que queda fuera del alcance de estos tres elementos se descarta del contexto del mensaje activo, lo que ahorra cómputo y memoria.

Implementación basada en simulación

Nuestra implementación de ejemplo simula la aplicación de la estrategia antes mencionada, construyendo una ventana de poda de contexto paso a paso. Los modelos de transformadores de oraciones se utilizan para simular un proceso de larga duración junto con un historial de conversaciones simulado.

Empezamos realizando las importaciones necesarias:

A continuación, cargamos e inicializamos un modelo de incrustación previamente entrenado, concretamente todo MiniLM-L6-v2 de la biblioteca sentencia_transformers. Este modelo ha sido entrenado para transformar texto sin formato en vectores de incrustación que capturan características semánticas. También creamos un historial de agente simple y simulado que contiene interacciones usuario-agente (en un entorno real, esto se obtendría de una base de datos):

La lógica central del proceso de poda de contexto viene a continuación. Está encapsulado en una función prune_context() que recibe el mensaje actual, el historial de interacción completo y el número de turnos pasados ​​semánticamente relevantes para recuperar, k:

El código anterior se explica en gran medida por sí mismo. Divide la lógica en un caso base (cuando el historial de conversación aún es demasiado corto, en cuyo caso todo el historial se pasa como contexto) y un caso general, en el que el proceso de poda semántica real se lleva a cabo a través de varios pasos: incrustar giros pasados, calcular similitudes de cosenos con la incrustación actual, ordenarlos de mayor a menor similitud y seleccionar los K giros pasados ​​principales. El mensaje actual, el giro más reciente y los giros pasados ​​semánticamente similares de top-K finalmente se ensamblan en un contexto podado.

El siguiente ejemplo ilustra cómo obtener el contexto para un nuevo mensaje en el que el usuario regresa a aspectos relacionados con la eficiencia de las rutas de la flota:

La ventana de contexto resultante producida por nuestra estrategia de poda se muestra a continuación:

Tenga en cuenta que utilizamos el valor predeterminado para k, es decir, top_k=2. El último turno, que siempre está incluido en nuestro pipeline definido, consta del par de mensajes:

Entonces, ¿por qué solo aparece una interacción usuario-agente adicional antes de este turno, en lugar de dos? La razón es que la estrategia top-k no opera a nivel de turno completo (es decir, un par de mensajes), sino a nivel de mensaje individual. En este caso, los dos mensajes recuperados basados ​​en la similitud forman las dos mitades de la misma interacción, pero es igualmente posible que los dos mensajes más relevantes sean mensajes de usuario, mensajes de agente o simplemente partes no consecutivas del historial de chat.

Concluyendo

Este artículo demostró cómo implementar una canalización de poda de contexto, basada en un historial de conversación de agente simulado, que se basa en la similitud semántica para seleccionar las partes más relevantes de una conversación como contexto para el mensaje actual. Esta es una técnica importante para agentes de larga duración, que ayuda a reducir el uso de memoria y los costos de cálculo al tiempo que mejora la eficiencia general.