Ir al contenido

IDP — Build Schema

Tipo: idp-build-schema  ·  Paquete: IDP Activities v1.20.4  ·  Salida: List<object>

Desde: v1.1.0

Traduce una taxonomía a los JSON Schema que consume AI — Extract. Por cada campo pide tres cosas: el valor interpretado, el texto literal del documento del que sale y el número de línea donde aparece — que es lo que IDP — Ground usa después para localizarlo. En el Designer en español aparece como IDP — Construir esquema.

Valida la taxonomía y la trocea en lotes: un modelo con salida garantizada compila el esquema antes de generar, y un esquema demasiado grande se rechaza. Cada lote lleva como máximo maxFields celdas: un campo escalar cuenta 1 y una tabla cuenta una por columna. Una tabla nunca se parte entre lotes, porque sus columnas tienen que ir juntas para devolver filas completas.

El log dice cuántos campos (y celdas) hay y en cuántos lotes quedaron. Si una tabla tiene por sí sola más columnas que maxFields, va en su propio lote igualmente y el log lo advierte: si el modelo rechaza ese esquema, ese es el motivo.

ParámetroTipoPor defectoDescripción
taxonomystring | Dictionary—La taxonomía: la ruta de un .json, el JSON como texto, o el objeto. Describe un tipo de documento, no un layout.
ParámetroTipoPor defectoDescripción
maxFieldsint7Cuántas celdas van en cada lote (entero positivo). Una tabla cuenta una vez por columna y nunca se parte. Subirlo reduce el número de llamadas, pero el modelo rechaza un esquema demasiado grande: cámbialo solo si puedes volver a probar la taxonomía. Desde la versión 1.5.0.

Devuelve una List<object>: un JSON Schema por lote, cada uno listo para pasárselo tal cual a AI — Extract. Una taxonomía pequeña devuelve una lista de un solo elemento.

Cada esquema tiene raíz "type": "object" con una propiedad por campo del lote. Por campo se pide { value, valueRaw, line }: line siempre (-1 si el campo no aparece), y value/valueRaw se omiten cuando el campo no está, en vez de inventarse. Un campo date se pide como texto con formato de fecha, y un boolean se lee como casilla (☑ marcada, ☐ vacía). Una tabla pide una lista de filas con esa misma forma por celda. Pasa todas las respuestas, en una lista, a IDP — Ground: ahí se juntan.

Describe un tipo de documento, no una plantilla. Ahí está el negocio: la capa visual cambia de un emisor a otro, pero la semántica no. Un solo factura-proveedor.json sirve para todos los proveedores.

{
"documentType": "factura-proveedor",
"description": "Factura de compra de un proveedor. El formato varía entre emisores.",
"fields": [
{
"name": "numero",
"type": "string",
"description": "Número de la factura, tal y como aparece impreso",
"minConfidence": 0.95
},
{
"name": "proveedor",
"type": "string",
"description": "Razón social de quien emite la factura",
"minConfidence": 0.6
}
]
}
ClaveObligatoriaQué es
documentTypesíIdentificador del tipo de documento.
descriptionnoQué es este documento. Se le pasa al modelo como contexto.
fieldssíLista de campos; no puede estar vacía ni repetir nombres.
fields[].namesíNombre del campo en el resultado.
fields[].typenostring (por defecto), number, integer, boolean, date o table.
fields[].descriptionsíQué es este campo.
fields[].minConfidencenoConfianza exigida para darlo por bueno, entre 0 y 1. Por defecto 0.8.
fields[].fieldssolo en tableLas columnas de la tabla.

Un campo de tipo table es un campo que se repite: una fila por cada aparición en el documento. Es lo que permite extraer las líneas de una factura, un listado de repuestos o cualquier cosa con N entradas.

{
"name": "items",
"type": "table",
"description": "Líneas de detalle de la factura",
"fields": [
{ "name": "descripcion", "type": "string", "description": "Descripción del producto o servicio", "minConfidence": 0.7 },
{ "name": "cantidad", "type": "number", "description": "Cantidad facturada", "minConfidence": 0.9 },
{ "name": "valor", "type": "number", "description": "Valor total de la línea", "minConfidence": 0.9 }
]
}

Las columnas se declaran igual que un campo normal, con su propia description y su propio minConfidence — porque una cantidad y una descripción no se leen con la misma fiabilidad. La tabla en sí no lleva minConfidence: no se verifica como un todo, se verifica celda a celda.

minConfidence es la confianza mínima para aceptar el campo sin que lo mire una persona. Cuanto más alto, más estricto.

Va por campo a propósito. Un número de factura o de serie es alfanumérico y sin redundancia lingüística: es justo donde el OCR falla, y donde equivocarse sale caro — así que se le exige casi certeza (0.95). Una razón social se lee siempre bien y el contexto la corrige sola, así que exigirle lo mismo solo mandaría a revisión trabajo que no la necesita (0.6).

Un umbral único para todo el documento manda todo a revisión y mata el ROI.

El pipeline a mano, con un AI — Extract por lote:

IDP — Load Document path = rutaDoc → output: doc
IDP — Build Schema taxonomy = asset("taxonomias/factura-proveedor.json") → output: esquemas
Create List → output: respuestas
Foreach items = esquemas itemVariable = esquema
AI — Extract prompt = doc["text"]
schema = esquema
→ output: parcial
Add to List list = respuestas item = parcial
IDP — Ground document = doc
extraction = respuestas
taxonomy = asset("taxonomias/factura-proveedor.json")
→ output: res
MensajeCausa y solución
'maxFields' debe ser un número entero positivo. Se recibió: …Valor de maxFields no válido.
'taxonomy' es obligatorio. / 'taxonomy' no es un JSON válido: … / 'taxonomy' debe ser un objeto JSON, pero es …Falta la taxonomía o no es un objeto JSON. Si pasas una ruta, comprueba que el archivo exista.
La taxonomía debe declarar un 'documentType'. / La taxonomía debe declarar un arreglo 'fields'. / El arreglo 'fields' de la taxonomía está vacío; no hay nada que extraer.Falta una clave obligatoria de la taxonomía.
La taxonomía declara el campo '…' más de una vez.Nombres de campo repetidos (sin distinguir mayúsculas).
Cada campo de la taxonomía debe tener un 'name'. / El campo '…' no tiene 'description'. El modelo la lee para decidir qué va en este campo, así que no es opcional.Un campo sin nombre o sin descripción.
El campo '…' tiene un tipo desconocido '…'. Tipos válidos: string, number, integer, boolean, date, table. / La columna '…' tiene el tipo '…'. Las columnas de una tabla deben ser de uno de estos tipos: string, number, integer, boolean, date.Tipo no válido (o una tabla dentro de una tabla).
Campo '…': 'minConfidence' debe estar entre 0 y 1. Se recibió: …Umbral fuera de rango o no numérico.
El campo '…' es una tabla, así que debe declarar un arreglo 'fields' con sus columnas. / La tabla '…' no declara columnas. / El campo '…' declara 'fields' pero su tipo es '…'. Solo un campo de tipo 'table' tiene columnas.Estructura de tabla incorrecta.