Il tuo estrattore di tabelle ha superato il test. I numeri no.

Ovvero: perché il "99% di precisione per cella" è il numero più pericoloso in una tabella finanziaria.

G
Greg T · Engineering· 12 min di lettura·Giu 21, 2026
Read in English

Una revisore apre il tuo risultato di estrazione per uno stato patrimoniale. Il modello mostra una precisione per cella del 99,2%. Impressionante. Poi calcola il totale della colonna delle attività a mano, come fanno i revisori, e ottiene un numero sfasato di una riga. Le attività non sono più uguali alle passività più il patrimonio netto. Il bilancio non quadra.

Lo 0,8% su cui il modello ha sbagliato non era un errore di battitura in una nota a piè di pagina. Era il totale.

Questo è lo scandalo silenzioso dell'estrazione di tabelle in finanza. Lo sappiamo per esperienza, perché abbiamo costruito le nostre prime pipeline per inseguire esattamente questi punteggi: benchmark che valutano una tabella come una griglia di stringhe (strings), mentre l'unica domanda che conta davvero per un lettore finanziario non viene mai posta. I numeri quadrano ancora? Le metriche che dominano le leaderboard sono, matematicamente, cieche agli errori che rovinano le carriere.


Cosa misurano realmente i benchmark

Se hai cercato un modello di estrazione di tabelle, hai visto i punteggi. TEDS. Cell-match accuracy. Grid similarity. Si riducono tutti alla stessa idea: allineare la tabella predetta con la tabella di riferimento (ground-truth), scorrere le celle e contare quante corrispondono.

TEDS (Tree-Edit-Distance Similarity) è la più popolare. Trasforma ogni tabella in un albero di righe e celle e misura quante modifiche sono necessarie per trasformare un albero nell'altro. Meno modifiche ci sono, più alto è il punteggio. È una metrica veramente ingegnosa, ed è stata progettata per rispondere a una domanda veramente utile: è più o meno la tabella giusta, con più o meno la forma e il testo giusti?

Questa domanda va benissimo per una revisione della letteratura o per fare scraping su Wikipedia. È la domanda sbagliata per un rendiconto finanziario.

Perché ecco come ciascuna di queste metriche tratta un numero: come una stringa (string). La cella 1,234.56 è, per il valutatore, sei glifi in una scatola. Non ha alcuna idea che questa scatola dovrebbe essere la somma delle quattro scatole sopra di essa. Non ha alcuna idea che il valore nella riga etichettata "Total assets" abbia un'importanza strutturale che il valore in "Misc. accruals" non ha. Ogni cella vale la stessa frazione del punteggio, e il punteggio è una media.

In finanza, gli errori non sono mai distribuiti uniformemente. E la media nasconde esattamente il punto in cui dovresti guardare.


Quattro modi in cui un punteggio del 99% ti dà comunque numeri sbagliati

Ecco le modalità di guasto che una metrica di similarità di stringhe non può vedere. Ognuna di queste ottiene un punteggio magnifico e ti rovina la giornata.

1. La colonna scivolata

Una tabella finanziaria a più colonne presenta "2023" e "2022" fianco a fianco. L'estrattore legge la geometria in modo leggermente errato e sposta ogni valore della colonna dell'anno precedente di una cella verso il basso. Ora, ogni numero del 2022 è attribuito alla riga sbagliata.

Per una metrica di corrispondenza delle celle (cell-match), non è successo quasi nulla. Le stesse stringhe sono presenti, in quasi le stesse celle. TEDS batte a malapena ciglio. Per un lettore, assolutamente tutti i numeri dell'anno precedente sono sbagliati, e l'analisi degli scostamenti costruita su di essi è pura finzione.

Il rendiconto finanziario di origine

Il tipo di rendiconto finanziario che un estrattore riceve realmente: una cella di intestazione unita sulle due colonne degli anni, una colonna di note, righe di sezione a tutta larghezza, sotto-elementi rientrati e punti di riempimento. Ovvio per un essere umano, un campo minato per un parser che deve decidere quale numero appartiene a quale riga e a quale anno. Ogni numero qui è corretto.

Conto economico consolidato scansionato con un'intestazione unita Esercizio chiuso al 31 dicembre che copre le colonne 2023 e 2022, una colonna di note e sezioni raggruppate
fig.1a · conto economico scansionato sintetico con intestazione unita + righe di sezione (ground truth)

La colonna scivolata

La colonna 2023 è stata estratta correttamente. Ogni valore della colonna 2022 è atterrato una riga troppo in basso, in modo che ogni numero dell'anno precedente si trovi ora sulla riga sbagliata. L'etichetta ti indica a chi appartiene il numero che è realmente atterrato in quella cella.

↓  l'intera colonna 2022 è scivolata di una riga verso il basso
Voce contabile2022 — nel documento2022 — come estratto
Ricavi1,610valore perso
Costo del venduto8701,610dai Ricavi
Margine lordo740870dal Costo del venduto
Opex505740dal Margine lordo
Risultato operativo235505dalle Opex
✓ Similarità TEDS: 98,6%✗ Colonna anno precedente: 100% sbagliata
Stesse stringhe, quasi le stesse celle, quindi la metrica gli assegna un punteggio quasi perfetto. Per un lettore, ogni numero del 2022 si trova ora sulla riga sbagliata, e l'analisi degli scostamenti costruita su di essi è pura finzione.
fig.1b · ground truth vs estrazione scivolata

2. Il decimale spostato

Un rendiconto finanziario tedesco scrive 1.234,56. Il modello, addestrato in un mondo in cui la virgola separa le migliaia, lo "corregge" gentilmente in 1,234.56, o peggio, rimuove i separatori e restituisce 123456.

I numeri ci sono tutti. La similarità di stringhe è entusiasta. Il valore è sbagliato di un fattore cento. Passa a un rendiconto finanziario francese, dove il separatore delle migliaia è uno spazio, e lo stesso modello divide un numero in tre.

La locale non è formattazione. La locale è aritmetica. Una virgola nel posto sbagliato non è una scelta di stile, è un numero diverso.

3. L'intestazione smarrita

I numeri sono estratti perfettamente. Ogni cifra è corretta. Ma l'intestazione di colonna "Restated" (Rideterminato) è stata unita a quella accanto, cosicché ora è impossibile sapere quali numeri corrispondano alla rideterminazione e quali siano gli originali. Le celle corrispondono alla ground truth. Il significato, invece, non sopravvive.

Una tabella in cui i numeri sono giusti e le intestazioni sono sbagliate non è corretta al 95%. È una pila di numeri corretti senza alcuna idea di cosa stiano contando. In finanza, un numero senza la sua etichetta non è un dato. È rumore che si dà il caso sia numerico.

4. Il negativo diventato positivo

I contabili scrivono i numeri negativi in questo modo: (1,200). Molti estrattori leggono le parentesi come una decorazione e restituiscono 1,200. Un accantonamento diventa un'attività. Un'uscita di cassa diventa un'entrata.

Un solo carattere. Il segno del flusso di cassa. La metrica conta le cifre come una corrispondenza e passa oltre.


Perché la metrica letteralmente non può vedere il problema

Nota lo schema. In tutti i casi precedenti, la tabella è strutturalmente corretta e aritmeticamente rotta. Le righe ci sono, le colonne ci sono, le stringhe sono vicine. La struttura ha superato il test. L'aritmetica ha fallito. E il punteggio non può notare la differenza, perché non ha mai misurato l'aritmetica per cominciare.

Il documento che il benchmark valuta

Una nota sui ricavi tratta direttamente da un report: intestazione dell'anno unita, colonna di note, righe numerate. Un modello leggerà ogni cifra perfettamente e ti darà comunque un totale che non corrisponde alla somma.

Nota sui ricavi scansionata il cui totale dichiarato per l'anno in corso di 1.824 non è uguale alla somma delle sue righe (1.284)
Direttamente sulla pagina, anno in corso: 612 + 288 + 154 + 230 = 1,284. Il totale dichiarato mostra 1,824. Un punteggio di similarità delle celle non verifica mai la somma, quindi non se ne accorge mai.
fig.2a · nota sintetica scansionata sui ricavi (intestazione unita)

La struttura ha superato il test. L'aritmetica ha fallito.

Ogni cella corrisponde al riferimento, quindi ognuna guadagna il suo segno di spunta verde. Ma somma le quattro righe e totalizzano 1,284 — e non i 1,824 stampati sulla riga del totale. Una metrica di stringhe non ha alcun modo di vedere questa discrepanza.

Voce contabileImporto (€000)
Ricavi da prodotti612
Ricavi da servizi288
Licenze154
Altri ricavi230
Somma delle quattro righe1,284
Ricavi totali (come stampato)1,824Δ 540
Le quattro celle sono individualmente corrette. Semplicemente non si sommano per dare il totale stampato. La precisione di corrispondenza delle celle (cell-match) non verifica mai una somma, quindi assegna un punteggio quasi perfetto.
✓ Precisione Cell-match: 99,2%✓ Similarità di stringhe: SUPERATO✗ Riconciliazione: FALLITO
fig.2b · cosa vede una metrica cell-match

Non è un problema di messa a punto. Non puoi risolverlo ponderando maggiormente alcune celle, perché la metrica non ha alcuna rappresentazione delle relazioni che contano. Non sa che una colonna deve corrispondere al suo totale. Non sa che le attività sono uguali alle passività più il patrimonio netto. Non sa che il saldo di chiusura di questo trimestre è il saldo di apertura del trimestre successivo. Per un punteggio di similarità di stringhe, uno stato patrimoniale e un menu da asporto sono lo stesso tipo di oggetto: una griglia di testo.

L'informazione che rende una tabella finanziaria finanziaria, ovvero i vincoli tra i numeri, è esattamente l'informazione che questi benchmark scartano prima ancora che la valutazione abbia inizio.

Ottieni così modelli che dominano la leaderboard ma a cui non si può ancora affidare un conto economico (P&L). La leaderboard non ha mai testato ciò di cui hai bisogno.


La metrica di cui la finanza ha realmente bisogno

Ecco il cambio di prospettiva. Smetti di chiedere "quanto è simile questa tabella alla tabella di riferimento". Inizia a chiedere "questa tabella quadra?"

Un rendiconto finanziario non è un artefatto sfocato che si valuta con una percentuale. È un sistema di equazioni con invarianti noti:

  • Le righe si sommano per formare i loro subtotali. I subtotali si sommano per formare i loro totali.
  • In uno stato patrimoniale, le attività sono uguali alle passività più il patrimonio netto.
  • Nei dati in partita doppia, i dare sono uguali agli avere.
  • Un saldo di chiusura di un periodo è uguale al saldo di apertura del successivo, in assenza di rideterminazioni esplicite.
  • Una colonna di percentuali, ricalcolata dalle sue colonne di origine, riproduce se stessa.

Queste non sono euristiche. È la definizione di un rendiconto finanziario corretto. E ti danno qualcosa che un punteggio di similarità non potrà mai darti: una verifica binaria, interna al documento, che non richiede alcuna ground truth. La tabella si riconcilia o non si riconcilia. Quando non lo fa, non hai bisogno di un annotatore per dirti che qualcosa non va. Te lo dice l'aritmetica.

In pseudo-codice, il test che conta davvero non assomiglia per niente a una distanza di editing:

# Not: how close are these two grids of strings?
# But: does the extracted table obey its own arithmetic?

def reconciles(table):
    for total_row in table.totals():
        components = table.rows_feeding(total_row)
        if abs(sum(components) - total_row.value) > tolerance:
            return Fail(total_row, expected=sum(components), got=total_row.value)

    if table.is_balance_sheet():
        if abs(table.assets - (table.liabilities + table.equity)) > tolerance:
            return Fail("balance sheet does not balance")

    return Pass()

La bellezza della cosa: questa verifica viene eseguita su un singolo documento, senza annotazioni di riferimento, in produzione, sul vero estratto conto che il tuo cliente ha appena caricato. Un benchmark di similarità delle celle può solo dirti come si è comportato un modello sul set di test di qualcun altro il mese scorso. La riconciliazione ti dice se questo numero, quello che sta per influenzare una decisione di credito, è affidabile in questo preciso momento.

Due domande, due metriche

L'industria ha costruito metriche per tabelle per rispondere a una domanda. La finanza ne ha sempre posta un'altra.

Cosa chiedono i benchmark

“È più o meno la tabella giusta?”

Metriche
TEDS · cell-match · GriTS
Cos'è una cella, per il punteggio
  • Una stringa di glifi in una scatola
  • Vale quanto qualsiasi altra cella
  • Mediata in un singolo numero
Cieco a
  • Somme e subtotali
  • Segni e negativi tra parentesi
  • Spostamenti di decimali e di locale
  • Intestazioni orfane
Verdetto: una percentuale sfocata
Cosa chiede la finanza

“Questa tabella quadra?”

Verifiche
  • Σ righe = subtotale = totale
  • Attività = passività + patrimonio netto
  • Dare = avere
  • Saldo di chiusura = prossima apertura*
Requisiti
  • Nessuna annotazione di ground-truth
  • Viene eseguito su un documento live
Verdetto: quadra, oppure no
fig.3 · *in assenza di rideterminazioni esplicite

Una tabella che non quadra non è giusta al 99%. È affidabile allo 0%. Non c'è spazio per la compiacenza per un rendiconto finanziario che non quadra.


Come progettiamo questo in Holofin

Trasformare documenti finanziari caotici in numeri su cui puoi basare una decisione è il nostro vero lavoro. Il problema delle metriche di cui sopra non è accademico per noi. È la differenza tra la demo di un modello e un sistema che un revisore convaliderà.

Alcuni principi derivano dal prendere la cosa sul serio:

  • Riconciliare, non assomigliare. Non consideriamo una tabella come estratta finché non obbedisce alla propria aritmetica. I totali devono corrispondere alla somma. Gli stati patrimoniali devono quadrare. I periodi devono susseguirsi. La somiglianza con un riferimento è una comodità di sviluppo. La riconciliazione è il vero accordo.
  • Un numero non è una stringa. Ogni valore porta con sé il suo tipo, il suo segno, la sua locale e la sua valuta, analizzati deliberatamente, e non dedotti dal modo in cui è stato punteggiato. (1.234,56) è un milleduecento negativo, e lo trattiamo come tale fin dal primo passaggio.
  • Vincoli piuttosto che impressioni (vibes). Quando l'aritmetica non quadra, non è un fastidio di arrotondamento da eliminare. È un segnale. Lo evidenziamo, proviamo strategie di estrazione alternative ed escaliamo per la revisione piuttosto che fornire una risposta sbagliata con sicurezza.
  • Una provenienza per numero. Ogni valore estratto porta con sé la sua pagina, la sua bounding box e il lignaggio della sua intestazione, in modo che un revisore possa cliccare su qualsiasi numero per risalire ai pixel esatti da cui proviene. Un numero che non puoi tracciare è un numero che non puoi difendere.

Questo è anche il motivo per cui siamo cauti riguardo ai numeri che pubblichiamo. Osserviamo una precisione zero-shot di oltre il 97% sui documenti finanziari comuni, e costruiamo gli strumenti per catturare gli ultimi punti percentuali piuttosto che fingere che non esistano, perché in finanza, quegli ultimi punti percentuali sono precisamente dove si trova il totale.


Conclusione

L'industria ha costruito metriche di estrazione di tabelle per rispondere a "è più o meno la tabella giusta". La finanza ha sempre posto una domanda diversa: "questi numeri quadrano?"

Un modello può superare il primo test e fallire il secondo sull'unica riga che conta, e il punteggio non te lo dirà mai. Quindi smettila di valutare le tabelle finanziarie in base al loro aspetto. Valutale in base alla loro capacità di quadrare.

Se il tuo estrattore ha già superato un benchmark pur consegnandoti un rendiconto finanziario che non quadrava, sai già quale numero era sbagliato. Era il totale. È sempre il totale.

Articoli correlati

Holofin