Passa al contenuto principale

Componenti

Il Tree Agent è un grafo composto da nodi di varie tipologie, tra cui quelli di tipo component. I nodi component unitamente a quelli head e tail permettono di definire dei gruppi di nodi. Le 3 regole che specificano il comportamento dei componenti sono:

  • l'unico nodo figlio del nodo head è come se fosse direttamente collegato al genitore del nodo component;
  • gli eventuali nodi figli del nodo component è come se fosse collegati direttamente al nodo genitore del nodo tail. Di conseguenza, se il nodo tail non viene collegato ad alcun nodo dentro il componente, allora quel componente non potrà avere alcun figlio;
  • dentro il componente, il self viene mantenuto isolato da quello dei nodi esterni, di conseguenza, dentro il nodo head è possibile definire un metodo __init__() specifico del componente;
warning

I metodi init nella root e nei nodi head viene eseguita su solo se durante un'interazione si passa per almeno un nodo contenuto nel relativo componente o a livello di root.

Grazie ai componenti è possibile definire dei gruppi di nodi specializzati in operazioni ben definite, e riutilizzarli più volte senza doverli riscrivere da zero. Ad esempio, il componente knowledge permette di:

  • immagazzinare dei chunk tramite un nodo di tipo query e di estrarli in base alla richiesta dell'utente;
  • verificare tramite un nodo llm se i chunk identificati contengono le informazioni utili per rispondere;
  • solo in caso positivo si risponde all'utente attraverso un nodo di tipo emit, altrimenti si restituisce come outcome un Outcome.FAILURE.
warning

Quando si utilizza un componente dentro un Tree Agent, questo viene clonato nel progetto con tutti i suoi nodi. Una volta importato, il componente è modificabile liberamente, ma in modo indipendente: se successivamente si aggiorna il componente originale, il cambiamento non si propaga ai Tree Agent che ne fanno già uso. In caso di bug o aggiornamenti, occorre intervenire manualmente su ogni istanza.

suggerimento

Quando si progetta un componente, si sconsiglia di far uso del session_state per condividere dati tra nodi interni: preferire il self. Il self è confinato all'interno del componente, quindi non genera interferenze con altri componenti o nodi esterni che usano le stesse chiavi. Tuttavia, il self non è persistente tra interazioni: viene ricreato all'inizio di ogni interazione. Per memorizzare informazioni tra interazioni consecutive è necessario usare il session_state, ma con attenzione: se lo stesso componente viene istanziato più volte nello stesso albero, le istanze si contenderanno le stesse chiavi.