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.
L’LLM non esegue direttamente i complessi calcoli finanziari. Invece, si affida a un set di funzioni Python specializzate, ciascuna implementando un metodo di valutazione specifico (come DCF a uno, due o tre stadi, metodi reddituali, patrimoniali, misti o a multipli).
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

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) emixed_method_valuationoffrono 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_valuationconsente 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:
- Input Utente: L’utente inserisce la sua richiesta in linguaggio naturale tramite un’interfaccia (nel nostro caso, basata su
ipywidgets). - 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. - 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.
- Esecuzione Funzione: Il codice Python intercetta le tool calls, esegue le funzioni di valutazione richieste con gli argomenti forniti dall’LLM.
- Feedback all’LLM: Il risultato del calcolo viene reinviato all’LLM come parte della conversazione.
- 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.
- Output Utente: La risposta finale viene visualizzata all’utente tramite l’interfaccia.
Questo flusso è ben rappresentato dal Diagramma di Sequenza UML:

Aplicare il workflow di analisi
Vediamo come si svolge un tipico processo di valutazione attraverso questo modello integrato:
- 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). - L’LLM interpreta; Lafunzione
get_company_valuationinvia questa richiesta all’LLM insieme alle istruzioni sul suo ruolo di esperto finanziario e alla lista dei metodi di valutazione disponibili (i “tools”). - 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_flow,stage1_growth_rate,stage1_years, ecc.). Genera quindi una risposta che include unatool_callspecificando di chiamare la funzionediscounted_cash_flow_two_stagecon i parametri estratti. - 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 funzionediscounted_cash_flow_two_stagecon i dati forniti. - 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.
- 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.
- 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:

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?

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:
- 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_messageche 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. - Le funzioni di valutazione (Python Functions): Questo è il layer computazionale. È costituito da un insieme di funzioni Python distinte (es.
discounted_cash_flow_one_stage,income_based_valuation,asset_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. - 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. - 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.floatper valori monetari o tassi,intper anni,strper nomi di metriche) e includono descrizioni dettagliate per ciascun parametro tramiteField(description="..."). Quando l’LLM genera unatool_callcon 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 (
FieldsenzaOptional) 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.
- 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_calls,get_company_valuationle 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.

Il Flusso operativo dettagliato è il seguente:
- Ricezione della richiesta e definizione dei tools: La funzione
get_company_valuationinvia la richiesta dell’utente in linguaggio naturale all’API di OpenAI. Insieme alla richiesta, vengono inviati:- Un
system_messageche 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 ilnamedella funzione e, crucialmente, lo schema JSON deiparametersattesi, generato da Pydantic. Questo schema non solo specifica il nome e il tipo di dato di ogni parametro, ma include anche ladescriptiondettagliata definita nei modelli Pydantic.
- Un
- 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). - 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%” comestage1_growth_rate, “5 anni” comestage1_years, ecc.). - 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. Ognitool_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, ...}").
- Processamento della
tool_callda parte del codice python: La funzioneget_company_valuationriceve questa risposta dall’API di OpenAI. Rileva la presenza ditool_callse itera su ciascuna di esse. Per ognitool_call, estrae ilnamedella funzione e la stringaarguments. - Validazione Pydantic e esecuzione funzione: La stringa
argumentsviene 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. - 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’
iddellatool_calloriginale. Questo fornisce all’LLM il risultato concreto del calcolo che aveva richiesto. - Generazione della risposta finale: Con la cronologia completa della conversazione (inclusa la richiesta iniziale, la
tool_calldell’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.
Questo processo permette all’LLM di fungere da interfaccia e motore di ragionamento che delega i calcoli precisi a strumenti specializzati, con Pydantic che garantisce l’affidabilità e la struttura dello scambio di dati critici.
