(Haz clic en la imagen arriba para ver el video de esta lección)
Las herramientas son interesantes porque permiten que los agentes de IA tengan un rango más amplio de capacidades. En lugar de que el agente tenga un conjunto limitado de acciones que puede realizar, al agregar una herramienta, el agente ahora puede realizar una amplia gama de acciones. En este capítulo, analizaremos el Patrón de Diseño de Uso de Herramientas, que describe cómo los agentes de IA pueden usar herramientas específicas para alcanzar sus objetivos.
En esta lección, buscamos responder las siguientes preguntas:
Después de completar esta lección, podrás:
El Patrón de Diseño de Uso de Herramientas se centra en dotar a los modelos de lenguaje grande (LLMs) de la capacidad de interactuar con herramientas externas para lograr objetivos específicos. Las herramientas son código que puede ser ejecutado por un agente para realizar acciones. Una herramienta puede ser una función simple como una calculadora, o una llamada API a un servicio de terceros como consulta de precios de acciones o pronóstico del clima. En el contexto de agentes de IA, las herramientas están diseñadas para ser ejecutadas por agentes en respuesta a llamadas de función generadas por el modelo.
Los agentes de IA pueden aprovechar las herramientas para completar tareas complejas, recuperar información o tomar decisiones. El patrón de diseño de uso de herramientas se usa a menudo en escenarios que requieren interacción dinámica con sistemas externos, como bases de datos, servicios web o intérpretes de código. Esta capacidad es útil para varios casos de uso diferentes, incluyendo:
Estos bloques constructores permiten que el agente de IA realice una amplia gama de tareas. Veamos los elementos clave necesarios para implementar el Patrón de Diseño de Uso de Herramientas:
Esquemas de Funciones/Herramientas: Definiciones detalladas de las herramientas disponibles, incluyendo nombre de función, propósito, parámetros requeridos y salidas esperadas. Estos esquemas permiten que el LLM entienda qué herramientas están disponibles y cómo construir solicitudes válidas.
Lógica de Ejecución de Funciones: Rige cómo y cuándo se invocan las herramientas basándose en la intención del usuario y el contexto de la conversación. Esto puede incluir módulos planificadores, mecanismos de enrutamiento o flujos condicionales que determinan el uso dinámico de herramientas.
Sistema de Manejo de Mensajes: Componentes que gestionan el flujo conversacional entre entradas del usuario, respuestas del LLM, llamadas a herramientas y salidas de herramientas.
Marco de Integración de Herramientas: Infraestructura que conecta al agente con diversas herramientas, sean funciones simples o servicios externos complejos.
Manejo de Errores y Validación: Mecanismos para manejar fallos en la ejecución de herramientas, validar parámetros y gestionar respuestas inesperadas.
Gestión de Estado: Rastrea el contexto de la conversación, interacciones previas con herramientas y datos persistentes para asegurar consistencia a lo largo de interacciones de múltiples turnos.
A continuación, analicemos el Llamado a Funciones/Herramientas con más detalle.
El llamado a funciones es la forma principal en que habilitamos a los Modelos de Lenguaje Grande (LLMs) para interactuar con herramientas. A menudo verás que ‘Función’ y ‘Herramienta’ se usan indistintamente porque las ‘funciones’ (bloques de código reutilizable) son las ‘herramientas’ que los agentes usan para realizar tareas. Para que se invoque el código de una función, un LLM debe comparar la solicitud del usuario contra la descripción de las funciones. Para hacer esto, se envía un esquema que contiene las descripciones de todas las funciones disponibles al LLM. El LLM entonces selecciona la función más apropiada para la tarea y devuelve su nombre y argumentos. La función seleccionada se invoca, su respuesta se envía de vuelta al LLM, que usa la información para responder a la solicitud del usuario.
Para que los desarrolladores implementen el llamado a funciones para agentes, necesitarán:
Usemos el ejemplo de obtener la hora actual en una ciudad para ilustrar:
Inicializar un LLM que soporte llamado a funciones:
No todos los modelos soportan el llamado a funciones, por lo que es importante verificar que el LLM que usas lo haga. Azure OpenAI soporta el llamado a funciones. Podemos comenzar iniciando el cliente de Azure OpenAI.
# Inicializar el cliente de Azure OpenAI
client = AzureOpenAI(
azure_endpoint = os.getenv("AZURE_AI_PROJECT_ENDPOINT"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
api_version="2024-05-01-preview"
)
Crear un Esquema de Función:
Luego definiremos un esquema JSON que contiene el nombre de la función, descripción de lo que hace la función, y los nombres y descripciones de los parámetros de la función. Después tomaremos este esquema y lo pasaremos al cliente creado previamente, junto con la solicitud del usuario para encontrar la hora en San Francisco. Es importante notar que lo que se devuelve es una llamada a herramienta, no la respuesta final a la pregunta. Como se mencionó anteriormente, el LLM devuelve el nombre de la función que seleccionó para la tarea y los argumentos que se le pasarán.
# Descripción de la función para que el modelo lea
tools = [
{
"type": "function",
"function": {
"name": "get_current_time",
"description": "Get the current time in a given location",
"parameters": {
"type": "object",
"properties": {
"location": {
"type": "string",
"description": "The city name, e.g. San Francisco",
},
},
"required": ["location"],
},
}
}
]
# Mensaje inicial del usuario
messages = [{"role": "user", "content": "What's the current time in San Francisco"}]
# Primera llamada API: Pedir al modelo que use la función
response = client.chat.completions.create(
model=deployment_name,
messages=messages,
tools=tools,
tool_choice="auto",
)
# Procesar la respuesta del modelo
response_message = response.choices[0].message
messages.append(response_message)
print("Model's response:")
print(response_message)
Model's response:
ChatCompletionMessage(content=None, role='assistant', function_call=None, tool_calls=[ChatCompletionMessageToolCall(id='call_pOsKdUlqvdyttYB67MOj434b', function=Function(arguments='{"location":"San Francisco"}', name='get_current_time'), type='function')])
El código de función necesario para realizar la tarea:
Ahora que el LLM ha escogido qué función necesita ejecutarse, el código que realiza la tarea debe ser implementado y ejecutado. Podemos implementar el código para obtener la hora actual en Python. También necesitaremos escribir el código para extraer el nombre y argumentos del response_message para obtener el resultado final.
def get_current_time(location):
"""Get the current time for a given location"""
print(f"get_current_time called with location: {location}")
location_lower = location.lower()
for key, timezone in TIMEZONE_DATA.items():
if key in location_lower:
print(f"Timezone found for {key}")
current_time = datetime.now(ZoneInfo(timezone)).strftime("%I:%M %p")
return json.dumps({
"location": location,
"current_time": current_time
})
print(f"No timezone data found for {location_lower}")
return json.dumps({"location": location, "current_time": "unknown"})
# Manejar llamadas a funciones
if response_message.tool_calls:
for tool_call in response_message.tool_calls:
if tool_call.function.name == "get_current_time":
function_args = json.loads(tool_call.function.arguments)
time_response = get_current_time(
location=function_args.get("location")
)
messages.append({
"tool_call_id": tool_call.id,
"role": "tool",
"name": "get_current_time",
"content": time_response,
})
else:
print("No tool calls were made by the model.")
# Segunda llamada a la API: Obtener la respuesta final del modelo
final_response = client.chat.completions.create(
model=deployment_name,
messages=messages,
)
return final_response.choices[0].message.content
get_current_time called with location: San Francisco
Timezone found for san francisco
The current time in San Francisco is 09:24 AM.
El llamado a funciones está en el corazón de la mayoría, si no de todos, los diseños de uso de herramientas para agentes; sin embargo, implementarlo desde cero puede ser a veces un desafío. Como aprendimos en Lección 2, los marcos agenticos nos proveen bloques constructores preconstruidos para implementar el uso de herramientas.
Aquí hay algunos ejemplos de cómo puedes implementar el Patrón de Diseño de Uso de Herramientas usando diferentes marcos agenticos:
Microsoft Agent Framework es un marco de IA de código abierto para construir agentes de IA. Simplifica el proceso de usar el llamado a funciones permitiendo que definas herramientas como funciones en Python con el decorador @tool. El marco maneja la comunicación de ida y vuelta entre el modelo y tu código. También proporciona acceso a herramientas preconstruidas como Búsqueda de Archivos e Intérprete de Código a través del AzureAIProjectAgentProvider.
El siguiente diagrama ilustra el proceso de llamado a funciones con Microsoft Agent Framework:

En el Microsoft Agent Framework, las herramientas se definen como funciones decoradas. Podemos convertir la función get_current_time que vimos anteriormente en una herramienta usando el decorador @tool. El marco automáticamente serializará la función y sus parámetros, creando el esquema para enviar al LLM.
from agent_framework import tool
from agent_framework.azure import AzureAIProjectAgentProvider
from azure.identity import AzureCliCredential
@tool
def get_current_time(location: str) -> str:
"""Get the current time for a given location"""
...
# Crear el cliente
provider = AzureAIProjectAgentProvider(credential=AzureCliCredential())
# Crear un agente y ejecutarlo con la herramienta
agent = await provider.create_agent(name="TimeAgent", instructions="Use available tools to answer questions.", tools=get_current_time)
response = await agent.run("What time is it?")
Azure AI Agent Service es un marco agentico más reciente diseñado para capacitar a los desarrolladores a construir, desplegar y escalar agentes de IA de alta calidad y extensibles de forma segura sin necesidad de gestionar los recursos subyacentes de cómputo y almacenamiento. Es particularmente útil para aplicaciones empresariales puesto que es un servicio completamente gestionado con seguridad de nivel empresarial.
Comparado con desarrollar directamente con la API de LLM, Azure AI Agent Service ofrece algunas ventajas, incluyendo:
Las herramientas disponibles en Azure AI Agent Service pueden dividirse en dos categorías:
El Agent Service nos permite usar estas herramientas juntas como un conjunto de herramientas (toolset). También utiliza threads que rastrean el historial de mensajes de una conversación particular.
Imagina que eres un agente de ventas en una empresa llamada Contoso. Quieres desarrollar un agente conversacional que pueda responder preguntas sobre tus datos de ventas.
La siguiente imagen ilustra cómo podrías usar Azure AI Agent Service para analizar tus datos de ventas:

Para usar cualquiera de estas herramientas con el servicio podemos crear un cliente y definir una herramienta o conjunto de herramientas. Para implementar esto prácticamente, podemos usar el siguiente código en Python. El LLM podrá observar el conjunto de herramientas y decidir si usar la función creada por el usuario, fetch_sales_data_using_sqlite_query, o el Intérprete de Código preconstruido según la solicitud del usuario.
import os
from azure.ai.projects import AIProjectClient
from azure.identity import DefaultAzureCredential
from fetch_sales_data_functions import fetch_sales_data_using_sqlite_query # función fetch_sales_data_using_sqlite_query que se puede encontrar en un archivo fetch_sales_data_functions.py.
from azure.ai.projects.models import ToolSet, FunctionTool, CodeInterpreterTool
project_client = AIProjectClient.from_connection_string(
credential=DefaultAzureCredential(),
conn_str=os.environ["PROJECT_CONNECTION_STRING"],
)
# Inicializar conjunto de herramientas
toolset = ToolSet()
# Inicializar agente de llamada de función con la función fetch_sales_data_using_sqlite_query y agregarla al conjunto de herramientas
fetch_data_function = FunctionTool(fetch_sales_data_using_sqlite_query)
toolset.add(fetch_data_function)
# Inicializar herramienta Code Interpreter y agregarla al conjunto de herramientas.
code_interpreter = code_interpreter = CodeInterpreterTool()
toolset.add(code_interpreter)
agent = project_client.agents.create_agent(
model="gpt-4o-mini", name="my-agent", instructions="You are helpful agent",
toolset=toolset
)
Una preocupación común con el SQL generado dinámicamente por LLMs es la seguridad, particularmente el riesgo de inyección SQL o acciones maliciosas, como eliminar o manipular la base de datos. Si bien estas preocupaciones son válidas, pueden mitigarse eficazmente configurando adecuadamente los permisos de acceso a la base de datos. Para la mayoría de las bases de datos, esto implica configurarlas como solo lectura. Para servicios de base de datos como PostgreSQL o Azure SQL, la aplicación debería tener asignado un rol de solo lectura (SELECT).
Ejecutar la aplicación en un entorno seguro mejora aún más la protección. En escenarios empresariales, los datos típicamente se extraen y transforman desde sistemas operacionales a una base de datos o almacén de datos de solo lectura con un esquema amigable. Este enfoque asegura que los datos estén seguros, optimizados para rendimiento y accesibilidad, y que la aplicación tenga acceso restringido y solo de lectura.
Únete a Microsoft Foundry Discord para reunirte con otros aprendices, asistir a horas de oficina y resolver tus preguntas sobre Agentes de IA.
Comprendiendo los Patrones de Diseño Agenticos
Descargo de responsabilidad:
Este documento ha sido traducido utilizando el servicio de traducción automática Co-op Translator. Aunque nos esforzamos por la precisión, tenga en cuenta que las traducciones automáticas pueden contener errores o imprecisiones. El documento original en su idioma nativo debe considerarse la fuente autorizada. Para información crítica, se recomienda una traducción profesional realizada por humanos. No nos hacemos responsables por malentendidos o interpretaciones erróneas derivadas del uso de esta traducción.