, construí un sistema de procesamiento inteligente de documentos (IDP) totalmente automatizado que se ejecutaba en la nube en Amazon Web Services. El sistema fue diseñado para permitir solicitudes del tipo Libertad de Información por parte de ciudadanos irlandeses que deseaban saber si sus datos (nombre, dirección, etc.) estaban registrados en una gran base de datos de reclamaciones de seguros mantenida por mi empleador.
En un nivel alto, el cronograma del flujo de trabajo era este:
Los abogados del cliente enviaron un correo electrónico a una dirección específica de Outlook solicitando una búsqueda de los detalles del cliente en la base de datos. Para la búsqueda, necesitábamos el nombre y apellido del cliente, junto con su fecha de nacimiento y dirección actual. Una búsqueda solo podría realizarse si había documentos que lo corroboraran adjuntos al correo electrónico para "probar" quién era el cliente. Los archivos adjuntos suelen ser archivos PDF que contienen imágenes de pasaportes, permisos de conducir y otros documentos oficiales. Además, también podíamos recibir documentos MS Word o PDF de extractos bancarios y facturas de servicios públicos. A una hora específica cada día, el IDP procesó estos correos electrónicos, extrajo y clasificó los archivos adjuntos y extrajo cualquier información de identificación personal (PII) relevante, que se envió a una base de datos de reclamaciones para su búsqueda. Si se encontraban detalles del reclamo en la base de datos, se creaba un PDF protegido con contraseña que contenía esos detalles y se enviaba al abogado, junto con un correo electrónico separado que contenía la contraseña para desbloquearlo. Si no se encontraron resultados, se envió un simple correo electrónico indicándolo.
Además de un proceso Human-In-The-Loop (HIL) que permitió a los usuarios realizar una verificación cruzada final para determinar si la PII extraída de diferentes documentos coincidía, el proceso fue completamente automatizado.
Por cierto, este nuevo proceso resultó aproximadamente un 90% más eficiente que el sistema manual al que reemplazó.
En este artículo, les mostraré los pasos que seguí para implementar este sistema en la plataforma en la nube de AWS, aunque sea una versión ligeramente simplificada.
Tenga en cuenta que, además de ser usuario de Amazon Web Services (AWS), no tengo ninguna afiliación ni asociación con la empresa.
En el sistema real que desarrollé, nuestra fuente de correos electrónicos procedía de una cuenta de correo electrónico corporativa de Outlook. No tengo acceso a ninguno de ellos ahora, así que usaré mi Gmail personal como nuestro servidor de correo electrónico y asumiré que cada correo electrónico contiene solo un archivo adjunto. Supongo que cualquier archivo adjunto siempre será un archivo de imagen (JPG o PNG) de un pasaporte, permiso de conducir o extracto bancario. Además, el paso final de nuestro proceso será un archivo de resultados simple en S3 que indique la clasificación y los valores de extracción de PII para el archivo adjunto.
Debido a la longitud de los fragmentos de código, etc., incluiré un enlace al final del artículo a un repositorio de GitHub, donde podrá encontrar todo el código Lambda, el código de la función Step, los permisos de IAM y todo lo demás necesario para este proyecto.
Como se trata principalmente del lado de AWS, asumiré que todo está configurado en su cliente de correo electrónico para permitir que un proceso AWS Lambda lea sus correos electrónicos.
Para Gmail, brevemente, este proceso incluiría:-
crear o seleccionar un proyecto de Google Cloud que habilite la API de Gmail, habilite OAuth y complete un flujo de consentimiento de Google por única vez.
Después de eso, almacenará las credenciales/tokens de actualización devueltos de forma segura en algo como AWS Secrets Manager.
El objetivo es extraer los siguientes datos de PII de cada archivo adjunto de correo electrónico.
Tipo de documento, nombre, apellido, fecha de nacimiento y dirección
Nuestras imágenes adjuntas de prueba de Gmail
Le pedí a Codex que creara 3 imágenes obviamente falsas de un pasaporte, una licencia de conducir y un extracto bancario. Aunque son falsos, contienen la misma información que los reales. Aquí están esas imágenes.
Envié estas imágenes por correo electrónico a mi cuenta de Gmail y etiqueté los correos electrónicos como "Procesamiento de documentos".
Ahora tenemos todo listo para comenzar a crear nuestro IDP.
Estos son los servicios de AWS que usaremos para implementar nuestro IDP.
IAM para permisos EventBridge para programación Función de paso para orquestación Lambda para computación S3 para almacenamiento Secrets Manager para almacenar OAuth y otra información secreta Textract para OCR Bedrock para inferencia de IA
1/ Almacenar nuestras credenciales OAUTH de forma segura
Lo primero que debemos hacer es almacenar nuestras credenciales OAuth de Gmail y el token de actualización en AWS Secrets Manager. Para mí, la configuración de mi correo electrónico arrojó un documento JSON que se parecía a este.
{ "installed": { "client_id": "my_client_id.apps.googleusercontent.com", "client_secret": "MY_CLIENT_SECRET", "project_id": "my_project_id", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://oauth2.googleapis.com/token" } }
Abra la consola de administración de AWS y vaya a la pantalla de Secret Manager. Haga clic en el botón "Guardar un nuevo secreto" y elija "Otro tipo de secreto" como tipo de secreto. En la sección de pares clave/valor, seleccione la PESTAÑA Texto sin formato e ingrese su JSON desde arriba. Entonces tu pantalla debería verse así,
Haga clic en Siguiente, luego ingrese un nombre y una descripción adecuados para su nuevo secreto. Haga clic en Siguiente, luego Siguiente nuevamente, antes de hacer clic en el botón Tienda.
2/ Configurar nuestros depósitos S3
Tendremos un depósito de uso general y 5 carpetas que contendrán nuestros datos.
raw: aquí es donde los archivos adjuntos de correo electrónico sin procesar se descargarán para texttract: esto contendrá el texto devuelto por Textract results: esto contendrá los resultados de la clasificación de documentos y auditoría de información PII: registro de información cuarentena: cualquier imagen/documento no clasificado se colocará aquí
3/ Creando nuestras Lambdas
Necesitaremos tres.
i) ingest_email_image recupera mensajes de correo electrónico elegibles y escribe cada imagen en nuestra carpeta sin formato en Amazon S3.
ii) extract_text envía las imágenes S3 al servicio Amazon Textract y almacena el texto extraído.
iii) classify_and_extract_pii envía ese texto extraído a Amazon Bedrock Claude Sonnet 4.6, que intenta clasificar el tipo de documento y extraer cualquier PII relevante y escribe el resultado.
Aquí hay un diagrama simplificado del proceso que construiremos.
Programador de EventBridge | v Flujo de trabajo de funciones de paso estándar | +– Ingerir archivos adjuntos de imágenes de Gmail -> S3 raw/ | +– Mapa: un correo electrónico/imagen a la vez | +– Extracto de texto Lambda -> Extracto de texto S3/ | +– Bedrock Lambda -> Resultados S3/ | +– Registrar un resultado de éxito o fracaso
Lambda 1 – ingest_email_image
El primer Lambda sondea nuestra etiqueta de Gmail configurada utilizando credenciales OAuth de solo lectura de AWS Secrets Manager. Valida que cada correo electrónico contenga exactamente un archivo adjunto JPEG o PNG, guarda imágenes válidas en la carpeta S3 raw/ y devuelve resultados para la siguiente etapa de procesamiento; Los archivos adjuntos no válidos o duplicados se informan por separado.
Después de que se ejecute Lambda, debería ver los tres archivos de imagen guardados en la carpeta sin formato de su depósito S3.
Tenga en cuenta también que Lambda utiliza las siguientes variables de entorno.
Valor de variable ——– —— DOCUMENT_BUCKET YOUR_OUPUT_BUCKET_NAME GMAIL_LABEL_NAME YOUR_GMAIl_LABEL_NAME GMAIL_SECRET_ARN YOUR_SECRETS_MANAGER_ARN LOG_LEVEL INFO MAX_IMAGE_BYTES 10000000 MAX_MESSAGES_PER_RUN 25
Lambda 2 – extraer_texto
El segundo Lambda toma las imágenes almacenadas en raw/ y ejecuta la detección sincrónica de texto-documento de Amazon Textract en ellas. Guarda el texto extraído, las líneas individuales, las puntuaciones de confianza y los metadatos de origen como JSON en la carpeta S3 texttract/.
Aquí hay una versión embellecida y abreviada del resultado típico cuando lo ejecuté con la imagen del extracto bancario.
{ "schema_version":1, "processed_at":"2026-06-25T11:04:19.850574+00:00", "source":{ "bucket":"MY_BUCKET", "image_key":"raw/bank.png", "gmail_message_id":"19efe3cd80025b99", "gmail_attachment_id":"ANGjdJ-NRkTD-45NFgNRZfHyWSKezw5MI03xN7bvTs4PZKuDjbMCZPk–bnSp4l MVldYhISyd64jH9JgN5cJXTm2_KVDFDsrIFDWJAWs7K6CtMJvsb9OYNX7GZSnwptK_U6M3npTu_02mNbOY_Q-P TKt58rcYbIOA7aDbOxlrAqFh3NmoT69FV92oMjy6NqaT1uSXXZY40h62Ofp-JT4s2JGLKCymhi_o49eAPvBj8a zguB4WyoowqWiQEh_cL5IdI7uJC7GEIu9LoUZYuxr7AHZBwACeasd-sNbKLYUb7FwDhPpla_iGD9aDyncH8Q", "mime_type":"image/png" }, "textract":{ "model_version":"1.0", "document_metadata":{ "Pages":1 }, "lines":[ { "text":"Extracto bancario del Reino Unido", "confidence":99.98 }, { "text":"bank", "confidence":99.99 }, { "text":"Unastign Uiver Pol, 01426", "confidence":93.85 }, … … … { "text":"Términos Declaración de los bancos del Reino Unido fan Su condición de banda, dlesstery. AT stalewaly for diescavey fevien 720, 00553 Estimado", "confidence":93.75 }, { "text":"Contrined Parih Bank ellamty of allimd elines and ptke and corv. llartes hier. uniedarfc manteca de cerdo arena colunrty mp conmontivre", "confidence":79.02 }, { "text":"tharter m allar mpercian the Cant'g paymer Is amowe Sane UK Banklila the Serd Promonry à a corditions of larril and", "confidence":78.91 }, { "text":"Statemant of Teard of thre D2. Carpltionrnes Otros whitan y Contiiomed Earm Condiciones de Términos witte pittier atados Oswllas", "confidence":89.62 }, { "text":"Términos y condiciones, lod Cporl and Balance.", "confidence":82.19 } ], "text":"Extracto bancario del Reino UnidonbanknUnastign Uiver Pol, 01426nUttesline 952016nVobue 4346nContasc! 84 6207nContasc! CódigonVálidon01/05/2026 al 01/06/2026nPeríodo del estado de cuentanSaldo inicialn01/05/2026 al 01/06/2026nSaldo finalnTransaccionesnanFechanDescripciónnMontonSaldon07906TNnDirecto Débitosn£72 000n£59 000n080161BnPagos con tarjetan£73 000n£95 000nTarjeta Paynditn090061NnCrédito de salarion£95 000n£56 000n064061BnSalario Créditon£23,000n£64,000n095061DnRetiros en cajero automáticon£60,000n£60,000n075061NnCajero automático con retiron£60,000n£64,000n374091DnATM Vithdrawalyn£60,000n£63,000n340061DnRetiros en cajeros automáticosn£60,000n£73,000n153381DnRetiros en cajeros automáticosn£60,000n£13,000n150491DnATM Retiron£10,000n£13,000n169010PnRetiros en cajero automáticon£11,000n£19,000n188191DnRetiros en cajero automáticon£10,000n£95,000n11111TDnSalario Créditon£60,000n£55,000n11211TDnRetiros en cajeros automáticosn£60,000n£95,000nNúmero de páginanCondiciones Extracto de los bancos del Reino Unido fan Su condición de banda, dlesstery AT stalewaly para diescavey fevien 720, 00553 EstimadonContrined Parih Bank ellamty de. allimd elines y ptke y corv. llartes hier. uniedarfc lard sand colunrty mp conmontivrentharter m allar mpercian the Cant'g paymer Is amowe Sane UK Banklila the Serd Promonry à a corditions of larril andnStatemant of Teard of the Carpltionrnes Other whitan and Contiiomed Earm Conditions of Terms witte. Pittier atado OswllasnTérminos y condiciones, lod Cporl y saldo." } }
Lambda 3 – clasificar_y_extract_pii
El Lambda final toma cada bloque de texto JSON que Textract extrajo de las imágenes de entrada y utiliza AWS Bedrock para clasificar el tipo de documento y extraer cualquier PII que pueda recopilar. La clave del éxito en este paso es el modelo utilizado y el mensaje que se le pasa. Para mi proyecto de trabajo, utilicé Claude Sonnet 4.6 y un mensaje muy grande porque tenía que manejar entradas más complejas. Pero para este ejemplo más sencillo, aunque seguiremos usando Sonnet 4.6, podemos utilizar un mensaje mucho más simple.
Primero, debemos anotar el modelo de ARN asociado con Sonnet 4.6 en la región en la que está trabajando. Esto se hace desde la consola Bedrock, así que selecciónelo y luego haga clic en el enlace Perfiles de inferencia en la barra de menú de la izquierda. Busque Sonnet 4.6 y anote el ARN apropiado. Como se trata de un perfil de inferencia, también deberá tomar nota de las regiones a través de las cuales AWS puede enrutar llamadas de inferencia, ya que deberán agregarse a sus permisos de IAM junto con el permiso del perfil de inferencia.
Estos son los resultados finales que recibí después de procesar los archivos adjuntos del banco, el pasaporte y la licencia de conducir.
Adjunto bancario
{ "schema_version":1, "processed_at":"2026-06-25T11:04:23.221887+00:00", "source":{ "bucket":"MY_BUCKET", "textract_key":"textract/bank.png.json" }, "model":{ "model_id":"us.anthropic.claude-sonnet-4-6" }, "classification":"bank_statement", "pii":{ "first_name":"John", "last_name":"Smith", "date_of_birth":null, "address":"11 The High Street, NewTown, NT1 3WE" } }
Adjunto de pasaporte
{ "schema_version":1, "processed_at":"2026-06-25T11:04:21.829715+00:00", "source":{ "bucket":"MY_BUCKET", "textract_key":"textract/passport.jpg.json" }, "model":{ "model_id":"us.anthropic.claude-sonnet-4-6" }, "clasificación":"pasaporte", "pii":{ "first_name":"AVERY", "last_name":"EJEMPLO", "fecha_de_nacimiento":"1991-08-30", "address":"14 Ejemplo Lane, Testford, TE1 2ST" } }
Adjunto de licencia de conducir
{ "schema_version":1, "processed_at":"2026-06-25T11:04:22.507427+00:00", "source":{ "bucket":"MY_BUCKET", "textract_key":"textract/driving.jpg.json" }, "model":{ "model_id":"us.anthropic.claude-sonnet-4-6" }, "classification":"driving_licence", "pii":{ "first_name":"AVERY", "last_name":"EXAMPLE", "date_of_birth":"1991-08-30", "address":"14 Ejemplo de carril, Testford, TE1 2ST" } }
Este Lambda utiliza las siguientes variables de entorno.
Valor variable ——– —— BEDROCK_MODEL_ID us.anthropic.claude-sonnet-4-6 DOCUMENT_BUCKET MY_BUCKET LOG_LEVEL INFO MAX_INPUT_CHARS 30000 MAX_JOBS_PER_RUN 25
La función de paso
Aunque para este ejemplo simple probablemente podríamos simplemente conectar en cadena los tres Lambdas para ejecutarlos uno tras otro en el código, la mejor práctica es utilizar la herramienta de orquestación de AWS, llamada Step. Las funciones de pasos tienen la ventaja adicional de poder volver a intentarse después de fallas y manejar con elegancia errores y tiempos de espera.
AWS utiliza un lenguaje llamado Amazon State Language (ASL) para definir sus funciones de pasos. El código ASL está en el repositorio. Dentro de Step, puede representar un proceso en un diagrama de flujo útil que, en nuestro caso, se ve así.
Puede parecer un poco complicado, pero gran parte de eso es el andamiaje típico que rodea un proceso como este, como el manejo de errores. Básicamente se trata de orquestar las tres Lambdas llamándolas una tras otra.
El programador de EventBridge
Para unir todo, necesitaba una forma de iniciar la función Paso a diario. Una forma sencilla de hacerlo en AWS es a través de un servicio llamado EventBridge. EventBridge es capaz de hacer muchas cosas, pero una de sus funciones más útiles es configurar un evento de sincronización basado en cron que puede llamar a otros sistemas AWS en una fecha y hora específicas. En mi proyecto de trabajo, establecí una tarea programada para que se ejecutara a las 11:55 p. m. cada noche para capturar todos los correos electrónicos en la bandeja de entrada de ese día, así que lo repetiré aquí.
Haga clic en el servicio EventBridge desde la consola principal, luego haga clic en el elemento del menú Programar en la barra de la izquierda. En la pantalla, haga clic en el botón "Crear horario". Deberías ver una pantalla como esta.
Escriba un nombre y una descripción para su horario. Deje el campo "Grupo de programación" como predeterminado y luego elija la opción "Programación recurrente". Seleccione su zona horaria requerida y opte por la programación basada en cron. Desde aquí, complete los campos como lo haría para un trabajo cron.
Para nuestro ejemplo de lunes a viernes a las 11:55 p. m., esto sería
A continuación, establezca una ventana de tiempo flexible si lo desea, junto con fechas de inicio/finalización opcionales. Haga clic en el botón Siguiente y seleccione "Funciones de pasos de AWS" como objetivo. Seleccione el nombre de la función de paso que desea ejecutar en la lista desplegable e ingrese las entradas.
Haga clic en Siguiente. En esta pantalla, ingrese NINGUNO para la acción a realizar una vez finalizado el evento. También puede ingresar una cola de mensajes fallidos (DLQ), detalles de cifrado y permisos de IAM.
Haga clic en Siguiente una vez más para ir a la pantalla Revisar y, si está satisfecho con todos los detalles, haga clic en el botón "Crear programa".
Su programación ahora estará "en vivo" y su función Step se ejecutará todos los días de la semana a las 11:55 p.m.
¿Qué se necesita para convertir esto en un sistema de producción?
Entonces, lo que les he mostrado en este artículo es lo básico de un sistema IDP automatizado. Mirando retrospectivamente el sistema IDP de la vida real que implementé, estos son los cambios que necesitaría para producirlo adecuadamente.
Maneje más tipos de documentos adjuntos, por ejemplo, MS Word, texto sin formato, PDF, imágenes y material escrito a mano. Maneje múltiples archivos adjuntos por correo electrónico. Codifique un HIL frontal para que los usuarios puedan verificar la PII devuelta de diferentes documentos para asegurarse de que coincidan. Haga que el front-end de HIL active automáticamente la siguiente etapa automatizada, por ejemplo, una función de paso separada que implemente… Enviar la PII a la base de datos del back-end para su búsqueda. Automatizar la producción de archivos PDF que contienen resultados de búsqueda en bases de datos. Proteger automáticamente con contraseña los archivos PDF que contienen los resultados de búsqueda de la base de datos. Automatizar el envío de los archivos PDF y el archivo de contraseña separado al solicitante. Asegurarse de que todo esté registrado
Tenga en cuenta que existe un costo asociado con la creación y el desarrollo del sistema que describí anteriormente, por lo que si sigue el proceso y crea recursos reales en AWS, tenga en cuenta esto y elimine todo lo que ya no necesite para evitar cargos sorpresa.
Resumen
Este artículo recorre el proceso de creación de un sistema de procesamiento inteligente de documentos simplificado en AWS. El sistema comienza con correos electrónicos con una etiqueta específica en Gmail, extrae imágenes adjuntas a Amazon S3, utiliza Amazon Textract para leer el texto y luego envía ese texto a Amazon Bedrock con Claude Sonnet para clasificar el documento y extraer PII clave como nombre, fecha de nacimiento y dirección. Este trabajo lo llevan a cabo funciones de AWS Lambda.
Las llamadas Lambda están orquestadas con una función de paso, programadas por EventBridge y protegidas con permisos de IAM y Secrets Manager. El resultado es un proceso práctico de AWS que demuestra cómo la entrada, clasificación y extracción de datos de documentos basados en correo electrónico se pueden automatizar sin dejar de tener en cuenta la producción en el diseño.
Cubrimos mucho terreno y probablemente diseñamos demasiado la solución basándonos en las imágenes de entrada "simplificadas" que intentábamos procesar. Para nuestros casos de prueba, probablemente podríamos haber omitido el paso de AWS Textract por completo y simplemente hacer que Bedrock clasificara y extrajera la información directamente de las imágenes.
Necesitaba el paso Textract en mi proyecto de trabajo porque la entrada con la que estaba tratando era más compleja, incluidos archivos PDF e imágenes de texto escrito a mano. Creo que valió la pena continuar con ese paso para demostrar que tienes opciones si tus aportaciones no son tan sencillas.
Finalmente, mencioné algunos pasos que necesitaría seguir para convertir el sistema que describí en un proceso adecuado y listo para producción.
Para ver todo el código y archivos auxiliares, consulte mi repositorio de GitHub en el siguiente enlace. Tenga en cuenta que he redactado ARN, nombres de depósitos, números de cuenta de AWS y cualquier otra cosa que pueda representar un riesgo para la privacidad o la seguridad.
https://github.com/taupirho/document-intake-aws-pipeline
PD: Estoy buscando trabajo por contrato en este momento. Si usted o alguien que conoce está buscando un ingeniero de datos con experiencia, ya sea remoto o con sede en Edimburgo, Reino Unido, con habilidades en AWS, AI, Python, SQL, PySpark, DuckDB, etc., hágamelo saber. Puedes encontrarme en LinkedIn.