Estrazione automatica
Arricchimento semantico
Output aggregato
Il Contesto
Il progetto nasce come iniziativa sperimentale di aggregazione contenuti per il settore media: raccogliere informazioni distribuite su un insieme eterogeneo di fonti web e renderle confrontabili e consultabili da un unico punto. Trattandosi di un contesto soggetto a riservatezza, le fonti specifiche e la logica di arricchimento di dominio non vengono divulgate; il valore del case study sta nell'architettura e nell'approccio, non nei dati trattati.
Il problema e ricorrente in editoria e media intelligence: ogni sito espone i propri contenuti con un markup diverso, senza un'API comune. Chi deve monitorare o aggregare quei contenuti finisce per copiarli a mano o per mantenere uno script fragile per ciascuna fonte, con un costo di manutenzione che cresce linearmente con il numero di sorgenti.
Il Problema
L'estrazione manuale o ad-hoc presentava tre criticita strutturali, indipendenti dalla fonte:
- HTML eterogeneo: ogni fonte ha selettori, annidamenti e convenzioni diverse. Un parser scritto per un sito si rompe sul successivo, e ogni restyle lato fonte richiede un intervento.
- Contenuto grezzo, non confrontabile: il testo estratto resta una stringa non normalizzata, senza categorie, entita o tag. Aggregare dieci fonti significa avere dieci formati diversi da riconciliare a valle.
- Nessun valore semantico: estrarre il testo e solo meta del lavoro. Per renderlo utile servono classificazione, sintesi ed estrazione di entita, attivita che a mano non scalano oltre poche decine di documenti.
L'obiettivo era un servizio backend unico capace di assorbire la diversita delle fonti a monte e restituire, a valle, un output strutturato e arricchito sempre nello stesso formato, indipendentemente da dove arrivasse il contenuto.
La Soluzione
L'architettura e una pipeline a tre stadi esposta da un servizio Node.js / Express, con ogni stadio isolato in modo da poter intervenire su un livello senza toccare gli altri.
1. Fetch e estrazione
Il primo stadio recupera l'HTML grezzo della fonte e lo passa a Cheerio, che fornisce un'API jQuery-like server-side per interrogare il DOM. Le regole di estrazione sono configurabili per fonte (selettori e mappatura campi esterni al codice), cosi aggiungere una sorgente significa dichiarare una configurazione, non scrivere un nuovo parser. L'output di questo stadio e un oggetto pulito e normalizzato: titolo, corpo, metadati, ripuliti da boilerplate e markup.
2. Arricchimento AI
Il contenuto normalizzato passa a un livello che invoca l'OpenAI API con prompt strutturati per ottenere classificazione tematica, sintesi e estrazione di entita. La richiesta forza un output in formato fisso (schema JSON), cosi il risultato dell'LLM e parsabile e validabile in modo deterministico, non testo libero da interpretare.
3. Aggregazione
L'ultimo stadio normalizza i risultati provenienti da tutte le fonti in un'unica struttura comune e li espone via Express come output aggregato, pronto al consumo da parte di sistemi a valle, indipendente dalla fonte di origine.
Tecnologie Chiave
Stack volutamente minimale: poche tecnologie mature, ciascuna con un ruolo netto nella pipeline. Nessuna dipendenza superflua da mantenere.
Runtime
Runtime asincrono ideale per workload I/O-bound come fetch e chiamate API in parallelo.
API Layer
Espone la pipeline come endpoint HTTP semplici e orchestra il flusso a tre stadi.
Parsing HTML
Parsing DOM server-side, leggero e veloce: estrazione via selettori senza un browser headless.
Arricchimento AI
Classificazione, sintesi ed estrazione entita con output forzato a schema JSON validabile.
Il Risultato
Il servizio sostituisce gli script fonte-per-fonte con un'unica pipeline configurabile: aggiungere una sorgente diventa una questione di configurazione, e ogni contenuto esce gia classificato, sintetizzato e normalizzato.
Estrazione automatica
Arricchimento semantico
Output aggregato
Nota. Gli indicatori sopra sono indicativi e stimati e si riferiscono a un progetto soggetto a riservatezza: descrivono capacita abilitate dall'architettura, non metriche auditate. Cifre esatte, fonti e logica di arricchimento di dominio non sono divulgabili.
Sfide Tecniche
Output dell'LLM affidabile e parsabile
Un LLM tende a restituire testo libero: utile per un umano, inutilizzabile come campo di un'API. La sfida era rendere la fase di arricchimento deterministica a valle. La soluzione: vincolare le risposte a uno schema JSON esplicito, validare ogni risposta contro lo schema prima di accettarla e gestire con re-prompt mirati i casi di output malformato. Cosi un componente per natura probabilistico produce un contratto stabile per il resto della pipeline.
Disaccoppiare il servizio dalla fragilita delle fonti
Affidare l'estrazione a selettori CSS significa dipendere dal markup altrui, che cambia senza preavviso. Per evitare che un restyle lato fonte rompesse l'intero servizio, le regole di estrazione sono state esternalizzate in configurazione e isolate dal core: una fonte che cambia struttura si sistema aggiornando la sua mappatura, senza ridistribuire il servizio ne intaccare le altre sorgenti. La normalizzazione a valle garantisce che l'output resti identico anche quando l'estrazione a monte viene ricalibrata.