Colaboración Avanzada de IA: Desarrollando un Sistema Multi-Agente con CrewAI
¡Hola! Soy Tommy, y te guiaré a través del avanzado ámbito de los Sistemas Multi-Agente, un tema que extiende las capacidades de los agentes de IA individuales en potentes unidades cooperativas que pueden abordar problemas complejos del mundo real. En esta guía, exploraremos cómo coordinar múltiples agentes de IA para resolver tareas complejas, enfatizando la escalabilidad, la orquestación y la colaboración. Ya sea que estés desarrollando sistemas de soporte al cliente autónomos o aplicaciones complejas de resolución de problemas, este tutorial te dotará de las herramientas y conocimientos necesarios para tener éxito. ¡Quédate para ver cómo todo se reúne con una implementación práctica en Google Colab al final!
Visión General del Sistema Multi-Agente y su Marco
Los sistemas multi-agente representan un salto significativo desde los paradigmas tradicionales de IA. En lugar de depender de una única entidad de IA para gestionar todas las tareas, los Sistemas Multi-Agente permiten agentes especializados, cada uno diseñado para roles específicos. Esta especialización permite un procesamiento más eficiente, ejecución paralela de tareas y la capacidad de abordar problemas más complejos.
Beneficios:
- Escalabilidad: Cada agente puede ser optimizado y escalado de forma independiente, lo que permite que el sistema maneje cargas de trabajo crecientes al agregar más agentes.
- Robustez: Si un agente falla, otros pueden continuar funcionando, proporcionando un mecanismo de conmutación por error que mejora la confiabilidad del sistema.
- Eficiencia: Los agentes pueden trabajar en paralelo o en jerarquía, acelerando el tiempo de finalización de la tarea general, particularmente en escenarios donde las tareas son independientes o pueden descomponerse en subtareas más pequeñas.
- Modularidad: La naturaleza modular de los Sistemas Multi-Agente significa que los agentes pueden reutilizarse en diferentes sistemas, reduciendo el tiempo de desarrollo para nuevos proyectos.
Desafíos:
- Complejidad de Coordinación: Asegurar que los agentes trabajen juntos sin problemas puede ser difícil, especialmente a medida que aumenta el número de agentes.
- Sobrecarga de Comunicación: La necesidad de que los agentes se comuniquen agrega carga, particularmente si dependen de diferentes modelos o marcos.
- Manejo de Errores: Las fallas en un agente pueden propagarse o causar problemas en otros, requiriendo sofisticados mecanismos de manejo de errores.
Introducción a CrewAI
CrewAI es un excelente marco para gestionar y orquestar múltiples agentes. Simplifica los conceptos complejos de los Sistemas Multi-Agente en estructuras manejables, proporcionando herramientas para construir, implementar y gestionar sistemas multi-agente en entornos de producción.
Algunas características clave de CrewAI incluyen:
- Ejecución de Tareas Secuenciales, Paralelas y Jerárquicas: Por defecto, las tareas se procesan secuencialmente, pero CrewAI también admite la ejecución paralela y jerárquica, que es crucial para sistemas a gran escala.
- Integración de Herramientas Personalizadas: CrewAI permite a los desarrolladores crear e integrar herramientas personalizadas adaptadas a tareas específicas de los agentes, mejorando la versatilidad y efectividad del sistema para su caso de uso.
- Gestión de Memoria: CrewAI proporciona mecanismos para la memoria a corto, largo plazo y de entidad, permitiendo a los agentes aprender de experiencias pasadas y mejorar con el tiempo.
- Configuración de Agentes Basada en Roles: Al enfocar a los agentes en roles y objetivos específicos, CrewAI asegura que cada agente esté optimizado para su tarea, mejorando la eficiencia general del sistema.
Configuración y Dependencias
Antes de definir los agentes, asegúrate de que tu entorno esté correctamente configurado. Para este tutorial, utilizaremos Google Colab. Sigue estos pasos para instalar las dependencias necesarias y configurar tus variables de entorno:
Instalar Dependencias:
Dado que estamos trabajando en Google Colab, la instalación de dependencias es sencilla. Utilizaremos los paquetes crewai
, crewai_tools
, langchain_community
y pymongo
. Estas bibliotecas proporcionan la funcionalidad básica para crear y gestionar agentes de IA, integrar herramientas externas como las de LangChain, y conectarse a una base de datos MongoDB.
El comando anterior se ejecutó en un cuaderno de Google Colab, pero si lo estás ejecutando localmente, elimina el signo de admiración (!).
Configurar Variables de Entorno:
A continuación, necesitarás configurar tus variables de entorno. Para este tutorial, utilizaremos el modelo gpt-3.5-turbo de OpenAI, ya que es ampliamente accesible. Si tienes acceso a GPT-4, puedes omitir este paso o modificar la variable de entorno en consecuencia.
Agrega el siguiente código a tu cuaderno de Colab, reemplazando los valores de marcador de posición con tus claves de API y credenciales reales. Esta configuración permite que tus agentes interactúen con servicios externos y bases de datos de manera segura.
Diseñando un Sistema Multi-Agente
Diseñar un sistema multi-agente comienza con definir claramente los roles y responsabilidades de cada agente. Vamos a través de un ejemplo práctico: construir un Sistema de Soporte al Cliente donde diferentes agentes manejan tareas distintas como recuperación de datos, resolución de consultas y revisión de calidad.
PASO 1: Definir los Agentes
Al crear agentes de IA, es crucial establecer un sólido marco mental. Comienza haciéndote preguntas clave que reflejen el proceso de pensamiento de un gerente:
- Orientación a Objetivos: ¿Cuál es el objetivo principal del agente? ¿Qué procesos necesitará el agente para cumplir este objetivo de manera efectiva?
- Analogía con la Construcción de Equipos: Si esta fuera una tarea humana, ¿qué tipo de personas contratarías para hacer el trabajo? Considera los roles y la experiencia necesaria, luego mapea estas cualidades en las capacidades del agente de IA.
Cada agente puede ejecutar un modelo de lenguaje diferente (LLM) en un sistema multi-agente. Dado que estamos utilizando CrewAI para este tutorial, vale la pena señalar que los agentes también pueden integrar modelos del Hugging Face Hub. Esta flexibilidad te permite ajustar los agentes para satisfacer necesidades específicas, proporcionando respuestas más personalizadas.
Por ejemplo, puedes ajustar modelos como phi-3, tinyLLama, o Llama-3 para adaptarlos mejor a tu caso de uso. Si no estás familiarizado con este proceso, puedes consultar mis tutoriales anteriores sobre cómo ajustar estos modelos:
- Ajuste de Phi-3
- Ajuste de tinyllama
- Ajuste de Llama-3
Para usar un modelo del Hugging Face Hub, puedes cargarlo en tu agente de la siguiente manera:
Comprendiendo el Agente de Recuperación de Datos
- Rol: Este agente está definido como un "Especialista en Recuperación de Datos," enfocado en obtener datos.
- Objetivo: El objetivo del agente es recuperar toda la información relevante sobre un cliente de la base de datos.
- Historia: La historia proporciona contexto, ayudando al agente a comprender su rol dentro del sistema más amplio.
- Permitir Delegación: Configurado como Falso, lo que significa que este agente no delegará sus tareas a otros.
- Verbose: Habilita el registro detallado de las acciones del agente.
Comprendiendo el Agente de Soporte
- Rol: El "Representante de Soporte Senior" es responsable de ofrecer un soporte excepcional al cliente.
- Objetivo: El agente busca proporcionar un soporte amable y útil.
- Historia: Este agente utiliza los datos proporcionados por el Especialista en Recuperación de Datos para asistir al cliente.
- Permitir Delegación: Configurado como Falso para mantener la responsabilidad de la tarea dentro de este agente.
- Verbose: El registro detallado ayuda a rastrear cómo se desempeña este agente.
Comprendiendo el Agente de QA de Soporte
- Rol: El "Especialista en Garantía de Calidad de Soporte" asegura la calidad del soporte proporcionado.
- Objetivo: El objetivo de este agente es lograr reconocimiento por mantener alta calidad de soporte.
- Historia: Se centra en asegurar que las respuestas del Representante de Soporte Senior sean exhaustivas y precisas.
- Verbose: Al igual que con los otros agentes, el registro detallado está habilitado para monitorear las actividades del agente.
Paso 2: Definir las Tareas
Con nuestros agentes definidos, el siguiente paso es crear las tareas que realizarán. Las tareas son centrales para cómo operan los agentes, proporcionando un conjunto claro de acciones que deben llevarse a cabo utilizando herramientas específicas. El parámetro tools
es clave, ya que dicta qué recursos o utilidades utilizará el agente para cumplir la tarea. Hay varias herramientas disponibles, incluidas las de LangChain, pero es importante seleccionar la que mejor se ajuste al rol y objetivo del agente. Evita sobrecargar a tus agentes con demasiadas herramientas; concéntrate en aquellas que son más efectivas para la tarea en cuestión.
Elementos Clave de Herramientas Efectivas:
- Versatilidad: La herramienta debería manejar diferentes tipos de entradas del agente, adaptándose a varios escenarios.
- Tolerancia a Fallos: Debería fallar de manera elegante, posiblemente consultando más, enviando mensajes de error o solicitando rangos de entrada específicos.
- Caching: Esto previene solicitudes repetidas innecesarias al utilizar una capa de caché entre agentes, optimizando la eficiencia incluso cuando la misma consulta es utilizada por diferentes agentes.
Antes de definir las tareas, inicialicemos la herramienta que usaremos.
Inicialización de Herramientas
Las herramientas pueden ser integradas o personalizadas, dependiendo de los requisitos de la tarea. En este tutorial, utilizaremos varias herramientas, incluyendo DirectoryReadTool y FileReadTool para leer archivos de un directorio específico, y una herramienta personalizada para la recuperación de datos.
Primero, inicialicemos las herramientas integradas:
A continuación, definiremos una herramienta personalizada para recuperar datos de una base de datos MongoDB. Al crear esta herramienta, encontré un problema donde inicializar el cliente de MongoDB en el constructor habitual __init__
causaba errores. Después de investigar, encontré que inicializarlo como una variable de clase con la anotación de tipo apropiada resolvía el problema.
your_code_here
Definiendo las Tareas
Las tareas representan objetivos específicos que los agentes deben alcanzar. Cada tarea se define por una description
, un expected_output
, las tools
que usará y el agent
responsable de llevar a cabo la tarea.
Tarea de Recuperación de Datos
Esta tarea se asigna a nuestro data_retrieval_agent
, cuyo trabajo es recopilar toda la información relevante sobre el cliente de la base de datos. Los datos recopilados aquí serán cruciales para abordar la consulta del cliente en las tareas posteriores.
data_retrieval_task = Task(
description=dedent("""
Reúne todos los datos relevantes del {customer} de la base de datos, enfocándote en los datos cruciales que serían excelentes para conocer al abordar la consulta del cliente.
"""),
expected_output=dedent("""
Un conjunto de datos completo de la información del cliente. Destacando la información clave del cliente que será útil para el equipo al abordar la consulta del cliente.
"""),
tools=[retrival_tool],
agent=data_retrieval_agent,
)
En esta tarea, la retrival_tool
obtiene los datos necesarios de la base de datos, que luego el agente procesará para asegurar que sean relevantes y completos.
Tarea de Resolución de Consultas
Una vez que se recuperan los datos, el support_agent
usará esta información para abordar la consulta del cliente. Esta tarea implica buscar en archivos relevantes y generar una respuesta detallada.
inquiry_resolution = Task(
description=dedent("""
{customer} acaba de comunicarse con una solicitud muy importante:
{inquiry}
{customer} es quien se puso en contacto. Asegúrate de usar todo lo que sabes para proporcionar el mejor soporte posible. Debes esforzarte por proporcionar una respuesta completa, clara y precisa a la consulta del cliente.
"""),
expected_output=dedent("""
Una respuesta detallada e informativa a la consulta del cliente que aborde todos los aspectos de su pregunta.
La respuesta debe incluir referencias a todo lo que utilizaste para encontrar la respuesta, incluidos datos externos o soluciones. Asegúrate de que la respuesta sea completa, dejando ninguna pregunta sin respuesta, y manteniendo un tono útil y amigable a lo largo del proceso.
"""),
tools=[directory_read_tool, file_read_tool],
agent=support_agent,
)
Aquí, el directory_read_tool
y file_read_tool
ayudan al support_agent
a filtrar la documentación almacenada, asegurando que la respuesta al cliente esté bien informada y sea precisa.
Tarea de Revisión de Garantía de Calidad
Finalmente, el support_quality_assurance_agent
revisa la respuesta generada por el support_agent
. Esta tarea asegura que la respuesta cumpla con los altos estándares de la empresa, sea exhaustiva y amigable para el cliente.
quality_assurance_review = Task(
description=dedent("""
Revisa la respuesta redactada por el Representante de Soporte Senior para la consulta de {customer}. Asegúrate de que la respuesta sea completa, precisa y cumpla con los altos estándares de calidad esperados para el soporte al cliente.
Verifica que todas las partes de la consulta del cliente se hayan abordado a fondo, con un tono útil y amigable.
Verifica las referencias y fuentes utilizadas para encontrar la información, asegurando que la respuesta esté bien respaldada y no deje preguntas sin responder.
"""),
expected_output=dedent("""
Una respuesta final, detallada e informativa lista para ser enviada al cliente.
Esta respuesta debe abordar completamente la consulta del cliente, incorporando toda la retroalimentación y las mejoras relevantes.
No seas demasiado formal, somos una empresa relajada y genial, pero mantén un tono profesional y amigable a lo largo del proceso.
"""),
agent=support_quality_assurance_agent,
output_file="response.md",
human_input=True,
)
Esta tarea agrega una capa de control de calidad, asegurando que se satisfagan plenamente las necesidades del cliente y que la respuesta esté alineada con los estándares de la empresa.
Paso 3: Inicializar la Tripulación
Ahora que hemos definido nuestros agentes y tareas, es hora de unir todo inicializando una Tripulación. La Tripulación es la entidad central que gestiona la ejecución de tareas por los agentes. Orquesta cómo se procesan las tareas y si los agentes pueden recordar interacciones anteriores.
Opciones de Proceso
El parámetro process
controla cómo se ejecutan las tareas por la tripulación. Las opciones incluyen:
- Secuencial (Por Defecto): Las tareas se realizan una tras otra en un orden específico.
- Jerárquico: Un agente actúa como gerente, delegando tareas a otros agentes mientras mantiene una memoria general de las tareas.
- Paralelo: Las tareas se ejecutan de manera concurrente, permitiendo que múltiples tareas se ejecuten al mismo tiempo.
Tipos de Memoria
La memoria mejora la capacidad de los agentes para recordar interacciones pasadas, mejorando la calidad de las respuestas con el tiempo. El parámetro de memoria, cuando se establece en Verdadero, activa varios tipos de memoria:
- Memoria a Corto Plazo: Solo disponible durante el tiempo de ejecución de la tripulación. Una vez que la tripulación termina, esta memoria se borra y no será accesible en ejecuciones posteriores.
- Memoria a Largo Plazo: Almacena respuestas en almacenamiento persistente, lo que permite que la tripulación recuerde interacciones pasadas incluso después de que la sesión ha terminado.
- Memoria de Entidad: Agrupa y reconoce entidades (por ejemplo, nombres de clientes, productos) dentro de la conversación para proporcionar respuestas más contextuales y significativas. También es efímera y se borra después de que la sesión termina.
Por defecto, la memoria se establece en Falso, pero cuando se activa (memory=True), todos los tipos de memoria se activan para un mejor rendimiento.
Aquí se muestra cómo inicializamos la tripulación con nuestros agentes, tareas y configuración de memoria:
your_code_here
Parámetros Clave Explicados
- agents: Una lista de agentes que participarán en la tripulación. A cada agente se le asignan tareas específicas según sus roles y objetivos definidos.
-
tasks: Una lista de tareas que los agentes necesitan completar. Estas tareas están diseñadas para ejecutarse secuencialmente por defecto, pero puedes personalizar el flujo de ejecución cambiando el parámetro
process
. - verbose: Establecer esto en 2 habilita un registro detallado, para que puedas monitorear cómo los agentes interactúan entre sí y cómo progresan a través de las tareas.
- memory: Al establecer memory=True, habilitamos todos los tipos de memoria, asegurando que los agentes puedan recordar interacciones anteriores y proporcionar respuestas más informadas.
Flujo de Ejecución
Con esta configuración, la tripulación ejecutará las tareas en secuencia:
-
Recuperación de Datos: El
data_retrieval_agent
recupera la información relevante del cliente de la base de datos. -
Resolución de Consultas: El
support_agent
utiliza los datos recuperados, junto con información adicional de directorios y archivos, para proporcionar una respuesta completa a la consulta del cliente. -
Revisión de Garantía de Calidad: El
support_quality_assurance_agent
revisa la respuesta, asegurando que cumpla con los estándares de calidad, y luego la guarda en un archivo.
Paso 4: Activar la Tripulación
Después de inicializar la tripulación con tus agentes y tareas, el siguiente paso es activarla proporcionando las entradas necesarias. Estas entradas guiarán a los agentes mientras trabajan en sus tareas asignadas.
En este ejemplo, utilizaremos las siguientes entradas:
- customer: El nombre del cliente que hace la consulta.
- inquiry: La pregunta o problema específico que el cliente desea que se aborde.
Explicación de las Entradas
- customer: "Tommy Ade" es el cliente cuya información se recuperará y cuya consulta será abordada por los agentes. Esto también se utiliza para personalizar las respuestas e interacciones.
- inquiry: El cliente está preguntando cómo ajustar el modelo Llama 3 y también solicitando información de fondo sobre el modelo de lenguaje grande (LLM). Esta entrada impulsará las tareas realizadas por los agentes, desde la recuperación de datos hasta la resolución de consultas y la garantía de calidad.
Paso 5: Revisar la Ejecución de la Tripulación
Una vez invocado el método de activación, la tripulación comienza a ejecutar las tareas. La configuración de verbose asegura que se produzcan registros detallados, mostrando cómo los agentes colaboran para lograr el objetivo. Esto es particularmente útil para entender el proceso de toma de decisiones y cómo cada agente contribuye al resultado final.
Deberías ver al Especialista en Recuperación de Datos comenzar la tarea de recuperación con registros y salidas detalladas. Se produce un error menor al usar la herramienta personalizada que definimos anteriormente; dado que CrewAI nos ayuda a gestionar los errores de forma elegante, no afectó la ejecución y permitió que el agente introdujera la variable correcta, lo que nos proporcionó los detalles del cliente que queríamos.
Después de que el agente termina de trabajar, devuelve la salida final y la entrega al siguiente agente que asumirá la siguiente tarea. El Agente de Soporte comienza y utiliza las herramientas de directorio y archivo para leer todos los archivos y preparar una respuesta a la consulta del cliente. Después de que el Agente de Soporte ha proporcionado su respuesta, se inicia la siguiente tarea, y el agente de QA comienza. Luego, delega una tarea al agente de Soporte nuevamente para revisar su respuesta.
Entonces, el agente de QA recibe la retroalimentación del Agente de Soporte y ahora busca nuestra retroalimentación para una mejor respuesta si es necesario. El agente de QA luego recibe la retroalimentación y trabaja en su respuesta con base en lo que se dijo y brinda una respuesta adecuada.
Salida Final en Formato Markdown
Después de que la tripulación completa todas las tareas, genera el resultado final en un formato de markdown. Este formato es particularmente útil para fines de documentación o para compartir los resultados de manera estructurada y legible.
Dado que configuramos un output_file
para nuestra tarea de QA, el archivo conteniendo la respuesta estará en nuestro directorio actual. El contenido del archivo de salida contiene la respuesta final del agente de QA de soporte. Puedes ver el cuaderno de Google Colab utilizado para este tutorial AQUÍ.
Generalizando a Través de Casos de Uso
Adaptación a Múltiples Dominios
Si bien este tutorial se centra en ejemplos de soporte al cliente, los principios de los sistemas multi-agente pueden adaptarse a varias industrias, desde la gestión de la cadena de suministro hasta servicios personalizados impulsados por IA.
Diseño Modular y Reutilizable
Al diseñar tu sistema, prioriza la modularidad. Estructura los agentes y sus interacciones de tal manera que puedan adaptarse o reutilizarse fácilmente en diferentes proyectos, ahorrando tiempo y recursos en desarrollos futuros.
Conclusión
En este tutorial, hemos construido un sofisticado sistema multi-agente utilizando CrewAI, demostrando cómo automatizar tareas de soporte al cliente de manera efectiva. Comenzamos configurando el entorno, definiendo agentes especializados y creando tareas que aprovechan diversas herramientas, incluyendo una herramienta personalizada de recuperación de datos. Al inicializar y activar la tripulación, vimos cómo los agentes colaboran para recuperar datos, redactar respuestas y asegurar calidad, todo mientras utilizan memoria e input humano para producir una salida final refinada.
Para profundizar en las capacidades y posibilidades de los sistemas multi-agente, consulta la documentación de CrewAI.
Dejar un comentario
Todos los comentarios se revisan antes de su publicación.
Este sitio está protegido por hCaptcha y se aplican la Política de privacidad de hCaptcha y los Términos del servicio.