AI Engineering Academy · Lezione

Estrarre dati da testo non strutturato

Costruirà una pipeline di estrazione delle informazioni che legga testo grezzo, come email, ricevute e articoli, e restituisca campi strutturati con tipi, valori predefiniti e validazione.

Lezione 3 di 413 passaggi

Estrarre dati da testo non strutturato è una lezione AI Engineering Academy gratuita su CoddyKit. Questa è la lezione 3 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento AI Engineering Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Engineering Academy include 4 lezioni in totale.

Il problema dell'estrazione delle informazioni

Le organizzazioni sono sommerse da testo non strutturato: email, ticket di assistenza, contratti, fatture, articoli di giornale, note mediche e post sui social media. In questo testo sono nascosti dati strutturati di valore, ma estrarli manualmente è lento, costoso e soggetto a errori. Gli LLM con output strutturati cambiano la situazione: possono leggere qualsiasi testo e compilare uno schema predefinito con i campi pertinenti, su larga scala e con un'accuratezza ragionevole.

L'estrazione delle informazioni (IE) è il processo di identificazione ed estrazione automatica di fatti strutturati dal testo non strutturato. L'IE basata su LLM supera nettamente i precedenti approcci basati su regole o sulle tecniche classiche di NLP, perché gli LLM comprendono il contesto, la sinonimia e le informazioni implicite senza richiedere pattern regex creati manualmente per ogni variazione.

Casi d'uso comuni dell'estrazione

L'estrazione delle informazioni alimenta numerose applicazioni aziendali di valore:

  • Elaborazione delle fatture: estrae fornitore, voci, importi e scadenze dalle fatture PDF per automatizzare la gestione dei debiti verso i fornitori
  • Analisi dei contratti: estrae parti contraenti, date di decorrenza, termini di pagamento e clausole di risoluzione dai documenti legali
  • Parsing dei curriculum: estrae competenze, esperienza, formazione e informazioni di contatto dai CV per i sistemi ATS
  • Instradamento dei ticket di assistenza: estrae categoria, gravità, prodotto interessato e livello del cliente per instradare automaticamente i ticket
  • Monitoraggio delle notizie: estrae entità, eventi e sentiment dagli articoli di giornale per l'analisi della concorrenza

Creazione di una pipeline di estrazione dalle email

Costruiamo una pipeline pratica di estrazione che legga le email dei clienti ed estragga dati strutturati utili all'azione. La pipeline utilizza uno schema Pydantic per definire esattamente ciò che vogliamo ottenere da ogni email, quindi elabora le email in batch.

import openai
from pydantic import BaseModel
from typing import List, Optional
from enum import Enum

client = openai.OpenAI()

class Priority(str, Enum):
    urgent = 'urgent'
    high = 'high'
    normal = 'normal'
    low = 'low'

class EmailExtraction(BaseModel):
    subject_summary: str
    sender_intent: str
    product_mentioned: Optional[str]
    issue_category: str  # billing / technical / general / feedback
    priority: Priority
    action_required: bool
    action_description: Optional[str]
    customer_sentiment: str  # positive / negative / neutral / frustrated

def extract_from_email(email_body: str) -> EmailExtraction:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'You are an expert at analyzing customer emails and extracting structured information for a support team.'},
            {'role': 'user', 'content': f'Analyze this customer email:\n\n{email_body}'}
        ],
        response_format=EmailExtraction
    )
    return result.choices[0].message.parsed

Riconoscimento di entità nominate con gli LLM

Il riconoscimento di entità nominate (NER) è un'attività classica dell'IE: consiste nell'identificare e classificare le entità nominate (persone, organizzazioni, luoghi, date e importi monetari) nel testo. Gli LLM semplificano notevolmente il NER, perché è sufficiente descrivere le entità desiderate e il modello le estrae senza dover creare un modello NER addestrato appositamente.

import openai
from pydantic import BaseModel
from typing import List, Optional

client = openai.OpenAI()

class NamedEntity(BaseModel):
    text: str       # The exact text as it appears
    entity_type: str  # PERSON / ORG / LOCATION / DATE / MONEY / PRODUCT
    normalized: Optional[str]  # Standardized form where applicable

class NERResult(BaseModel):
    entities: List[NamedEntity]

text = '''
Apple Inc. CEO Tim Cook announced yesterday that the company will invest $1.2 billion
in a new manufacturing facility in Austin, Texas, expected to open in Q3 2026.
'''

result = client.beta.chat.completions.parse(
    model='gpt-4o-mini',
    messages=[
        {'role': 'system', 'content': 'Extract all named entities from the text. Classify each as PERSON, ORG, LOCATION, DATE, MONEY, or PRODUCT.'},
        {'role': 'user', 'content': text}
    ],
    response_format=NERResult
)
for entity in result.choices[0].message.parsed.entities:
    print(f'[{entity.entity_type}] {entity.text}')

Estrazione di documenti su larga scala

Per le pipeline di estrazione in produzione che elaborano migliaia di documenti, sono necessari l'elaborazione asincrona e la gestione dei limiti di frequenza. Un modello tipico usa asyncio con un semaforo per elaborare i documenti in parallelo rispettando i limiti di frequenza dell'API.

import asyncio
import openai
from pydantic import BaseModel
from typing import List, Optional

async_client = openai.AsyncOpenAI()

class InvoiceExtraction(BaseModel):
    vendor: str
    total_amount: Optional[float]
    currency: str
    invoice_date: Optional[str]

async def extract_invoice(doc_text: str, semaphore: asyncio.Semaphore) -> InvoiceExtraction:
    async with semaphore:  # Limit concurrent requests
        result = await async_client.beta.chat.completions.parse(
            model='gpt-4o-mini',
            messages=[
                {'role': 'system', 'content': 'Extract invoice data.'},
                {'role': 'user', 'content': doc_text}
            ],
            response_format=InvoiceExtraction
        )
        return result.choices[0].message.parsed

async def process_invoices(documents: List[str]):
    sem = asyncio.Semaphore(5)  # Max 5 concurrent requests
    tasks = [extract_invoice(doc, sem) for doc in documents]
    return await asyncio.gather(*tasks, return_exceptions=True)

# results = asyncio.run(process_invoices(invoice_texts))
print('Async pipeline defined - handles rate limits via semaphore')

Gestione delle informazioni implicite e dedotte

Gli LLM possono estrarre non solo informazioni dichiarate esplicitamente, ma anche informazioni dedotte o implicite. Se una recensione dice «Lo uso ogni giorno da un mese e funziona ancora perfettamente», il modello può dedurre che la durata sia un attributo positivo, anche se la parola «durata» non compare mai. Questo è un vantaggio importante rispetto all'estrazione basata su regex, che può trovare solo ciò che è esplicitamente presente.

Tuttavia, questa capacità comporta dei rischi: il modello potrebbe dedurre troppo e compilare i campi con supposizioni invece che con fatti. Per le estrazioni ad alto impatto (legali, finanziarie o mediche), aggiunga un campo confidence allo schema e chieda al modello di valutare il proprio grado di certezza, segnalando le estrazioni con bassa confidenza per la revisione umana.

Progettazione dei prompt di estrazione

La qualità dell'estrazione dipende in larga misura dalla progettazione del prompt. Principi fondamentali per i prompt di estrazione:

  • Definisca i campi ambigui: se «data» potrebbe indicare la data della fattura, la scadenza o la data di ricezione, specifichi esattamente quale desidera
  • Fornisca esempi per i formati insoliti: «Per il prezzo, restituisca solo il valore numerico, ad esempio 29.99 e non $29.99»
  • Gestisca la normalizzazione: «Normalizzi i nomi dei Paesi nei codici ISO 3166-1 alpha-2»
  • Specifichi la fonte dell'estrazione: «Estragga solo dall'oggetto, non dal corpo dell'email»

Consideri il prompt di estrazione come una specifica precisa per un operatore umano di inserimento dati: ogni ambiguità lasciata nel prompt diventa una decisione che il modello prenderà in modo non coerente.

Estrazione in più passaggi per documenti complessi

Alcuni documenti sono troppo complessi per essere elaborati in un unico passaggio, perché lo schema completo è ampio, sezioni diverse richiedono competenze differenti oppure la struttura del documento è molto variabile. L'estrazione in più passaggi suddivide l'attività in fasi sequenziali: prima classifica il tipo di documento, poi estrae lo schema appropriato per quel tipo.

import openai
from pydantic import BaseModel
from typing import Optional

client = openai.OpenAI()

class DocumentType(BaseModel):
    doc_type: str  # invoice / contract / resume / report
    confidence: float

def classify_document(text: str) -> str:
    result = client.beta.chat.completions.parse(
        model='gpt-4o-mini',
        messages=[
            {'role': 'system', 'content': 'Classify the document type.'},
            {'role': 'user', 'content': text[:500]}  # Use only the beginning for classification
        ],
        response_format=DocumentType
    )
    return result.choices[0].message.parsed.doc_type

# Then route to the appropriate extraction schema
EXTRACTION_SCHEMAS = {
    'invoice': 'InvoiceSchema',  # Replace with actual Pydantic classes
    'contract': 'ContractSchema',
    'resume': 'ResumeSchema',
}

print('Multi-pass: classify first, then extract with the right schema')

Arricchimento post-estrazione

I dati estratti spesso necessitano di un arricchimento dopo l'estrazione iniziale: convertire i nomi delle aziende estratti in forme canoniche interrogando un database aziendale, cercare il codice postale estratto per completare città e Stato, oppure convertire le date estratte in un formato standard. Questo passaggio di arricchimento dovrebbe avvenire nel codice dell'applicazione dopo l'estrazione, non durante la chiamata all'LLM.

Mantenere separati estrazione e arricchimento rende la pipeline più facile da testare e manutenere. È possibile testare la logica di arricchimento con test unitari in modo indipendente e sostituire il modello di estrazione senza modificare il codice di arricchimento.

Misurazione dell'accuratezza dell'estrazione

Per le pipeline di estrazione in produzione, misuri sistematicamente l'accuratezza rispetto a un set di test annotato. Le metriche principali sono:

  • Accuratezza dei campi: percentuale di campi estratti correttamente per documento
  • Corrispondenza esatta: il valore del campo corrisponde esattamente al valore di riferimento
  • Corrispondenza normalizzata: il valore del campo corrisponde dopo la normalizzazione (ad esempio, '$1,234.00' == '1234.0')
  • Tasso di falsi positivi: frequenza con cui il modello estrae un campo che dovrebbe essere null
  • Tasso di falsi negativi: frequenza con cui il modello restituisce null per un campo presente

Esegua questa valutazione ogni volta che modifica i modelli, aggiorna i prompt o aggiunge nuove fonti di documenti alla pipeline. Anche piccole diminuzioni dell'accuratezza possono produrre un impatto aziendale significativo quando si elaborano migliaia di documenti.

Registrazione delle estrazioni per il miglioramento continuo

Ogni risultato di estrazione in produzione è un dato che può migliorare la pipeline. Registri in un database ogni documento di input, l'output estratto e gli eventuali errori di convalida. Esamini periodicamente un campione dei log di produzione per identificare i problemi ricorrenti: determinati formati di documento con cui il modello ha difficoltà, campi che risultano spesso null quando non dovrebbero oppure valori insoliti che indicano una deriva del prompt.

Questi dati registrati diventano anche il set di dati per l'addestramento futuro, qualora desideri eseguire il fine-tuning di un modello specificamente per l'attività di estrazione, ottenendo un'alternativa più accurata e meno costosa rispetto agli LLM generalisti per l'estrazione strutturata.

Verifica rapida

Verifichi la comprensione dei concetti di AI Engineering presentati in questa lezione.

Riepilogo della lezione

In questa lezione ha imparato che: gli LLM con schemi Pydantic estraggono in modo affidabile dati strutturati da qualsiasi fonte di testo non strutturato, l'elaborazione asincrona con semafori consente l'estrazione in batch da migliaia di documenti rispettando i limiti di frequenza e l'estrazione in più passaggi classifica prima i documenti, quindi applica lo schema appropriato a ciascun tipo. Nel prossimo argomento costruiremo la logica di convalida e di nuovi tentativi automatici per gestire i casi in cui i dati estratti non rispettano le regole aziendali.

Gratis per iniziare

Impara Python con un tutor IA — gratis

Scrivi ed esegui vero codice nel tuo browser, ricevi aiuto istantaneo da un tutor IA disponibile 24/7, e riprendi da dove hai lasciato sul web o nell'app.

Corsi
30
Lezioni
120

Domande Frequenti

La lezione «Estrarre dati da testo non strutturato» è gratuita?

Sì — il testo completo di «Estrarre dati da testo non strutturato» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso AI Engineering Academy, passa a CoddyKit PRO. Il corso AI Engineering Academy include 4 lezioni in totale.

Cosa imparerò in «Estrarre dati da testo non strutturato»?

Costruirà una pipeline di estrazione delle informazioni che legga testo grezzo, come email, ricevute e articoli, e restituisca campi strutturati con tipi, valori predefiniti e validazione. Eserciti AI Engineering Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare AI Engineering Academy?

Non è richiesta alcuna esperienza precedente. AI Engineering Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 3 di 4.

Quanto tempo richiede la lezione «Estrarre dati da testo non strutturato»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione AI Engineering Academy?

Sì. Ogni lezione AI Engineering Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Modalità JSON e response_format
  2. Output strutturati con Pydantic
  3. Estrarre dati da testo non strutturato
  4. Validare e riprovare gli output errati
← Torna a AI Engineering Academy