Introduzione: da prototipo a produzione con agenti IA
Le squadre Java hanno già a disposizione strumenti per il build, l’integrazione continua (CI), la consegna continua (CD) e modelli operativi consolidati. Tuttavia, portare gli agenti IA dal laboratorio alla produzione resta complesso: i framework di agenti non risolvono automaticamente problemi di scalabilità, governance, sicurezza e operatività.
Amazon Bedrock e Spring AI colmano queste lacune. Insieme, consentono di creare agenti autonomi che pianificano, invocano tool e API, e mantengono il contesto in conversazioni a più turni. L’agentic AI sta evolvendo da semplici interazioni prompt‑risposta verso sistemi autonomi capaci di eseguire compiti multi‑step complessi.
Spring AI: IA sul JVM con i pattern di Spring
Spring AI porta le capacità di IA sulla JVM sfruttando gli idiomi familiari di Spring: auto‑configurazione, iniezione delle dipendenze e advisor componibili. Gli sviluppatori possono costruire agenti IA con le stesse convenzioni usate per REST, sicurezza e accesso ai dati.
Amazon Bedrock AgentCore è una piattaforma indipendente da framework e modelli, pensata per costruire, connettere e ottimizzare agenti su larga scala. Con AgentCore è possibile:
- Portare il proprio framework di agente e modello di fondazione (FM) preferito;
- Accedere a runtime gestito, memoria, automazione del browser, esecuzione di codice e gestione delle identità.
Due esempi pratici
Il tutorial illustra due sistemi:
- Assistente di viaggio: agente singolo che dimostra chiamata di tool (previsioni meteo, ricerca itinerari), streaming delle risposte, memoria della conversazione e pattern di resilienza.
- Sistema IDP multi‑agente: piattaforma di elaborazione intelligente dei documenti con cinque agenti specialisti (avvocato, mutuo, assicurazione, fiscale, generale), motore di regole, alerting e osservabilità.
Prerequisiti tecnici
- Java JDK 21 (obbligatorio)
- Spring Boot 4.1 con Spring AI 2.0 e spring‑ai‑agentcore 2.0
- Maven 3.9+
- Node.js 18+ (frontend React)
- Terraform 1.5+
- Docker con Buildx per build multi‑architettura
- AWS CLI v2 configurato con credenziali
- Un account AWS
Cosa rende un sistema un “agente”
Una chiamata di chat completion genera solo testo; non può decidere il passo successivo, interagire con sistemi esterni o ricordare eventi passati. Un agente combina tre capacità fondamentali:
- Pianificazione: a partire da un obiettivo, il modello scompone il compito in step, li priorizza e li adatta al nuovo contesto.
- Uso di tool: il modello può selezionare e invocare funzioni esterne (API, database, interpreti di codice) per agire nel mondo reale.
- Memoria: il contesto persiste tra i turni (memoria a breve termine) e tra le sessioni (memoria a lungo termine).
Un’applicazione RAG (Retrieval‑Augmented Generation) utilizza solo il recupero, ma manca del loop di pianificazione. Un agente possiede tutti e tre gli elementi, operando in un ciclo orientato al goal fino al completamento o al riconoscimento dell’impossibilità di proseguire.
Architettura di riferimento agente
Il diagramma (Figura 1) mostra una pipeline a 11 stadi: dal gateway di runtime (autenticazione, rate‑limiting) ai guardrail di input, classificazione, agente specialista, tool, modello di fondazione, memoria, motore di regole, revisione umana, fino alla risposta finale. Resilienza, osservabilità, logging e IAM a minimo privilegio permeano tutti gli stadi.
Panoramica della soluzione
Entrambi i sistemi condividono gli stessi pattern architetturali:
- Applicazione Spring Boot con
ChatClientdi Spring AI, integrazionespring‑ai‑agentcoree APIConversedi Amazon Bedrock. - Runtime AgentCore con contratti
POST /invocationseGET /pingper il deployment gestito. - Memoria gestita da AgentCore (contesto a breve e lungo termine).
- Chiamata di tool mediante metodi annotati
@Tool. - Output strutturato mappato a record Java.
- Immagine container ARM64 ottimizzata per AWS Graviton.
- Terraform modulare per il provisioning dell’infrastruttura.
Assistente di viaggio: flusso operativo
L’assistente è una singola applicazione Spring Boot con due punti di ingresso: /invocations e /ping, richiesti da AgentCore. Spring AI orchestra le chiamate a Bedrock tramite l’API Converse, risolve localmente le invocazioni dei tool e trasmette i token al client mediante Server‑Sent Events (SSE). La memoria di AgentCore fornisce sia il contesto della sessione corrente sia quello storico, eliminando la necessità di gestire stato esterno.
Sistema IDP multi‑agente: architettura dettagliata
Il flusso IDP (Figura 3) prevede:
- Un
ClassifierAgentche legge ogni documento e lo indirizza all’agente specialista appropriato (Lawyer, Mortgage, Insurance, Tax, General). - Ogni agente specialista estende
AbstractDocumentAgente utilizza l’API Converse multimodale di Bedrock per estrarre JSON strutturato con punteggi di confidenza. - Un motore di regole valuta espressioni SpEL definite in
application.ymlcontro le estrazioni. - In base alla gravità (
ALERToBLOCK), ilAlertServiceinvia notifiche o blocca il documento per revisione umana. - Documenti a bassa confidenza sono instradati a una coda di revisione manuale.
- Metriche, audit trail, resilienza e osservabilità sono applicati a tutti gli stadi.
Pattern di collaborazione tra agenti
Quando più agenti interagiscono, la loro coordinazione determina il comportamento complessivo. La soluzione adotta tre pattern:
- Router: invia ogni richiesta a un singolo agente specialistico in base al tipo di documento.
- Evaluator: passa i risultati dello specialista al motore di regole, applica livelli di severità e genera alert o blocchi per la revisione.
- Parallel fan‑out: invia la stessa richiesta a più specialisti contemporaneamente, aggrega i risultati e poi li sottopone al motore di regole.
Il diagramma (Figura 4) confronta visivamente questi tre pattern, evidenziando i punti di ingresso, le vie di flusso e i punti di aggregazione.
Implementazione pratica: passi chiave
Per realizzare gli esempi sopra, è necessario:
- Creare un progetto Maven con dipendenze
spring-boot-starter,spring-aiespring-ai-agentcore. - Definire le classi Java che rappresentano gli agenti, annotando i metodi di tool con
@Tool(es.getWeather(String city)). - Configurare il
ChatClientper puntare all’endpointConversedi Bedrock, specificando il modello di fondazione desiderato. - Implementare la memoria tramite
AgentCoreMemory, scegliendo tra memorie volatile (sessione) o persistente (DynamoDB, S3). - Scrivere file
application.ymlcon le regole SpEL per il motore di regole (es.confidence < 0.7 ? BLOCK : ALERT). - Costruire l’immagine Docker ARM64 con
docker buildxe pubblicarla su Amazon ECR. - Utilizzare Terraform per creare:
- VPC, subnet e security group;
- Cluster ECS/Fargate per il runtime;
- IAM role con policy least‑privilege per l’accesso a Bedrock, S3 e DynamoDB.
- Distribuire l’applicazione su ECS/Fargate, abilitare il bilanciatore di carico e configurare l’autoscaling basato su metriche di CPU e latenza.
- Attivare CloudWatch Logs, Traces e Metrics per osservabilità completa.
Best practice per produzione
- Sicurezza: utilizzare IAM role dedicati per ogni micro‑servizio, limitare l’accesso alle chiavi Bedrock e cifrare i dati a riposo.
- Governance: definire policy di guardrail a livello di modello (es. blocco di contenuti sensibili) e a livello di tool (validazione dei parametri).
- Resilienza: implementare circuit breaker e retry con Spring Retry; configurare timeout per le chiamate a Bedrock.
- Osservabilità: sfruttare OpenTelemetry per tracce distribuite, aggiungere metriche personalizzate per il tasso di errori dei tool e il tempo medio di pianificazione.
- Scalabilità: sfruttare il runtime gestito di AgentCore, che fornisce scaling automatico dei container e gestione della memoria.
Conclusioni
Grazie a Spring AI e Amazon Bedrock AgentCore, le organizzazioni Java possono trasformare rapidamente prototipi di agenti IA in soluzioni operative, mantenendo coerenza con le pratiche di CI/CD, governance e sicurezza già consolidate. L’assistente di viaggio offre un punto di ingresso semplice per sperimentare tool calling e memoria, mentre il sistema IDP multi‑agente dimostra come orchestrare più specialisti, regole complesse e alerting in un contesto enterprise. Seguendo i pattern descritti, è possibile costruire agenti autonomi, scalabili e osservabili, pronti a supportare casi d’uso aziendali sempre più sofisticati.
