Da qualche mese sto lavorando a Spectre, una libreria Elixir per costruire agenti che non si limitino a generare una risposta, ma che possano anche seguire regole, chiedere conferme ed eseguire azioni dentro un’applicazione.
Più la libreria cresceva, più mi accorgevo di un problema: è abbastanza facile far funzionare bene un agente quando sei tu a scrivere gli esempi con cui provarlo.
Nei test sai già più o meno cosa dirà l’utente. Puoi preparare frasi chiare, prevedere le intenzioni e verificare che venga scelta l’azione giusta. Nella realtà, invece, le persone scrivono messaggi incompleti, cambiano idea, rispondono soltanto “sì” oppure danno per scontate informazioni che il sistema non conosce.
Avevo quindi bisogno di usare Spectre dentro un progetto vero, con conversazioni che non potevo preparare in anticipo.
Per questo sto costruendo Freelance Fast.
Perché un sito per freelance
Una piattaforma per freelance mi è sembrata un buon modo per provare gli agenti perché contiene diversi problemi interessanti, ma il flusso generale rimane abbastanza semplice.
Da una parte c’è un cliente che ha bisogno di qualcuno per realizzare un progetto. Spesso non ha ancora una specifica completa: può avere soltanto un’idea, un problema da risolvere o qualche esempio di ciò che vorrebbe ottenere.
Dall’altra parte ci sono freelance che non vogliono passare la giornata a controllare nuove bacheche e leggere annunci che non hanno niente a che fare con il loro lavoro.
Non volevo costruire un altro marketplace pieno di pagine, filtri, profili pubblici e offerte al ribasso. Oltre a non piacermi molto come prodotto, una struttura del genere non mi avrebbe aiutato più di tanto a provare Spectre.
Ho quindi scelto un approccio basato principalmente sulla conversazione.
Il cliente scrive su WhatsApp o Telegram e racconta ciò che vuole realizzare. L’agente può chiedere i dettagli mancanti, aiutare a rendere la richiesta più chiara e infine preparare il progetto.
Prima di salvare dati personali deve ottenere il consenso dell’utente, mentre prima di inviare il progetto ai freelance è prevista un’approvazione manuale da parte dell’amministratore.
Il freelance, invece, entra tramite GitHub. Il sistema può analizzare i repository, i linguaggi e le librerie utilizzate per preparare un profilo tecnico. In seguito il freelance sceglie quali tipi di progetto vuole ricevere, il budget minimo, la disponibilità e il canale preferito.
Quando arriva un nuovo progetto, non viene mandato a tutti. Il sistema prova a trovare i profili compatibili e avvisa soltanto quelli che sembrano adatti.
Il progetto rimane aperto per alcuni giorni, i freelance interessati possono inviare una proposta e alla fine il cliente sceglie con chi parlare. L’agente può riordinare e riassumere le candidature, ma non prende la decisione al posto del cliente.
Cosa sto provando con Spectre
Dentro Freelance Fast ci sono due agenti principali: uno per il cliente e uno per il freelance. Hanno regole e azioni diverse, anche se condividono gran parte dell’infrastruttura.
L’agente del cliente deve, per esempio, distinguere tra una semplice domanda sul servizio e la volontà reale di creare un progetto. Deve anche capire quando l’utente vuole vedere i propri progetti, modificarne uno o chiuderlo.
L’agente del freelance deve invece riconoscere richieste come vedere le opportunità disponibili, candidarsi, aggiungere una proposta o ritirare una candidatura.
Queste operazioni sembrano semplici finché non arrivano messaggi come:
“Sì, va bene.”
Oppure:
“Chiudiamo.”
Nel primo caso bisogna capire a quale domanda sta rispondendo l’utente. Nel secondo bisogna distinguere tra chiudere un progetto e chiudere semplicemente la conversazione.
Spectre mi permette di combinare classificatori, embedding, cache semantica e modelli linguistici per provare a riconoscere l’intenzione. Quando il sistema non è abbastanza sicuro, può chiedere una precisazione invece di eseguire subito qualcosa.
Per le azioni uso anche Spectre Kinetic. L’agente può proporre un’operazione, ma è poi il codice dell’applicazione a controllare i parametri e a decidere se può essere eseguita.
Le regole importanti non vengono lasciate soltanto dentro il prompt. Per esempio, un cliente può avere un solo progetto attivo, un freelance senza abbonamento non può candidarsi e un contatto non può essere condiviso prima che il cliente abbia scelto una persona.
Sto provando anche il sistema di policy di Spectre. Alcune azioni, come accettare i termini o eliminare un account, richiedono una conferma esplicita. Se l’utente rifiuta, l’azione deve fermarsi senza cercare di reinterpretare la risposta.
Infine c’è il journal. Voglio poter vedere non soltanto il messaggio ricevuto e la risposta inviata, ma anche come l’agente ha interpretato quel messaggio, quale percorso ha scelto e quale azione ha tentato di eseguire.
Questo mi serve soprattutto quando qualcosa non funziona. Senza una traccia del ragionamento applicativo, è difficile capire se il problema si trova nel modello, nel classificatore, nella policy oppure nel codice che esegue l’azione.
Ho dovuto costruire anche WhatsApp e Telegram
Quando ho deciso che Freelance Fast avrebbe funzionato principalmente tramite chat, pensavo che la parte WhatsApp e Telegram sarebbe stata una normale integrazione.
Alla fine ho creato due librerie separate: ex_wapp per WhatsApp ed ex_gram per Telegram.
Mi serviva un livello di controllo che non trovavo nelle soluzioni già disponibili per Elixir. Volevo poter gestire le sessioni, collegare un account tramite QR, ricevere messaggi, controllare lo stato della connessione e inviare risposte usando un’interfaccia abbastanza simile per entrambi i canali.
Questa parte ha richiesto più lavoro di quanto avessi previsto.
Una connessione può cadere. Una sessione deve poter essere ripristinata dopo un riavvio. Un messaggio può risultare inviato dal processo ma non ancora consegnato dal servizio. Bisogna distinguere utenti, gruppi, numeri di telefono e identificatori diversi tra WhatsApp e Telegram.
Ho finito per lavorare su riconnessioni, conferme di consegna, salvataggio delle sessioni e ripristino dei dati. Sono dettagli poco visibili quando tutto funziona, ma diventano immediatamente importanti quando l’agente deve essere raggiungibile ogni giorno.
Le due librerie non sono nate come prodotti separati da Freelance Fast. Sono nate perché il progetto ne aveva bisogno. Ora, però, posso riutilizzarle anche in altre applicazioni senza riscrivere ogni volta tutta la parte di comunicazione.
Quello che voglio capire
Freelance Fast è ancora un progetto in corso. Non lo considero una dimostrazione definitiva di Spectre e non so ancora quanto bene funzionerà il modello di piattaforma che ho scelto.
È proprio questo il motivo per cui mi interessa.
Voglio vedere cosa succede quando le persone iniziano a scrivere messaggi che non avevo previsto. Voglio capire se l’agente fa troppe domande, se prende decisioni troppo presto, se riesce a recuperare dopo un errore e se le regole che ho inserito sono sufficientemente chiare.
Ogni conversazione interpretata male può mostrarmi un problema concreto della libreria. Magari manca una policy, la memoria conserva l’informazione sbagliata oppure due intenzioni sono troppo simili per il classificatore.
Anche la parte di consegna può essere provata soltanto utilizzandola davvero. Non basta sapere che una funzione restituisce {:ok, message}. Bisogna capire cosa succede se il dispositivo si disconnette subito dopo, se il processo viene riavviato oppure se la stessa azione viene tentata due volte.
Per ora il mio obiettivo non è rendere Freelance Fast un enorme marketplace. Mi interessa costruire un flusso piccolo, comprensibile e realmente utilizzabile.
Se riuscirà ad aiutare clienti e freelance a incontrarsi, sarà già un buon risultato. Allo stesso tempo mi darà un posto concreto in cui continuare a migliorare Spectre, Spectre Kinetic, ex_wapp ed ex_gram.
Probabilmente alcune idee cambieranno dopo le prime conversazioni reali. Preferisco scoprirlo attraverso un progetto utilizzabile piuttosto che continuare a perfezionare la libreria soltanto attraverso esempi costruiti da me.
Send via.chat
Receive form leads, send login codes, and route important alerts through WhatsApp or Telegram.