Extraction de données pilotée par un schéma
Fournissez des schémas JSON dans les invites pour garantir un format de sortie structuré.
Extraction de données pilotée par un schéma est une leçon AI Prompt Engineering gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage AI Prompt Engineering, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours AI Prompt Engineering comprend 4 leçons au total.
Pourquoi utiliser une extraction guidée par un schéma ?
Lorsque vous dites à un modèle extrayez les données importantes, vous obtenez une sortie incohérente et imprévisible. Lorsque vous fournissez un schéma JSON et dites extrayez les données correspondant exactement à ce schéma, vous obtenez à chaque fois une sortie cohérente, exploitable par machine et respectant les types.
L’extraction guidée par un schéma est le modèle utilisé dans les systèmes de production qui traitent des factures, des contrats, des dossiers médicaux, des notes de réunion et tout document dont les données structurées doivent être extraites de manière fiable à partir de texte non structuré.
Fournir le schéma dans l’invite
Le schéma figure directement dans l’invite. Le modèle l’utilise comme contrat de sortie :
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.')Exemple d’extraction de facture
Application du schéma pour extraire des données structurées d’un véritable texte de facture :
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"])}')Extraction de notes de réunion
Application de l’extraction guidée par un schéma aux notes de réunion — un type de document moins structuré :
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')Extraction de spécifications produit
Extraction de spécifications produit structurées à partir de la description d’un catalogue :
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))Gérer les champs facultatifs
Les schémas doivent gérer correctement les champs facultatifs. Utilisez null par défaut pour les données manquantes plutôt que de supprimer le champ — la structure de sortie reste ainsi cohérente :
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)Extraction de plusieurs documents avec le même schéma
Le même schéma peut être appliqué de manière cohérente à de nombreux documents. C’est ainsi que vous constituez à grande échelle une base de données structurée à partir de documents non structurés :
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')Valider le schéma après l’extraction
Validez les données extraites par rapport au schéma attendu à l’aide de la bibliothèque jsonschema de Python ou de validateurs personnalisés :
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)Affiner le schéma de manière itérative
Les schémas évoluent grâce à des tests itératifs. Le processus :
- Définissez le schéma initial à partir des connaissances du domaine
- Exécutez l’extraction sur 20 documents d’exemple
- Examinez la sortie — quels champs sont systématiquement erronés ou manquants ?
- Affinez la description du schéma et ajoutez des définitions de champs
- Relancez l’extraction sur les mêmes 20 documents
- Répétez jusqu’à ce que la qualité atteigne le seuil fixé
Ajouter des descriptions de champs au schéma
Lorsqu’un champ est ambigu, ajoutez un commentaire descriptif au schéma pour guider le modèle :
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')Scores de confiance pour les champs extraits
Pour les systèmes de production, incluez un score de confiance pour chaque champ. Les extractions peu fiables peuvent être orientées vers une vérification humaine :
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'))Vérification rapide
Lorsqu’un champ obligatoire n’est pas présent dans le document source, que doit demander à l’invite d’extraction guidée par un schéma de renvoyer pour ce champ ?
Extraction guidée par un schéma — points essentiels
L’extraction guidée par un schéma est la norme pour le traitement fiable des documents en production :
- Fournissez le schéma JSON exact dans l’invite — le modèle l’utilise comme contrat de sortie
- Ajoutez des descriptions pour les champs ambigus afin de guider l’interprétation du modèle
- Indiquez toujours que les champs manquants doivent renvoyer null, sans jamais être omis
- Appliquez le même schéma à de nombreux documents pour obtenir une sortie cohérente, prête à alimenter une base de données
- Incluez un score de confiance pour chaque champ afin de permettre l’orientation vers une vérification humaine
- Validez les données extraites par programmation après chaque extraction
- Affinez les schémas de manière itérative : extrayez 20 exemples, examinez-les, améliorez le schéma, puis recommencez
Questions Fréquemment Posées
La leçon « Extraction de données pilotée par un schéma » est-elle gratuite ?
Oui — le texte complet de « Extraction de données pilotée par un schéma » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours AI Prompt Engineering, passe à CoddyKit PRO. Le cours AI Prompt Engineering comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Extraction de données pilotée par un schéma » ?
Fournissez des schémas JSON dans les invites pour garantir un format de sortie structuré. Tu pratiques AI Prompt Engineering avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer AI Prompt Engineering ?
Aucune expérience préalable n'est requise. AI Prompt Engineering sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.
Combien de temps prend la leçon « Extraction de données pilotée par un schéma » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon AI Prompt Engineering ?
Oui. Chaque leçon AI Prompt Engineering inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Invites d’extraction d’entités nommées
- Extraction de données pilotée par un schéma
- LLM comme classificateur de texte
- Confiance et incertitude en classification