Reflexión (Reflection)

Reflexión (Reflection) es un patrón de diseño en el que una generación de un modelo LLM es seguida por una reflexión, que a su vez es otra generación de LLM condicionada por la salida de la primera. Por ejemplo, dado un encargo para escribir código, el primer LLM puede generar un fragmento de código, y el segundo LLM puede generar una crítica sobre dicho código.

En el contexto de Saptiva-Agents y sus agentes, la reflexión puede implementarse como un par de agentes, donde el primer agente genera un mensaje y el segundo genera una respuesta a dicho mensaje. Estos dos agentes continúan interactuando hasta alcanzar una condición de parada, como un número máximo de iteraciones o una aprobación explícita del segundo agente.

🛠 Vamos a implementar este patrón de diseño de reflexión usando agentes de Saptiva-Agents.

Tendremos dos agentes:

  • 🧑‍💻 Agente Coder: genera un fragmento de código.

  • 🧑‍🏫 Agente Reviewer: genera una crítica del fragmento de código generado.


Protocolo de Mensajes

Antes de definir los agentes, primero necesitamos definir el protocolo de mensajes que usarán los agentes para comunicarse entre sí.

from dataclasses import dataclass


@dataclass
class CodeWritingTask:
    task: str


@dataclass
class CodeWritingResult:
    task: str
    code: str
    review: str


@dataclass
class CodeReviewTask:
    session_id: str
    code_writing_task: str
    code_writing_scratchpad: str
    code: str


@dataclass
class CodeReviewResult:
    review: str
    session_id: str
    approved: bool

El conjunto de mensajes anterior define el protocolo para nuestro ejemplo de patrón de diseño de reflexión:

  • La aplicación envía un mensaje CodeWritingTask al agente coder

  • El agente coder genera un mensaje CodeReviewTask, que se envía al agente reviewer

  • El agente reviewer genera un mensaje CodeReviewResult, que se envía de regreso al agente coder

  • Dependiendo del mensaje CodeReviewResult, si el código es aprobado, el agente coder envía un mensaje CodeWritingResult de vuelta a la aplicación; de lo contrario, el agente coder envía otro mensaje CodeReviewTask al agente reviewer, y el proceso continúa.

Podemos visualizar este protocolo de mensajes utilizando un diagrama de flujo de datos:

coder-reviewer data flow

Agentes

Ahora, definamos los agentes para el patrón de diseño de reflexión.

Usamos la API de difusión (Broadcast API) para implementar el patrón de diseño. Los agentes implementan el modelo de publicación/suscripción (pub/sub). El agente coder se suscribe a los mensajes CodeWritingTask y CodeReviewResult, y publica los mensajes CodeReviewTask y CodeWritingResult.

Algunas cosas a tener en cuenta sobre CoderAgent:

  • Utiliza chain-of-thought prompting (encadenamiento de pensamientos) en su mensaje del sistema.

  • Almacena historiales de mensajes para diferentes CodeWritingTask en un diccionario, de modo que cada tarea tiene su propio historial.

  • Al hacer una solicitud de inferencia al LLM usando su cliente de modelo, transforma el historial de mensajes en una lista de objetos saptiva_agents.models.LLMMessage para pasarlos al cliente del modelo.

El agente revisor se suscribe al mensaje CodeReviewTask y publica el mensaje CodeReviewResult.

El ReviewerAgent utiliza el modo JSON (JSON-mode) al hacer una solicitud de inferencia al LLM, y también emplea chain-of-thought prompting (encadenamiento de pensamientos) en su mensaje del sistema.


Registro (Logging)

Activa el registro (logging) para ver los mensajes intercambiados entre los agentes.


Ejecutando el Patrón de Diseño

Probemos el patrón de diseño con una tarea de programación. Dado que todos los agentes están decorados con el decorador de clase default_subscription(), los agentes, al ser creados, se suscriben automáticamente al topic por defecto.

Publicamos un mensaje CodeWritingTask al topic por defecto para iniciar el proceso de reflexión.

Los mensajes de registro muestran la interacción entre los agentes coder (programador) y reviewer (revisor). La salida final muestra el fragmento de código generado por el agente coder y la crítica generada por el agente reviewer.

Última actualización