Aprovechar las llamadas a funciones para crear aplicaciones LLM más inteligentes
Los modelos de lenguaje grandes (LLMs) ya no se limitan a generar texto; ahora manejan tareas más complejas e impulsadas por el contexto. Un avance clave en esta área es la llamada de funciones, que permite a los LLM interactuar con herramientas externas, bases de datos y API para realizar operaciones dinámicas. Esto les permite ir más allá de la generación de texto y trabajar con datos y servicios del mundo real.
En un reciente Berlin Unstructured Data Meetup organizado por Zilliz, Nikolai Danylchyk, ingeniero de clientes en Google, analizó cómo Gemini, un LLM moderno, utiliza la llamada de funciones para ampliar sus capacidades. Este blog resumirá sus ideas y demostrará cómo aprovechar esta potente función para crear aplicaciones LLM avanzadas. Si quieres conocer más detalles, te recomendamos que veas la repetición de la charla de Nikolai en YouTube.
Comprender la llamada avanzada de funciones en los LLM
Los LLM han evolucionado significativamente, pero su verdadero potencial brilla cuando interactúan con sistemas externos mediante llamadas de funciones. Esta capacidad permite a los LLM ir más allá de las limitaciones de sus datos de entrenamiento estáticos al consultar bases de datos en vivo, ejecutar comandos o realizar cálculos en tiempo real. Al integrar la llamada de funciones, los LLM pueden conectarse sin problemas con otros sistemas para ofrecer respuestas más precisas, actuales y dinámicas. Desglosemos cómo funciona la llamada de funciones usando Gemini como ejemplo.
Figura 1- Pasos de la llamada de funciones y componentes utilizados en tiempo de ejecución
Figura 1: Pasos de la llamada de funciones y componentes utilizados en tiempo de ejecución.
El proceso comienza cuando un usuario envía una solicitud a la API de Gemini. En este punto, el desarrollador ya ha definido una o más declaraciones de funciones dentro de la herramienta, informando a Gemini de las funciones disponibles y de cómo ejecutarlas. Una vez recibida la entrada del usuario, la API de Gemini analiza el contenido y el prompt, devolviendo una respuesta de "Function Call". Esta respuesta incluye datos estructurados, como el nombre de la función que debe llamarse y los parámetros relevantes.
El siguiente paso ocurre fuera del sistema Gemini: la aplicación utiliza el nombre de la función y los parámetros de la respuesta de Gemini para realizar una solicitud de API a un servicio externo. Aquí es donde interviene el desarrollador, utilizando herramientas como la biblioteca
requestsen Python para llamar a una API REST o cualquier otra biblioteca cliente adecuada a sus necesidades.Después de que el sistema externo devuelve su respuesta, la aplicación envía esos datos de vuelta a Gemini. Luego, el modelo utiliza esta nueva información para generar una respuesta final para el usuario. Si se requieren datos adicionales, Gemini puede emitir otra llamada de función, continuando el ciclo según sea necesario.
Para comprender la importancia de esta capacidad avanzada, considera un LLM tradicional sin la función de llamada de funciones. Sus respuestas se generan en función de los datos con los que fue entrenado, que pueden estar desactualizados o tener un alcance limitado. Sin embargo, con las llamadas de funciones, un LLM puede emitir comandos para obtener información en tiempo real de una base de datos, actualizar un registro en un sistema de gestión de relaciones con clientes (CRM) o incluso activar acciones como reservar un billete o realizar un pedido. Este enfoque amplía la utilidad del modelo, pasando de simplemente generar respuestas a realizar tareas.
En términos técnicos, una llamada a función en un LLM implica una interacción estructurada entre el modelo y una API o servicio externo. El modelo identifica un escenario adecuado en el que se requiere una llamada a función, formula los parámetros para la llamada y la ejecuta.
Por ejemplo, si un usuario pregunta: “¿Cuál es el clima en Berlín?” La llamada a función activaría una API del clima, recuperando datos en tiempo real para generar la respuesta. En este caso, el LLM actúa como un intermediario inteligente entre el usuario y el sistema externo, orquestando una interacción más precisa y útil.
Ahora que hemos explorado el concepto básico de las llamadas a función, veamos una implementación práctica usando Gemini para interactuar con una API del mundo real: recuperar tipos de cambio de divisas.
Ejemplo: Uso de llamadas a función para recuperar tipos de cambio de divisas
Veamos cómo podemos utilizar una API de tipos de cambio de divisas mediante llamadas a función de Gemini:
Instalación de las bibliotecas necesarias y Configuración de variables del proyecto
Comencemos actualizando e instalando la biblioteca google-cloud-aiplatform, que se necesita para interactuar con la plataforma Vertex AI de Google Cloud. Luego, proporciona tu ID de proyecto y ubicación como variables.
!pip3 install --upgrade --user --quiet google-cloud-aiplatform
PROJECT_ID = "[your-project-id]" # @param {type:"string"}
LOCATION = "us-central1" # @param {type:"string"}
Estos son marcadores de posición para identificar con qué proyecto y región en Google Cloud estás trabajando.
Importación de módulos necesarios y definición del modelo generativo
Luego, importa los módulos requeridos para definir y trabajar con un modelo generativo de Vertex AI. La biblioteca requests se usará más adelante para obtener datos de una API externa.
import requests
from vertexai.generative_models import (
Content,
FunctionDeclaration,
GenerativeModel,
Part,
Tool,
)
model = GenerativeModel("gemini-1.5-pro-001")
La última línea inicializa un modelo generativo, en este caso, gemini-1.5-pro-001. Más adelante usarás el modelo para generar respuestas basadas en el prompt de entrada.
Definición de una función para tipos de cambio de divisas y creación de una herramienta
A continuación, crea una función que describa los parámetros necesarios para obtener un tipo de cambio entre dos divisas y envuélvela en una herramienta.
get_exchange_rate_func = FunctionDeclaration(
name="get_exchange_rate",
description="Get the exchange rate for currencies between countries",
parameters={
"type": "object",
"properties": {
"currency_date": {
"type": "string",
"description": "A date that must always be in YYYY-MM-DD format or the value 'latest' if a time period is not specified"
},
"currency_from": {
"type": "string",
"description": "The currency to convert from in ISO 4217 format"
},
"currency_to": {
"type": "string",
"description": "The currency to convert to in ISO 4217 format"
}
},
"required": [
"currency_from",
"currency_date",
]
},
)
exchange_rate_tool = Tool(
function_declarations=[get_exchange_rate_func],
)
Los parámetros incluyen currency_date (en formato YYYY-MM-DD o la palabra clave latest), currency_from (el código ISO 4217 de la divisa desde la que se convierte) y currency_to (el código ISO 4217 de la divisa a la que se convierte). La sección required especifica que currency_from y currency_date son obligatorios. Luego definimos una herramienta llamada exchange_rate_tool, que envuelve la declaración de la función get_exchange_rate. Más adelante pasaremos esta herramienta al modelo para gestionar la recuperación de tipos de cambio.
Generación de una respuesta con el modelo y extracción de parámetros de la respuesta
Ahora invoquemos una respuesta pasando un prompt al modelo. Esperamos que el modelo genere una respuesta que contenga una llamada a función con parámetros.
prompt = """What is the exchange rate from Australian dollars to Swedish krona?
How much is 500 Australian dollars worth in Swedish krona?"""
response = model.generate_content(
prompt,
tools=[exchange_rate_tool],
)
response.candidates[0].content
params = {}
for key, value in response.candidates[0].content.parts[0].function_call.args.items():
params[key[9:]] = value
params
El código anterior define un prompt que pregunta por el tipo de cambio entre dólares australianos y coronas suecas. Luego se llama al modelo usando generate_content, pasando el prompt junto con exchange_rate_tool. El modelo intentará generar una respuesta.
Luego se analiza la respuesta. El diccionario params se completa iterando por las claves y los valores de function_call.args y eliminando los primeros 9 caracteres de la clave para que coincida con los nombres de parámetros esperados.
Obtener tipos de cambio desde una API y dar una respuesta al usuario
Ahora solicitemos la API de Frankfurter (una API gratuita de tipos de cambio) usando los parámetros extraídos de la respuesta anterior y generemos una respuesta para el usuario.
import requests
url = f"https://api.frankfurter.app/{params['date']}"
api_response = requests.get(url, params=params)
api_response.text
response = model.generate_content(
[
Content(role="user", parts=[
Part.from_text(prompt + """Give your answer in steps with lots of detail
and context, including the exchange rate and date."""),
]),
Content(role="function", parts=[
Part.from_dict({
"function_call": {
"name": "get_exchange_rate",
}
})
]),
Content(role="function", parts=[
Part.from_function_response(
name="get_exchange_rate",
response={
"content": api_response.text,
}
)
]),
],
tools=[exchange_rate_tool],
)
response.candidates[0].content.parts[0].text
En el código anterior, una vez que obtenemos una respuesta de la API de tipos de cambio, llamamos de nuevo al método generate_content, esta vez pasando varios contenidos: uno del usuario (que solicita pasos detallados y contexto), una llamada de función a get_exchange_rate y la respuesta de la API de Frankfurter. Esta combinación impulsa al modelo a dar una respuesta más completa y paso a paso. Finalmente imprimimos la parte de texto del contenido generado por el modelo. Esta es la respuesta que devolvemos al usuario.
Aquí hay una respuesta de ejemplo:
Figura 2- Salida de un programa que muestra el tipo de cambio de dólares australianos a coronas suecas
Figura 2: Salida de un programa que muestra el tipo de cambio de dólares australianos a coronas suecas
La respuesta muestra que la llamada de función funcionó y nos dio el tipo de cambio actual según lo listado por la API de Frankfurter.
Hasta ahora, hemos cubierto las llamadas a funciones, la característica avanzada de Gemini y muchos otros LLM. Si bien las llamadas a funciones por sí solas pueden realizar tareas complejas como la recuperación de divisas, su verdadero potencial se realiza cuando se combinan con otras técnicas potentes, como Retrieval Augmented Generation (RAG).
Combinar llamadas a funciones con generación aumentada por recuperación (RAG) para una interactividad mejorada
La generación aumentada por recuperación (RAG) se ha convertido en una de las tendencias más significativas en el procesamiento del lenguaje natural (NLP). Los sistemas RAG combinan las capacidades generativas de los LLM con la eficiencia de los sistemas de recuperación impulsados por bases de datos vectoriales como Milvus y Zilliz Cloud (el Milvus gestionado). Específicamente, en un sistema RAG, la base de datos vectorial recupera información contextual para el LLM, y luego el LLM genera una respuesta más precisa basada en la información recuperada. La llamada a funciones mejora este proceso al permitir una interacción más dinámica entre el LLM y bases de datos o sistemas externos. Con la incorporación de llamadas a funciones, los LLM pueden ampliar sus capacidades no solo recuperando datos relevantes, sino también procesándolos e interactuando con ellos en tiempo real.
Por ejemplo, en una aplicación de atención al cliente que utiliza tanto RAG como llamadas a funciones, el LLM ofrece una interacción más rica y personalizada. Cuando un usuario pregunta: “¿Dónde está mi pedido reciente?” El sistema primero emplea RAG para recuperar información general sobre el procesamiento de pedidos desde la base de datos vectorial Milvus, proporcionando contexto. Por ejemplo, la información recuperada es “los pedidos suelen tardar entre 3 y 5 días hábiles en entregarse.” Simultáneamente, mediante la llamada a funciones, accede a datos en tiempo real consultando la cuenta del cliente. La respuesta final se convierte en: “Su pedido #12345 fue enviado el 10 de septiembre y se espera que llegue el 15 de septiembre.”
Esta integración de RAG con la llamada a funciones crea un sistema dinámico que no solo genera respuestas relevantes e informativas, sino que también interactúa activamente con datos y servicios en vivo, aportando una dimensión interactiva. Esta combinación hace que los agentes inteligentes impulsados por LLM sean capaces de realizar interacciones complejas del mundo real.
- Consulte este tutorial para obtener una guía paso a paso sobre cómo aprovechar las capacidades de llamada a funciones de los LLM para mejorar los sistemas RAG.
Casos de uso de combinar RAG y llamada a funciones
Veamos varias de estas interacciones del mundo real.
Atención médica: recuperación de historiales médicos y programación de citas
En la atención médica, RAG combinado con la llamada a funciones permite que los LLM proporcionen soporte altamente personalizado y basado en datos tanto para pacientes como para proveedores de atención médica. Un médico podría pedirle al sistema los datos históricos de un paciente, mientras el sistema recupera historiales médicos relevantes usando RAG desde una base de datos vectorial como Milvus. Al mismo tiempo, mediante la llamada a funciones, el LLM puede interactuar con sistemas hospitalarios externos para programar citas de seguimiento o recuperar datos diagnósticos en tiempo real.
Ejemplo: Un médico pregunta: “¿Cuál es el último resultado de la prueba del paciente X y puedes reservar una cita de seguimiento para la próxima semana?” El sistema primero consulta Milvus para recuperar documentos relacionados del historial del paciente, proporcionando información sobre tendencias y condiciones. Luego, utiliza la llamada a funciones para acceder a la API de programación del hospital y reservar una cita para el paciente.
Finanzas: perspectivas de inversión personalizadas y transacciones en tiempo real
En el sector financiero, RAG se emplea para recuperar información de mercado relevante y datos financieros históricos almacenados en bases de datos vectoriales como Milvus. Al combinar esto con la llamada a funciones, un LLM también puede realizar acciones en tiempo real, como comprar o vender acciones, transferir fondos o generar recomendaciones de cartera personalizadas basadas en datos en vivo.
Ejemplo: Un usuario pregunta: “¿Cómo se ha comportado mi cartera en los últimos seis meses, y puedes comprar $1000 en acciones de Apple?” El sistema primero usa RAG para recuperar el historial de la cartera del usuario desde Milvus, proporcionando un resumen del rendimiento pasado. Luego, usando llamadas a funciones, interactúa con una API de trading para ejecutar la compra de acciones y confirmar la transacción al usuario.
Comercio electrónico: Recomendaciones de productos y seguimiento de pedidos en tiempo real
En el comercio electrónico, RAG puede ayudar a recuperar información de productos, reseñas o historial del cliente desde Milvus para personalizar una experiencia de compra. Cuando se combina con llamadas a funciones, el sistema puede interactuar con sistemas de inventario en vivo para proporcionar disponibilidad de stock, rastrear pedidos en tiempo real o incluso procesar pagos.
Ejemplo: Un cliente pregunta, ¿Puedes recomendarme una laptop similar a mi última compra y decirme cuándo llegará mi pedido actual? El LLM recupera información sobre las compras anteriores del cliente desde Milvus y recomienda un producto similar. Luego se usan llamadas a funciones para consultar la API de seguimiento de pedidos y proporcionar actualizaciones en tiempo real sobre el estado de entrega del pedido actual.
Viajes: Sugerencias de itinerarios y gestión de reservas
En viajes y hospitalidad, RAG puede obtener detalles sobre destinos, hoteles e itinerarios de viaje almacenados en una base de datos vectorial como Milvus. Combinado con llamadas a funciones, el sistema puede gestionar reservas, sugerir itinerarios personalizados u ofrecer actualizaciones en tiempo real sobre vuelos y reservas.
Ejemplo: Un viajero pregunta, ¿Puedes sugerirme un itinerario de 5 días en Italia y reprogramar mi reserva de hotel para una fecha anterior? El sistema primero recupera sugerencias de itinerarios desde Milvus basadas en las preferencias y viajes anteriores del viajero. Luego, usa llamadas a funciones para interactuar con el sistema de reservas del hotel, modificar la reserva y confirmar el cambio con el usuario.
A medida que vemos cómo las llamadas a funciones mejoran sistemas como RAG, es importante reconocer los desafíos y beneficios prácticos al implementar dichas tecnologías en aplicaciones del mundo real.
Desafíos y beneficios de las llamadas a funciones en casos de uso del mundo real
Si bien el potencial de las llamadas a funciones es inmenso, viene con su propio conjunto de desafíos. Una de las principales preocupaciones es garantizar la seguridad y privacidad de las interacciones. Cuando un LLM emite llamadas a funciones, puede requerir acceso a datos sensibles, como cuentas de usuario o información financiera. Garantizar que estas transacciones sean seguras y cumplan con las regulaciones de privacidad de datos es crucial.
Además, la complejidad de gestionar múltiples llamadas a funciones en un solo flujo de trabajo puede provocar problemas de latencia. Por ejemplo, si un LLM emite varias llamadas a funciones a diferentes sistemas, el tiempo de respuesta puede aumentar, lo que potencialmente afecta la experiencia del usuario. Esto es particularmente importante en aplicaciones en tiempo real donde la velocidad es crítica.
En el lado positivo, las llamadas a funciones ofrecen varios beneficios, incluyendo automatización mejorada de tareas, respuestas en tiempo real más precisas y una mejor interacción con el usuario. En industrias como la salud, las finanzas y el servicio al cliente, las llamadas a funciones pueden optimizar las operaciones mediante la automatización de tareas rutinarias. Por ejemplo, en salud, un LLM podría recuperar historiales de pacientes, programar citas y enviar recordatorios mediante llamadas a funciones, liberando tiempo para que los profesionales médicos se centren en casos más complejos.
Más allá de los beneficios y desafíos prácticos, existen consideraciones éticas y técnicas que no deben pasarse por alto, particularmente en torno a la seguridad de los datos y la fiabilidad del sistema.
Consideraciones éticas y técnicas
Desde un punto de vista técnico, nosotros, como desarrolladores, debemos gestionar cuidadosamente cómo se implementan las llamadas a funciones para evitar posibles dificultades. Un problema común es la dependencia excesiva de sistemas externos. Si un LLM emite constantemente llamadas a funciones a servicios de terceros, la fiabilidad del sistema pasa a depender del tiempo de actividad y el rendimiento de esos servicios. Deben existir mecanismos adecuados de gestión de errores y de respaldo para garantizar que el sistema siga funcionando sin problemas, incluso cuando los servicios externos no estén disponibles.
Éticamente, las llamadas a funciones plantean preocupaciones sobre la transparencia y el consentimiento del usuario. Si un LLM toma decisiones o realiza acciones en nombre de un usuario, es esencial que el usuario sea plenamente consciente de lo que está haciendo el sistema. Por ejemplo, en servicios financieros, si un LLM ejecuta operaciones o transfiere fondos, los usuarios deben ser informados sobre las acciones que se están llevando a cabo y deben tener la capacidad de intervenir si es necesario. Una documentación clara y mecanismos de consentimiento del usuario son fundamentales para mantener la confianza en dichos sistemas.
Otra preocupación ética gira en torno al uso de datos. Cuando las llamadas a funciones acceden a datos personales o sensibles, deben existir medidas estrictas para proteger la privacidad del usuario. Los desarrolladores deben asegurarse de que los datos se manejen de manera responsable y de que las llamadas a funciones cumplan con regulaciones de privacidad como GDPR o HIPAA.
Conclusión
Nikolai hizo un trabajo fantástico al arrojar luz sobre cómo las llamadas a funciones ofrecen una mejora crítica a los modelos de lenguaje grandes, permitiéndoles realizar tareas del mundo real al interactuar con sistemas y datos externos. Ya sea recuperar tipos de cambio de divisas o impulsar interacciones más complejas mediante Retrieval-Augmented Generation (RAG), las llamadas a funciones amplían los horizontes de lo que los LLM pueden lograr.
Lecturas adicionales
Sigue leyendo

How to Install and Run OpenClaw (Previously Clawdbot/Moltbot) on Mac
Turn your Mac into an AI gateway for WhatsApp, Telegram, Discord, iMessage, and more — in under 5 minutes.

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

DeepRAG: Thinking to Retrieval Step by Step for Large Language Models
Discover DeepRAG, an advanced retrieval-augmented generation (RAG) model that improves LLM accuracy by retrieving only essential data through step-by-step reasoning.


