Prima l'incorporazione, poi il chunking: Recupero più intelligente delle RAG con il chunking semantico Max-Min
LaRetrieval Augmented Generation (RAG) è diventata l'approccio predefinito per fornire contesto e memoria alle applicazioni di IA - gli agenti di IA, gli assistenti di supporto ai clienti, le basi di conoscenza e i sistemi di ricerca vi fanno affidamento.
In quasi tutte le pipeline RAG, il processo standard è lo stesso: si prendono i documenti, si dividono in pezzi e poi si incorporano questi pezzi per il recupero delle somiglianze in un database vettoriale come Milvus. Poiché il chunking avviene a monte, la qualità dei pezzi influisce direttamente sulla qualità del sistema e sull'accuratezza delle risposte finali.
Il problema è che le strategie tradizionali di chunking solitamente dividono il testo senza alcuna comprensione semantica. Il chunking a lunghezza fissa si basa sul conteggio dei token e il chunking ricorsivo utilizza la struttura a livello superficiale, ma entrambi ignorano il significato effettivo del testo. Di conseguenza, le idee correlate vengono spesso separate, le righe non correlate vengono raggruppate e il contesto importante viene frammentato.
In questo blog vorrei condividere una strategia di chunking diversa: Max-Min Semantic Chunking. Invece di fare il chunking per primo, incorpora il testo in anticipo e usa la somiglianza semantica per decidere dove devono formarsi i confini. Incorporando il testo prima di tagliarlo, la pipeline è in grado di seguire le variazioni naturali di significato, anziché affidarsi a limiti di lunghezza arbitrari.
Come funziona una tipica pipeline RAG
La maggior parte delle pipeline RAG, indipendentemente dal framework, segue la stessa catena di montaggio in quattro fasi. Probabilmente ne avete scritto voi stessi una qualche versione:
1. Pulizia e raggruppamento dei dati
La pipeline inizia pulendo i documenti grezzi: rimuovendo intestazioni, piè di pagina, testo di navigazione e tutto ciò che non è contenuto reale. Una volta eliminato il rumore, il testo viene suddiviso in parti più piccole. La maggior parte dei team utilizza pezzi di dimensioni fisse, in genere 300-800 token, perché in questo modo il modello di incorporazione è gestibile. Lo svantaggio è che le suddivisioni si basano sulla lunghezza, non sul significato, quindi i confini possono essere arbitrari.
2. Incorporamento e archiviazione
Ogni pezzo viene poi incorporato utilizzando un modello di incorporamento come quello di OpenAI text-embedding-3-small o il codificatore di BAAI. I vettori risultanti vengono memorizzati in un database vettoriale come Milvus o Zilliz Cloud. Il database gestisce l'indicizzazione e la ricerca di similarità, in modo da poter confrontare rapidamente le nuove query con tutti i chunk memorizzati.
3. Interrogazione
Quando un utente pone una domanda, ad esempio "Come fa il RAG a ridurre le allucinazioni?". - il sistema incorpora la domanda e la invia al database. Il database restituisce i top-K chunk i cui vettori sono più vicini alla domanda. Questi sono i pezzi di testo su cui il modello si baserà per rispondere alla domanda.
4. Generazione della risposta
I pezzi recuperati vengono raggruppati insieme alla domanda dell'utente e inseriti in un LLM. Il modello genera una risposta utilizzando il contesto fornito come base.
Il chunking si trova all'inizio dell'intera pipeline, ma ha un impatto notevole. Se i pezzi sono in linea con il significato naturale del testo, il recupero è accurato e coerente. Se i frammenti sono stati tagliati in punti scomodi, il sistema ha più difficoltà a trovare le informazioni giuste, anche con embeddings forti e un database vettoriale veloce.
Le sfide di un corretto chunking
La maggior parte dei sistemi RAG oggi utilizza uno dei due metodi di chunking di base, che presentano entrambi dei limiti.
1. Chunking a dimensione fissa
Questo è l'approccio più semplice: dividere il testo in base a un numero fisso di token o caratteri. È veloce e prevedibile, ma ignora completamente la grammatica, gli argomenti o le transizioni. Le frasi possono essere tagliate a metà. A volte anche le parole. Le incorporazioni ottenute da questi pezzi tendono a essere rumorose perché i confini non riflettono la reale struttura del testo.
2. Suddivisione ricorsiva dei caratteri
Questo metodo è un po' più intelligente. Suddivide il testo in modo gerarchico sulla base di indicazioni come paragrafi, interruzioni di riga o frasi. Se una sezione è troppo lunga, la divide ulteriormente in modo ricorsivo. Il risultato è generalmente più coerente, ma ancora incoerente. Alcuni documenti non hanno una struttura chiara o hanno sezioni di lunghezza non uniforme, il che compromette l'accuratezza del reperimento. In alcuni casi, inoltre, questo approccio produce pezzi che superano la finestra di contesto del modello.
Entrambi i metodi devono affrontare lo stesso compromesso: precisione contro contesto. I pezzi più piccoli migliorano l'accuratezza del recupero, ma perdono il contesto circostante; quelli più grandi preservano il significato, ma rischiano di aggiungere rumore irrilevante. Trovare il giusto equilibrio è ciò che rende il chunking fondamentale e frustrante nella progettazione di sistemi RAG.
Chunking semantico Max-Min: Incorporare prima, suddividere dopo
Nel 2025, S.R. Bhat et al. hanno pubblicato Rethinking Chunk Size for Long-Document Retrieval: A Multi-Dataset Analysis. Una delle loro scoperte principali è che non esiste un'unica dimensione "migliore" per il RAG. I chunk piccoli (64-128 token) tendono a funzionare meglio per le domande di tipo fattuale o di ricerca, mentre i chunk più grandi (512-1024 token) sono utili per i compiti narrativi o di ragionamento di alto livello. In altre parole, il chunking a dimensione fissa è sempre un compromesso.
Ciò solleva una domanda naturale: invece di scegliere una lunghezza e sperare che sia la migliore, possiamo suddividere i pezzi in base al significato piuttosto che alla dimensione? Il Max-Min Semantic Chunking è un approccio che ho trovato e che cerca di fare proprio questo.
L'idea è semplice: prima incorporare, poi suddividere. Invece di dividere il testo e poi incorporare i pezzi che ne escono, l'algoritmo incorpora tutte le frasi in anticipo. Utilizza poi le relazioni semantiche tra queste incorporazioni di frasi per decidere dove devono andare i confini.
Diagramma che mostra il flusso di lavoro embed-first chunk-second nel chunking semantico Max-Min
Concettualmente, il metodo tratta il chunking come un problema di raggruppamento vincolato nello spazio delle incorporazioni. Si percorre il documento in ordine, una frase alla volta. Per ogni frase, l'algoritmo confronta il suo embedding con quello del chunking corrente. Se la nuova frase è semanticamente abbastanza vicina, si unisce al chunk. Se è troppo lontana, l'algoritmo inizia un nuovo chunk. Il vincolo fondamentale è che i chunk devono seguire l'ordine delle frasi originali: nessun riordino, nessun raggruppamento globale.
Il risultato è un insieme di pezzi di lunghezza variabile che riflettono i punti in cui il significato del documento cambia effettivamente, invece di quelli in cui un contatore di caratteri arriva a zero.
Come funziona la strategia di chunking semantico Max-Min
Il Max-Min Semantic Chunking determina i confini dei pezzi confrontando il modo in cui le frasi si relazionano tra loro nello spazio vettoriale ad alta dimensione. Invece di basarsi su lunghezze fisse, osserva come il significato si sposta all'interno del documento. Il processo può essere suddiviso in sei fasi:
1. Incorporare tutte le frasi e iniziare un chunk
Il modello di incorporazione converte ogni frase del documento in un'incorporazione vettoriale. Le frasi vengono elaborate in ordine. Se le prime n-k frasi formano il chunk corrente C, la frase successiva (sₙ₋ₖ₊₁) deve essere valutata: deve unirsi a C o iniziare un nuovo chunk?
2. Misurare la coerenza del chunk corrente
All'interno del chunk C, calcolare la minima somiglianza di coseno a coppie tra tutte le incorporazioni di frasi. Questo valore riflette quanto siano strettamente correlate le frasi all'interno del chunk. Una somiglianza minima più bassa indica che le frasi sono meno correlate, il che suggerisce che il chunk potrebbe dover essere diviso.
3. Confrontare la nuova frase con il chunk
Successivamente, si calcola la massima somiglianza del coseno tra la nuova frase e qualsiasi frase già presente in C. Questo valore riflette il grado di allineamento semantico della nuova frase con il chunk esistente.
4. Decidere se estendere il chunk o iniziarne uno nuovo.
Questa è la regola fondamentale:
Se la somiglianza massima della nuova frase con il chunk C è maggiore o uguale alla somiglianza minima all'interno di C, → la nuova frase si adatta e rimane nel chunk.
Altrimenti, → inizia un nuovo chunk.
Questo assicura che ogni chunk mantenga la sua coerenza semantica interna.
5. Regolare le soglie in base alle modifiche del documento
Per ottimizzare la qualità dei chunk, è possibile regolare dinamicamente parametri come le dimensioni dei chunk e le soglie di somiglianza. Ciò consente all'algoritmo di adattarsi alle diverse strutture e densità semantiche dei documenti.
6. Gestire le prime frasi
Quando un chunk contiene una sola frase, l'algoritmo gestisce il primo confronto utilizzando una soglia di somiglianza fissa. Se la somiglianza tra la frase 1 e la frase 2 è superiore a tale soglia, le due frasi formano un chunk. In caso contrario, si dividono immediatamente.
Punti di forza e limiti del chunking semantico Max-Min
Il Max-Min Semantic Chunking migliora il modo in cui i sistemi RAG suddividono il testo utilizzando il significato anziché la lunghezza, ma non è una soluzione definitiva. Ecco un'analisi pratica di ciò che fa bene e dei punti deboli.
Cosa fa bene
Il chunking semantico Max-Min migliora il chunking tradizionale in tre modi importanti:
1. Confini dei chunk dinamici e guidati dal significato
A differenza degli approcci basati su dimensioni o strutture fisse, questo metodo si basa sulla somiglianza semantica per guidare il chunking. Confronta la somiglianza minima all'interno del chunk corrente (quanto è coeso) con la somiglianza massima tra la nuova frase e quel chunk (quanto si adatta). Se quest'ultima è maggiore, la frase si unisce al chunk; altrimenti, inizia un nuovo chunk.
2. Regolazione dei parametri semplice e pratica
L'algoritmo dipende da tre soli iperparametri fondamentali:
la dimensione massima del chunk,
la somiglianza minima tra le prime due frasi, e
la soglia di somiglianza per l'aggiunta di nuove frasi.
Questi parametri si adattano automaticamente al contesto: pezzi più grandi richiedono soglie di somiglianza più severe per mantenere la coerenza.
3. Basso overhead di elaborazione
Poiché la pipeline RAG calcola già gli embeddings delle frasi, Max-Min Semantic Chunking non aggiunge calcoli pesanti. Tutto ciò che serve è una serie di controlli di somiglianza del coseno durante la scansione delle frasi. Questo lo rende più economico di molte tecniche di chunking semantico che richiedono modelli aggiuntivi o clustering a più stadi.
Cosa non può ancora risolvere
Il Max-Min Semantic Chunking migliora i confini dei pezzi, ma non elimina tutte le sfide della segmentazione dei documenti. Poiché l'algoritmo elabora le frasi in ordine e raggruppa solo localmente, può ancora perdere le relazioni a lungo raggio nei documenti più lunghi o complessi.
Un problema comune è la frammentazione del contesto. Quando le informazioni importanti sono sparse in diverse parti di un documento, l'algoritmo può collocare questi pezzi in chunk separati. Ogni pezzo porta con sé solo una parte del significato.
Ad esempio, nelle note di rilascio di Milvus 2.4.13, come mostrato di seguito, un pezzo potrebbe contenere l'identificatore della versione e un altro l'elenco delle funzionalità. Una domanda come "Quali nuove funzionalità sono state introdotte in Milvus 2.4.13?" dipende da entrambi. Se questi dettagli sono suddivisi in diversi chunk, il modello di incorporamento potrebbe non collegarli, con conseguente indebolimento del recupero.
-
Esempio che mostra la frammentazione del contesto nelle note di rilascio di Milvus 2.4.13, con l’identificatore della versione e l’elenco delle caratteristiche in parti separate.
Questa frammentazione influisce anche sulla fase di generazione dell'LLM. Se il riferimento alla versione è in un chunk e le descrizioni delle caratteristiche sono in un altro, il modello riceve un contesto incompleto e non può ragionare in modo pulito sulla relazione tra i due.
Per mitigare questi casi, i sistemi utilizzano spesso tecniche come le finestre scorrevoli, la sovrapposizione dei confini dei chunk o le scansioni multi-pass. Questi approcci reintroducono parte del contesto mancante, riducono la frammentazione e aiutano la fase di recupero a conservare le informazioni correlate.
Conclusione
Il chunking semantico Max-Min non è una soluzione magica per tutti i problemi di RAG, ma ci offre un modo più sano di pensare ai confini dei chunk. Invece di lasciare che siano i limiti dei token a decidere dove le idee vengono tagliate, utilizza gli embeddings per individuare dove il significato si sposta effettivamente. Per molti documenti del mondo reale - API, specifiche, log, note di rilascio, guide alla risoluzione dei problemi - questo approccio può da solo aumentare notevolmente la qualità del recupero.
L'aspetto positivo di questo approccio è che si inserisce naturalmente nelle pipeline RAG esistenti. Se si incorporano già frasi o paragrafi, il costo aggiuntivo è costituito da pochi controlli di somiglianza del coseno. Non sono necessari modelli aggiuntivi, clustering complessi o preelaborazioni pesanti. E quando funziona, i pezzi prodotti sembrano più "umani", più vicini al modo in cui raggruppiamo mentalmente le informazioni durante la lettura.
Ma il metodo ha ancora dei punti deboli. Vede il significato solo a livello locale e non riesce a ricollegare le informazioni che sono intenzionalmente separate. Finestre sovrapposte, scansioni a più passaggi e altri trucchi per preservare il contesto sono ancora necessari, soprattutto per i documenti in cui i riferimenti e le spiegazioni vivono lontani l'uno dall'altro.
Tuttavia, il Max-Min Semantic Chunking ci porta nella giusta direzione: lontano dall'affettatura arbitraria del testo e verso pipeline di reperimento che rispettino effettivamente la semantica. Se state esplorando modi per rendere RAG più affidabile, vale la pena di sperimentarlo.
Avete domande o volete approfondire il tema del miglioramento delle prestazioni di RAG? Unitevi al nostro Discord e mettetevi in contatto con gli ingegneri che ogni giorno costruiscono e mettono a punto sistemi di reperimento reali.
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word



