Vai al contenuto principale

Tutorial su OpenAI Function Calling

Scopri come la nuova funzionalità di Function Calling di OpenAI consente ai modelli GPT di generare output JSON strutturati, risolvendo problemi comuni dovuti a output irregolari.
Aggiornato 3 giu 2026  · 8 min leggi

Che cos'è OpenAI Function Calling?

L'API di OpenAI è ottima nel generare risposte in modo sistematico. Puoi gestire i prompt, ottimizzare l'output del modello e creare applicazioni linguistiche e operative con poche righe di codice.

Nonostante tutti i vantaggi, l'API di OpenAI era un incubo per sviluppatori e ingegneri. Perché? Sono abituati a lavorare con tipi di dati strutturati, e lavorare con dati non strutturati come le stringhe è difficile.

Per ottenere risultati coerenti, gli sviluppatori devono usare espressioni regolari (RegEx) o fare prompt engineering per estrarre le informazioni dalla stringa di testo.

Qui entra in gioco la funzionalità di function calling di OpenAI. Permette ai modelli GPT-3.5 e GPT-4 di accettare funzioni definite dall'utente come input e generare output strutturati. In questo modo non devi scrivere RegEx o fare prompt engineering.

In questo tutorial ti spiegherò passo dopo passo come il function calling di OpenAI può aiutare a risolvere problemi comuni degli sviluppatori causati da output irregolari dei modelli.

Usare OpenAI senza Function Calling

In questa sezione genereremo risposte usando il modello GPT-3.5-Turbo senza function calling per vedere se otteniamo o meno un output coerente.

Prima di installare l'API Python di OpenAI, devi ottenere una chiave API e configurarla sul tuo sistema locale. Segui il tutorial GPT-3.5 e GPT-4 tramite l'API di OpenAI in Python per imparare come ottenere la chiave API e configurarla. Il tutorial include anche esempi su come impostare le variabili d'ambiente in DataLab, il notebook dati di DataCamp con funzionalità AI.

Per ulteriore assistenza, consulta il codice nel quaderno OpenAI Function Calling su DataLab.

Aggiorna l'API Python di OpenAI alla V1 usando:

pip install --upgrade openai -q

Dopo di che, inizializza il client OpenAI usando la chiave API.

import os
from openai import OpenAI

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

Nota: OpenAI non offre più crediti gratuiti ai nuovi utenti, quindi devi acquistarli per usare l'API.

Scriveremo una descrizione casuale di uno studente. Puoi inventarne una tu oppure usare ChatGPT per generarne una.

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."

Nella prossima parte, scriveremo un prompt per estrarre le informazioni dello studente dal testo e restituire l'output come oggetto JSON. Estrarremo nome, corso di laurea, università, voti e club nella descrizione dello studente.

# 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}
'''

Aggiungi il prompt al modulo di chat completions dell'API OpenAI per generare la risposta.

# 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 risposta è piuttosto buona. Convertiamola in JSON per capirla meglio.

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

Useremo la libreria `json` per convertire il testo in un oggetto JSON.

import json

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

Il risultato finale è praticamente perfetto. Quindi, perché abbiamo bisogno del Function Calling?

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

Proviamo lo stesso prompt, ma usando una descrizione di un altro studente.

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."

Cambieremo solo il testo della descrizione dello studente nel prompt.

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}
'''

E poi eseguiamo la funzione di chat completion usando il secondo 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

Come puoi vedere, non è coerente. Invece di restituire un solo club, ha restituito l'elenco dei club a cui Ravi è iscritto. È anche diverso dal primo studente.

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

Esempio di OpenAI Function Calling

Per risolvere questo problema, useremo ora una funzionalità introdotta di recente chiamata Function Calling. È fondamentale creare una funzione personalizzata per aggiungere le informazioni necessarie a un elenco di dizionari, in modo che l'API di OpenAI possa comprenderne la funzionalità.

  • name: scrivi il nome della funzione Python che hai appena creato.
  • description: la funzionalità della funzione.
  • parameters: all'interno di “properties” scriveremo il nome degli argomenti, il tipo e la descrizione. Aiuterà l'API di OpenAI a identificare le parole che stiamo cercando.

Nota: Assicurati di seguire il pattern corretto. Scopri di più sul function calling leggendo la documentazione ufficiale.

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. '
                }
                
            }
        }
    }
]

Ora genereremo le risposte per due descrizioni di studenti usando una funzione personalizzata aggiunta all'argomento "functions". Dopodiché convertiremo la risposta testuale in un oggetto JSON e la stamperemo.

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)

Come possiamo vedere, abbiamo ottenuto un output uniforme. Abbiamo persino ricevuto i voti come numeri invece che come stringhe. Un output coerente è essenziale per creare applicazioni AI senza bug.

{'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'}

Funzioni personalizzate multiple

Puoi aggiungere più funzioni personalizzate alla funzione di chat completion. In questa sezione vedremo le capacità sorprendenti dell'API di OpenAI e come seleziona automaticamente la funzione corretta restituendo gli argomenti giusti.

Nella lista Python di dizionari aggiungeremo un'altra funzione chiamata “extract_school_info”, che ci aiuterà a estrarre dal testo le informazioni sull'università.

Per farlo, devi aggiungere un altro dizionario di una funzione con nome, descrizione e parametri.

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.'
                }
            }
        }
    }
]

Genereremo una descrizione di “Stanford University” usando ChatGPT per testare la nostra funzione.

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 l'elenco delle descrizioni di studente e università e passalo attraverso la funzione di chat completion di OpenAI per generare la risposta. Assicurati di aver fornito la funzione personalizzata aggiornata.

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)

Il modello GPT-3.5-Turbo ha selezionato automaticamente la funzione corretta per i diversi tipi di descrizione. Otteniamo un output JSON perfetto sia per lo studente che per l'università.

{'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}

Possiamo persino verificare sotto il nome che la risposta è stata generata usando la funzione “extract_school_info”.

Applicazioni del Function Calling

In questa sezione costruiremo un riassuntore di testo stabile che sintetizzerà le informazioni su scuola e studente in un certo modo.

Per prima cosa, creeremo due funzioni Python, extract_student_info e extract_school_info, che prendono gli argomenti dal function calling e restituiscono una stringa riassuntiva.

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. Crea la lista Python, che consiste nella descrizione del primo studente, un prompt casuale e la descrizione della prima università. Il prompt casuale è aggiunto per convalidare il meccanismo automatico di function calling.
  2. Genereremo la risposta usando ciascun testo nella lista `descriptions`.
  3. Se viene usata una chiamata di funzione, otterremo il nome della funzione e, in base ad esso, applicheremo gli argomenti pertinenti alla funzione usando la risposta. Altrimenti, restituisci la risposta normale.
  4. Stampa gli output di tutti e tre gli esempi.
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)
  • Sample#1: il modello GPT ha selezionato “extract_student_info” e abbiamo ottenuto un breve riepilogo sullo studente.
  • Sample#2: il modello GPT non ha selezionato alcuna funzione e ha trattato il prompt come una normale domanda; di conseguenza, abbiamo ottenuto la biografia di Abraham Lincoln.
  • Sample#3: il modello GPT ha selezionato “extract_school_info” e abbiamo ottenuto un breve riepilogo su Stanford University.
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.

Conclusione

In questo tutorial abbiamo imparato il function calling di OpenAI. Abbiamo anche visto come usarlo per generare output coerenti, creare più funzioni e costruire un riassuntore di testo affidabile.

Se vuoi saperne di più sull'API di OpenAI, valuta di seguire il corso Working with OpenAI API e usare il cheat sheet OpenAI API in Python per creare il tuo primo progetto con AI.

Domande frequenti

Come gestisce OpenAI function calling output JSON complessi e annidati?

Il function calling di OpenAI ti permette di definire strutture JSON annidate nello schema della funzione. Specificando le relazioni gerarchiche all'interno della proprietà parameters, puoi garantire che il modello generi output JSON correttamente annidati e strutturati per requisiti di dati complessi.

Il function calling di OpenAI può essere usato con API esterne o database?

Sì, il function calling di OpenAI può essere integrato con API esterne o database creando funzioni personalizzate che eseguono chiamate API o query al database in base agli argomenti passati dal modello. Ciò abilita interazioni dinamiche con sistemi esterni mantenendo risposte coerenti e strutturate.

Cosa succede se la chiamata di funzione del modello non corrisponde ad alcuna funzione definita?

Se la chiamata di funzione del modello non corrisponde a una funzione definita o allo schema fornito, la chiamata di funzione non viene attivata e il modello tratta l'input come un normale prompt testuale, restituendo invece una tipica risposta in testo. Questo garantisce flessibilità nella gestione di input vari.


Abid Ali Awan's photo
Author
Abid Ali Awan
LinkedIn
Twitter

In quanto data scientist certificato, sono appassionato di sfruttare tecnologie all’avanguardia per creare applicazioni di machine learning innovative. Con una solida esperienza in riconoscimento vocale, analisi e reportistica dei dati, MLOps, AI conversazionale e NLP, ho affinato le mie competenze nello sviluppo di sistemi intelligenti in grado di avere un impatto concreto. Oltre alla mia expertise tecnica, sono anche un comunicatore efficace, con il talento di rendere chiari e sintetici concetti complessi. Di conseguenza, sono diventato un blogger molto seguito in ambito data science, condividendo idee ed esperienze con una community in crescita di professionisti dei dati. Attualmente mi concentro sulla creazione e sull’editing di contenuti, lavorando con large language model per sviluppare contenuti potenti e coinvolgenti che possano aiutare aziende e singoli a valorizzare al meglio i propri dati.

Argomenti
Correlato

blog

Tokenizzazione nel NLP: come funziona, sfide e casi d'uso

Guida al preprocessing NLP nel machine learning. Copriamo spaCy, i transformer di Hugging Face e come funziona la tokenizzazione in casi d'uso reali.
Abid Ali Awan's photo

Abid Ali Awan

10 min

blog

I 15 migliori server MCP remoti che ogni AI builder dovrebbe conoscere nel 2026

Scopri i 15 migliori server MCP remoti che stanno trasformando lo sviluppo AI nel 2026. Scopri come migliorano automazione, ragionamento, sicurezza e velocità dei workflow.
Abid Ali Awan's photo

Abid Ali Awan

15 min

blog

Che cos'è Snowflake? Guida per principianti alla piattaforma dati cloud

Esplora le basi di Snowflake, la piattaforma dati cloud. Scopri la sua architettura, le sue funzionalità e come integrarla nelle tue pipeline di dati.
Tim Lu's photo

Tim Lu

12 min

Mostra altroMostra altro