Nel panorama dell’intelligenza artificiale, il framework Cheshire Cat emerge come una soluzione innovativa per la gestione avanzata dei Large Language Models (LLM). Sviluppato da Piero Savastano, Cheshire Cat si distingue per la sua capacità di integrare vari modelli linguistici e per la sua struttura agnostica, offrendo un’impressionante flessibilità ed efficienza. Questo articolo approfondisce le funzionalità, i vantaggi e il contesto di sviluppo di questo framework, mettendo in luce la crescente comunità che lo supporta.

Che Cos’è Cheshire Cat?

Cheshire Cat è un framework progettato per migliorare l’efficienza, l’efficacia e la personalizzazione dei modelli di linguaggio di grandi dimensioni (come GPT-4). Caratterizzato da una struttura modulare, il framework permette una facile integrazione con diversi LLM, rendendolo agnostico rispetto alle specifiche tecnologiche di base. E’ infatti possibile utilizzare il “gatto” con diversi Large Language Model potendo così scegliere il modello più adatto per il proprio progetto.

Caratteristiche principali di Cheshire Cat

  • Design Modulare: Come WordPress per i siti web, Cheshire Cat ha una architettura tale per cui supporta una vasta personalizzazione tramite plugin scritti in Python che lo rendono incredibilmente customizzabile e pronto per applicazioni in produzione.
  • Interfaccia User-Friendly: Offre un’interfaccia intuitiva che semplifica le complessità dell’AI per gli utenti finali.
  • Scalabilità: Con i giusti accorgimenti, è progettata per scalare, si adatta facilmente a progetti di piccole dimensioni fino a implementazioni a livello aziendale.
  • Ready-to-go: Il progetto è completamente dockerizzato ed è possibile scaricarlo localmente direttamente dalla repository seguendo la documentazione

Cheshire Cat risponde su dati personalizzati

Utilizzare un modello come ChatGPT ha sicuramente molti vantaggi, ma anche alcuni svantaggi. La conoscenza che ha ChatGPT è molto vasta, ma non può coprire ogni aspetto del sapere soprattutto in contesti specifici della realtà su cui vogliamo calare il modello linguistico. Inoltre non è personalizzata.

Posso chiedere per esempio che tipo di cane sia un Malamute, ma non posso certo chiedergli “Come si chiama il mio cane” oppure “A che ora apre il forno dove di solito vado a prendere il pane”. In questo senso Cheshire Cat offre una soluzione molto interessante che tecnicamente prende il nome di RAG o Retrieval Augmented Generation

Cosa è il Retrieval Augmented Generation (RAG) e come si usa in Cheshire Cat?

Il RAG è una tecnica di prompting che arricchisce la generazione di contenuti testuali attraverso una fase di recupero di informazioni. Questo metodo permette al modello di attingere a un vasto database per integrare e migliorare la generazione del testo. Letteralmente quindi il RAG consente di aggiungere informazioni che poi il Large Language Model utilizzerà, per rispondere all’utente.

Nel caso precedente, se tramite RAG ho vettorializzato la frase Poldo è il mio cane ed è un Malamute”, in questo caso alla domanda “Chi è il mio cane” il Large Langue Model potrebbe rispondere con “Il tuo cane si chiama Poldo ed è un Malamute”  invece di rispondere

Non ho accesso alle informazioni personali, quindi non posso sapere chi sia il tuo cane. Tuttavia, posso rispondere a domande generali sui cani o aiutarti con consigli sulla cura degli animali se vuoi!”

Il RAG effettivamente combina le capacità di un algoritmo di machine learning con l’accesso a una base di dati esterna, ottimizzando sia l’accuratezza che la pertinenza delle risposte fornite. E’ possibile caricare file di testo, documenti in pdf o anche siti interi. Tramite Cheshire Cat avviene in automatico il processo di embedding (ossia il processo per cui le parole e le frasi vengono trasformate in vettori) e salvate su un dabase vettoriale molto potente Qdrant.

Come Funziona il RAG?

Per i lettori interessati il funzionamento del RAG è semplice anche se necessità di un minimo di conoscenze di algebra lineare. Dati due vettori x e y possiamo calcolare il coseno dell’angolo di questi due vettori.

L’angolo  formato tra i due vettori può sarà tanto più piccolo quanto più i due vettori sono simili, Se identifico con a l’angolo tra i due vettori, allora vale che per a=0° allora cos(a) = 1  . All’opposto per vettori che sono indipendenti o ortogonali (quindi molto diversi tra loro) il coseno sarà 0.

vettori simili vettori orotgonali

Vettori con una similarità del coseno più vicini tra loro avranno una distanza semantica vicina, ad esempio la frase “Sei un cane a programmare in Python” è molto diversa dalla frase “Ho dato da mangiare al mio cane Python”. Sebbene molte di queste parole siano le stesse, semanticamente hanno significati diversi quindi i due vettori avranno una similarità di coseno bassa. All’opposto la frase “Il mio cane si chiama Poldo” e “Il mio cane si chiama Python” avranno una distanza vettoriale ridotta. ps il vettore a due dimensioni è solo una semplificazione in quanto è impensabile un angolo a n-dimesioni

Per cui se ho un database vettoriale che contiene tutti i miei dati trasformati in vettori e faccio una ricerca per similarità, posso fare una domanda “Come si chiama il mio cane?” e trovare nel database dei miei dati quei pezzi di testo che sono simili alla mia query, ad esempio “Ieri sera ho portato fuori a far pipì Poldo” oppure “Poldo è il miglior cane che io abbia mai avuto”. Posso quindi chiedere all’intelligenza artificiale di rispondere alla mia domanda “Come si chiama il mio cane?” ma dandogli anche i pezzi del mio database che contengono la risposta.

[fine inciso un po’ nerdoso e palloso]

Hook e Plugin nel Cheshire Cat

Hook e plugin sono il centro di customizzazione del Cheshire Cat. Attraverso la scrittura di questi pezzi di codice si può creare un Gatto che abbia delle specifiche funzionalità, o integrazioni con sistemi esterni.

Cosa sono gli Hook?

Gli hook sono funzioni specifiche messe a disposizione da Cheshire Cat che si innestano nei diversi punti del ciclo di vita del framework, influenzando direttamente il suo comportamento interno. Possono essere associati ad eventi, modificare il flusso di esecuzione o manipolare dati, personalizzando l’interazione e le risposte del sistema secondo necessità precise.

Cosa sono i Plugin?

I plugin sono componenti aggiuntivi software integrabili nel framework Cheshire Cat, che estendono o modificano le funzionalità esistenti. Scritti in Python, questi moduli permettono di arricchire il sistema con nuove capacità specifiche, mantenendo inalterato il nucleo centrale del sistema.

La comunità di sviluppatori attorno a Cheshire Chat è continuamente all’opera nel creare plugin che aggiungono funzionalità al gatto in modo semplice e diretto.

Ne abbiamo sviluppati alcuni anche noi:

  • https://github.com/mimir-chatbot/html-parser (un plugin che filtra l’HTML letto da una pagina web ed estrae testo o rimuove testo solo dai tag specificati)
  • https://github.com/mimir-chatbot/Dynamic-Language (un plugin per far parlare il gatto in qualsiasi lingua in maniera dinamica)
  • https://github.com/mimir-chatbot/sentrycat-plugin (un plugin per integrare Sentry all’interno del gatto)

Il paragone con WordPress regge sempre, i plugin possono aggiungere qualsiasi funzionalità si desideri, possono essere scritti direttamente dall’utente o possono essere scaricati da quelli prodotti direttamente dalla community

A cosa servono?

I plugin e gli hook rendono Cheshire Cat estremamente flessibile e adattabile, consentendo l’aggiunta di funzionalità come il supporto per nuove lingue o strumenti di analisi specializzati. Gli hook permettono modifiche comportamentali durante l’esecuzione, facilitando l’adattamento a esigenze particolari senza necessità di riscrivere il codice principale. Questa architettura modulare stimola l’innovazione e l’adattabilità in progetti di intelligenza artificiale complessi.

La gestione delle memorie nel Cheshire Cat

Il Cheshire Cat utilizza diverse tipologie di memoria i cui nomi ricordano il mix di uno psicologo cognitivo che adora “Alice nel Paese delle Meraviglie”

Memoria a Lungo Termine (LTM) nel Cheshire Cat

Il Cheshire Cat utilizza la Memoria a Lungo Termine (LTM) per conservare e gestire informazioni che rimangono disponibili attraverso diverse sessioni. Questa memoria è suddivisa in tre componenti principali:

  1. Memoria Episodica: Questa parte della memoria conserva le tracce delle interazioni passate dell’utente con il sistema. Memorizzare le conversazioni precedenti permette al Cheshire Cat di ricordare e riferirsi a eventi passati, migliorando la coerenza e la personalizzazione delle interazioni. La memoria episodica aiuta il sistema a sviluppare un contesto continuo durante le interazioni con l’utente, rendendo le conversazioni più naturali e personalizzate.
  2. Memoria Dichiarativa: Archivia i contenuti dei documenti che gli utenti caricano nel sistema. Questa componente è cruciale per permettere al Cheshire Cat di accedere rapidamente a informazioni rilevanti e specifiche che sono state introdotte precedentemente. Ad esempio, se un utente carica un manuale tecnico, la memoria dichiarativa consente al sistema di estrarre e utilizzare le informazioni di quel manuale durante le conversazioni future.
  3. Memoria Procedurale: Contiene le definizioni delle funzioni Python e altre informazioni su come il Cheshire Cat esegue certe operazioni. Questa memoria è fondamentale per il funzionamento delle funzionalità interne del sistema come i plugin, permettendo al Cheshire Cat di eseguire compiti programmabili e di rispondere a richieste complesse degli utenti.

Memoria Operativa

Oltre alla LTM, il Cheshire Cat dispone di una Memoria Operativa, che gestisce dati temporanei utili durante una sessione attiva. Questa memoria è essenziale per la condivisione di informazioni tra diversi plugin o funzioni, mantenendo un contesto temporaneo che influisce sulla generazione delle risposte. Ad esempio, la memoria operativa può tenere traccia della cronologia della chat corrente, che viene poi utilizzata per formulare prompt iniziali per il modello di linguaggio durante la sessione.

Rabbit Hole e Mad Hatter: Componenti di Gestione della Memoria e dei Plugin

  1. Rabbit Hole: È il componente del Cheshire Cat responsabile per l’ingestione di nuovi documenti e per il loro archivio nella memoria dichiarativa. Questo processo permette al Cheshire Cat di aggiornare continuamente la sua base di conoscenza con informazioni fresche e rilevanti. Il Rabbit Hole supporta una varietà di formati di file, facilitando agli utenti l’integrazione di contenuti diversi nel sistema.
  2. Mad Hatter: Gestisce i plugin che estendono o modificano le funzionalità del Cheshire Cat. Il Mad Hatter non solo carica e organizza i plugin, ma gestisce anche la loro esecuzione secondo una priorità definita, assicurando che le operazioni più critiche abbiano la precedenza nel sistema. Questo manager di plugin è vitale per mantenere l’ordine e l’efficienza nell’esecuzione delle estensioni software che arricchiscono il Cheshire Cat.

Gatto, bello, figo e ora…

Non c’è che dire, il framework Cheshire Cat rappresenta una soluzione all’avanguardia per la gestione dei Large Language Models, ed è un progetto che siamo onorati di poter collaborare insieme a Pietro e a tutto il suo staff.

Cheshire Cat offrendo una personalizzazione estesa attraverso la sua architettura modulare e i suoi robusti sistemi di memoria. Per chi desidera esplorare ulteriori dettagli o integrare il Cheshire Cat nei propri progetti, invitiamo a visitare la pagina del progetto o a contattarci per una consulenza personalizzata.