0Pricing
AI Prompt Engineering · Lección

Extracción de datos basada en esquemas

Proporcione esquemas JSON en los prompts para garantizar un formato de salida estructurado.

Extracción de datos basada en esquemas es una lección gratuita de AI Prompt Engineering en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de AI Prompt Engineering, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Por qué utilizar la extracción basada en esquemas?

Cuando le indica a un modelo extraiga los datos importantes, obtiene una salida incoherente e impredecible. Cuando proporciona un esquema JSON y dice extraiga datos que coincidan con este esquema exacto, obtiene siempre una salida legible por máquina, coherente y con tipos seguros.

La extracción basada en esquemas es el patrón utilizado en sistemas de producción que procesan facturas, contratos, historiales médicos, notas de reuniones y cualquier documento del que sea necesario extraer datos estructurados de forma fiable a partir de texto no estructurado.

Proporcionar el esquema en el prompt

El esquema se incluye directamente en el prompt. El modelo lo utiliza como contrato de salida:

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.')

Ejemplo de extracción de una factura

Aplicación del esquema para extraer datos estructurados del texto de una factura real:

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"])}')

Extracción de notas de reuniones

Aplicación de la extracción basada en esquemas a notas de reuniones, un tipo de documento menos estructurado:

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')

Extracción de especificaciones de productos

Extracción de especificaciones de productos estructuradas a partir de la descripción de un catálogo:

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))

Gestión de campos opcionales

Los esquemas deben gestionar correctamente los campos opcionales. Utilice null como valor predeterminado para los datos que falten en lugar de omitir el campo; así se mantiene la coherencia de la estructura de salida:

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)

Extracción de varios documentos con el mismo esquema

El mismo esquema puede aplicarse de forma coherente a muchos documentos. Así es como se construye una base de datos estructurada a partir de documentos no estructurados a gran escala:

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')

Validación del esquema después de la extracción

Valide los datos extraídos comparándolos con el esquema esperado mediante la biblioteca jsonschema de Python o validadores personalizados:

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)

Refinamiento iterativo del esquema

Los esquemas evolucionan mediante pruebas iterativas. El proceso:

  1. Defina un esquema inicial basándose en el conocimiento del dominio
  2. Ejecute la extracción en 20 documentos de muestra
  3. Revise la salida: ¿qué campos son sistemáticamente incorrectos o faltan?
  4. Refine la descripción del esquema y añada definiciones de campos
  5. Vuelva a ejecutarlo con los mismos 20 documentos
  6. Repita el proceso hasta que la calidad alcance el umbral establecido

Añadir descripciones de campos al esquema

Cuando un campo sea ambiguo, añada un comentario descriptivo para orientar al modelo:

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')

Puntuaciones de confianza para los campos extraídos

En los sistemas de producción, incluya una puntuación de confianza para cada campo. Las extracciones con baja confianza pueden derivarse a una revisión humana:

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'))

Comprobación rápida

Cuando un campo obligatorio no está presente en el documento de origen, ¿qué debe indicarle un prompt de extracción basada en esquemas al modelo que devuelva para ese campo?

Extracción basada en esquemas: conclusiones clave

La extracción basada en esquemas es el estándar para el procesamiento fiable de documentos en producción:

  • Proporcione el esquema JSON exacto en el prompt; el modelo lo utiliza como contrato de salida
  • Añada descripciones de campos para los campos ambiguos con el fin de orientar la interpretación del modelo
  • Indique siempre que los campos que falten deben devolver null y nunca omitirse
  • Aplique el mismo esquema a muchos documentos para obtener una salida coherente preparada para bases de datos
  • Incluya puntuaciones de confianza por campo para permitir la derivación a revisión humana
  • Valide los datos extraídos mediante programación después de cada extracción
  • Refine los esquemas de forma iterativa: extraiga 20 muestras, revíselas, mejore el esquema y repita el proceso

Preguntas frecuentes

¿La lección «Extracción de datos basada en esquemas» es gratis?

Sí — el texto completo de «Extracción de datos basada en esquemas» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de AI Prompt Engineering, actualiza a CoddyKit PRO. El curso de AI Prompt Engineering incluye 4 lecciones en total.

¿Qué aprenderé en «Extracción de datos basada en esquemas»?

Proporcione esquemas JSON en los prompts para garantizar un formato de salida estructurado. Practicas AI Prompt Engineering con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar AI Prompt Engineering?

No se requiere experiencia previa. AI Prompt Engineering en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Extracción de datos basada en esquemas»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de AI Prompt Engineering?

Sí. Cada lección de AI Prompt Engineering incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Prompts para extraer entidades con nombre
  2. Extracción de datos basada en esquemas
  3. El LLM como clasificador de texto
  4. Confianza e incertidumbre en la clasificación
← Volver a AI Prompt Engineering