am. Andrea Migliavacca

Inbox Triage / take-home AI engineering

Smistamento automatico di una casella condivisa.

Ho realizzato un servizio che, nei casi con confidenza sufficiente, classifica le email, seleziona le azioni e prepara le risposte automaticamente. Sotto la soglia chiede una decisione a una persona. Invii e scritture nei sistemi esterni richiedono una conferma.

Il progetto parte dall'esercizio pubblico di Go Fig AI, che fornisce otto email e un'API cliente simulata.

La demo riproduce risposte registrate dal servizio in esecuzione; il modello non gira nel browser.

Servizio
FastAPI · Docker
Decisione
OpenDecider-nano
Tracce e flusso
LangSmith · LangGraph
Verifica
55 test in CI

Dall'email all'azione

Una casella info@ riceve richieste di fatturazione, bug, contatti commerciali e spam. Se la classificazione supera la soglia, il servizio sceglie le azioni da una tabella e prepara le eventuali risposte. I casi incerti o sospetti restano da classificare o verificare.

Percorso di un'email: modello decisionale, azioni proposte, bozza, approvazione umana e scrittura. I casi incerti restano da rivedere.
  1. Email in arrivoIl modello restituisce quattro probabilità e controlla le istruzioni rivolte al sistema.
  2. Smistamento automaticoCon confidenza sufficiente, il servizio seleziona le azioni; i casi incerti passano a una persona.
  3. Bozza e confermaLe risposte sono preparate automaticamente; una persona può approvare, modificare o rifiutare ogni azione.
  4. Scrittura e tracciaIl permesso di scrittura arriva solo dopo l'approvazione; LangSmith registra il percorso.
Classificazione e preparazione sono automatiche; la scrittura parte dopo conferma. Apri lo schema completo.

Classificazione e bozze

OpenDecider-nano sceglie fra quattro categorie e restituisce una probabilità per ciascuna. Da 0,90 in su il servizio prepara le azioni previste; sotto soglia chiede a una persona di classificare l'email. Una seconda domanda rileva eventuali istruzioni rivolte al sistema.

Il modello generativo prepara le bozze di risposta senza accedere ai sistemi esterni. Il testo può essere corretto prima dell'invio.

Nel laboratorio, un'email con probabilità 0,80 sotto la soglia 0,90 resta incerta e senza azioni proposte.
Una richiesta ambigua resta senza azioni quando il modello non supera la soglia. Apri la schermata.

Dalla proposta all'esecuzione

Risposta, record CRM e avviso tecnico richiedono un verdetto separato. Il codice che legge e classifica possiede solo il permesso di lettura; il client con permesso di scrittura viene creato nel passo di esecuzione, dopo l'approvazione. Un registro evita invii duplicati.

Un lead classificato dal modello con risposta e record CRM proposti, ciascuno in attesa di approvazione.
Il lead produce due azioni distinte, risposta e CRM: nessuna parte senza approvazione. Apri la schermata.

Tracce ed esperimenti

LangSmith raccoglie decisione, bozza e verdetto umano nella traccia della stessa email. Ho valutato il decisore come esperimento su dataset con esiti attesi e un controllo per gli errori che propongono azioni su email da trattenere.

Ho implementato anche il percorso come grafo LangGraph: Studio mostra dove il flusso si ferma per l'approvazione e da quale stato riprende.

Esperimento LangSmith con otto email, esiti attesi, esiti del modello e due punteggi per ciascun caso.
L'esperimento permette di esaminare ogni email oltre al punteggio aggregato. Apri la schermata.
Grafo LangGraph in Studio fermo al nodo di approvazione, con proposta e stato del flusso visibili.
La pausa nel nodo di approvazione è visibile in LangGraph Studio. Apri la schermata.

Test e risultati

GitHub Actions esegue 55 test a ogni push: nessuna scrittura senza approvazione, nessun permesso anticipato, nessun doppio invio e un esito definito per i guasti. In una branch di prova ho rimosso il controllo dell'approvazione: un test è fallito, come previsto.

In una sola esecuzione, tutte le 8 email dell'esercizio hanno prodotto l'esito atteso. Dodici email aggiuntive hanno rivelato falsi allarmi e attacchi non riconosciuti: per questo un messaggio segnalato non viene scartato e la sicurezza non dipende dal solo rilevatore di iniezioni.

Queste prove mostrano il percorso e i suoi confini; venti email, valutate una volta ciascuna, non misurano l'accuratezza su una casella reale. Anche posta, CRM e Slack del cliente sono simulati.

GitHub Actions: suite verde sul ramo principale e un'esecuzione rossa sul ramo di prova dopo la rimozione del controllo di approvazione.
La suite resta verde sul ramo principale e segnala la regressione introdotta nella prova. Apri la schermata.

Demo e codice

La demo pubblica fa provare la pagina di decisione e approvazione con risposte registrate. Per avviare il servizio completo, il repository contiene i due container, i test e le decisioni di progetto.