Ir al contenido

IDP Activities

Versión: 1.18.0  ·  ID: zoan-packages-idp  ·  Autor: Zoan Software

El paquete IDP (Intelligent Document Processing) lee documentos cuyo formato cambia de un emisor a otro: hojas de vida de equipos, facturas, actas. La idea es describir qué significa cada dato en vez de dónde está, para que la misma configuración sirva para todos los formatos de un mismo tipo de documento.

  • Sin sesión: cada actividad recibe la ruta del documento y trabaja sobre él.
  • La ruta se decide sola: IDP Load Document mira si el PDF tiene capa de texto. Si la tiene, la lee (gratis y exacta); si no, lo escanea con Azure Document Intelligence. Las dos rutas devuelven la misma estructura, así que lo que va detrás no cambia.
  • Las coordenadas están unificadas: todas las palabras salen en píxeles al dpi que pidas, con origen arriba-izquierda, venga de donde venga el documento.

Cada palabra viene con su caja (x, y, width, height). Eso es lo que permite volver al documento desde un dato extraído: resaltar de dónde salió un número de serie, mostrárselo a una persona para que lo valide, o auditar una extracción meses después.

Si usas el mismo dpi en PDF To Images, las cajas caen exactamente encima de la página renderizada, sin conversión ninguna. Es la base sobre la que se dibuja cualquier revisión visual.

Las dos primeras son el camino normal. Las de abajo siguen ahí para quien necesite meterse entre medias.

ActividadTipoSalidaQué hace
IDP Classifyidp-classifyobjectLee un documento y dice de qué tipo es. Devuelve el documento ya leído
IDP Extractidp-extractobjectExtrae los campos de un proyecto de extracción, enruta al perfil del formato y localiza cada valor en la página
IDP Load Documentidp-load-documentobjectCarga un documento y devuelve su texto y sus palabras con posición
IDP Build Classifieridp-build-classifierobjectConstruye el esquema que identifica de qué tipo es el documento
IDP Build Schemaidp-build-schemalistTrocea una taxonomía en los esquemas que caben en una llamada
IDP Groundidp-groundobjectLocaliza cada valor extraído y marca lo que necesita revisión

Dos nodos:

IDP Classify → ¿es del tipo que toca? → IDP Extract

IDP Classify devuelve el documento ya leído junto al veredicto, e IDP Extract lo reusa: el fichero se lee una sola vez. Con un escaneo eso no es una optimización menor — releer es pagar Azure dos veces.

Van separadas a propósito. Qué hacer con un documento que no toca es una decisión tuya, no de una actividad: una que decide sola no hacer su trabajo esconde el control de flujo, y además impide lo único que de verdad hace falta cuando la cola trae de todo — clasificar una vez y enrutar al proyecto que corresponda.

Conviene tenerlas separadas en la cabeza porque protegen de cosas distintas:

  • Clasificar responde “¿es este documento del tipo que creo?”. Sin ese paso, una factura procesada como hoja de vida puede colar un dato incorrecto con confianza alta.
  • Groundear responde “¿está este valor escrito en el documento?”. Detecta que el modelo se lo inventó, no que el documento sea el equivocado.

Ninguna cubre a la otra. Ver IDP Build Classifier para el caso concreto que se escapa.

La ruta de escaneo usa Azure Document Intelligence (modelo prebuilt-layout), que lee manuscrito — importante porque en muchos documentos la parte que nadie ha digitalizado nunca (un historial de mantenimientos, una firma, una anotación al margen) está escrita a mano. No necesita entrenamiento ni etiquetado: funciona con cualquier documento desde el primer día.

Encolar (una vez por lote):

List Files path = = env("HOSPITAL_DOCS_DIR") pattern = "*.pdf" recursive → ficheros
Foreach items = = ficheros itemVariable = ruta
Queue Add Item queueName = "hojas-de-vida" reference = = ruta
specificContent = { "path": = ruta }

reference = la ruta. Es la clave de idempotencia de la cola y la que llevará el documento en Zoan Cloud, así que relanzarlo no duplica nada y desde el item se llega al documento.

Procesar:

Queue Process queueName = "hojas-de-vida" itemVariable = item onError = continue
Set Variable name = contenido value = = item.SpecificContent
IDP Classify path = = contenido["path"]
projects = ["hoja-de-vida"]
credential = = credential("anthropic-key")
dpi = 200
azureCredential = = credential("azure-di-key")
→ doc
If condition = = doc["recognized"] == false
Queue Set Transaction Status item = = item status = "successful"
output = { "descartado": true, "reason": = doc["reason"] }
Continue
IDP Extract document = = doc ← ya leído: no se relee
project = "hoja-de-vida"
credential = = credential("anthropic-key")
azureCredential = = credential("azure-di-key")
→ res
PDF To Images path = = contenido["path"] dpi = 200 outputDir = = tmpFolder → paginas
Documents Upload path = = contenido["path"] reference = = item.Reference
pages = = paginas dpi = 200 extraction = = res
documentType = = res["documentType"] → subido
Queue Set Transaction Status item = = item status = "successful"
output = { "documentId": = subido["id"],
"needsReview": = res["needsReview"],
"values": = res["values"] }

Queue Process cierra cada item solo —successful si el cuerpo termina, failed si lanza— pero lo cierra con output vacío: tira el resultado. Con el auto-cierre, tu telemetría es “procesé 400, fallaron 12” y nada más.

Por eso el ejemplo llama a Queue Set Transaction Status a mano: si el cuerpo ya fijó el estado, el auto-cierre se aparta. Así cada documento deja su rastro consultable — qué se extrajo, con qué confianza, por qué fue a revisión, y por qué se descartó si se descartó.

Con eso tienes:

DóndeQué te da
GET /queues/:id/metricsTotal, cuentas por estado, tasa de éxito, throughput por hora, tiempos medio y p95.
GET /queues/:id/itemsCada documento con su reference, estado y el output que le pusiste.
Cola validacion-*Cuántos y cuáles necesitan una persona.