Potencia las capacidades de la IA entregándole herramientas (tool calling) basadas en R
Enseña a la IA a usar R para potenciar sus capacidades
26/4/2026
La inteligencia artificial no lo sabe todo. Y lo que no sabe, lo inventa. Es demasiado importante conocer las limitaciones de las herramientas de inteligencia artificial para poder hacer buen uso de ellas.
Por ejemplo, la IA puede saber mucho sobre Chile, pero no sabe con exactitud todos los datos de la población de todos sus territorios. Veamos un caso:
Poniendo a prueba el conocimiento de la IA
Hagamos una consulta por un dato específico primero, y luego sobre población chilena al modelo Claude Haiku de Anthropic.
Como somos usuarixs de R hablaremos con la IA desde R. Tenemos que tener configurado un modelo de inteligencia artificial (LLM) en R, y luego iniciamos el chat con la IA:
library(ellmer)
# iniciar modelo
chat <- chat_anthropic(
model = "claude-haiku-4-5"
)
Con el modelo iniciado, le hacemos la pregunta:
chat$chat("Cuál es la población de Curanilahue?")
El modelo responde:
Curanilahue es una comuna ubicada en la región del Bío Bío, en Chile. Según el Censo de 2017, su población era de aproximadamente 25.000 habitantes.
Esta información no es solo desactualizada, sino también incorrecta 😔
Esto es porque, por muchos billones de parámetros que tenga un modelo, es imposible que lo sepa todo. Muchas veces los mismos modelos recomiendan buscar información en las fuentes oficiales, como corresponde.
Contenidos mínimos
¿Qué pasa si pudiéramos entregarle los datos correctos al modelo de lenguaje?
Esto es posible mediante el uso de herramientas (tool calling), que, como su nombre indica, es la capacidad de ciertos modelos de inteligencia artificial de poder recibir herramientas para poder usarlas cuando sean necesarias.
Esto significa que podemos crear funciones de R y entregárselas a la inteligencia artificial para que las use! 😮
Herramienta: consultar datos del Censo desde R
En
este repositorio creé una función de R llamada consultar_censo(), que permite obtener datos de población del Censo 2024 en distintos niveles territoriales (país, región, provincia, comuna), y en distintas desagregaciones (total, sexo, grupos de edad).
Para poder usarla en tu sesión de R, clona el repositorio, o descarga el script consultar_censo.R y el archivo censo.rds y ponlos en tu proyecto de R.
La función se usa así:
consultar_censo(
nivel = "Comuna",
territorio = "Curanilahue")
→ datos a nivel comuna, Curanilahue
ℹ población censada: 31.119
[1] 31119
La función consultar_censo() es útil para un ser humano, pero queremos que la IA pueda usarla también para que use esta información en sus respuestas.
Entregarle herramientas a la IA
Para hacer que la IA use funciones de R, primero hay que tener una función, describírsela a la IA, y entregársela.
Registrar una herramienta
Vamos a registrar la herramienta para que el modelo sepa de su existencia con la función tool() del
paquete {ellmer}.
Dentro de tool() ponemos la función, una descripción de su uso, y también explicamos cómo se usa cada argumento de la función, incluyendo los valores esperados. De esta forma, la inteligencia artificial aprenderá a usar la función correctamente.
Por ejemplo:
herramienta_censo <- tool(
consultar_censo,
description = "Entrega la población a nivel de país, región, provincia o comuna, y según grupos de edad y/o sexo, a partir de datos del Censo 2024.",
arguments = list(
nivel = # explicar cómo se usa…
…
)
)
Ver código completo para registrar la función consultar_censo()
# crear herramienta
herramienta_censo <- tool(
consultar_censo,
description = "Permite obtener la población según datos del Censo 2024 a nivel de país, región, provincia o comuna, y según grupos de edad y/o sexo",
# explicar uso de argumentos
arguments = list(
nivel = type_enum(
required = TRUE,
values = c("País", "Región", "Provincia", "Comuna"),
description = "Nivel de la información sobre población, desde País (el más general) a Comuna (el más específico)"
),
edad = type_enum(
required = FALSE,
values = c("Total", "0 a 4", "5 a 9", "10 a 14", "15 a 19", "20 a 24",
"25 a 29", "30 a 34", "35 a 39", "40 a 44", "45 a 49", "50 a 54",
"55 a 59", "60 a 64", "65 a 69", "70 a 74", "75 a 79", "80 a 84",
"85 o más"),
description = "Grupos de edades para filtrar la población. Si se busca la población total, elegir 'Total'."
),
sexo = type_enum(
required = FALSE,
values = c("Hombres", "Mujeres", "Total"),
description = "Sexo para filtrar la población. Si se busca la población total, elegir 'Total'."
),
territorio = type_string(
required = FALSE,
description = "Unidad territorial a filtrar si se elige un nivel distinto a 'País'. Corresponde al nombre de la región, provincia o comuna que se desea consultar"
)
)
)
Si bien puede parecer engorroso, también se puede usar IA para describir la función automáticamente usando create_tool_def(). Para más información, revisar la viñeta vignette("tool-calling")
Una vez definida la herramienta, la podemos registrar en el modelo:
chat$register_tool(herramienta_censo)
Ahora la IA sabe de la existencia de consultar_censo(), y en base a la descripción que le dimos, podrá usarla si lo considera necesario.
Probando el uso de herramientas
Para hacer que la IA use la herramienta, simplemente le hacemos un prompt donde la herramienta sea útil. En nuestro caso, simplemente repetimos el prompt anterior:
chat$chat("Cuál es la población de Curanilahue?")
◯ [tool call] consultar_censo(nivel = "Comuna", edad =
"Total", sexo = "Total", ...)
→ datos a nivel comuna, Curanilahue
ℹ población censada: 31.119
● #> 31119
Según el Censo 2024, la población total de Curanilahue es de 31.119 habitantes.
En vez de citar información desactualizada o entregar estimaciones, la IA decidió usar la herramienta, y gracias a ella pudo entregar información exacta en base a datos reales!
También podemos hacer preguntas más específicas y la IA no va a tener ningún problema en usar la función, dado que se la explicamos bien 😌
chat$chat("Cuál es la población femenina de Curanilahue?")
◯ [tool call] consultar_censo(nivel = "Comuna", edad =
"Total", sexo = "Mujeres", ...)
→ datos a nivel comuna, Curanilahue
→ sexo: Mujeres
ℹ población censada: 15.992
● #> 15992
Según el Censo 2024, la población femenina de Curanilahue es de 15.992 mujeres.
Increíble! 🤯 Gracias al uso de herramientas disminuimos al mínimo la alucinación de la IA; es decir, evitamos que invente respuestas al entregarle herramientas para responder mejor.
Ahora podemos hacer distintas preguntas que involucren población y la IA usará la herramienta las veces que la requiera. Pidámosle que compare las poblaciones de dos comunas:
chat$chat("¿En qué comuna vive más gente: en Puente Alto o en Maipú?")
◯ [tool call] consultar_censo(nivel = "Comuna", edad =
"Total", sexo = "Total", ...)
→ datos a nivel comuna, Puente Alto
ℹ población censada: 568.086
● #> 568086
◯ [tool call] consultar_censo(nivel = "Comuna", edad =
"Total", sexo = "Total", ...)
→ datos a nivel comuna, Maipú
ℹ población censada: 503.635
● #> 503635
Según el Censo 2024:
| Comuna | Población |
|---|---|
| Puente Alto | 568,086 |
| Maipú | 503,635 |
En Puente Alto vive más gente que en Maipú. Puente Alto tiene 64,451 habitantes más que Maipú.
Pero si seguimos preguntando cosas, podemos encontrarnos con problemas 😬 Preguntemos algo que haga que el modelo tenga que sumar datos:
chat$chat("Cuál es la población masculina de Curanilahue mayor de 20 años?")
El modelo procede a usar la herramienta más de 10 veces para obtener los grupos de edad relevantes y luego sumarlos…
Ver razonamiento completo
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "15 a 19",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 15 a 19
→ sexo: Hombres
ℹ población censada: 1.019
● #> 1019
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "20 a 24",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 20 a 24
→ sexo: Hombres
ℹ población censada: 991
● #> 991
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "25 a 29",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 25 a 29
→ sexo: Hombres
ℹ población censada: 1.018
● #> 1018
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "30 a 34",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 30 a 34
→ sexo: Hombres
ℹ población censada: 1.030
● #> 1030
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "35 a 39",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 35 a 39
→ sexo: Hombres
ℹ población censada: 988
● #> 988
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "40 a 44",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 40 a 44
→ sexo: Hombres
ℹ población censada: 917
● #> 917
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "45 a 49",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 45 a 49
→ sexo: Hombres
ℹ población censada: 963
● #> 963
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "50 a 54",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 50 a 54
→ sexo: Hombres
ℹ población censada: 985
● #> 985
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "55 a 59",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 55 a 59
→ sexo: Hombres
ℹ población censada: 978
● #> 978
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "60 a 64",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 60 a 64
→ sexo: Hombres
ℹ población censada: 1.005
● #> 1005
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "65 a 69",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 65 a 69
→ sexo: Hombres
ℹ población censada: 815
● #> 815
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "70 a 74",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 70 a 74
→ sexo: Hombres
ℹ población censada: 615
● #> 615
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "75 a 79",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 75 a 79
→ sexo: Hombres
ℹ población censada: 375
● #> 375
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "80 a 84",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 80 a 84
→ sexo: Hombres
ℹ población censada: 220
● #> 220
◯ [tool call] consultar_censo(nivel = "Comuna", edad = "85 o más",
sexo = "Hombres", ...)
→ datos a nivel comuna, Curanilahue
→ grupo de edad: 85 o más
→ sexo: Hombres
ℹ población censada: 172
● #> 172
Finalmente la IA responde (ojo con la respuesta 👀)
Según el Censo 2024, la población masculina de Curanilahue mayor de 20 años es de 10,092 habitantes, distribuida de la siguiente manera:
20 a 24 años: 991
25 a 29 años: 1,018
30 a 34 años: 1,030
35 a 39 años: 988
40 a 44 años: 917
45 a 49 años: 963
50 a 54 años: 985
55 a 59 años: 978
60 a 64 años: 1,005
65 a 69 años: 815
70 a 74 años: 615
75 a 79 años: 375
80 a 84 años: 220
85 o más años: 172
TOTAL: 10,072
Los datos que cita son correctos (gracias a la herramienta) pero… ¿te fijaste? Se equivocó en la suma! Arriba dio una cifra y después dio otra abajo, y ninguna de las dos es la suma correcta!
Esto pasa porque la IA es en realidad modelos de lenguaje (LLM), y los modelos de lenguaje no hacen operaciones matemáticas. Pueden predecir resultados cercanos a los esperados, pero no se garantiza que sean correctos al 100%… a menos que usen herramientas 🤔
Solucionemos esta falencia de la IA con otra herramienta:
Creamos una función sencilla que sume valores:
# crear otra herramienta pasa sumar valores, porque los modelos de lenguaje no saben sumar
sumar <- function(valores) {
sum(valores)
}
Luego la definimos para que el modelo la entienda:
herramienta_suma <- tool(
sumar,
description = "Suma varios valores numéricos",
# explicar uso de argumentos
arguments = list(
valores = type_array(type_integer(),
description = "Cifras a sumar")
)
)
Finalmente se la entregamos al modelo:
chat$register_tool(herramienta_suma)
Y ahora volvemos a hacerle el prompt al modelo, esperando que se pegue la escurrida y use la herramienta:
chat$chat("Cuál es la población masculina de Curanilahue mayor de 20 años?")
◯ [tool call] sumar(valores = c(991L, 1018L, 1030L, 988L, 917L,
963L, 985L, ...)
● #> 11072
Según el Censo 2024, la población masculina de Curanilahue mayor de 20 años es de 11,072 habitantes.
Ahora sí 😉 La IA supo que necesitaba sumar los datos, así que esta vez recurrió a la herramienta y lo hizo bien.
Usar LLMs desde R tiene una potencialidad notable, con un ecosistema de paquetes maduro para implementar IA en el análisis de datos. Con lo que vimos en esta publicación se podría implementar un chat bot manejado por R que pueda realizar consultas a datos complejos y entregar información exacta, o hacer que los modelos de IA realicen operaciones complejas de cualquier tipo. Hay muchísimas posibilidades!
Publicaciones sobre inteligencia artificial
- Fecha de publicación:
- April 26, 2026
- Extensión:
- 12 minute read, 2346 words
- Tags:
- inteligencia artificial datos