Passa al contenuto principale

Introduzione

Il Tree Agent è una libreria Python progettata per la realizzazione di agenti AI complessi. A differenza delle librerie tradizionali, non è pensata per essere utilizzata direttamente tramite un IDE: l'interfaccia primaria di sviluppo è il Designer, uno strumento visuale integrato in CAITY Studio, sviluppato da AIDAPT appositamente per questo scopo.

Rispetto ad altre soluzioni simili, il Tree Agent non si pone come obiettivo quello di rendere la creazione di agenti accessibile a utenti non tecnici eliminando il codice. Al contrario, il target è lo sviluppatore: il codice rimane centrale perché è il mezzo più veloce e flessibile per implementare logiche custom. Il Designer ha lo scopo di semplificare la gestione della complessità strutturale che emerge nei progetti reali, non di nasconderla.

Come molte soluzioni moderne, anche il Tree Agent adotta un grafo di esecuzione: ogni nodo rappresenta un'unità di elaborazione e il flusso si sposta tra nodi in base all'esito delle callback. La struttura di questo grafo è però organizzata come un albero: questa struttura non descrive il flusso di esecuzione, ma definisce le relazioni di parentela tra nodi e governa i meccanismi di navigazione automatica dell'agente. I dettagli di questi meccanismi sono trattati nelle sezioni successive.

In generale, per ottenere agenti in grado di compiere task personalizzati si può ricorrere a due tecniche principali:

  1. Fine-tuning: tramite un allenamento extra si aggiungono dei layer alla rete neurale del LLM per modificare il suo comportamento;
  2. Prompt engineering: tramite un prompt con una struttura opportuna e con le giuste istruzioni si guida un modello generico ad eseguire operazioni specifiche.

Il Tree Agent segue la seconda strada.

Idea base

Generalmente un sistema RAG si compone di un vector store che raccoglie una collezione di chunk associati ciascuno al suo embedding. Ogni volta che si esegue una query, viene prima calcolato l'embedding, e poi vengono recuperati i chunk con gli embedding più simili a quello della query. I chunk trovati vengono quindi aggiunti al prompt per dare il contesto utile a produrre risposte precise e puntuali.

informazioni

Un chunk è un pezzo di informazione abbastanza piccolo da poter essere caricato su un singolo prompt di un LLM. Per funzionare in maniera ottimale, il contenuto di un chunk dovrebbe essere il più possibile circoscritto.

informazioni

Un embedding è un vettore di lunghezza variabile in base al modello embedder impiegato (generalmente tra 256 e 3072 elementi). Questo vettore può essere immaginato come un riassunto del contenuto del chunk. Gli embedder sono studiati per fare in modo che tanto più sono correlati due chunk, tanto più sono simili i loro embedding.

Nel Tree Agent, questo flusso viene incluso, ma anche esteso attraverso nuove logiche. Nello specifico viene definito un grafo ad albero, in cui alcuni nodi specifici (spesso i nodi foglia) includono un vector store distinto. In generale, ogni volta che si svolge una nuova interazione, a partire dall'ultimo nodo eseguito durante l'interazione precedente, si scende in direzione del nodo più promettente. Durante il percorso che separa i due estremi, ciascun nodo può contribuire a deviare o interrompere il flusso.

informazioni

Ogni nodo racchiude al suo interno un insieme di proprietà e di callback che dipendono dalla sua tipologia.

Architettura generale dell'albero

Funzionalità principali

Alcune delle caratteristiche distintive del Tree Agent rispetto ad altre soluzioni progettate per la realizzazione di agenti AI sono:

  • coding: dentro ogni nodo che si aggiunge al flusso dell'agente è possibile sviluppare apposite funzioni Python che consentono un controllo molto più fine di quello offerto da soluzioni completamente no code;
  • modulare: il grafo del Tree Agent può includere componenti: nodi al cui interno sono contenuti altri nodi. Grazie a questa struttura è possibile astrarre e realizzare e mantenere con maggiore semplicità progetti complessi;
  • multi agente: è possibile suddividere i nodi tra più agenti interconnessi tra loro. Grazie a questa funzionalità è possibile ottenere dei comportamenti ancora più avanzati e flessibili pronti per essere adattati a qualsiasi esigenza;
  • persistente: oltre allo storico della chat, il tree-agent dispone di una memoria strutturata a cui ciascun nodo può leggere e scrivere informazioni utili;
  • interconnesso: il comportamento del Tree Agent può essere adattato anche a seguito del rilascio tramite diversi canali:
    • dynamics: tramite il Designer, per ciascun campo supportato di un nodo è disponibile un toggle che consente di esporlo al cliente finale. Una volta abilitato, il progettista assegna un nome alla proprietà; il cliente potrà poi configurarla in autonomia tramite una semplice form nell'applicativo associato. Questo meccanismo è utile per rendere configurabili parametri come il modello LLM, i prompt e le soglie di similarità senza dover intervenire sulla progettazione;
    • metadati: oltre al contenuto della chat inserito dal cliente e alle risposte restituite dall'agente, il Tree Agent può comunicare con il frontend tramite metadati strutturati che permettono di avere un'esperienza ancora più personalizzata e integrata con il sito ospitante;
    • API chunk: la documentazione divisa in chunk e passata al modello può essere aggiornata tramite un'apposita interfaccia API e senza passare per la progettazione;
  • interazione avanzata: non solo testo, il Tree Agent può ricevere ed inviare anche immagini e documenti. Inoltre, in caso di domande chiuse, è possibile mostrare dei pulsanti in chat personalizzabili.