Estrazione dei dati guidata dallo schema
Fornisca schemi JSON nei prompt per garantire un formato di output strutturato
Estrazione dei dati guidata dallo schema è una lezione AI Prompt Engineering gratuita su CoddyKit. Questa è la lezione 2 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 Prompt Engineering, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso AI Prompt Engineering include 4 lezioni in totale.
Perché utilizzare l'estrazione basata su schema?
Quando dice a un modello estrai i dati importanti, ottiene un output incoerente e imprevedibile. Quando fornisce uno schema JSON e dice estrai i dati conformi a questo schema esatto, ottiene ogni volta un output leggibile dalle macchine, coerente e con tipi sicuri.
L'estrazione basata su schema è il pattern utilizzato nei sistemi di produzione che elaborano fatture, contratti, cartelle cliniche, note di riunioni e qualsiasi documento dal quale sia necessario estrarre in modo affidabile dati strutturati da testo non strutturato.
Fornitura dello schema nel prompt
Lo schema risiede direttamente nel prompt. Il modello lo utilizza come contratto dell'output:
import anthropic, json
client = anthropic.Anthropic(api_key='YOUR_API_KEY')
INVOICE_SCHEMA = '''
{
"invoice_number": "string",
"vendor_name": "string",
"vendor_address": "string or null",
"invoice_date": "YYYY-MM-DD",
"due_date": "YYYY-MM-DD or null",
"line_items": [
{
"description": "string",
"quantity": "number",
"unit_price": "number",
"total": "number"
}
],
"subtotal": "number",
"tax": "number or null",
"total_amount": "number",
"currency": "3-letter ISO code e.g. USD"
}
'''
def extract_invoice(invoice_text):
prompt = f'Extract structured data from this invoice.\nReturn JSON matching this schema exactly:\n{INVOICE_SCHEMA}\n\nInvoice:\n{invoice_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=500, messages=[{'role': 'user', 'content': prompt}])
return json.loads(r.content[0].text)
print('Invoice schema defined.')Esempio di estrazione da una fattura
Applicazione dello schema per estrarre dati strutturati dal testo di una fattura reale:
invoice_text = '''
INVOICE #INV-2025-0342
From: Acme Software Ltd.
123 Tech Street, San Francisco, CA 94105
Date: March 15, 2025
Due: April 14, 2025
Items:
- Annual Pro License (5 seats) x1 @ $2,400.00 = $2,400.00
- Setup & Onboarding x2 @ $300.00 = $600.00
Subtotal: $3,000.00
Tax (8.5%): $255.00
TOTAL DUE: $3,255.00 USD
'''
result = extract_invoice(invoice_text)
print(f'Invoice: {result["invoice_number"]}')
print(f'Vendor: {result["vendor_name"]}')
print(f'Total: {result["currency"]} {result["total_amount"]}')
print(f'Line items: {len(result["line_items"])}')Estrazione da note di riunione
Applicazione dell'estrazione basata su schema alle note di riunione, un tipo di documento meno strutturato:
MEETING_SCHEMA = '''
{
"meeting_title": "string",
"date": "YYYY-MM-DD",
"attendees": ["string"],
"decisions": ["string"],
"action_items": [
{
"task": "string",
"owner": "string or null",
"due_date": "YYYY-MM-DD or null"
}
],
"next_meeting": "string or null"
}
'''
meeting_notes = '''
Product Sync - March 20, 2025
Attendees: Sarah (PM), Jake (Engineering), Priya (Design)
Decided to push the v2.0 launch to April 15.
Will not include the analytics dashboard in v2.0.
Actions:
- Jake to fix the login bug by March 25
- Priya to finalize mockups by March 22
- Sarah to send updated roadmap to stakeholders (no date set)
Next sync: March 27, same time.
'''
print(f'Meeting schema: {len(MEETING_SCHEMA)} chars')
print(f'Notes length: {len(meeting_notes)} chars')Estrazione delle specifiche di prodotto
Estrazione di specifiche strutturate di prodotto dalla descrizione di un catalogo:
PRODUCT_SCHEMA = '''
{
"product_name": "string",
"sku": "string or null",
"category": "string",
"price": {"amount": "number", "currency": "string"},
"dimensions": {
"length_cm": "number or null",
"width_cm": "number or null",
"height_cm": "number or null",
"weight_kg": "number or null"
},
"colors": ["string"],
"materials": ["string"],
"features": ["string"],
"in_stock": true | false
}
'''
product_text = 'AlphaDesk Pro standing desk. SKU: AD-PRO-001. $899. Available in white and black. 120x60x75cm, 35kg. Steel frame, bamboo top. Features: memory height, anti-collision, app control. In stock.'
prompt = f'Extract product specs. Return JSON:\n{PRODUCT_SCHEMA}\n\nProduct: {product_text}'
r = client.messages.create(model='claude-opus-4-5', max_tokens=400, messages=[{'role': 'user', 'content': prompt}])
print(json.loads(r.content[0].text))Gestione dei campi facoltativi
Gli schemi devono gestire correttamente i campi facoltativi. Utilizzi null come valore predefinito per i dati mancanti invece di omettere il campo: in questo modo la struttura dell'output rimane coerente:
prompt_optional = '''
Extract the data. For fields not present in the source text,
use null — do NOT omit the field.
Every field in the schema must appear in the output.
Schema:
{
"company": "string",
"ceo": "string or null",
"founded": "YYYY or null",
"revenue": "string or null",
"employees": "number or null"
}
Text: Vertex AI Solutions is a B2B SaaS company.
'''
# Expected output: ceo, founded, revenue, employees all set to null
# NOT omitted — null fields are still present in the JSON
print(prompt_optional)Estrazione di più documenti con lo stesso schema
Lo stesso schema può essere applicato in modo coerente a molti documenti. È così che si costruisce un database strutturato a partire da documenti non strutturati su larga scala:
def extract_many(documents, schema):
results = []
for i, doc in enumerate(documents):
try:
r = client.messages.create(
model='claude-opus-4-5', max_tokens=400,
messages=[{'role': 'user', 'content': f'Extract data. Return JSON matching schema:\n{schema}\n\nDocument:\n{doc}'}]
)
parsed = json.loads(r.content[0].text)
parsed['_source_doc'] = i
parsed['_extraction_ok'] = True
results.append(parsed)
except (json.JSONDecodeError, Exception) as e:
results.append({'_source_doc': i, '_extraction_ok': False, '_error': str(e)})
return results
invoices = ['Invoice from Acme, March 2025, $500', 'Invoice from Beta Corp, April 2025, $1200']
results = extract_many(invoices, INVOICE_SCHEMA)
print(f'Processed: {len([r for r in results if r["_extraction_ok"]])} success, {len([r for r in results if not r["_extraction_ok"]])} failed')Validazione dello schema dopo l'estrazione
Convalidi i dati estratti rispetto allo schema previsto utilizzando la libreria jsonschema di Python o validatori personalizzati:
def validate_extracted(data, required_fields, type_checks):
errors = []
# Check required fields
for field in required_fields:
if field not in data or data[field] is None:
errors.append(f'Required field missing or null: {field}')
# Check types
for field, expected_type in type_checks.items():
if field in data and data[field] is not None:
if not isinstance(data[field], expected_type):
errors.append(f'{field}: expected {expected_type.__name__}, got {type(data[field]).__name__}')
return errors
extracted = {'invoice_number': 'INV-001', 'total_amount': 3255.0, 'vendor_name': 'Acme', 'invoice_date': '2025-03-15'}
required = ['invoice_number', 'total_amount', 'vendor_name']
types = {'total_amount': float, 'invoice_number': str, 'line_items': list}
errors = validate_extracted(extracted, required, types)
print('Validation errors:', errors)Affinamento iterativo dello schema
Gli schemi evolvono attraverso test iterativi. Il processo:
- Definisca lo schema iniziale sulla base delle conoscenze del dominio
- Esegua l'estrazione su 20 documenti di esempio
- Esamini l'output: quali campi sono sistematicamente errati o mancanti?
- Affini la descrizione dello schema e aggiunga le definizioni dei campi
- Esegua nuovamente l'estrazione sugli stessi 20 documenti
- Ripeta il processo finché la qualità non raggiunge la soglia
Aggiunta delle descrizioni dei campi allo schema
Quando un campo è ambiguo, aggiunga un commento descrittivo per guidare il modello:
ANNOTATED_SCHEMA = '''
{
"invoice_number": "string // The unique identifier for this invoice, e.g., INV-2025-001",
"invoice_date": "YYYY-MM-DD // Date the invoice was issued",
"due_date": "YYYY-MM-DD or null // Payment due date; null if not specified",
"subtotal": "number // Amount before tax, as a decimal number",
"tax": "number or null // Tax amount as a decimal; null if tax is not listed",
"total_amount": "number // Final amount to pay, including tax",
"payment_terms": "string or null // e.g., Net 30, Due on receipt; null if not mentioned"
}
'''
print('Annotated schema adds context per field.')
print(f'Schema length: {len(ANNOTATED_SCHEMA)} chars')Punteggi di confidenza per i campi estratti
Per i sistemi di produzione, includa un punteggio di confidenza per ogni campo. Le estrazioni con bassa confidenza possono essere indirizzate alla revisione umana:
SCHEMA_WITH_CONFIDENCE = '''
{
"fields": {
"invoice_number": {"value": "string", "confidence": "high|medium|low"},
"total_amount": {"value": "number", "confidence": "high|medium|low"},
"due_date": {"value": "YYYY-MM-DD or null", "confidence": "high|medium|low"}
},
"overall_confidence": "high|medium|low",
"extraction_notes": "string or null // Any ambiguities encountered"
}
'''
prompt = f'Extract invoice data with confidence scores.\nReturn JSON:\n{SCHEMA_WITH_CONFIDENCE}\n\nInvoice: Payment due within 30 days. Total is approximately $500.'
r = client.messages.create(model='claude-opus-4-5', max_tokens=300, messages=[{'role': 'user', 'content': prompt}])
result = json.loads(r.content[0].text)
print('Overall confidence:', result.get('overall_confidence'))
print('Notes:', result.get('extraction_notes'))Verifica rapida
Quando un campo obbligatorio non è presente nel documento sorgente, cosa dovrebbe indicare al modello un prompt di estrazione basata su schema di restituire per quel campo?
Estrazione basata su schema: concetti fondamentali
L'estrazione basata su schema è lo standard per l'elaborazione affidabile dei documenti in produzione:
- Fornisca lo schema JSON esatto nel prompt: il modello lo utilizza come contratto dell'output
- Aggiunga descrizioni dei campi ambigui per guidare l'interpretazione del modello
- Indichi sempre che i campi mancanti devono restituire null e non devono mai essere omessi
- Applichi lo stesso schema a molti documenti per ottenere un output coerente, pronto per essere inserito in un database
- Includa punteggi di confidenza per ogni campo per consentire l'instradamento alla revisione umana
- Convalidi i dati estratti programmaticamente dopo ogni estrazione
- Affini gli schemi iterativamente: estragga 20 esempi, esamini i risultati, migliori e ripeta
Domande Frequenti
La lezione «Estrazione dei dati guidata dallo schema» è gratuita?
Sì — il testo completo di «Estrazione dei dati guidata dallo schema» è 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 Prompt Engineering, passa a CoddyKit PRO. Il corso AI Prompt Engineering include 4 lezioni in totale.
Cosa imparerò in «Estrazione dei dati guidata dallo schema»?
Fornisca schemi JSON nei prompt per garantire un formato di output strutturato Eserciti AI Prompt Engineering 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 Prompt Engineering?
Non è richiesta alcuna esperienza precedente. AI Prompt Engineering su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «Estrazione dei dati guidata dallo schema»?
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 Prompt Engineering?
Sì. Ogni lezione AI Prompt Engineering 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
- Prompt per l'estrazione di entità nominate
- Estrazione dei dati guidata dallo schema
- LLM come classificatore di testo
- Affidabilità e incertezza nella classificazione