La IA no viene a quitarte el trabajo: viene a quitarte el papeleo.
Doc Validator AI es una aplicación de validación documental asistida por inteligencia artificial. El proyecto nace de una idea sencilla: muchas tareas administrativas no son complejas por sí mismas, pero se vuelven costosas cuando hay que repetirlas una y otra vez sobre decenas, cientos o miles de expedientes.
La solución aplica document intelligence, IA generativa, procesamiento asíncrono y arquitectura cloud sobre AWS para convertir documentos dispersos en información estructurada, trazable y útil para la revisión profesional.
No se plantea como un chatbot, sino como una solución de negocio orientada a reducir trabajo manual repetitivo en procesos de validación documental.
En muchos procesos administrativos, una parte importante del trabajo consiste en comprobar que todo está en orden:
- Revisar documentos recibidos.
- Comprobar que no falta información.
- Localizar datos relevantes.
- Detectar incoherencias.
- Validar si un expediente puede avanzar.
- Mantener trazabilidad del estado de revisión.
Visto de forma aislada, cada revisión puede parecer sencilla. El problema aparece cuando ese proceso se repite expediente tras expediente.
Ahí aparece la fricción operativa:
- Pérdida de tiempo administrativo.
- Documentos faltantes detectados tarde.
- Errores que pueden pasar desapercibidos.
- Revisiones duplicadas.
- Baja trazabilidad.
- Dificultad para conocer el estado real de cada expediente.
La IA no elimina la revisión. La ordena.
El objetivo del proyecto no es que la IA tome la decisión final, sino que prepare el terreno para que una persona pueda revisar mejor.
En lugar de enfrentarse a una carpeta desordenada de documentos, el profesional puede trabajar sobre una primera lectura estructurada:
- Qué documentos se han recibido.
- Qué información se ha extraído.
- Qué posibles incoherencias existen.
- Qué advertencias se han generado.
- Qué expediente requiere atención prioritaria.
La IA actúa como una capa de asistencia, no como una fuente infalible de verdad.
Doc Validator convierte este flujo:
documentos dispersos
↓
revisión manual repetitiva
↓
detección tardía de errores
↓
decisión con poca trazabilidad
en este otro:
documentos recibidos
↓
extracción documental
↓
interpretación con IA generativa
↓
resultados estructurados
↓
revisión profesional
La clave está en separar dos responsabilidades:
Textract convierte el documento en contenido.
Bedrock convierte el contenido en contexto.
El primer caso de uso se centra en la validación documental de expedientes, como podría ocurrir en procesos administrativos, inmobiliarios, financieros o internos de una organización.
Un usuario puede:
- Crear un expediente.
- Subir documentos asociados.
- Consultar el estado del procesamiento.
- Revisar resultados, advertencias e incidencias.
- Tomar una decisión final con más contexto.
El sistema procesa documentos como PDFs, imágenes, formularios o documentación semiestructurada.
Desde un punto de vista funcional, la solución se organiza como una cadena de responsabilidades:
Interfaz de usuario
↓
Backend / orquestación
↓
Almacenamiento seguro
↓
Procesamiento asíncrono
↓
Extracción documental
↓
IA generativa
↓
Datos y resultados
↓
Revisión profesional
Cada pieza cumple una función concreta:
| Capa | Responsabilidad |
|---|---|
| Interfaz de usuario | Crear expedientes, subir documentos y consultar resultados |
| Backend | Validar peticiones, registrar documentos y orquestar el flujo |
| Almacenamiento | Conservar documentos originales |
| Mensajería | Desacoplar la subida del procesamiento |
| Procesamiento | Ejecutar el análisis documental en segundo plano |
| Extracción documental | Obtener texto y estructura del documento |
| IA generativa | Clasificar, normalizar y generar advertencias |
| Persistencia | Guardar estados, resultados e incidencias |
| Revisión profesional | Validar resultados y tomar la decisión final |
La arquitectura cloud permite llevar el flujo funcional a un entorno real: seguro, escalable y mantenible.
La solución utiliza:
- React + Nginx para el frontend.
- FastAPI para el backend.
- Amazon EKS para ejecutar frontend y backend en Kubernetes gestionado.
- Application Load Balancer e Ingress para exponer la aplicación.
- Amazon S3 para almacenar documentos originales.
- Amazon RDS PostgreSQL para guardar expedientes, documentos, jobs y resultados.
- Amazon SQS para desacoplar la subida del procesamiento.
- AWS Lambda como worker asíncrono de documentos.
- Amazon Textract para OCR y extracción documental.
- Amazon Bedrock para clasificación, normalización y extracción semántica.
- Amazon ECR para almacenar imágenes Docker.
- Terraform para aprovisionar infraestructura.
- IRSA para evitar credenciales AWS estáticas dentro de EKS.
- CloudWatch para logs y trazabilidad.
Cuando un usuario sube un documento, el backend no intenta procesarlo todo en la misma petición.
El flujo es:
- El frontend envía el documento al backend.
- El backend guarda el documento original en S3.
- El backend registra el documento en PostgreSQL.
- El backend crea un job de procesamiento.
- El backend publica un evento en SQS.
- Lambda consume el evento.
- Lambda recupera el documento desde S3.
- Lambda usa Textract para extraer texto y estructura.
- Lambda usa Bedrock para interpretar y normalizar el contenido.
- Lambda guarda resultados, advertencias e incidencias en PostgreSQL.
- El frontend consulta el estado y muestra los resultados al usuario.
Frontend
↓
Backend FastAPI
↓
S3 + RDS + SQS
↓
Lambda
↓
Textract
↓
Bedrock
↓
RDS
↓
Frontend
Este diseño permite que el procesamiento sea:
- Asíncrono.
- Trazable.
- Escalable.
- Tolerante a errores.
- Más cómodo para el usuario.
El procesamiento documental puede tardar varios segundos o más, dependiendo del tamaño y tipo de documento.
Por eso, el backend no bloquea la petición del usuario. Solo registra el trabajo y lo delega.
Backend → SQS → Lambda → Textract / Bedrock → RDS
SQS permite desacoplar la experiencia de usuario del trabajo pesado.
Lambda permite ejecutar el procesamiento bajo demanda.
Textract se encarga de la extracción documental.
Su papel es obtener texto y estructura a partir de documentos que pueden venir en distintos formatos:
- PDFs.
- Imágenes.
- Formularios.
- Documentos escaneados.
- Documentos semiestructurados.
Textract responde a una pregunta técnica:
¿Qué texto y estructura hay en este documento?
Bedrock actúa como capa de inteligencia generativa.
A partir del contenido extraído, ayuda a:
- Clasificar el tipo de documento.
- Extraer campos relevantes.
- Normalizar información.
- Detectar posibles incoherencias.
- Generar advertencias revisables.
Bedrock responde a preguntas más cercanas al proceso de negocio:
¿Qué tipo de documento es?
¿Qué datos relevantes contiene?
¿Falta algo?
¿Hay alguna incoherencia?
¿Qué debería revisar una persona?
La IA no decide por el profesional.
Prepara el expediente para que pueda revisarlo mejor.
El backend necesita permisos para operar con servicios AWS como S3 y SQS.
En lugar de usar credenciales estáticas, el proyecto utiliza IRSA.
IRSA permite asociar un ServiceAccount de Kubernetes con un rol IAM de AWS.
Pod backend
↓
ServiceAccount backend
↓
IAM Role asociado
↓
Permisos S3 + SQS
Esto permite que el backend obtenga credenciales temporales gestionadas por AWS.
Ventajas:
- No hay claves AWS estáticas en Kubernetes.
- Los permisos están limitados al backend.
- Se aplica el principio de mínimo privilegio.
- Las credenciales son temporales.
El modelo de datos se centra en expedientes, documentos y procesamiento.
Entidades principales:
| Entidad | Descripción |
|---|---|
expedients |
Expediente documental |
documents |
Documento subido al expediente |
processing_jobs |
Trabajo de procesamiento asociado a un documento |
document_extractions |
Resultado bruto de Textract |
document_normalizations |
Resultado normalizado por Bedrock |
validation_issues |
Incidencias detectadas |
validation_checks |
Checks de validación |
doc_validator/
├── backend/
│ ├── app/
│ │ ├── api/
│ │ ├── core/
│ │ ├── db/
│ │ ├── lambdas/
│ │ ├── models/
│ │ ├── schemas/
│ │ ├── services/
│ │ └── main.py
│ ├── Dockerfile
│ ├── Dockerfile.lambda
│ └── requirements.txt
│
├── frontend/
│ ├── public/
│ ├── src/
│ ├── Dockerfile
│ ├── nginx.conf
│ ├── package.json
│ └── vite.config.ts
│
├── infra/
│ ├── k8s-eks/
│ └── terraform/
│ └── aws/
│
├── Makefile
├── README.md
└── .gitignore
- Python
- FastAPI
- SQLAlchemy
- Pydantic
- PostgreSQL
- boto3
- Uvicorn
- React
- TypeScript
- Vite
- Nginx
- Amazon Textract
- Amazon Bedrock
- AWS Lambda
- Amazon SQS
- Amazon EKS
- Amazon ECR
- Amazon RDS PostgreSQL
- Amazon S3
- Application Load Balancer
- AWS Load Balancer Controller
- Terraform
- Kubernetes
- Makefile
- IAM
- IRSA
- OIDC provider de EKS
- Security Groups
- VPC Endpoints
- CloudWatch
El backend expone la API principal del sistema.
Responsabilidades:
- Crear expedientes.
- Recibir documentos.
- Subir documentos a S3.
- Registrar documentos en PostgreSQL.
- Crear jobs de procesamiento.
- Publicar eventos en SQS.
- Consultar resultados de extracción, normalización y validación.
Capas principales:
| Capa | Responsabilidad |
|---|---|
api |
Rutas y endpoints |
schemas |
Validación y serialización |
models |
Modelos ORM |
services |
Lógica de negocio e integración con AWS |
db |
Conexión y sesiones de base de datos |
core |
Configuración centralizada |
lambdas |
Handlers serverless |
El frontend está desarrollado con React y TypeScript.
En cloud se compila y se sirve con Nginx dentro de EKS.
El acceso externo se produce mediante ALB e Ingress:
| Ruta | Servicio |
|---|---|
/ |
Frontend React |
/api |
Backend FastAPI |
Esto permite que el frontend use rutas relativas hacia la API:
/api
GET /api/healthPOST /api/expedientsEjemplo:
{
"candidate_name": "Juan Pérez"
}GET /api/expedientsGET /api/expedients/{expedient_id}POST /api/expedients/{expedient_id}/documentsGET /api/expedients/{expedient_id}/documentsGET /api/documents/{document_id}/extractionGET /api/documents/{document_id}/normalizedGET /api/expedients/{expedient_id}/validation-summaryPOST /api/expedients/{expedient_id}/revalidateTerraform gestiona la infraestructura principal en AWS:
- Bucket S3 para documentos.
- Cola SQS y DLQ.
- RDS PostgreSQL.
- Repositorios ECR.
- Función Lambda.
- Clúster EKS.
- Node group de EKS.
- IAM roles y policies.
- OIDC provider para IRSA.
- AWS Load Balancer Controller.
- VPC Endpoints.
- Security Groups.
terraform -chdir=infra/terraform/aws outputOutputs concretos:
terraform -chdir=infra/terraform/aws output -raw backend_ecr_repository_url
terraform -chdir=infra/terraform/aws output -raw frontend_ecr_repository_url
terraform -chdir=infra/terraform/aws output -raw document_processor_lambda_name
terraform -chdir=infra/terraform/aws output -raw eks_cluster_name
terraform -chdir=infra/terraform/aws output -raw backend_iam_role_arnEl flujo principal se ejecuta con:
make upEste comando encadena:
tf-init
↓
deploy-lambda
↓
deploy-eks
↓
show-outputs
Para eliminar el entorno:
make downEl Makefile centraliza operaciones habituales.
Comandos útiles:
make tf-plan
make tf-apply
make tf-destroy
make outputsmake deploy-backend
make deploy-frontend
make deploy-eks-imagesmake eks-status
make eks-ingress
make eks-alb-urlmake logs-backend
make logs-frontend
make logs-lambdaEl proyecto separa configuración no sensible, secretos y valores generados dinámicamente.
Contiene configuración no sensible:
APP_ENV=cloud
EVENT_SOURCE=doc-validator-backend
AWS_REGION=eu-west-1
BEDROCK_MODEL_ID=eu.amazon.nova-lite-v1:0
BEDROCK_TEMPERATURE=0
BEDROCK_MAX_TOKENS=1200
SQS_WAIT_TIME_SECONDS=10
SQS_MAX_NUMBER_OF_MESSAGES=1
SQS_VISIBILITY_TIMEOUT_SECONDS=300No contiene credenciales AWS para el backend en EKS.
El backend obtiene permisos mediante IRSA.
Actualmente contiene principalmente:
DATABASE_URL
| Fichero | Motivo |
|---|---|
.env.local |
Configuración específica del entorno |
.env.secret |
Secretos locales si fueran necesarios |
infra/terraform/aws/terraform.tfvars |
Variables reales de Terraform |
infra/terraform/aws/terraform.tfstate |
Estado de Terraform |
infra/terraform/aws/.terraform/ |
Providers y metadatos locales |
Ver pods:
kubectl get pods -n doc-validatorVer servicios:
kubectl get svc -n doc-validatorVer Ingress / ALB:
make eks-ingress
make eks-alb-urlVer logs:
make logs-backend
make logs-frontend
make logs-lambdaComprobar ServiceAccount del backend:
kubectl describe serviceaccount backend -n doc-validatorComprobar que el pod usa IRSA:
kubectl exec -n doc-validator deployment/backend -- env | grep AWSDoc Validator muestra una forma práctica de aplicar inteligencia artificial generativa a un proceso real.
La IA no sustituye al profesional.
Le evita empezar desde cero.
La arquitectura cloud sostiene el flujo. Textract extrae el contenido. Bedrock interpreta la información. Y la persona mantiene el control final sobre la revisión y la decisión.
El objetivo no es automatizar por automatizar, sino reducir ruido, ordenar información dispersa y permitir que los profesionales dediquen más tiempo a lo que realmente requiere criterio.