Extracción de datos de texto no estructurado
Creará un pipeline de extracción de información que lea texto sin procesar, como correos electrónicos, recibos y artículos, y devuelva campos estructurados con tipos, valores predeterminados y validación.
Extracción de datos de texto no estructurado es una lección gratuita de AI Engineering Academy en CoddyKit. Esta es la lección 3 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.
El problema de la extracción de información
Las organizaciones se están ahogando en texto no estructurado: correos electrónicos, tickets de soporte, contratos, facturas, artículos de noticias, notas médicas y publicaciones en redes sociales. En ese texto hay datos estructurados valiosos, pero extraerlos manualmente es lento, costoso y propenso a errores. Los LLM con salidas estructuradas cambian esta situación: pueden leer cualquier texto y completar un esquema predefinido con los campos relevantes, a gran escala y con una precisión razonable.
La extracción de información (IE) es el proceso de identificar y extraer automáticamente hechos estructurados a partir de texto no estructurado. La IE basada en LLM supera ampliamente a los enfoques anteriores basados en reglas o en PLN clásico, porque los LLM entienden el contexto, la sinonimia y la información implícita sin necesidad de crear patrones regex manualmente para cada variación.
Casos de uso habituales de la extracción
La extracción de información impulsa muchas aplicaciones empresariales valiosas:
- Procesamiento de facturas: extraer el proveedor, las partidas, los importes y las fechas de vencimiento de facturas en PDF para automatizar las cuentas por pagar
- Análisis de contratos: extraer las partes, las fechas de entrada en vigor, las condiciones de pago y las cláusulas de rescisión de documentos legales
- Análisis de currículos: extraer las habilidades, la experiencia, la formación y los datos de contacto de los CV para sistemas ATS
- Enrutamiento de tickets de soporte: extraer la categoría, la gravedad, el producto afectado y el nivel del cliente para enrutar los tickets automáticamente
- Monitorización de noticias: extraer entidades, eventos y sentimientos de artículos de noticias para obtener inteligencia competitiva
Creación de un pipeline de extracción de correos electrónicos
Vamos a crear un pipeline de extracción práctico que lea correos electrónicos de clientes y extraiga datos estructurados que permitan tomar medidas. El pipeline utiliza un esquema de Pydantic para definir exactamente qué queremos obtener de cada correo electrónico y, a continuación, procesa los correos por lotes.
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.parsedReconocimiento de entidades con nombre mediante LLM
El reconocimiento de entidades con nombre (NER) es una tarea clásica de IE: identificar y clasificar entidades con nombre (personas, organizaciones, ubicaciones, fechas e importes monetarios) en un texto. Los LLM simplifican enormemente el NER, ya que basta con describir las entidades que desea y el modelo las extrae sin necesidad de un modelo NER entrenado específicamente.
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}')Extracción de documentos a gran escala
Para los pipelines de extracción en producción que procesan miles de documentos, necesita procesamiento asíncrono y gestión de límites de tasa. Un patrón habitual utiliza asyncio con un semáforo para procesar documentos en paralelo respetando los límites de tasa de la 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')Gestión de información implícita e inferida
Los LLM pueden extraer no solo información indicada explícitamente, sino también información inferida o implícita. Si una reseña dice «Llevo un mes usándolo a diario y sigue funcionando perfectamente», el modelo puede inferir que la durabilidad es un atributo positivo, aunque la palabra «durabilidad» no aparezca. Esta es una gran ventaja frente a la extracción basada en regex, que solo puede encontrar lo que está presente de forma explícita.
Sin embargo, esta capacidad también entraña riesgos: el modelo puede inferir demasiado y completar campos con suposiciones en lugar de hechos. Para extracciones de alto riesgo (legales, financieras o médicas), añada un campo confidence al esquema e indique al modelo que valore su certeza, marcando las extracciones con baja confianza para que las revise una persona.
Diseño de prompts de extracción
La calidad de la extracción depende en gran medida del diseño del prompt. Principios clave para los prompts de extracción:
- Defina los campos ambiguos: si «fecha» puede significar fecha de factura, fecha de vencimiento o fecha de recepción, especifique exactamente cuál necesita
- Proporcione ejemplos para formatos inusuales: «Para el precio, devuelva solo el valor numérico; por ejemplo, 29.99, no $29.99»
- Gestione la normalización: «Normalice los nombres de países usando códigos ISO 3166-1 alfa-2»
- Especifique la fuente de extracción: «Extraiga solo del asunto, no del cuerpo del correo electrónico»
Considere el prompt de extracción como una especificación precisa para una persona encargada de introducir datos: cada ambigüedad que deje en el prompt será una decisión que el modelo tomará de forma incoherente.
Extracción en varias pasadas para documentos complejos
Algunos documentos son demasiado complejos para extraer su información en una sola pasada, ya sea porque el esquema completo es muy grande, porque distintas secciones requieren conocimientos diferentes o porque la estructura del documento es muy variable. La extracción en varias pasadas divide la tarea en pasos secuenciales: primero clasifica el tipo de documento y después extrae el esquema adecuado para ese 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')Enriquecimiento posterior a la extracción
Los datos extraídos suelen necesitar enriquecimiento después de la extracción inicial: convertir los nombres de empresas extraídos a formas canónicas consultando una base de datos de empresas, buscar el código postal extraído para completar la ciudad y el estado, o convertir las fechas extraídas a un formato estándar. Este paso de enriquecimiento debe realizarse en el código de su aplicación después de la extracción, no durante la llamada al LLM.
Mantener separadas la extracción y el enriquecimiento facilita las pruebas y el mantenimiento del pipeline. Puede probar de forma independiente con pruebas unitarias la lógica de enriquecimiento y cambiar el modelo de extracción sin modificar su código de enriquecimiento.
Medición de la precisión de la extracción
En los pipelines de extracción en producción, mida sistemáticamente la precisión con respecto a un conjunto de pruebas etiquetado. Las métricas clave son:
- Precisión por campo: porcentaje de campos extraídos correctamente por documento
- Coincidencia exacta: el valor del campo coincide exactamente con la verdad de referencia
- Coincidencia normalizada: el valor del campo coincide después de la normalización (por ejemplo, '$1,234.00' == '1234.0')
- Tasa de falsos positivos: frecuencia con la que el modelo extrae un campo que debería ser null
- Tasa de falsos negativos: frecuencia con la que el modelo devuelve null para un campo que sí está presente
Ejecute esta evaluación cada vez que cambie de modelo, actualice los prompts o añada nuevas fuentes de documentos al pipeline. Incluso pequeñas caídas de precisión pueden provocar un impacto empresarial significativo al procesar miles de documentos.
Registro de extracciones para la mejora continua
Cada resultado de extracción en producción es un dato que puede mejorar su pipeline. Registre en una base de datos cada documento de entrada, la salida extraída y cualquier error de validación. Tome periódicamente muestras de los registros de producción para identificar patrones de error frecuentes: determinados formatos de documento con los que el modelo tiene dificultades, campos que a menudo son null cuando no deberían serlo o valores inusuales que indiquen una desviación del prompt.
Estos datos registrados también se convierten en su futuro conjunto de datos de entrenamiento si alguna vez desea ajustar un modelo específicamente para su tarea de extracción, lo que le proporcionaría una alternativa de mayor precisión y menor coste que los LLM de propósito general para la extracción estructurada.
Comprobación rápida
Compruebe su comprensión de los conceptos de ingeniería de IA de esta lección.
Resumen de la lección
En esta lección ha aprendido que los LLM con esquemas de Pydantic extraen de forma fiable datos estructurados de cualquier fuente de texto no estructurado, que el procesamiento asíncrono con semáforos permite extraer por lotes datos de miles de documentos respetando los límites de tasa y que la extracción en varias pasadas clasifica primero los documentos y después aplica el esquema adecuado a cada tipo. A continuación, crearemos la lógica de validación y reintento automático para gestionar los casos en los que los datos extraídos no cumplan las reglas de negocio.
Preguntas frecuentes
¿La lección «Extracción de datos de texto no estructurado» es gratis?
Sí — el texto completo de «Extracción de datos de texto no estructurado» 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 «Extracción de datos de texto no estructurado»?
Creará un pipeline de extracción de información que lea texto sin procesar, como correos electrónicos, recibos y artículos, y devuelva campos estructurados con tipos, valores predeterminados y valida… 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 3 de 4.
¿Cuánto tiempo toma la lección «Extracción de datos de texto no estructurado»?
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
- Modo JSON y response_format
- Salidas estructuradas con Pydantic
- Extracción de datos de texto no estructurado
- Validación y reintento de salidas incorrectas