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: boolEl 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
CodeWritingTaskal agente coderEl agente coder genera un mensaje
CodeReviewTask, que se envía al agente reviewerEl agente reviewer genera un mensaje
CodeReviewResult, que se envía de regreso al agente coderDependiendo del mensaje
CodeReviewResult, si el código es aprobado, el agente coder envía un mensajeCodeWritingResultde vuelta a la aplicación; de lo contrario, el agente coder envía otro mensajeCodeReviewTaskal agente reviewer, y el proceso continúa.
Podemos visualizar este protocolo de mensajes utilizando un diagrama de flujo de datos:
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
CodeWritingTasken 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.LLMMessagepara 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