Saltar al contenido principal
InicioTutorialesInteligencia Artificial (IA)

Tutorial de llamada a funciones de OpenAI

Descubra cómo la nueva capacidad de llamada a funciones de OpenAI permite a los modelos GPT generar salidas JSON estructuradas, resolviendo problemas comunes de desarrollo causados por salidas irregulares.
may 2024  · 12 min leer

¿Qué es la llamada a funciones de OpenAI?

La API de OpenAI es excelente para generar la respuesta de forma sistemática. Puede gestionar sus indicaciones, optimizar la salida del modelo y realizar, construir y lenguajear aplicaciones con pocas líneas de código.

Incluso con todo lo bueno, la API de OpenAI era una pesadilla para los desarrolladores e ingenieros. ¿Por qué? Están acostumbrados a trabajar con tipos de datos estructurados, y trabajar con datos no estructurados como cadenas es difícil.

Para obtener resultados coherentes, los desarrolladores tienen que utilizar expresiones regulares (RegEx) o ingeniería de consulta para extraer la información de la cadena de texto.

Aquí es donde entra en juego la capacidad de llamada a funciones de OpenAI. Permite que los modelos GPT-3.5 y GPT-4 tomen como entrada funciones definidas por el usuario y generen una estructura de salida. Con esto, no es necesario escribir RegEx ni realizar ingeniería de consulta.

En este tutorial, exploraremos cómo la llamada a funciones de OpenAI puede ayudar a resolver problemas comunes de los desarrolladores causados por salidas irregulares de los modelos.

Si acaba de empezar a utilizar ChatGPT y la API OpenAI, considere la posibilidad de echar un vistazo al seminario web Introducción a la API OpenAI y ChatGPT. Este recurso puede guiarte a través de la generación del lenguaje y la codificación y ayudarte a realizar tareas básicas utilizando la API de Python.

Uso de OpenAI sin llamadas a funciones

En esta sección, generaremos respuestas utilizando el modelo GPT-3.5-Turbo sin llamadas a funciones para ver si obtenemos resultados consistentes o no.

Antes de instalar la API Python de OpenAI, debes obtener una clave API y configurarla en tu sistema local. Sigue el tutorial GPT-3.5 y GPT-4 a través de la API OpenAI en Python para aprender a obtener la clave API y configurarla. El tutorial también incluye ejemplos de configuración de variables de entorno en DataLab, el cuaderno de datos con IA de DataCamp.

Para obtener más ayuda, consulta el código del libro de trabajo OpenAI Function Calling en DataLab.

Actualiza la API Python de OpenAI a la V1 usando:

pip install --upgrade openai -q

Después, inicia el cliente OpenAI utilizando la clave API.

import os
from openai import OpenAI

client = OpenAI(
  api_key=os.environ['OPENAI_API_KEY'],
)

Nota: OpenAI ya no ofrece créditos gratuitos a los nuevos usuarios, por lo que hay que comprarlos para utilizar la API.

Escribiremos una descripción aleatoria del alumno. Puedes crear tu propio texto o utilizar ChatGPT para que te genere uno.

student_1_description = "David Nguyen is a sophomore majoring in computer science at Stanford University. He is Asian American and has a 3.8 GPA. David is known for his programming skills and is an active member of the university's Robotics Club. He hopes to pursue a career in artificial intelligence after graduating."

En la siguiente parte, escribiremos un prompt para extraer la información del estudiante del texto y devolver la salida como un objeto JSON. Extraeremos el nombre, la especialidad, el centro de estudios, las calificaciones y los clubes en la descripción del alumno.

# A simple prompt to extract information from "student_description" in a JSON format.
prompt1 = f'''
Please extract the following information from the given text and return it as a JSON object:

name
major
school
grades
club

This is the body of text to extract the information from:
{student_1_description}
'''

Añade la solicitud al módulo de finalización de chat de la API de OpenAI para generar la respuesta.

# Generating response back from gpt-3.5-turbo
openai_response = client.chat.completions.create(
    model = 'gpt-3.5-turbo',
    messages = [{'role': 'user', 'content': prompt_1}]
)

openai_response.choices[0].message.content

La respuesta es bastante buena. Convirtámoslo en JSON para entenderlo mejor.

'{\n  "name": "David Nguyen",\n  "major": "computer science",\n  "school": "Stanford University",\n  "grades": "3.8 GPA",\n  "club": "Robotics Club"\n}'

Utilizaremos la librería `json` para convertir el texto en un objeto JSON.

import json

# Loading the response as a JSON object
json_response = json.loads(openai_response.choices[0].message.content)
json_response

El resultado final es prácticamente perfecto. Entonces, ¿por qué necesitamos la Llamada a Función?

{'name': 'David Nguyen',
 'major': 'computer science',
 'school': 'Stanford University',
 'grades': '3.8 GPA',
 'club': 'Robotics Club'}

Probemos con la misma pregunta, pero utilizando una descripción diferente del alumno.

student_2_description="Ravi Patel is a sophomore majoring in computer science at the University of Michigan. He is South Asian Indian American and has a 3.7 GPA. Ravi is an active member of the university's Chess Club and the South Asian Student Association. He hopes to pursue a career in software engineering after graduating."

Sólo cambiaremos el texto de la descripción del alumno en el aviso.

prompt2 = f'''
Please extract the following information from the given text and return it as a JSON object:

name
major
school
grades
club

This is the body of text to extract the information from:
{student_2_description}
'''

Y, ejecute la función de finalización de chat utilizando el segundo prompt.

# Generating response back from gpt-3.5-turbo
openai_response = client.chat.completions.create(
    model = 'gpt-3.5-turbo',
    messages = [{'role': 'user', 'content': prompt_2}]
)

# Loading the response as a JSON object
json_response = json.loads(openai_response.choices[0].message.content)
json_response

Como puede ver, no es coherente. En lugar de devolver un club, ha devuelto la lista de clubes a los que se ha unido Ravi. También es diferente del primer alumno.

{'name': 'Ravi Patel',
 'major': 'computer science',
 'school': 'University of Michigan',
 'grades': '3.7 GPA',
 'club': ['Chess Club', 'South Asian Student Association']}

Ejemplo de llamada a una función de OpenAI

Para resolver este problema, utilizaremos una función recientemente introducida llamada Llamada a Función. Es esencial crear una función personalizada para añadir la información necesaria a una lista de diccionarios para que la API de OpenAI pueda entender su funcionalidad.

  • nombre: escriba el nombre de la función Python que ha creado recientemente.
  • descripción: la funcionalidad de la función.
  • parámetros: dentro de las "propiedades", escribiremos el nombre de los argumentos, tipo y descripción. Ayudará a la API de OpenAI a identificar el mundo que estamos buscando.

Nota: Asegúrese de seguir el patrón correcto. Obtenga más información sobre la llamada a funciones leyendo la documentación oficial.

student_custom_functions = [
    {
        'name': 'extract_student_info',
        'description': 'Get the student information from the body of the input text',
        'parameters': {
            'type': 'object',
            'properties': {
                'name': {
                    'type': 'string',
                    'description': 'Name of the person'
                },
                'major': {
                    'type': 'string',
                    'description': 'Major subject.'
                },
                'school': {
                    'type': 'string',
                    'description': 'The university name.'
                },
                'grades': {
                    'type': 'integer',
                    'description': 'GPA of the student.'
                },
                'club': {
                    'type': 'string',
                    'description': 'School club for extracurricular activities. '
                }
                
            }
        }
    }
]

A continuación, generaremos respuestas para dos descripciones de alumnos utilizando una función personalizada añadida al argumento "functions". Después, convertiremos la respuesta de texto en un objeto JSON y lo imprimiremos.

student_description = [student_1_description,student_2_description]
for i in student_description:
    response = client.chat.completions.create(
        model = 'gpt-3.5-turbo',
        messages = [{'role': 'user', 'content': i}],
        functions = student_custom_functions,
        function_call = 'auto'
    )

    # Loading the response as a JSON object
    json_response = json.loads(response.choices[0].message.function_call.arguments)
    print(json_response)

Como vemos, obtenemos un resultado uniforme. Incluso tenemos calificaciones numéricas en lugar de cadenas. Una producción coherente es esencial para crear aplicaciones de IA sin errores.

{'name': 'David Nguyen', 'major': 'computer science', 'school': 'Stanford University', 'grades': 3.8, 'club': 'Robotics Club'} 

{'name': 'Ravi Patel', 'major': 'computer science', 'school': 'University of Michigan', 'grades': 3.7, 'club': 'Chess Club'}

Múltiples funciones personalizadas

Puede añadir varias funciones personalizadas a la función de finalización del chat. En esta sección, veremos las capacidades mágicas de la API OpenAI y cómo selecciona automáticamente la función correcta y devuelve los argumentos adecuados.

En la lista Python del diccionario, añadiremos otra función llamada "extract_school_info", que nos ayudará a extraer información universitaria del texto.

Para ello, hay que añadir otro diccionario de una función con nombre, descripción y parámetros.

custom_functions = [
    {
        'name': 'extract_student_info',
        'description': 'Get the student information from the body of the input text',
        'parameters': {
            'type': 'object',
            'properties': {
                'name': {
                    'type': 'string',
                    'description': 'Name of the person'
                },
                'major': {
                    'type': 'string',
                    'description': 'Major subject.'
                },
                'school': {
                    'type': 'string',
                    'description': 'The university name.'
                },
                'grades': {
                    'type': 'integer',
                    'description': 'GPA of the student.'
                },
                'club': {
                    'type': 'string',
                    'description': 'School club for extracurricular activities. '
                }
                
            }
        }
    },
    {
        'name': 'extract_school_info',
        'description': 'Get the school information from the body of the input text',
        'parameters': {
            'type': 'object',
            'properties': {
                'name': {
                    'type': 'string',
                    'description': 'Name of the school.'
                },
                'ranking': {
                    'type': 'integer',
                    'description': 'QS world ranking of the school.'
                },
                'country': {
                    'type': 'string',
                    'description': 'Country of the school.'
                },
                'no_of_students': {
                    'type': 'integer',
                    'description': 'Number of students enrolled in the school.'
                }
            }
        }
    }
]

Generaremos una descripción de la "Universidad de Stanford" utilizando ChatGPT para probar nuestra función.

school_1_description = "Stanford University is a private research university located in Stanford, California, United States. It was founded in 1885 by Leland Stanford and his wife, Jane Stanford, in memory of their only child, Leland Stanford Jr. The university is ranked #5 in the world by QS World University Rankings. It has over 17,000 students, including about 7,600 undergraduates and 9,500 graduates23. "

Crea la lista de descripciones de estudiantes y escuelas y pásala a través de la función de completado de chat de OpenAI para generar la respuesta. Asegúrese de que ha proporcionado la función personalizada actualizada.

description = [student_1_description, school_1_description]
for i in description:
    response = client.chat.completions.create(
        model = 'gpt-3.5-turbo',
        messages = [{'role': 'user', 'content': i}],
        functions = custom_functions,
        function_call = 'auto'
    )

    # Loading the response as a JSON object
    json_response = json.loads(response.choices[0].message.function_call.arguments)
    print(json_response)

El modelo GPT-3.5-Turbo ha seleccionado automáticamente la función correcta para los distintos tipos de descripción. Obtenemos una salida JSON perfecta para el estudiante y la escuela.

{'name': 'David Nguyen', 'major': 'computer science', 'school': 'Stanford University', 'grades': 3.8, 'club': 'Robotics Club'} 

{'name': 'Stanford University', 'ranking': 5, 'country': 'United States', 'no_of_students': 17000}

Incluso podemos buscar bajo el nombre que se genera el reposo utilizando la función "extract_school_info".

Aplicaciones de la llamada a funciones

En esta sección, construiremos un resumidor de texto estable que resumirá la información del colegio y de los alumnos de una forma determinada.

En primer lugar, crearemos dos funciones Python, extract_student_info y extract_school_info, que toman los argumentos de la llamada a la función y devuelven una cadena resumida.

def extract_student_info(name, major, school, grades, club):
    
    """Get the student information"""

    return f"{name} is majoring in {major} at {school}. He has {grades} GPA and he is an active member of the university's {club}."

def extract_school_info(name, ranking, country, no_of_students):
    
    """Get the school information"""

    return f"{name} is located in the {country}. The university is ranked #{ranking} in the world with {no_of_students} students."
  1. Cree la lista Python, que consta de la descripción del alumno uno, la indicación aleatoria y la descripción de la escuela uno. La pregunta aleatoria se añade para validar la mecánica de llamada automática a funciones.
  2. Generaremos la respuesta utilizando cada texto de la lista `descriptions`.
  3. Si se utiliza una llamada a función, obtendremos el nombre de la función y, basándonos en él, aplicaremos los argumentos pertinentes a la función utilizando la respuesta. En caso contrario, devuelve la respuesta normal.
  4. Imprime las salidas de las tres muestras.
descriptions = [
    student_1_description, 
    "Who was a Abraham Lincoln?",
    school_1_description
                ]

for i, sample in enumerate(descriptions):
    response = client.chat.completions.create(
        model = 'gpt-3.5-turbo',
        messages = [{'role': 'user', 'content': sample}],
        functions = custom_functions,
        function_call = 'auto'
    )
    
    response_message = response.choices[0].message
    
    if dict(response_message).get('function_call'):
        
        # Which function call was invoked
        function_called = response_message.function_call.name
        
        # Extracting the arguments
        function_args  = json.loads(response_message.function_call.arguments)
        
        # Function names
        available_functions = {
            "extract_school_info": extract_school_info,
            "extract_student_info": extract_student_info
        }
        
        fuction_to_call = available_functions[function_called]
        response_message = fuction_to_call(*list(function_args .values()))
        
    else:
        response_message = response_message.content
    
    print(f"\nSample#{i+1}\n")
    print(response_message)
  • Muestra#1: El modelo GPT ha seleccionado "extract_student_info", y hemos obtenido un breve resumen sobre el estudiante.
  • Sample#2: El modelo GPT no ha seleccionado ninguna función y ha tratado la pregunta como una pregunta normal, y como resultado, hemos obtenido la biografía de Abraham Lincoln.
  • Sample#3: El modelo GPT ha seleccionado "extract_school_info", y obtenemos un breve resumen sobre la Universidad de Stanford.
Sample#1

David Nguyen is majoring in computer science at Stanford University. He has 3.8 GPA and he is an active member of the university's Robotics Club.

Sample#2

Abraham Lincoln was the 16th President of the United States. He served as president from March 1861 until his assassination in April 1865. Lincoln led the country through its greatest internal crisis, the American Civil War, and his Emancipation Proclamation declared slaves in Confederate territory to be free. He is known for his leadership, his commitment to preserving the Union, and his efforts to abolish slavery. Lincoln's presidency is widely regarded as one of the most transformative in American history.

Sample#3

Stanford University is located in the United States. The university is ranked #5 in the world with 17000 students.

Conclusión

La llamada a funciones de OpenAI abre nuevas e interesantes posibilidades a los desarrolladores que crean aplicaciones de IA. Al permitir que modelos como GPT-3.5 y GPT-4 generen datos JSON estructurados a través de funciones personalizadas, resuelve los principales puntos débiles en torno a las salidas de texto incoherentes e impredecibles.

Las llamadas a funciones pueden utilizarse para acceder a API web externas, ejecutar consultas SQL personalizadas y desarrollar aplicaciones de IA estables. Puede extraer información relevante del texto y proporcionar respuestas coherentes para comandos API y SQL.

En este tutorial, aprendimos sobre la nueva característica de OpenAI, llamada a funciones. También aprendimos a utilizarlo para generar salidas coherentes, crear funciones múltiples y construir un resumidor de texto fiable.

Si quieres aprender más sobre la API de OpenAI, considera tomar el curso Trabajando con la API de OpenAI y usar la hoja de trucos de la API de OpenAI en Python para crear tu primer proyecto potenciado por IA.

Temas
Relacionado

blog

Todo lo que sabemos sobre GPT-5

Predecir cómo podría ser la próxima evolución de la tecnología de IA de OpenAI y qué avances podría tener el modelo GPT-5.
Josep Ferrer's photo

Josep Ferrer

10 min

blog

Los 16 mejores marcos y bibliotecas de IA: Guía para principiantes

Explore los mejores marcos y bibliotecas de IA y sus fundamentos en esta guía definitiva para profesionales de datos noveles que comienzan su carrera profesional.
Yuliya Melnik's photo

Yuliya Melnik

15 min

blog

¿Qué es la tokenización?

La tokenización divide el texto en partes más pequeñas para facilitar el análisis mecánico y ayudar a las máquinas a comprender el lenguaje humano.
Abid Ali Awan's photo

Abid Ali Awan

9 min

tutorial

Primeros pasos con Claude 3 y la API de Claude 3

Conozca los modelos Claude 3, las pruebas de rendimiento detalladas y cómo acceder a ellas. Además, descubra la nueva API Python de Claude 3 para generar texto, acceder a funciones de visión y streaming.
Abid Ali Awan's photo

Abid Ali Awan

tutorial

Guía introductoria para perfeccionar los LLM

La puesta a punto de grandes modelos lingüísticos (LLM) ha revolucionado el Procesamiento del Lenguaje Natural (PLN), ofreciendo capacidades sin precedentes en tareas como la traducción de idiomas, el análisis de sentimientos y la generación de textos. Este enfoque transformador aprovecha modelos preentrenados como GPT-2, mejorando su rendimiento en dominios específicos mediante el proceso de ajuste fino.
Josep Ferrer's photo

Josep Ferrer

12 min

tutorial

Cómo recortar una cadena en Python: Tres métodos diferentes

Aprenda los fundamentos del recorte de caracteres iniciales y finales de una cadena en Python.
Adel Nehme's photo

Adel Nehme

5 min

See MoreSee More