Vai al contenuto principale

Tutorial sul Function Calling di GPT-4.5: estrai prezzi azionari e notizie con l’IA

Crea un sistema di function calling multi-funzione per estrarre prezzi azionari e notizie usando il modello più avanzato di OpenAI.
· 12 min leggi

Scopri con l'IA

I large language model (LLM) spesso faticano a generare in modo coerente output strutturati, come il JSON, anche quando si usano tecniche avanzate di prompt engineering. Il prompt engineering può migliorare i risultati, ma non è infallibile: durante i test possono ancora verificarsi errori, portando a occasionali fallimenti. Quindi, come puoi garantire ogni volta output strutturati accurati e affidabili?

Il function calling negli LLM indica la capacità di questi modelli di produrre risposte con dati strutturati, tipicamente sotto forma di oggetti JSON. Questa funzionalità permette agli LLM di andare oltre la semplice generazione di testo e interagire con sistemi esterni, API e strumenti. Sfruttando il function calling, gli LLM possono svolgere compiti più complessi e guidati dal contesto mantenendo la struttura e l’accuratezza richieste.

In questo tutorial, impareremo a usare GPT-4.5, il modello più accurato e fattuale, per creare uno script di function calling. Prima implementeremo una singola funzione per estrarre i prezzi azionari da internet. Poi aggiungeremo un’altra funzione, consentendo all’LLM di scegliere tra più strumenti e selezionare quello più appropriato in base al prompt dell’utente.

Alla fine di questo tutorial, saprai costruire una tua applicazione intelligente in grado di fornire i prezzi azionari di qualsiasi azienda e anche distribuire feed di notizie.

Immagine dell’autore

Le capacità di Function Calling di GPT-4.5

GPT-4.5, l’ultimo modello di OpenAI, introduce diverse funzionalità avanzate, tra cui capacità di function calling migliorate. Queste capacità sono pensate per migliorare la capacità del modello di interagire con sistemi esterni ed eseguire compiti complessi invocando funzioni specifiche in base agli input dell’utente.

Fonte: Model - OpenAI API

Ecco le caratteristiche chiave del Function Calling di GPT-4.5:

1. Integrazione con le API

GPT-4.5 supporta il function calling tramite le Chat Completions API, Assistants API e Batch API. Questo consente agli sviluppatori di integrare senza soluzione di continuità il modello nelle proprie applicazioni, permettendogli di eseguire attività come il recupero e l’elaborazione dei dati e persino l’esecuzione di comandi all’interno di un ambiente software.

2. Output strutturati

Il modello può restituire output strutturati, come JSON, particolarmente utili per gli sviluppatori che necessitano che il modello interagisca con altri sistemi o strumenti che richiedono formati di dati specifici.

3. Capacità visive

Sebbene GPT-4.5 non supporti output multimodali come voce o video, supporta le capacità di visione tramite input di immagini. Questo consente al modello di elaborare e analizzare dati visivi, che possono essere combinati con il function calling per svolgere attività che coinvolgono sia dati testuali sia immagini.

4. Funzionalità avanzate

La funzionalità di function calling in GPT-4.5 è progettata per semplificare workflow complessi, consentendo al modello di suggerire o invocare funzioni scritte nel tuo codice. Questo può essere particolarmente utile per automatizzare attività ripetitive o integrare processi decisionali guidati dall’IA in sistemi software esistenti.

Scopri tutti i dettagli sul nuovo modello OpenAI leggendo il blog GPT 4.5: caratteristiche, accesso, confronto con GPT-4o e altro.

Single Function Calling con GPT-4.5

Ora costruiremo un semplice sistema di function calling usando il modello GPT-4.5 e la libreria Yahooquery. La libreria Yahooquery ci aiuterà a estrarre qualsiasi dato relativo ai titoli azionari da Yahoo Finance. 

La nostra soluzione permetterà agli utenti di fare domande sui prezzi azionari, attivando una funzione specifica che recupera il prezzo da internet e genera una risposta. È davvero così semplice. 

Cominceremo installando le librerie openai e yahooquery usando il comando PIP.

!pip install openai yahooquery -q

Creare una funzione per il prezzo azionario  

Crea una funzione Python che prende un ticker (ad es., AAPL) e restituisce il prezzo di quel ticker. Usa yahooquery nel backend per estrarre i dati rilevanti.

from openai import OpenAI
import json
from yahooquery import Ticker

def get_stock_price(ticker):
    try:
        # Create a Ticker object for the provided ticker symbol
        t = Ticker(ticker)
        # Retrieve the price data
        price_data = t.price
        # Check if we received valid data for the ticker
        if ticker in price_data and price_data[ticker].get("regularMarketPrice") is not None:
            price = price_data[ticker]["regularMarketPrice"]
        else:
            return f"Price information for {ticker} is unavailable."
    except Exception as e:
        return f"Failed to retrieve data for {ticker}: {str(e)}"
    
    return f"{ticker} is currently trading at ${price:.2f}"

Definire gli strumenti usando la funzione

Il client OpenAI non comprende la funzione Python, quindi dobbiamo creare uno strumento usando un elenco di dizionari. Dobbiamo fornire il nome, la descrizione e il tipo di output necessari. 

Ogni volta che questa funzione viene invocata, estrarrà il nome del ticker dal prompt e lo restituirà in un formato strutturato.

tools = [{
    "type": "function",
    "function": {
        "name": "get_stock_price",
        "description": "Get current stock price for a provided ticker symbol from Yahoo Finance using the yahooquery Python library.",
        "parameters": {
            "type": "object",
            "properties": {
                "ticker": {"type": "string"}
            },
            "required": ["ticker"],
            "additionalProperties": False
        },
        "strict": True
    }
}]

Lascia che sia il modello a decidere se chiamare la funzione

Testiamo la nostra funzione OpenAI appena creata. Fornisci alla chat completion il messaggio dell’utente, il nome del modello e gli strumenti.

client = OpenAI()

messages = [{"role": "user", "content": "What's the current price of Meta stock?"}]

completion = client.chat.completions.create(
    model="gpt-4.5-preview",
    messages=messages,
    tools=tools,
)

print(completion.choices[0].message.tool_calls)

Come possiamo vedere, GPT-4.5 ha invocato correttamente get_stock_price e ha restituito il ticker corretto (META).

[ChatCompletionMessageToolCall(id='call_uVGbahRiMnn4AkOJYbv8gfIV', function=Function(arguments='{"ticker":"META"}', name='get_stock_price'), type='function')]

Eseguire la funzione con il ticker fornito

Ora possiamo passare questo ticker alla nostra funzione Python get_stock_price. 

tool_call = completion.choices[0].message.tool_calls[0]
args = json.loads(tool_call.function.arguments)

result = get_stock_price(args["ticker"])

print(result)

Come risultato, ricevi una risposta che include il nome del ticker e il relativo prezzo.

META is currently trading at $640.00

Puoi fermarti qui, ma per fornire una risposta appropriata in linguaggio naturale, devi passare di nuovo i risultati alla chat completion.

Aggiungere la chiamata di funzione e il risultato dello strumento

Aggiungeremo la risposta generata dalla conversazione precedente e includeremo anche la chiamata allo strumento con l’ID dello strumento e i risultati.

messages.append(completion.choices[0].message)  # Model's function call message
messages.append({
    "role": "tool",
    "tool_call_id": tool_call.id,
    "content": str(result)
})

Inviare la conversazione aggiornata di nuovo al modello

Esegui di nuovo la chat completion con il messaggio che include il contenuto delle chiamate agli strumenti.

completion_2 = client.chat.completions.create(
    model="gpt-4.5-preview",
    messages=messages,
    tools=tools,
)

# The final model response incorporating the stock price information
print(completion_2.choices[0].message.content)

Come puoi vedere, abbiamo ottenuto il risultato corretto. 

The current price of Meta stock (META) is $640.00.

Potresti pensare che questo sia un passaggio inutile, ma quando hai un output complesso, questo step ti aiuterà a comprendere i risultati in inglese semplice invece che in formato JSON.

Se l’API di OpenAI ti crea confusione e vuoi saperne di più, valuta di seguire il percorso di carriera OpenAI Fundamentals per imparare a usare l’API di OpenAI per effettuare prompt ai modelli GPT e Whisper di OpenAI.

Multiple Function Calling con GPT4.5

Ora impareremo ad aggiungere un’altra funzione al nostro sistema di IA, in modo che GPT-4.5 possa decidere automaticamente quale funzione invocare in base al prompt dell’utente. Aggiungeremo una nuova funzione di feed che restituirà i 3 articoli di notizie principali con i relativi link per il ticker specificato. 

Inizia installando la libreria feedparser usando il comando pip. Useremo questa libreria per estrarre i titoli per il ticker specificato.

!pip install feedparser -q

Definisci la funzione per le notizie azionarie

Crea la funzione Python get_stock_news che prenderà il ticker in input e restituirà i tre titoli di notizie principali con i loro link.

import feedparser


def get_stock_news(ticker):
    # Construct the RSS feed URL for the given ticker.
    rss_url = f"https://feeds.finance.yahoo.com/rss/2.0/headline?s={ticker}&region=US&lang=en-US"
    try:
        feed = feedparser.parse(rss_url)
        if not feed.entries:
            return f"No news found for {ticker}."
        # Extract the top 3 news items (title and link)
        news_items = []
        for entry in feed.entries[:3]:
            title = entry.get("title", "No Title")
            link = entry.get("link", "No Link")
            news_items.append(f"{title} ({link})")
        news_str = "\n".join(news_items)
    except Exception as e:
        return f"Failed to retrieve news for {ticker}: {str(e)}"
    
    return f"Latest news for {ticker}:\n{news_str}"

get_stock_news("AAPL")

Abbiamo raccolto i tre titoli principali su Apple con i relativi link.

'Latest news for AAPL:\nNvidia AI Server Maker Hon Hai Posts 25% Jump in Two-Month Sales 
(https://finance.yahoo.com/news/nvidia-ai-server-maker-hon-075011863.html?.tsrc=rss)\nFoxconn says February revenue rose 56.43% y/y
(https://finance.yahoo.com/news/foxconn-says-february-revenue-rose-074433615.html?.tsrc=rss)\nApple Inc. (AAPL): Among the Best Stocks To Invest In According to Billionaires 
(https://finance.yahoo.com/news/apple-inc-aapl-among-best-051548210.html?.tsrc=rss)'

Definisci strumenti multipli per prezzo e notizie

Ora dobbiamo aggiungere un’altra funzione OpenAI chiamata get_stock_news con la descrizione e l’output appropriati.

tools = [
    {
        "type": "function",
        "function": {
            "name": "get_stock_price",
            "description": "Get current stock price for a provided ticker symbol using yahooquery.",
            "parameters": {
                "type": "object",
                "properties": {
                    "ticker": {"type": "string"}
                },
                "required": ["ticker"],
                "additionalProperties": False
            },
            "strict": True
        }
    },
    {
        "type": "function",
        "function": {
            "name": "get_stock_news",
            "description": "Get the latest news for a provided ticker symbol by parsing the Yahoo Finance RSS feed using feedparser.",
            "parameters": {
                "type": "object",
                "properties": {
                    "ticker": {"type": "string"}
                },
                "required": ["ticker"],
                "additionalProperties": False
            },
            "strict": True
        }
    }
]

Lascia che il modello decida se chiamare una o entrambe le funzioni

Proviamo a testare la funzione chiedendo a GPT-4.5 del titolo Google e delle ultime notizie su Google.

messages = [{
    "role": "user",
    "content": "What's the current price of Google stock and can you show me the latest news about it?"
}]


completion = client.chat.completions.create(
    model="gpt-4.5-preview",
    messages=messages,
    tools=tools,
)

completion.choices[0].message.tool_calls

Come possiamo vedere, ha invocato entrambe le funzioni per i prezzi azionari e per le ultime notizie.

[ChatCompletionMessageToolCall(id='call_zfcRJ4EcIUUqHCcN8SErjeoi', function=Function(arguments='{"ticker": "GOOGL"}', name='get_stock_price'), type='function'),
 ChatCompletionMessageToolCall(id='call_jBv8TlSPOyFKcRWHwByxLMb4', function=Function(arguments='{"ticker": "GOOGL"}', name='get_stock_news'), type='function')]

Salvare il risultato della chiamata di funzione

Il problema è che entrambe le funzioni restituiscono il ticker come risultato. Dobbiamo ideare una condizione if-else per determinare quale funzione è stata invocata. Salveremo i risultati della funzione nel dizionario.

# The model returns function call requests.
tool_calls = completion.choices[0].message.tool_calls

# Execute each function call based on the tool the model requested
tool_results = {}
for tool_call in tool_calls:
    func_name = tool_call.function.name
    args = json.loads(tool_call.function.arguments)
    if func_name == "get_stock_price":
        tool_results["price"] = get_stock_price(args["ticker"])
    elif func_name == "get_stock_news":
        tool_results["news"] = get_stock_news(args["ticker"])

Aggiungere la chiamata di funzione e i risultati degli strumenti

Ora aggiungeremo i risultati generati in precedenza e il risultato della funzione con l’ID dello strumento. 

messages.append(completion.choices[0].message)  # Append the model's function call message

for tool_call in tool_calls:
    func_name = tool_call.function.name
    result_content = tool_results.get("price") if func_name == "get_stock_price" else tool_results.get("news")
    messages.append({
        "role": "tool",
        "tool_call_id": tool_call.id,
        "content": result_content
    })

Inviare la conversazione aggiornata di nuovo al modello

Quando passiamo il messaggio risultante a GPT-4.5, ha generato risultati eccellenti e perfettamente ragionevoli.

from IPython.display import display, Markdown

completion_2 = client.chat.completions.create(
    model="gpt-4.5-preview",
    messages=messages,
    tools=tools,
)

# The final model response incorporates both stock price and news.
Markdown(completion_2.choices[0].message.content)

Abbiamo ottenuto il prezzo del titolo Google e i link alle principali notizie su Google. 

Il codice sorgente e gli output sono disponibili nel DataLab Workspace. Tutto ciò che devi fare è aggiungere la tua chiave API di OpenAI alla variabile d’ambiente, e potrai eseguire tutto in autonomia.

Conclusione

Abbiamo costretto i large language model a generare output strutturati e poi a passarli a un’API o a un’altra funzione Python per eseguire un compito specifico. Le IA avanzate, come GPT-4.5, possono usare più servizi o API per generare risposte altamente integrate. 

In futuro useremo il function calling e gli agenti per controllare tutto ciò che ci circonda; ti basterà inviare un comando vocale alla tua IA, che invocherà gli strumenti necessari in base al tuo comando e apporterà modifiche al sistema.

Abbiamo GPT-4.5, ma molti esperti di IA stanno aspettando GPT-5, che si prevede sarà più vicino all’AGI. Puoi scoprire tutto sul modello in arrivo leggendo il blog Tutto quello che sappiamo su GPT-5.

Abid Ali Awan

Autore

Abid Ali Awan

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