Gestión de datos parciales y ausentes
Diseñe esquemas con campos Optional y puntuaciones de confianza, implemente estrategias alternativas de extracción para documentos ambiguos y registre las extracciones con baja confianza para su revisión humana.
Gestión de datos parciales y ausentes es una lección gratuita de AI Engineering Academy 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 Engineering Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de AI Engineering Academy incluye 4 lecciones en total.
La realidad de los documentos incompletos
Los documentos del mundo real rara vez contienen todos los campos que espera su esquema. A una factura puede faltarle un número de pedido, un currículo puede omitir fechas y un artículo de noticias puede no mencionar ninguna ubicación. Diseñar el esquema de extracción para gestionar correctamente los datos parciales y ausentes es tan importante como extraer los datos presentes.
Campos opcionales en Pydantic
Marque como Optional[type] los campos que podrían no aparecer en todos los documentos y asígneles un valor predeterminado None. Pydantic v2 trata estos campos como anulables y se indica al modelo que no invente valores cuando falte información. Prefiera siempre None a una cadena vacía para los datos ausentes, ya que resulta más fácil filtrarlos posteriormente.
from pydantic import BaseModel, Field
from typing import Optional
class JobPosting(BaseModel):
title: str
company: str
salary_min: Optional[float] = Field(None, description='Minimum salary if stated')
salary_max: Optional[float] = Field(None, description='Maximum salary if stated')
remote: Optional[bool] = Field(None, description='True if remote, False if on-site, None if unspecified')Incorporación de puntuaciones de confianza
Pida al modelo que valore su propia confianza en cada campo extraído añadiendo una puntuación de confianza junto al valor. Envuelva ambos en un helper genérico FieldExtract. Las extracciones con baja confianza pueden enviarse a revisores humanos en lugar de pasarse directamente a los sistemas posteriores, lo que reduce el riesgo de que los datos incorrectos pasen inadvertidos.
from pydantic import BaseModel
from typing import Optional
class Confident(BaseModel):
value: Optional[str]
confidence: float # 0.0 to 1.0
class ContractExtract(BaseModel):
party_a: Confident
party_b: Confident
effective_date: Confident
termination_clause: ConfidentValores centinela frente a None
A veces, la ausencia de datos tiene un significado propio. Use el Optional de Python junto con una enumeración Literal para distinguir entre no mencionado, indicado explícitamente como ninguno y desconocido. Esta distinción en tres sentidos evita que el código posterior trate una ausencia indicada explícitamente igual que una mención inexistente, lo que puede provocar errores sutiles en la lógica de negocio.
from pydantic import BaseModel
from typing import Optional, Literal
class Discount(BaseModel):
# 'none' = explicitly no discount; None = not mentioned
discount_type: Optional[Literal['percentage', 'fixed', 'none']] = None
discount_value: Optional[float] = NoneEstrategias de extracción alternativas
Cuando una llamada de extracción principal devuelve demasiados campos None, pruebe con un prompt de seguimiento específico centrado exclusivamente en la información ausente. Envíe solo el párrafo pertinente junto con el modelo extraído parcialmente y pida al modelo que rellene únicamente los campos vacíos. Este enfoque en dos pasadas mejora notablemente la cobertura en documentos ambiguos.
def fill_missing(partial: JobPosting, raw_text: str) -> JobPosting:
missing = [k for k, v in partial.model_dump().items() if v is None]
if not missing:
return partial
prompt = f'From this text, extract ONLY these fields: {missing}.\n\n{raw_text}'
supplement = client.chat.completions.create(
model='gpt-4o-mini',
response_model=JobPosting,
messages=[{'role': 'user', 'content': prompt}]
)
merged = partial.model_dump()
for field in missing:
if getattr(supplement, field) is not None:
merged[field] = getattr(supplement, field)
return JobPosting(**merged)Uso de valores predeterminados y fábricas
Para los campos que tengan un valor predeterminado razonable cuando falten, use default o default_factory de Pydantic. Por ejemplo, una lista de etiquetas debería tener como valor predeterminado una lista vacía en lugar de None, de modo que el código posterior siempre pueda iterar sobre ella. Reserve None para los campos cuya ausencia deba marcarse y gestionarse explícitamente.
from pydantic import BaseModel, Field
from typing import List, Optional
class Article(BaseModel):
title: str
author: Optional[str] = None
tags: List[str] = Field(default_factory=list)
word_count: Optional[int] = None
published_date: Optional[str] = NoneEnvío de extracciones con baja confianza
Construya una cola de revisión para las extracciones cuya confianza esté por debajo de un umbral. Almacene los resultados de baja confianza en una tabla independiente de la base de datos con un indicador needs_review, muéstrelos en una interfaz interna de revisión y permita que los anotadores humanos los corrijan. Incorpore las correcciones como ejemplos few-shot para mejorar las extracciones futuras.
CONFIDENCE_THRESHOLD = 0.75
def process_extraction(result: ContractExtract, doc_id: str):
needs_review = any(
field.confidence < CONFIDENCE_THRESHOLD
for field in [result.party_a, result.party_b, result.effective_date]
)
if needs_review:
queue_for_human_review(doc_id, result)
else:
store_in_production_table(doc_id, result)Gestión de fragmentos de texto ambiguos
Algunos campos pueden extraerse de varias formas válidas a partir del mismo texto. Por ejemplo, una fecha escrita como «el próximo lunes» es ambigua sin una fecha de referencia. Use un campo raw_span para capturar el texto exacto utilizado por el modelo junto con el valor normalizado. Así conservará la evidencia original y facilitará mucho la depuración de las extracciones.
from pydantic import BaseModel
from typing import Optional
class DateField(BaseModel):
raw_span: Optional[str] = None # exact text from document
iso_date: Optional[str] = None # normalized YYYY-MM-DD
confidence: float = 1.0
class Contract(BaseModel):
effective_date: DateField
expiration_date: DateFieldRegistro de patrones de campos ausentes
Realice un seguimiento de los campos que aparecen como None con mayor frecuencia en su conjunto de documentos. Una alta tasa de ausencia en un campo obligatorio puede indicar que el campo realmente no aparece en la mayoría de los documentos o que la descripción del esquema está confundiendo al modelo. Registrar los patrones de ausencia por tipo de documento le ayuda a priorizar las mejoras del esquema que tendrán mayor impacto en la calidad de los datos.
from collections import Counter
missing_counter = Counter()
def log_missing(result):
for field, value in result.model_dump().items():
if value is None:
missing_counter[field] += 1
# After processing 1000 documents:
for field, count in missing_counter.most_common(5):
print(f'{field}: {count} missing ({100*count//1000}%)')Combinación de extracciones en varias pasadas
Para documentos complejos, como informes anuales o contratos extensos, lo más eficaz es una estrategia de extracción en varias pasadas. En la primera pasada, extraiga los campos de alta confianza que siempre están presentes. En las pasadas siguientes, céntrese en secciones o párrafos específicos para extraer los campos más difíciles. Combine todas las pasadas en un único registro final y permita que las pasadas posteriores sobrescriban los valores None anteriores.
def multi_pass_extract(pages: list) -> Invoice:
# Pass 1: header info from first page
header = extract_header(pages[0])
# Pass 2: line items from middle pages
items = []
for page in pages[1:-1]:
items.extend(extract_line_items(page))
# Pass 3: totals from last page
totals = extract_totals(pages[-1])
return Invoice(
vendor=header.vendor,
invoice_number=header.invoice_number,
line_items=items,
total_amount=totals.total_amount
)Prácticas recomendadas para diseñar esquemas
Los esquemas bien diseñados reducen de forma natural los datos ausentes. Use descripciones de campo concretas y específicas para que el modelo sepa exactamente qué debe buscar. Evite combinar dos conceptos en un mismo campo. Añada examples en la descripción del campo para orientar la extracción. Un esquema que facilite el trabajo del modelo tendrá muchos menos campos ausentes que uno basado en etiquetas vagas.
from pydantic import BaseModel, Field
class Address(BaseModel):
street: str = Field(description='Street number and name, e.g. 123 Main St')
city: str = Field(description='City name only, no state')
state: str = Field(description='Two-letter US state code, e.g. CA')
zip_code: str = Field(description='5-digit ZIP code, e.g. 94105')
country: str = Field(default='US', description='ISO 3166-1 alpha-2 country code')Comprobación rápida
Compruebe su comprensión de la gestión de datos parciales y ausentes en los procesos de extracción.
Resumen de la lección
En esta lección ha aprendido que los campos opcionales con valores predeterminados None evitan que se inventen datos ausentes; que las puntuaciones de confianza y las colas de revisión crean una red de seguridad para las extracciones inciertas; y que la extracción en varias pasadas mejora la cobertura en documentos complejos al centrarse en secciones específicas en cada pasada. A continuación, ampliaremos la extracción mediante procesamiento asíncrono y colas.
Preguntas frecuentes
¿La lección «Gestión de datos parciales y ausentes» es gratis?
Sí — el texto completo de «Gestión de datos parciales y ausentes» 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 Engineering Academy, actualiza a CoddyKit PRO. El curso de AI Engineering Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Gestión de datos parciales y ausentes»?
Diseñe esquemas con campos Optional y puntuaciones de confianza, implemente estrategias alternativas de extracción para documentos ambiguos y registre las extracciones con baja confianza para su revi… Practicas AI Engineering Academy 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 Engineering Academy?
No se requiere experiencia previa. AI Engineering Academy 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 «Gestión de datos parciales y ausentes»?
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 Engineering Academy?
Sí. Cada lección de AI Engineering Academy 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
- Instructor: extracción tipada con Pydantic
- Gestión de datos parciales y ausentes
- Procesamiento por lotes con asincronía y colas
- Evolución de esquemas y compatibilidad con versiones anteriores