Valutazione d’azienda con LLM e Function Calling per modelli d’avanguardia

By

13–20 minuti

Combinare LLM, Codice e API per trasformare e sperimentare modelli di frontiera nelle valutazioni aziendali. Valutazioni interattive, in Real-Time e conversazionali.

Negli scenari finanziari odierni, la valutazione aziendale si presenta come un processo non solo cruciale, ma anche affascinante e talvolta complesso, che richiede l’applicazione di diverse metodologie e un’analisi approfondita di innumerevoli dati provenienti da fonti variegate. L’integrazione di modelli linguistici di grandi dimensioni (LLM) con le funzionalità di Function Calling e strumenti personalizzati apre nuove porte, trasformando questo processo in un’opportunità più accessibile, efficiente e innovativa. Questo consente non solo di automatizzare le operation, ma anche di affinare l’accuratezza delle valutazioni, integrando dati tramite API e service data provider, per prendere decisioni strategiche sempre più informate e in real time.

Grazie alla capacità dei modelli di elaborazione del linguaggio naturale di comprendere il contesto, possiamo adottare un approccio innovativo alla valutazione aziendale, integrando variabili economiche e finanziarie, calcoli già effettuati e deterministici in tempo reale all’interno della COTEXT window di un modello LLM. Questo permetterà di realizzare una valutazione qualitativa e quantitativa affidabile. In questo articolo, esploreremo un modello di valutazione aziendale basato su LLM che sfrutta la Function Calling per interagire con funzioni Python specializzate in diversi metodi di valutazione, combinando così la potenza analitica di un linguaggio di programmazione con la flessibilità linguistica di un LLM, per offrire soluzioni su misura per imprenditori tecnologici.

L’architettura del Modello: LLM come orchestratore Intelligente

Al cuore del nostro modello c’è un LLM che agisce come un orchestratore intelligente. Il suo compito principale è interpretare le richieste in linguaggio naturale dell’utente e determinare quale metodo di valutazione sia più appropriato, estraendo i parametri (argomenti di input) necessari per i calcoli da passare alla funzione di valutazione da richiamare.

La chiave di questa integrazione è la funzionalità di Function Calling offerta dall’API di OpenAI. Questa feature permette all’LLM di “capire” quando la richiesta dell’utente può essere soddisfatta invocando una delle funzioni esterne disponibili.

Quando l’LLM identifica la necessità di un calcolo, genera una struttura JSON che specifica il nome della funzione Python da chiamare e gli argomenti estratti dalla richiesta dell’utente. Il nostro codice Python intercetta questa “tool call”, esegue la funzione corrispondente con i parametri forniti e restituisce il risultato all’LLM.

Le funzioni di valutazione: Il motore dei calcoli

Astronauta in un paesaggio marziano con un sole rosso sullo sfondo.
Immagine creata con Google Gemini Imagen 3. By Salvatore Miseo

Il cuore operativo del modello è rappresentato da un set di funzioni di calcolo Python, ciascuna specializzata in un metodo di valutazione aziendale riconosciuto:

  • Valutazioni basate sui Flussi di Cassa scontati (DCF): Implementazioni per modelli a uno, due e tre stadi di crescita. Questi metodi sono fondamentali per stimare il valore intrinseco di un’azienda basato sulle sue future capacità di generare liquidità.
    • discounted_cash_flow_one_stage: Per valutazioni DCF semplici con un unico tasso di crescita esplicito.
    • discounted_cash_flow_two_stage: Per scenari con due fasi di crescita distinte.
    • discounted_cash_flow_three_stage: Per modelli più complessi con tre fasi di crescita.
  • Metodi Patrimoniali e Reddituali: Funzioni come income_based_valuation (capitalizzazione degli utili), asset_based_valuation (valore netto degli asset) e mixed_method_valuation offrono prospettive diverse basate sul bilancio e sulla redditività storica o normalizzata.
    • income_based_valuation: Implementa il metodo reddituale della capitalizzazione.
    • asset_based_valuation: Calcola il valore patrimoniale netto.
    • mixed_method_valuation: Combina i risultati dei metodi reddituale e patrimoniale.
  • Metodi a Multipli: La funzione market_multiplier_valuation consente di stimare il valore confrontando l’azienda con operazioni di mercato simili, basandosi su metriche chiave (EBITDA, Utile, Fatturato, ecc.) e relativi moltiplicatori.
    • market_multiplier_valuation: Utilizza multipli di mercato per la stima.

Queste funzioni sono robuste e implementano la logica finanziaria necessaria.

Pydantic e la struttura dei dati

Per garantire che l’LLM fornisca gli argomenti corretti alle funzioni Python, utilizziamo la libreria Pydantic. Definiamo classi Pydantic (BaseModel) che modellano la struttura attesa per i parametri di ogni funzione di valutazione.

Pydantic non solo fornisce validazione automatica dei dati, ma ci permette anche di generare automaticamente gli schemi JSON necessari per configurare i “tools” per l’API di OpenAI. Questo assicura una comunicazione accurata tra l’LLM e le funzioni Python.

Il workflow di una valutazione

Il processo di valutazione si svolge tipicamente in questo modo:

  1. Input Utente: L’utente inserisce la sua richiesta in linguaggio naturale tramite un’interfaccia (nel nostro caso, basata su ipywidgets).
  2. Richiesta all’LLM: La funzione principale (get_company_valuation) invia la richiesta dell’utente all’LLM, insieme alle istruzioni di sistema e alla definizione dei tools disponibili.
  3. Decisione e Tool Call: L’LLM analizza la richiesta, identifica il metodo di valutazione appropriato ed estrae i parametri. Quindi, risponde generando una o più “tool calls” specificando quale funzione chiamare e con quali argomenti.
  4. Esecuzione Funzione: Il codice Python intercetta le tool calls, esegue le funzioni di valutazione richieste con gli argomenti forniti dall’LLM.
  5. Feedback all’LLM: Il risultato del calcolo viene reinviato all’LLM come parte della conversazione.
  6. Risposta Finale: L’LLM, avendo a disposizione il risultato del calcolo, genera una risposta finale in linguaggio naturale, spiegando la valutazione e i risultati all’utente.
  7. Output Utente: La risposta finale viene visualizzata all’utente tramite l’interfaccia.

Questo flusso è ben rappresentato dal Diagramma di Sequenza UML:

Diagramma di sequenza UML che rappresenta il flusso del processo di valutazione aziendale interattiva, evidenziando le interazioni tra utente, interfaccia, modello LLM e funzioni di valutazione.

Aplicare il workflow di analisi

Vediamo come si svolge un tipico processo di valutazione attraverso questo modello integrato:

  1. La richiesta in linguaggio naturale: Un manager o un imprenditore o un analista innovativo inserisce una domanda come: “Valutami un’azienda con un flusso di cassa iniziale di 500.000€, crescita 7% per 5 anni, poi 3% per 5 anni, tasso di sconto 10% e crescita terminale 1.5%.” tramite una semplice interfaccia (nel nostro esempio, basata su ipywidgets).
  2. L’LLM interpreta; Lafunzione get_company_valuation invia questa richiesta all’LLM insieme alle istruzioni sul suo ruolo di esperto finanziario e alla lista dei metodi di valutazione disponibili (i “tools”).
  3. La decisione e la Tool Call: L’LLM analizza la frase, riconosce la descrizione di un DCF a due stadi e identifica la funzione e individua gli argomenti numerici da passare alla funzione (initial_cash_flowstage1_growth_ratestage1_years, ecc.). Genera quindi una risposta che include una tool_call specificando di chiamare la funzione discounted_cash_flow_two_stage con i parametri estratti.
  4. Esecuzione della funzione Python: Il codice Python intercetta la tool_call, estrae il nome della funzione e gli argomenti (validati da Pydantic) ed esegue la funzione discounted_cash_flow_two_stage con i dati forniti.
  5. Il risultato torna all’LLM: Il risultato del calcolo (il valore aziendale, i flussi scontati, ecc.), formattato in JSON, viene inviato nuovamente all’LLM come un “messaggio di sistema” o “tool message”, arricchendo il contesto della conversazione.
  6. L’LLM spiega il risultato: Ora, con sia la richiesta originale dell’utente sia il risultato numerico del calcolo, l’LLM genera una risposta finale in linguaggio naturale. Questa risposta non è solo il numero finale, ma include una spiegazione del metodo utilizzato, i parametri considerati e il significato del risultato. Per l’analista esperto, questo può servire come base per ulteriori approfondimenti; per il manager o l’imprenditore, fornisce una comprensione chiara del valore stimato e delle sue determinanti.
  7. Presentazione all’Utente: La risposta finale dell’LLM viene visualizzata nell’interfaccia.

Di seguito si riporta il diagramma di flusso all’interno della funzione `get_company_valuation` che descrive la logica di interazione:

Diagramma di sequenza UML che illustra il flusso di un processo di valutazione aziendale tramite un LLM e funzioni Python specializzate.

La funzione prende il messaggio dell’utente come input. Costruisce un messaggio di sistema/o step che istruisce l’LLM sul suo ruolo di analista finanziario e sui metodi di valutazione disponibili. Effettua una prima chiamata all’API di OpenAI (`client.chat.completions.create`) passando il messaggio dell’utente, il ruolo del sistema e la lista dei `valuation_tools`. Il modello può rispondere direttamente o generare una o più ‘tool_calls’. Se ci sono tool calls, la funzione itera su di esse, estrae il nome della funzione e gli argomenti, ed esegue la funzione Python corrispondente (`discounted_cash_flow_one_stage`, ecc.) con gli argomenti forniti dall’LLM. La risposta di ciascuna funzione viene aggiunta alla conversazione come messaggio di ruolo ‘tool’. Infine, viene effettuata una seconda chiamata all’API con l’intera cronologia della conversazione (inclusi i risultati delle tool calls) per ottenere la risposta finale formattata dall’LLM, che spiega la valutazione eseguita.

Perché questo esempio rappresenta un’avanguardia nelle valutazioni?

Un astronauta in tuta spaziale osserva un sole rosso che sorge su una superficie rocciosa e desolata, illuminando l'ambiente circostante con luci calde e una tonalità rossa intensa.
Immagine creata con Google Gemini Imagen 3. By Salvatore Miseo

Questo caso d’uso automatizza i passaggi ripetitivi e standardizza l’applicazione dei metodi, consentendoti di dedicare più tempo all’analisi critica, alla raccolta dati complessi e all’interpretazione sfumata dei risultati. È uno strumento potente per aumentare l’efficienza e la portata della tua analisi in tempo reale.

Permette di ottenere un accesso rapido a stime di valore basate su metodologie solide, senza dover per forza essere un esperto financial modelling. Supporta decisioni strategiche informate, dalla valutazione di opportunità di M&A alla comprensione del valore di modelli business per la pianificazione futura o la raccolta fondi. Evolvendo il caso d’uso, modelli più strutturati potrebbero permettere di valutare in tempo reale un’idea o una startup, o una opportunità di business in modo intuitivo per esplorare scenari di crescita e il loro impatto sul valore, aiutandoti a comunicare meglio il potenziale della tua impresa a attori interni, investitori o partner.

L’integrazione tra LLM e Function Calling nella finanza è solo all’inizio di un’evoluzione entusiasmante. Questo innovativo modello di valutazione apre la strada a strumenti finanziari intelligenti, accessibili e potenti. I passi futuri potrebbero includere una sinergia con fonti di dati finanziari in tempo reale, grazie all’implementazione di funzioni per richiamare API o server MCP. Questo permetterebbe di modellare scenari complessi e di applicare previsioni e analisi di rischio in modo sempre più preciso e intuitivo.

Stiamo entrando in un’era in cui l’intelligenza artificiale non sostituisce l’esperienza finanziaria, ma la potenzia, rendendo analisi complesse come la valutazione aziendale più democratiche, rapide e potenti per tutti i livelli decisionali.

Applicare il modello di valutazione

MODELLO

QUESITO

Voglio valutare un’azienda con un flusso di cassa iniziale di 500.000€, una crescita annua del 7% per i primi 5 anni e del 3% per i successivi 5 anni.
Il tasso di sconto è del 10% e la crescita terminale è dell’1.5%. Quale metodo di valutazione consigli?

OUTPUT

Ho utilizzato il metodo DCF a due stadi per valutare l’azienda. Ecco i dettagli del calcolo:

Fase 1: Crescita del 7% per i primi 5 anni

  • Anno 1: Flusso di cassa di 535.000€, valore attuale di 486.364€
  • Anno 2: Flusso di cassa di 572.450€, valore attuale di 473.099€
  • Anno 3: Flusso di cassa di 612.521,5€, valore attuale di 460.196€
  • Anno 4: Flusso di cassa di 655.398€, valore attuale di 447.646€
  • Anno 5: Flusso di cassa di 701.275,87€, valore attuale di 435.437€

Fase 2: Crescita del 3% per i successivi 5 anni

  • Anno 6: Flusso di cassa di 722.314,14€, valore attuale di 407.728€
  • Anno 7: Flusso di cassa di 743.983,57€, valore attuale di 381.781€
  • Anno 8: Flusso di cassa di 766.303,07€, valore attuale di 357.486€
  • Anno 9: Flusso di cassa di 789.292,16€, valore attuale di 334.737€
  • Anno 10: Flusso di cassa di 812.970,93€, valore attuale di 313.435€

Valore Terminale

  • Valore Terminale: 9.707.829,34€, valore attuale di 3.742.788€

Valore Complessivo dell’Azienda

  • Valore d’Impresa (Enterprise Value): 7.840.697,69€

Il valore d’impresa calcolato è di circa 7.840.698€. Questo valore rappresenta la somma dei flussi di cassa attualizzati delle due fasi di crescita e il valore terminale attualizzato. Questo metodo è particolarmente adatto per aziende con fasi di crescita distinte e un tasso di crescita terminale più stabile.

L’output viene generato dalle funzioni specifiche individuate e richiamate dal LLM configurato, il quale si occupa di interpretare il quesito, orchestrare le funzioni e gli strumenti implementati, inferire gli argomenti e restituire un output in linguaggio naturale. Questo processo permette di ottenere risultati precisi e coerenti grazie ai calcoli effettuati.

Uno sguardo tecnico sotto il cofano del modello

Per tutti coloro che desiderano comprendere i meccanismi sottostanti, il modello si basa su un’architettura modulare che integra un Large Language Model con un set di strumenti computazionali specializzati tramite la funzionalità di Function Calling.

Le componenti chiave includono:

  1. Il Modello linguistico (LLM): Utilizziamo un modello avanzato (come GPT-4o) configurato con un ruolo di “esperto analista finanziario”. Questo viene ottenuto tramite la definizione di un system_message che ne guida il comportamento, indirizzandolo a identificare le richieste di valutazione, scegliere i metodi appropriati (DCF, patrimoniale, reddituale, multipli, misto) e riconoscere i parametri necessari. L’LLM processa l’input dell’utente in linguaggio naturale.
  2. Le funzioni di valutazione (Python Functions): Questo è il layer computazionale. È costituito da un insieme di funzioni Python distinte (es. discounted_cash_flow_one_stageincome_based_valuationasset_based_valuation, ecc.), ciascuna implementante la logica di calcolo per uno specifico metodo di valutazione aziendale. Queste funzioni sono progettate per essere pure (dato un input, producono sempre lo stesso output) e gestiscono le specificità matematiche e finanziarie di ciascun metodo.
  3. Definizione dei tools (OpenAI API Schema): Le funzioni di valutazione Python vengono esposte all’LLM come “tools” tramite la struttura valuation_tools. Ciascun tool viene descritto all’API di OpenAI specificando il nome della funzione e, crucialmente, lo schema JSON dei suoi parametri attesi. Questo schema è generato automaticamente dalle classi Pydantic definite per ciascun metodo di valutazione. La descrizione e lo schema permettono all’LLM di sapere quali funzioni sono disponibili, a cosa servono e quali dati richiedono.
  4. Validazione dei parametri (Pydantic): La libreria Pydantic gioca un ruolo fondamentale nel garantire l’integrità dei dati scambiati tra l’LLM e le funzioni Python. Per ogni funzione di valutazione, definiamo una classe che eredita da pydantic.BaseModel. Queste classi specificano il nome, il tipo di dato atteso (es. float per valori monetari o tassi, int per anni, str per nomi di metriche) e includono descrizioni dettagliate per ciascun parametro tramite Field(description="..."). Quando l’LLM genera una tool_call con gli argomenti estratti dalla richiesta dell’utente (tipicamente in formato JSON), questi argomenti vengono passati al corrispondente modello Pydantic. Pydantic valida automaticamente i dati in ingresso:
    • Controllo dei Tipi: Verifica che ogni valore corrisponda al tipo di dato specificato (un numero sia un float, un testo sia una stringa, ecc.).
    • Gestione dei Valori Mancanti: Segnala un errore se un campo richiesto (Field senza Optional) non è presente negli argomenti forniti dall’LLM.
    • Coercizione (dove possibile): In alcuni casi, Pydantic può tentare di convertire i dati al tipo corretto (es. una stringa “100000” in un float 100000.0).
    • Descrizioni per l’LLM: Le descrizioni definite nei campi (Field(description=...)) sono cruciali perché vengono incluse nello schema JSON esposto all’API di OpenAI, aiutando l’LLM a comprendere meglio il significato di ciascun parametro e a estrarre le informazioni corrette dalla richiesta dell’utente. Questa validazione robusta è essenziale per prevenire errori a runtime nelle funzioni di calcolo dovuti a dati incompleti o in formato errato, aumentando significativamente l’affidabilità del sistema.
  5. La funzione orchestratrice (get_company_valuation): Questa è la funzione Python che gestisce l’interazione tra l’utente, l’LLM e le funzioni di valutazione. Riceve la richiesta dell’utente, costruisce la sequenza di messaggi per la conversazione con l’LLM (includendo il messaggio di sistema e le definizioni dei tools), invia la richiesta all’API di OpenAI. Quando l’LLM risponde con una o più tool_callsget_company_valuation le intercetta, estrae il nome della funzione e gli argomenti (validandoli con Pydantic) ed esegue la funzione Python corrispondente. Il risultato del calcolo viene quindi re-inserito nella conversazione come un “tool message”, fornendo all’LLM il contesto necessario per generare la risposta finale in linguaggio naturale.
Astronauta che osserva un sole rosso su un paesaggio alieno, caratterizzato da rocce e un cielo di tonalità molto calde.

Il Flusso operativo dettagliato è il seguente:

  1. Ricezione della richiesta e definizione dei tools: La funzione get_company_valuation invia la richiesta dell’utente in linguaggio naturale all’API di OpenAI. Insieme alla richiesta, vengono inviati:
    • Un system_message che definisce il ruolo dell’LLM (esperto analista finanziario) e le sue istruzioni generali (scegliere metodi appropriati, spiegare, usare valori ragionevoli, ecc.).
    • La struttura valuation_tools, che è un array di oggetti JSON. Ogni oggetto in questo array descrive un tool disponibile (una funzione Python) all’LLM. La descrizione include il name della funzione e, crucialmente, lo schema JSON dei parameters attesi, generato da Pydantic. Questo schema non solo specifica il nome e il tipo di dato di ogni parametro, ma include anche la description dettagliata definita nei modelli Pydantic.
  2. Elaborazione LLM e identificazione dell’Intento: L’LLM riceve il messaggio dell’utente e l’elenco dei tools disponibili con le loro descrizioni e schemi di parametri. Utilizzando le sue capacità di comprensione del linguaggio naturale e il contesto fornito dal system_message, l’LLM analizza l’intento dell’utente. Ad esempio, se l’utente menziona “flusso di cassa iniziale”, “tasso di crescita”, “anni di proiezione” e “crescita terminale”, l’LLM riconosce che la richiesta è correlata a un metodo DCF. Confrontando gli elementi della richiesta con le descrizioni e i parametri dei tools disponibili, l’LLM “ragiona” e individua il tool (la funzione) che meglio corrisponde all’intento dell’utente (es. discounted_cash_flow_one_stage_two_stage, o _three_stage).
  3. Estrazione degli argomenti: Una volta identificata la funzione appropriata, l’LLM esamina nuovamente la richiesta dell’utente per estrarre i valori specifici necessari per i parametri di quella funzione. Le descrizioni dei parametri nello schema JSON del tool (derivate da Pydantic) sono fondamentali in questa fase, guidando l’LLM a capire quali numeri o stringhe nella richiesta corrispondono a quale parametro (es. identificare “500.000€” come initial_cash_flow, “7%” come stage1_growth_rate, “5 anni” come stage1_years, ecc.).
  4. Generazione della tool_call: Dopo aver identificato la funzione e estratto gli argomenti, l’LLM non esegue il calcolo, ma genera una risposta speciale contenente una o più tool_calls. Ogni tool_call è un oggetto JSON che include:
    • id: Un identificatore univoco per questa specifica chiamata.
    • type: Specifica il tipo di tool (attualmente sempre “function”).
    • function: Un oggetto contenente:
      • name: Il nome della funzione identificata dall’LLM (es. "discounted_cash_flow_two_stage").
      • arguments: Una stringa JSON contenente i parametri estratti e i loro valori nel formato atteso dallo schema Pydantic della funzione corrispondente (es. "{ \"initial_cash_flow\": 500000.0, \"stage1_growth_rate\": 0.07, ...}").
  5. Processamento della tool_call da parte del codice python: La funzione get_company_valuation riceve questa risposta dall’API di OpenAI. Rileva la presenza di tool_calls e itera su ciascuna di esse. Per ogni tool_call, estrae il name della funzione e la stringa arguments.
  6. Validazione Pydantic e esecuzione funzione: La stringa arguments viene deserializzata in un dizionario Python. Questo dizionario viene quindi passato al modello Pydantic corrispondente alla funzione chiamata. È qui che Pydantic entra in gioco per la validazione rigorosa: verifica che tutti i parametri obbligatori siano presenti, che i loro tipi di dato siano corretti e che soddisfino eventuali vincoli definiti nel modello Pydantic. Se la validazione ha successo, la funzione Python corrispondente viene eseguita con gli argomenti validati. Se fallisce, viene gestita l’eccezione.
  7. Feedback del risultato all’LLM: Il risultato dell’esecuzione della funzione Python (il valore calcolato, i dettagli intermedi, ecc.) viene serializzato in JSON e inviato nuovamente all’API di OpenAI come un messaggio di ruolo “tool”, associato all’id della tool_call originale. Questo fornisce all’LLM il risultato concreto del calcolo che aveva richiesto.
  8. Generazione della risposta finale: Con la cronologia completa della conversazione (inclusa la richiesta iniziale, la tool_call dell’LLM e il risultato del tool), l’LLM genera la risposta finale in linguaggio naturale. Ora può interpretare il risultato numerico fornito dal tool e presentarlo all’utente in modo comprensibile, spiegando il metodo usato e i valori chiave.

RIMANIAMO IN CONTATTO!

Ci piacerebbe aggiornarti con le nostre ultime novità e offerte

Non inviamo spam! Leggi la nostra Informativa sulla privacy per avere maggiori informazioni.