Introducción a los SDK de Agentes
El auge de los agentes autónomos impulsados por IA ha transformado nuestra forma de pensar sobre las aplicaciones de software. Estos agentes, capaces de entender, razonar y actuar de forma independiente o semi-independiente, prometen un futuro de sistemas altamente inteligentes y automatizados. En el corazón de la construcción de tales agentes se encuentran los Kits de Desarrollo de Software para Agentes (SDKs). Un SDK de Agente proporciona las herramientas, bibliotecas y marcos fundamentales necesarios para diseñar, desarrollar, implementar y gestionar agentes de IA. Esta guía avanzada explorará un análisis comparativo de los SDKs de Agentes más populares, enfocándose en su arquitectura, características avanzadas, casos de uso prácticos, y proporcionando ejemplos de código para ilustrar sus fortalezas y debilidades. Exploraremos SDK destacados como LangChain, AutoGen, LlamaIndex, y discutiremos alternativas emergentes.
Componentes Clave de un SDK de Agente
Antes de explorar SDKs específicos, es crucial entender los componentes arquitectónicos comunes que proporcionan:
- Integración de LLM: Facilita la conexión fluida con varios Modelos de Lenguaje Grande (LLMs) (por ejemplo, OpenAI, Anthropic, modelos de Hugging Face).
- Gestión de Prompts: Herramientas para construir, plantillar y gestionar prompts para una interacción óptima con LLM.
- Llamadas de Herramientas/Funciones: Mecanismos para que los agentes interactúen con APIs externas, bases de datos o funciones personalizadas para extender sus capacidades.
- Gestión de Memoria: Sistemas para que los agentes retengan contexto, historial de conversación e información aprendida a lo largo de las interacciones.
- Planificación y Razonamiento: Marcos para que los agentes desglosen tareas complejas, planifiquen pasos de ejecución y razonen sobre los resultados (por ejemplo, ReAct, CoT).
- Orquestación de Agentes: Herramientas para definir sistemas multi-agente, gestionar la comunicación y coordinar tareas entre agentes.
- Observabilidad y Depuración: Características para monitorear el comportamiento del agente, rastrear caminos de ejecución y depurar problemas.
- Implementación y Escalabilidad: Consideraciones y herramientas para implementar agentes en entornos de producción y escalar su uso.
LangChain: La Navaja Suiza del Desarrollo de Agentes
LangChain es, sin duda, el SDK de Agente más adoptado y completo. Es conocido por su modularidad y extensas integraciones, lo que lo convierte en una opción poderosa para flujos de trabajo de agentes complejos.
Arquitectura y Conceptos Clave
La arquitectura de LangChain se construye en torno a varias abstracciones clave:
- LLMs/ChatModels: Interfaces para interactuar con varios proveedores de LLM.
- Prompts: Plantillas para generar entradas de LLM.
- Chains: Secuencias de llamadas a LLMs u otras utilidades.
- Agentes: LLMs aumentados con herramientas para interactuar con su entorno. Utilizan un ‘ciclo de razonamiento’ (por ejemplo, ReAct) para decidir qué herramienta utilizar.
- Herramientas: Funciones que un agente puede llamar para realizar acciones específicas.
- Memoria: Almacena interacciones pasadas para proporcionar contexto.
- Recuperadores: Componentes para obtener documentos de una base de conocimiento.
- Almacenes de Vectores: Bases de datos para almacenar incrustaciones vectoriales.
Características Avanzadas y Ejemplo Práctico (Agente ReAct con Herramienta Personalizada)
LangChain sobresale en la creación de agentes sofisticados que utilizan herramientas personalizadas y razonamiento complejo. Vamos a construir un agente LangChain que pueda responder preguntas sobre los precios de acciones actuales utilizando una herramienta personalizada y luego resumir las noticias relacionadas con la empresa.
Ejemplo: Agente de Precio de Acciones y Noticias
Primero, definimos una herramienta personalizada para obtener los precios de acciones:
from langchain.tools import BaseTool
from typing import Type
from pydantic import BaseModel, Field
import yfinance as yf
class StockPriceInput(BaseModel):
ticker: str = Field(description="El símbolo de cotización de la acción (por ejemplo, MSFT para Microsoft).")
class StockPriceTool(BaseTool):
name = "get_stock_price"
description = "Útil para obtener el precio actual de las acciones de una empresa."
args_schema: Type[BaseModel] = StockPriceInput
def _run(self, ticker: str) -> str:
try:
stock = yf.Ticker(ticker)
current_price = stock.history(period="1d")["Close"].iloc[-1]
return f"El precio actual de {ticker} es ${current_price:.2f}"
except Exception as e:
return f"No se pudo recuperar el precio de las acciones para {ticker}: {e}"
async def _arun(self, ticker: str) -> str:
raise NotImplementedError("Async no implementado para StockPriceTool")
Luego, nos integramos con una API de noticias (por ejemplo, NewsAPI.org – asegúrate de tener una clave de API) como otra herramienta. Para ser breves, usaremos una función de marcador de posición para la recuperación de noticias:
from langchain.tools import tool
@tool
def get_company_news(company_name: str) -> str:
"""Útil para obtener titulares recientes de noticias para un nombre de empresa dado."""
# En un escenario real, esto llamaría a una API de noticias
if "Microsoft" in company_name:
return "Noticias recientes de Microsoft: Anuncia nueva asociación de IA, Las ganancias superan las expectativas."
elif "Apple" in company_name:
return "Noticias recientes de Apple: Ventas del Vision Pro sólidas, rumores de lanzamiento de nuevo iPhone."
else:
return f"No se encontraron noticias recientes para {company_name}."
Ahora, creamos el agente:
from langchain_openai import ChatOpenAI
from langchain.agents import AgentExecutor, create_react_agent
from langchain import hub
# Inicializar LLM
llm = ChatOpenAI(temperature=0, model="gpt-4-turbo-preview") # o gpt-3.5-turbo
# Definir las herramientas que el agente puede usar
tools = [StockPriceTool(), get_company_news]
# Obtener la plantilla de prompt de ReAct del LangChain Hub
prompt = hub.pull("hwchase17/react")
# Crear el agente ReAct
agent = create_react_agent(llm, tools, prompt)
# Crear el Ejecutor de Agentes
agent_executor = AgentExecutor(agent=agent, tools=tools, verbose=True, handle_parsing_errors=True)
# Ejecutar el agente
print(agent_executor.invoke({"input": "¿Cuál es el precio actual de las acciones de Apple y cuáles son las últimas noticias sobre ellos?"}))
# Salida esperada (truncada por brevedad):
# > Entrando en nueva cadena de AgentExecutor...
# Pensamiento: Necesito encontrar primero el precio de las acciones de Apple, luego buscar noticias sobre ellos.
# Acción: get_stock_price
# Entrada de Acción: AAPL
# Observación: El precio actual de AAPL es $xxx.xx
# Pensamiento: Ahora tengo el precio de las acciones. Necesito obtener las noticias de Apple.
# Acción: get_company_news
# Entrada de Acción: Apple
# Observación: Noticias recientes de Apple: Ventas del Vision Pro sólidas, rumores de lanzamiento de nuevo iPhone.
# Pensamiento: Tengo tanto el precio de las acciones como las noticias de Apple. Ahora puedo proporcionar una respuesta detallada.
# Respuesta Final: El precio actual de las acciones de Apple es $xxx.xx. Las noticias recientes sobre Apple incluyen ventas sólidas del Vision Pro y rumores de un nuevo lanzamiento de iPhone.
Este ejemplo muestra la capacidad de LangChain para orquestar múltiples herramientas dentro de un sofisticado ciclo de razonamiento (ReAct), lo que lo hace ideal para tareas que requieren toma de decisiones dinámica.
Fortalezas y Debilidades
- Fortalezas: Extremadamente flexible y modular, vasto ecosistema de integraciones (LLMs, almacenes de vectores, herramientas), fuerte soporte comunitario, excelente para razonamientos complejos y de múltiples pasos.
- Debilidades: Puede tener una curva de aprendizaje pronunciada, el código boilerplate puede acumularse, la depuración de rendimiento puede ser un desafío en cadenas complejas.
AutoGen: Conversaciones y Orquestación Multi-Agente
AutoGen de Microsoft se centra en conversaciones multi-agente, lo que permite a los desarrolladores construir sistemas donde múltiples agentes colaboran para resolver tareas. Pone énfasis en la flexibilidad para definir roles de agente y patrones de comunicación.
Arquitectura y Conceptos Clave
Los conceptos clave de AutoGen giran en torno a:
- Agentes: Los bloques de construcción fundamentales. Pueden ser impulsados por LLMs (
ConversableAgent) o actuar como proxies humanos (UserProxyAgent). - Conversaciones: Los agentes se comunican enviándose mensajes entre sí.
- GroupChat: Facilita las conversaciones entre múltiples agentes de manera estructurada.
- Ejecutar Código: Los agentes pueden ejecutar código localmente o en un contenedor Docker.
Características Avanzadas y Ejemplo Práctico (Generación y Revisión de Código)
AutoGen sobresale en escenarios donde una tarea se descompone naturalmente en sub-tareas que requieren diferentes especialidades, simuladas por diferentes agentes. Vamos a crear un sistema multi-agente simple para la generación y revisión de código.
Ejemplo: Generador y Revisor de Código en Python
import autogen
# Configurar LLM (asegúrese de tener OPENAI_API_KEY configurado en las variables de entorno)
config_list = autogen.config_list_openai_aoai(exclude="aoai")
# Crear un UserProxyAgent para actuar como la interfaz humana
user_proxy = autogen.UserProxyAgent(
name="User_Proxy",
human_input_mode="NEVER", # Establecer en "ALWAYS" para depuración interactiva
max_consecutive_auto_reply=10,
is_termination_msg=lambda x: x.get("content", "").rstrip().endswith("TERMINATE"),
code_execution_config={
"work_dir": "coding",
"use_docker": False # Establecer en True para ejecución aislada
},
)
# Crear un AssistantAgent para generación de código
coder = autogen.AssistantAgent(
name="Coder",
llm_config={"config_list": config_list},
system_message="Eres un programador de Python útil. Escribe código Python limpio y eficiente."
)
# Crear otro AssistantAgent para revisión y pruebas de código
reviewer = autogen.AssistantAgent(
name="Reviewer",
llm_config={"config_list": config_list},
system_message="Eres un revisor de código. Revisa el código Python proporcionado en busca de corrección, eficiencia y errores. Sugiere mejoras y escribe casos de prueba si es necesario."
)
# Crear un GroupChat para orquestar la conversación
groupchat = autogen.GroupChat(
agents=[user_proxy, coder, reviewer],
messages=[],
max_round=15,
speaker_selection_method="auto" # Dejar que AutoGen decida quién habla a continuación
)
# Crear un GroupChatManager para gestionar el chat grupal
manager = autogen.GroupChatManager(groupchat=groupchat, llm_config={"config_list": config_list})
# Iniciar la conversación
user_proxy.initiate_chat(
manager,
message="Escribe una función en Python que calcule el enésimo número de Fibonacci de manera eficiente. El revisor lo comprobará y sugerirá pruebas."
)
# Salida esperada (simplificada y truncada):
# User_Proxy (al manager): Escribe una función en Python...
# Coder (al manager): Aquí está el código:
# ```python
# def fibonacci(n):
# if n <= 0: return 0
# elif n == 1: return 1
# else:
# a, b = 0, 1
# for _ in range(2, n + 1):
# a, b = b, a + b
# return b
# ```
# Reviewer (al manager): Se ve bien, eficiente usando el enfoque iterativo. Aquí hay un caso de prueba:
# ```python
# # test_fibonacci.py
# import pytest
# from your_module import fibonacci # Suponiendo que el código está guardado en un módulo
# def test_fibonacci_zero(): assert fibonacci(0) == 0
# def test_fibonacci_one(): assert fibonacci(1) == 1
# def test_fibonacci_small_numbers():
# assert fibonacci(2) == 1
# assert fibonacci(3) == 2
# assert fibonacci(5) == 5
# def test_fibonacci_large_number():
# assert fibonacci(10) == 55
# ```
# User_Proxy (al manager): TERMINATE
Este ejemplo demuestra cómo AutoGen facilita un flujo de trabajo colaborativo, con agentes asumiendo roles distintos e intercambiando mensajes para alcanzar un objetivo común. El UserProxyAgent incluso puede ejecutar el código generado si está configurado para hacerlo.
Puntos fuertes y débiles
- Puntos fuertes: Excelente para colaboración multi-agente, orquestación de tareas impulsada por lenguaje natural, sólidas capacidades de ejecución de código, intuitivo para construir agentes conversacionales.
- Puntos débiles: Menos énfasis en el razonamiento interno complejo de agentes (como ReAct para un solo agente), puede ser menos directo para flujos de trabajo secuenciales profundamente anidados en comparación con las cadenas de LangChain, gestionar flujos de conversación complejos puede volverse complicado.
LlamaIndex: Aumento de Datos para LLMs
Si bien no es estrictamente un 'Agent SDK' en el mismo sentido que LangChain o AutoGen, LlamaIndex es indispensable para construir agentes que necesitan interactuar y razonar sobre grandes cantidades de datos privados o específicos de dominio. Se centra en la 'R' en RAG (Generación Aumentada por Recuperación).
Arquitectura y Conceptos Básicos
La arquitectura de LlamaIndex se centra en la ingesta de datos, indexación y consulta:
- Cargadores: Conectores a varias fuentes de datos (PDFs, bases de datos, APIs, etc.).
- Nodos: Fragmentos de datos ingeridos, a menudo con metadatos.
- Índices: Representaciones estructuradas de sus datos, optimizadas para recuperación (por ejemplo, VectorStoreIndex, KeywordTableIndex).
- Motores de Consulta: Interfaces para consultar índices, a menudo utilizando LLMs para síntesis.
- Recuperadores: Componentes que obtienen nodos relevantes de un índice en función de una consulta.
- Agentes: LlamaIndex también tiene su propia abstracción de agente, a menudo construida alrededor de un motor de consulta y herramientas, diseñada para interactuar con fuentes de datos.
Características Avanzadas y Ejemplo Práctico (Consultando Datos No Estructurados)
LlamaIndex destaca en la creación de agentes que pueden 'hablar' con sus datos. Vamos a crear un agente que puede responder preguntas basadas en una colección de documentos.
Ejemplo: Agente de Preguntas y Respuestas sobre Documentos
Suponga que tenemos un directorio data/ que contiene varios archivos de texto (por ejemplo, notas de reuniones, descripciones de productos).
import os
from llama_index.readers.simple import SimpleDirectoryReader
from llama_index.core import VectorStoreIndex, Settings
from llama_index.llms.openai import OpenAI
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.agent import AgentRunner
from llama_index.core.tools import QueryEngineTool, ToolMetadata
# 1. Cargar documentos desde un directorio
# Crear archivos de datos ficticios para demostración
if not os.path.exists("data"): os.makedirs("data")
with open("data/product_info.txt", "w") as f: f.write("El nuevo producto XYZ cuenta con una cámara de 12MP, pantalla OLED de 6.1 pulgadas y 256GB de almacenamiento. Cuesta $999.")
with open("data/company_policy.txt", "w") as f: f.write("Los empleados tienen derecho a 20 días de tiempo libre pagado por año. Todos los gastos de viaje deben ser aprobados previamente.")
documents = SimpleDirectoryReader("data").load_data()
# 2. Configurar el LLM y el modelo de Embedding (asegúrese de que OPENAI_API_KEY esté configurado)
Settings.llm = OpenAI(model="gpt-3.5-turbo", temperature=0)
Settings.embed_model = OpenAIEmbedding(model="text-embedding-ada-002")
# 3. Crear un VectorStoreIndex a partir de los documentos
index = VectorStoreIndex.from_documents(documents)
# 4. Crear un motor de consulta a partir del índice
query_engine = index.as_query_engine()
# 5. Definir el motor de consulta como una herramienta para el agente
query_engine_tool = QueryEngineTool(
query_engine=query_engine,
metadata=ToolMetadata(
name="document_qa_tool",
description="Puede responder preguntas sobre documentos de la empresa, información de productos y políticas."
),
)
# 6. Crear el Agente de LlamaIndex (utiliza OpenAI LLM por defecto si está configurado)
agent = AgentRunner(tools=[query_engine_tool], llm=Settings.llm, verbose=True)
# 7. Ejecutar el agente
response = agent.chat("¿Cuáles son las especificaciones del nuevo producto XYZ?")
print(response)
# Salida esperada:
# > Ingresando al bucle del agente.
# Pensamiento: El usuario está preguntando sobre las especificaciones del producto. Debería usar la `document_qa_tool` para consultar los documentos cargados.
# Llamada a la herramienta: document_qa_tool con args: {"query": "especificaciones del nuevo producto XYZ"}
# Respuesta: El nuevo producto XYZ cuenta con una cámara de 12MP, pantalla OLED de 6.1 pulgadas y 256GB de almacenamiento.
# > Bucle del agente terminado.
# El nuevo producto XYZ cuenta con una cámara de 12MP, pantalla OLED de 6.1 pulgadas y 256GB de almacenamiento.
response = agent.chat("¿Cuántos días de tiempo libre pagado tienen derecho los empleados?")
print(response)
# Salida esperada:
# > Ingresando al bucle del agente.
# Pensamiento: El usuario está preguntando sobre la política de la empresa respecto al tiempo libre pagado. Debería usar la `document_qa_tool` para consultar los documentos cargados.
# Llamada a la herramienta: document_qa_tool con args: {"query": "política de tiempo libre pagado"}
# Respuesta: Los empleados tienen derecho a 20 días de tiempo libre pagado por año.
# > Bucle del agente terminado.
# Los empleados tienen derecho a 20 días de tiempo libre pagado por año.
Este ejemplo destaca la fortaleza de LlamaIndex en hacer que los datos no estructurados sean consultables por los LLMs. El agente decide dinámicamente utilizar la document_qa_tool cuando se enfrenta a preguntas que pueden ser respondidas por los documentos ingeridos.
Puntos fuertes y débiles
- Puntos fuertes: Inigualable para RAG, sólidas capacidades de ingesta e indexación de datos, fuerte soporte para varias fuentes de datos y almacenes vectoriales, bueno para construir agentes aumentados por conocimiento.
- Puntos débiles: Menos enfocado en conversaciones complejas entre múltiples agentes o cadenas de razonamiento profundas y de múltiples pasos en comparación con LangChain/AutoGen (aunque puede integrarse con ellos), su abstracción de agente es principalmente para interactuar con datos.
Alternativas Emergentes y SDKs de Nicho
El espacio de agentes está evolucionando rápidamente, con nuevos SDKs y frameworks que surgen constantemente:
- CrewAI: Se basa en los conceptos de LangChain y AutoGen, proporcionando un marco más opinativo para definir roles, tareas y procesos para equipos multi-agente. Simplifica la orquestación de flujos de trabajo complejos con un enfoque en claras responsabilidades de los agentes.
- Haystack (Deepset): Si bien es principalmente un framework para construir sistemas de búsqueda, Haystack también soporta RAG y capacidades agentes. Es conocido por su enfoque modular y fuerte énfasis en la preparación para producción.
- Semantic Kernel (Microsoft): Un SDK ligero que permite a los desarrolladores integrar LLMs con lenguajes de programación tradicionales. Se centra en 'plugins' y 'skills' para extender las capacidades de LLM, ofreciendo un enfoque más centrado en el código para el desarrollo de agentes.
Elegir el SDK de Agente Correcto para tu Proyecto
El mejor SDK de Agente depende en gran medida de los requisitos específicos de tu proyecto:
- Para razonamiento complejo con un solo agente utilizando herramientas personalizadas y flujos de trabajo flexibles: LangChain es una excelente opción debido a su modularidad y amplias integraciones. Es la opción ideal para construir agentes sofisticados y autónomos.
- Para colaboración entre múltiples agentes, interfaces conversacionales y ejecución automatizada de tareas (especialmente las que involucran código): AutoGen brilla. Si tu problema se descompone naturalmente en roles que pueden conversar y actuar, AutoGen proporciona un marco poderoso.
- Para agentes que necesitan consultar y sintetizar información de vastos conjuntos de datos propietarios o no estructurados: LlamaIndex es indispensable. Es tu herramienta principal para construir agentes impulsados por RAG. A menudo, LlamaIndex se utiliza en conjunto con LangChain o AutoGen para proporcionar capacidades de recuperación de datos a sus agentes.
- Para flujos de trabajo multi-agente con roles y tareas definidas: Considera CrewAI para un enfoque más estructurado hacia agentes basados en equipos.
- Para integrar capacidades de LLM en aplicaciones existentes con un enfoque en 'habilidades' y complementos: Semantic Kernel podría ser una mejor opción, especialmente para desarrolladores de .NET.
Conclusión
El espacio del SDK de Agentes es dinámico y poderoso, ofreciendo un conjunto diverso de herramientas para dar vida a los agentes de IA. LangChain, AutoGen y LlamaIndex representan la vanguardia, cada uno con fortalezas distintas adaptadas a diferentes aspectos del desarrollo de agentes. Al comprender sus arquitecturas básicas, características avanzadas y aplicaciones prácticas, los desarrolladores pueden tomar decisiones informadas, combinar sus fortalezas y construir sistemas de agentes de IA altamente inteligentes, sólidos y escalables capaces de abordar desafíos complejos del mundo real. El futuro de la IA es cada vez más agentivo, y dominar estos SDK es clave para desbloquear su máximo potencial.
🕒 Published:
Related Articles
- Creazione di plugin per Agent: Suggerimenti, consigli ed esempi pratici per migliorare le capacità dell’IA
- Vergleich der SDKs für Agenten: Ein praktisches Tutorial zur Erstellung intelligenter Agenten
- Die Autonomie entfalten: Ein praktischer Leitfaden zu KI-Agenten-Toolkit mit einer Fallstudie
- LangChain vs AutoGen: Qual usar em produção