Introducción
¿Qué demonios es un Agente?
Conceptos relacionados con Agentes y LLMs
ReAct (Razonar + Actuar): [Sinergizando el Razonamiento y la Actuación en Modelos de Lenguaje](https: //arxiv.org/pdf/2210.03629)( Github)
Piensa en el Prompt y haz algo al respecto (¿o no?).
Auto-Refinamiento: [Refinamiento Iterativo con Auto-Retroalimentación](https: //arxiv.org/pdf/2303.17651)( Github)
Al recibir un prompt, tomar una acción de forma iterativa, inspeccionar sus resultados y tomar acciones adicionales según sea necesario para mejorar los resultados hasta que no se necesiten más mejoras o se cumpla alguna otra restricción para forzar una detención, luego devolver el resultado final.
Ingeniería de Flujo: [Generación de Código con AlphaCodium: De la Ingeniería de Prompts a la Ingeniería de Flujo](https: //arxiv.org/pdf/2401.08500)( Github)
Un flujo iterativo basado en pruebas, multi-etapa y orientado al código, que mejora el rendimiento de los LLM en problemas de código.
Marcos de Agentes
CrewAI: [Agentes de IA para casos de uso reales](https: //www.crewai.com/)
La mayoría de los marcos de agentes de IA son difíciles de usar. Ofrecemos potencia con simplicidad. Automatice sus flujos de trabajo más importantes rápidamente.
LangChain: [Agentes](https: //www.langchain.com/agents)
Construya la arquitectura cognitiva adecuada para su aplicación. Identifique e implemente las mejores estrategias y arquitecturas de prompting para que sus LLM funcionen según lo previsto.
Construyamos un Agente
¿Qué se necesita para construir un Agente impulsado por LLM?
-
Contexto: Información para el Agente (Rol, Objetivo, Datos Iniciales, etc.)
-
Prompt: Mensaje en lenguaje natural para dirigirse al Agente (Texto, Audio, etc.)
-
Python: Codifica la magia usando Instructor
-
Leer: Lee más para aprender sobre Agentes y programa
Recuperación de Información vs Generación de Datos vs Llamada a Funciones con la librería Python Instructor
Hasta ahora, hemos estado usando Instructor tanto para la Recuperación de Información como para la Generación de Datos como Datos Estructurados. Ahora profundizaremos en las capacidades más avanzadas de Llamada a Funciones de la librería Python Instructor. Para el bloc de notas, usaremos Marimo Notebooks.
Entonces, ¿dónde está la A?
Un agente es cualquier cosa que puede ser vista como percibiendo su entorno a través de sensores y actuando sobre ese entorno a través de actuadores -- Stuart Russel y Peter Norvig.
Tomado de Inteligencia Artificial: Un Enfoque Moderno Cuarta Edición
Perceptos
class SystemMessage(BaseModel):
role: Literal ["system"] = "system"
content: str
class UserMessage(BaseModel):
role: Literal ["user"] = "user"
content: str
class AssistantMessage(BaseModel):
role: Literal ["assistant"] = "assistant"
content: str
percept_seq: List [Union [SystemMessage, UserMessage, AssistantMessage]] = []
Tabla de acciones
class DefaultFunc(OpenAISchema):
response: str
def run(self):
msg = f"DefaultFunc->run: {self.response}"
return msg
class UserFunc(OpenAISchema):
name: str
age: int
def run(self):
msg = f"UserFunc->run: User's name is {self.name} and age is {self.age}"
return msg
toolbox = [DefaultFunc, UserFunc]
Acciones y Actuador
def actuate(self, tool_call: ChatCompletionMessageToolCall):
Func = next(iter([func for func in toolbox if func.__name__ == tool_call.function.name]))
if not Func:
available_function_names = [func.__name__ for func in toolbox]
err_msg = f"Error: Function {tool_call.function.name} not found. Available functions: {available_function_names}"
console.error(err_msg)
return err_msg
try:
console.log(f"Tool Call -> {tool_call.function.name} ->with {tool_call.function.arguments} of type {type(tool_call.function.arguments)}", style="bold blue")
args = from_json(tool_call.function.arguments)
console.log(f"Args -> {args} of type {type(args)}", style="bold blue")
func = Func.model_validate(args)
console.log(f"Func -> {repr(func)}", style="bold blue")
output = func.run()
return output
except Exception as e:
return f"Error: {e}"
Un intento de diseño de agente
Este diagrama ayuda a visualizar el flujo de acciones y pensamientos a través de los agentes, asegurando un enfoque estructurado e iterativo para alcanzar el resultado final.
Explicación- Inicio: Piensa en la instrucción: El proceso comienza con el agente considerando la instrucción dada.
-
Derivar entradas: El agente deriva las entradas necesarias para decidir qué herramienta(s) usar de la caja de herramientas.
-
Caja de herramientas: El agente tiene acceso a una caja de herramientas que contiene 5 herramientas diferentes. Basándose en las entradas derivadas, el agente selecciona una herramienta.
-
Pensar en los resultados de la herramienta: Después de usar la primera herramienta, el agente piensa en los resultados que obtuvo.
-
Invocación secuencial de herramientas: El agente puede decidir invocar una segunda e incluso una tercera herramienta basándose en los resultados intermedios.
-
Resultado final: Finalmente, el agente produce el resultado final después de procesar a través de las herramientas necesarias y los pasos de pensamiento intermedios.
#+begin_src python
from instructor import OpenAISchema
from getting_started_with_ai_agents.agents.club_bouncer import (
ClubBouncer,
Person,
Guest,
)
from getting_started_with_ai_agents.llm import gen_client, SystemMessage, UserMessage
client = gen_client()
class ClubSecurity(OpenAISchema):
""" Agente de seguridad para Club UbuntuTechHive. Ayuda al portero a gestionar la fila y verificar la lista de invitados siguiendo las reglas del club. Si la persona tiene al menos 21 años y tiene al menos $20 en efectivo, puede entrar al club. Si la persona está en la lista de invitados, puede entrar al club. Si la persona es VIP, debe tener al menos $1000 en efectivo para obtener servicio de mesa. """
name: str # name of the person
age: int # age of the person
cash: float # amount of cash the person has
is_on_guest_list: bool # whether the person is on the guest list
def run(self): person = Person( name=self.name, age=self.age, cash=self.cash, is_on_guest_list=self.is_on_guest_list, ) return person
class ClubHost(OpenAISchema): """ Anfitriona para el Club UbuntuTechHive. Cobra la entrada y asigna boletos a los invitados. Revisa la lista de invitados y asigna a los invitados a la fila VIP. Gestiona a los VIP y el servicio de mesa. Acepta VIP con al menos $1000 en efectivo y solicitudes de servicio de mesa. Acepta el pago por el servicio de mesa y asigna mesas a los VIP. Si la persona tiene dinero para un boleto, permítale comprar el boleto y márquela como que tiene un boleto usando una pulsera. Si el invitado está en la lista de invitados, márquelo como presente en la copia de la lista de invitados del club y déjelo entrar. Si el invitado tiene $1000 en efectivo, es un VIP, márquelo como VIP y luego llévelo a una mesa libre. """
name: str # nombre de la persona
age: int # edad de la persona
cash: float # cantidad de dinero en efectivo que tiene la persona
has_ticket: bool = False # si la persona tiene un boleto
is_on_guest_list: bool = False # si la persona está en la lista de invitados
is_vip: bool = False # si la persona es un VIP
def run(self): guest = Guest(
name=self.name,
age=self.age,
cash=self.cash,
has_ticket=self.has_ticket,
is_on_guest_list=self.is_on_guest_list,
is_vip=self.is_vip,
)
return guest
bouncer = ClubBouncer(
context= [
SystemMessage(
content=""" ¡Bienvenido al Club UbuntuTechHive! Soy el portero del club. Gestionaré la fila esta noche para el club. Decidiré quién puede entrar al club. Mis decisiones se basan en los siguientes criterios:
-
La persona debe tener al menos 21 años.
-
La persona debe tener al menos $20 en efectivo.
-
La persona debe tener un boleto o estar en la lista de invitados.""",
format="markdown"
)
]
) -
Habrá un cargo de $20 por entrada para aquellos sin boleto o que no estén en la lista de invitados.
-
Los VIP deben tener al menos $1000 en efectivo para obtener servicio de mesa.
-
El servicio de mesa está disponible para VIP solo si hay un número limitado de mesas disponibles.
-
Cuando no haya mesas disponibles, los VIP deben esperar en la fila VIP hasta que una mesa esté disponible. """ ) ], capacity=100, table_count=10, client=client, toolbox= [ClubSecurity, ClubHost],
)
ifname == "main": bouncer.manage_line( UserMessage( content=""" La persona es John Doe y tiene 25 años con $50 en efectivo. Están en la lista de invitados. """ ) )
bouncer.manage_line( UserMessage( content=""" Lambert tiene 21 años con $20 en efectivo. Quieren comprar un boleto. """ ) )
#+end_src
Conclusión
Este campo avanza rápidamente y hay pocos expertos. No tengas miedo de leer, aprender y programar para comprender. ¡Luego decide por ti mismo si adoptar una biblioteca que se adapte a tus necesidades o crear la tuya propia!
Referencias
-
ReAct (Reason + Act): Sinergizando el Razonamiento y la Actuación en Modelos de Lenguaje( Github)
-
Self-Refine: Refinamiento Iterativo con Auto-Retroalimentación( Github)
-
Flow Engineering: Generación de Código con AlphaCodium: De la Ingeniería de Prompts a la Ingeniería de Flujo( Github)
