Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial

RAG e AI: rendere i documenti più analizzabili

Come sfruttare la RAG (Retrieval Augmented Generation) nelle applicazioni di AI per rendere i documenti più analizzabili
Come sfruttare la RAG (Retrieval Augmented Generation) nelle applicazioni di AI per rendere i documenti più analizzabili
Link copiato negli appunti

Proseguiamo nel "progetto RAG". Siamo arrivati al punto in cui possediamo la capacità di scaricare documenti nel nostro ambiente di lavoro per iniziare a costituire quella piattaforma di conoscenza di cui la nostra applicazione necessita per riuscire a rispondere ad interrogazioni specifiche dell'utente.

I documenti, indipendentemente dal procedimento di acquisizione, una volta integrati nel programma sono individuati da oggetti di classe Document:

Document(metadata={'source': 'dati/racconto.txt'},
	page_content='Questa storia parla di un ragazzo ...\n')

in cui troviamo almeno una proprietà metadata con indicazione della sorgente del file ed una page_content in cui viene incardinato il vero e proprio contenuto.

A questo punto, ciò di cui abbiamo bisogno è un meccanismo che li renda più digeribili in maniera da poterli indicizzare meglio durante il nostro procedimento di preparazione alla RAG: il text splitting.

Text splitting e RAG: di cosa si tratta

Il text splitting come il nome stesso suggerisce è un meccanismo di "sminuzzamento" dei contenuti di un documento in un certo numero di elementi di dimensioni minori che vengono, per convenzione, chiamati chunk.

Lo scopo di tutto ciò è quello di rendere i documenti più facilmente analizzabili soprattutto quando si tratta di file di grandi dimensioni. Il fatto che l'Intelligenza Artificiale di cui trattiamo sia "generativa" impone che, al fine di poter emulare il processo creativo e l'espressività tipici dell'essere umano, questi modelli devono essere in grado di analizzare documenti prodotti da persone che tipicamente presentano difficoltà oggettive all'approccio come la dimensione e la loro redazione in linguaggio naturale. Pertanto, il vero passaggio di valore consiste proprio in una loro riduzione in segmenti di dimensioni inferiori nel tentativo di renderli più gestibili.

La vera sfida del text splitting consiste tuttavia non tanto nella suddivisione meccanica degli elementi (il che potrebbe tradursi in non più che un semplice esercizio di programmazione), quanto nella possibilità di mantenere integro il contesto del discorso evitando, ad esempio, di spezzare frasi semplicemente in base al numero di caratteri creando troppe espressioni più corte ma tutte dal senso incompiuto.

Oltre a tali aspetti (suddivisione in base a caratteri e a contesto) esiste un'ulteriore classificazione attuabile basata sul formato del contenuto che può rivelarsi particolarmente favorevole se vogliamo procedere all'estrapolazione di contenuti da strutture dati testuali (si pensi al Markdown, ad esempio).

Già da questo preambolo si può immaginare che suddividere un testo in chunk rivela alcuni aspetti non del tutto banali, residenti non solo nelle "parole" in sé stesse quanto alla finalità del testo e alle tematiche che tratta.

Quanto sono grandi i chunk?

Al di là della metodologia ci sono due grandezze che vanno configurate prima che il TextSplitter venga avviato: dimensione del chunk e lunghezza di sovrapposizione.

Il primo aspetto, dimensione del chunk, viene impostato nello splitter con un parametro denominato chunk_size, indica quanti caratteri compongono un singolo chunk. Non esiste una dimensione ottimale in quanto l'importante è che sia idoneo all'indicizzazione che deve essere eseguita. Chunk di dimensione più piccola permettono di mirare correttamente ad un contenuto ma rischiano di spezzare troppo il discorso che quel tratto di documento sta portando avanti. Chunk più grandi custodiscono maggiormente il contesto ma rischiano di renderlo più generico.

Un rischio consiste anche nella confusione tra contesti che potremmo definire confinanti. L'ideale sarebbe avere dei chunk di dimensione adeguata a mantenere i concetti isolati e non troppo dispersivi. Questo però varia non solo per la procedura che stiamo compiendo ma anche da documento a documento. Potrebbe essere sconsigliabile scegliere pochi documenti di test su cui misurare
lo splitting sperando che possa essere adeguato per l'intera mole di testi che dobbiamo trattare.

L'altro aspetto, la lunghezza di sovrapposizione, denominata tecnicamente chunk_overlap, indica quanti caratteri di sovrapposizione ci possono essere tra chunk confinanti. E' un aspetto da considerare per arginare la dispersione dei contenuti spezzando contesti tra più chunk in maniera che non siano più chiaramente individuabili. L'overlap può essere impostato a zero (evitando così sovrapposizioni) o essere aumentato per fare in modo che un chunk riesca a portare avanti il discorso intrapreso dal precedente nella speranza di aumentarne il legame.

Anche in questo caso non esistono regole auree tuttavia si considera adeguato, a livello empirico, un overlapping del 10-20% rispetto alla dimensione del chunk. Esagerare anche con questa dimensione rischierebbe di contaminare i concetti che ogni chunk - ci si augura - possa esprimere chiaramente.

Conclusione: TextSplitter e progetto RAG

Dopo queste prime impostazioni di base, che comunque coprono tutti i tratti fondamentali dell'argomento, possiamo passare alla sperimentazione pratica mettendo a confronto, nella prossima lezione sul nostro progetto RAG, i due TextSplitter più comuni.

Se vuoi aggiornamenti su RAG e AI: rendere i documenti più analizzabili inserisci la tua email nel box qui sotto:

Compilando il presente form acconsento a ricevere le informazioni relative ai servizi di cui alla presente pagina ai sensi dell'informativa sulla privacy.

Ti consigliamo anche