Cómo puede un modelo usar tus funciones
Un modelo de lenguaje solo sabe escribir texto. No puede buscar un precio en tu tienda, porque no ejecuta tu código. La llamada a funciones, también llamada llamada a herramientas, cubre ese hueco.
Tú describes una función al modelo. Él responde con una petición de llamada, y es tu programa quien hace la llamada.
Al final de esta lección
Nota
Puedo describir una función para que un modelo pueda pedirla.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Herramienta | una función que tu programa ofrece a un modelo | |
| Llamada a herramienta | la petición del modelo de ejecutar una herramienta | |
| Esquema | una descripción de la forma de unos datos | |
| Argumentos | los valores que una llamada pasa a la función | {"item": "pera"} |
| Descripción | palabras que dicen al modelo para qué sirve una herramienta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una herramienta tiene un nombre y entradas
Para ofrecer una función envías tres cosas. El nombre es el que usará el modelo. La descripción dice qué hace y cuándo usarla. Los parámetros dicen qué argumentos recibe, escritos como un esquema JSON.
El modelo nunca ve tu código. Solo lee esta descripción, así que una descripción vaga da malas peticiones.
Ejemplo resuelto: una herramienta, parte a parte
| Parte | Qué contiene | En nuestra herramienta |
|---|---|---|
| name | El nombre que usa el modelo | get_price |
| description | Qué hace | Da el precio en céntimos de un artículo. |
| parameters | Los argumentos, como esquema | un texto llamado item |
| required | Los argumentos obligatorios | item |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Imprime la descripción de una herramienta
docker exec -w /home/node/project agent node -e "const tool={type:'function',function:{name:'get_price',description:'Da el precio en céntimos de un artículo.',parameters:{type:'object',properties:{item:{type:'string',description:'El nombre del artículo, por ejemplo manzana'}},required:['item']}}};console.log(JSON.stringify(tool,null,2))"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
El modelo responde con una petición
Cuando el modelo quiere una herramienta, su respuesta trae una lista llamada tool_calls en lugar de palabras. Cada llamada tiene un id, el name de la función y los arguments.
Los argumentos llegan en una sola cadena de JSON, no en un objeto. Tu programa debe leer esa cadena antes de usar los valores.
Pide una llamada a herramienta a un modelo
docker exec -w /home/node/project agent node -e "const u=(process.env.AI_URL||'http://ai:4000')+'/v1/chat/completions';const ask=async(m,t)=>{const r=await fetch(u,{method:'POST',headers:{'content-type':'application/json',authorization:'Bearer lab'},body:JSON.stringify({model:'lab',messages:m,tools:t,tool_choice:'required',max_tokens:80})});const j=await r.json();if(r.ok)return j.choices[0].message;throw Error(r.status+' '+j.error.message)};const tool={type:'function',function:{name:'get_price',description:'Da el precio de un artículo.',parameters:{type:'object',properties:{item:{type:'string'}}}}};(async()=>{let c;try{c=(await ask([{role:'user',content:'¿Cuánto cuesta una pera?'}],[tool])).tool_calls[0]}catch(e){console.log('Sin llamada ('+e.message+'). Muestra grabada:');c={function:{name:'get_price',arguments:JSON.stringify({item:'pera'})}}}const f=c.function;console.log('Nombre: '+f.name);console.log('Argumentos: '+f.arguments+' -> item '+JSON.parse(f.arguments).item)})()"Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Un error frecuente
Advertencia
Mucha gente cree que el modelo ejecuta la función. No es así. Solo escribe una petición. Tu programa lee la petición, ejecuta la función y decide qué hacer con el resultado.
Para ir más lejos: mejora una descripción
Cambia la descripción en la ejecución que consulta a un modelo, por ejemplo a Da un precio. Ejecútala tres veces y anota si la llamada cambia.
Después, añade required:['item'] al esquema. Escribe qué cambia para el modelo.