Guadagni:
- Valuta numericamente la dimensione del blocco, la sovrapposizione e i compromessi del blocco semantico
- Scelta della strategia di suddivisione appropriata per diversi tipi di documenti (PDF, tabella, codice, registro chat)
- Rafforza la qualità del recupero e il filtraggio aggiungendo metadati a ciascun blocco
Questo è il passaggio più trascurato ma più decisivo in RAG: come scomporre il documento. Questo si chiama spezzettamento. Anche se si fornisce lo stesso documento allo stesso modello, a causa di un errato suddivisione in blocchi il recupero restituisce il pezzo sbagliato e il modello non produrrà mai una risposta ottimale. In questa unità tratteremo le strategie di frammentazione, come adattarle in base al tipo di documento e come aggiungere metadati significativi a ciascun frammento.
Perché distruggiamo?
Ci sono tre ragioni. Innanzitutto, i modelli di incorporamento convertono il testo fino a una certa lunghezza in un vettore significativo; Se un intero capitolo di 40 pagine viene stipato in un unico vettore, il significato diventa "sfocato". In secondo luogo, vogliamo fornire al modello solo la parte necessaria come contesto; consegnare l'intero documento è costoso e fonte di distrazione. In terzo luogo, affinché il recupero sia preciso, l’unità di ricerca deve essere piccola e focalizzata.
Quindi il pezzo è la più piccola unità di recupero. Non dovrebbe essere né troppo grande né troppo piccolo: giusto.
Dimensioni dei blocchi e bilanciamento della sovrapposizione
Ci sono due impostazioni principali: dimensione del blocco (quanti token/parole ci saranno in un blocco) e sovrapposizione (la porzione condivisa dai blocchi vicini).
Pezzi molto piccoli (ad esempio 100 token): focalizzati ma disconnessi dal contesto. Dice "per 14 giorni", ma il significato di 14 giorni è lasciato nella frase precedente. Pezzi molto grandi (ad esempio 2000 token): preserva il contesto ma molti thread sono mescolati; l'incorporamento diventa confuso e gli argomenti irrilevanti si uniscono.
La sovrapposizione risolve il problema dei confini. Se una frase cade esattamente sul confine di due parti, viene divisa in due senza sovrapposizioni e il suo significato viene perso. La sovrapposizione di 50-100 token garantisce che le informazioni rientranti nel limite rimangano intatte almeno in una parte.
Dimensione del pezzo
Vantaggio
Svantaggio
contenuto appropriato
Piccolo (100-250 gettoni)
Alta sensibilità, focalizzato
Il contesto potrebbe rompersi
FAQ, articoli brevi, definizioni
Medio (300-600 token)
Equilibrio; la maggior parte degli scenari
—
Procedure, testi politici
Grande (800-1500 token)
Integrità del contesto
incorporamento sfocato
Narrazione, lunghe spiegazioni
Suggerimento: se non sai da dove iniziare, inizia con un blocco di 400-500 token e una sovrapposizione di 50-80 token; quindi misurare e regolare con i propri dati. La dimensione "giusta" non è universale, dipende dal contesto.
Strategie di suddivisione in blocchi
Dimensione fissa: ritaglia il testo ogni N token. È semplice e veloce, ma può interrompere a metà frase.
Basato su separatori (ricorsivo/separatore): divide in base al paragrafo e quindi ai limiti della frase; Preserva meglio l’integrità del significato. La maggior parte dei sistemi di produzione iniziano con questo.
Chunking semantico: esamina gli incorporamenti delle frasi e li divide dove avviene il cambio di soggetto. È il metodo di massima qualità ma più costoso; Con grandi volumi, i costi di transazione aumentano.
Consapevole della struttura: utilizza la struttura del documento come intestazioni, sezioni, tabelle. Ad esempio, dividere un documento Markdown per intestazioni garantisce che ciascuna parte abbia la propria intestazione.
Adattamento per tipo di documento
Non tutti i documenti sono uguali. La strategia varia in base al tipo:
- PDF/testo policy: basato su segnalibri, di medie dimensioni. Cancella le ripetizioni superiore/inferiore della pagina (intestazione/piè di pagina).
- Tabelle: non prendere la riga fuori contesto; mantieni ogni riga con le informazioni di intestazione ("Articolo: X, Prezzo: Y, Stock: Z"). La conversione della tabella grezza in testo semplice è spesso essenziale.
- Codice: suddiviso in base ai limiti di funzione/classe; Non eliminare una funzione.
- Registrazione chat/ticket: suddivisa per messaggio o round di conversazione; Mantenere la conoscenza di chi ha detto cosa.
# suddivisione in blocchi (concettuale) basata su parentesi = bol( testo, dimensione_destinazione=450, # sovrapposizione token=70, # parentesi token=["\n\n", "\n", ". ", " "] # primo paragrafo, ultima parola)
Aggiungi metadati a ciascuna traccia
Il Chunking non è solo "dividere"; è arricchire ogni pezzo. Ogni tag che alleghi alla traccia vale il suo peso in oro per futuri filtraggi e citazioni della fonte.
# Parte arricchita (concettuale){ "text": "Le ferie annuali retribuite sono 14 giorni con 1-5 anni di servizio...", "metadata": { "source": "ik_el_kitabi_v7.pdf", "section": "5.2 Ferie annuali", "page": 23, "date": "2025-06", "department": "IK", "privacy": "internal" }}
Un'altra tecnica potente è aggiungere un'intestazione contestuale: scrivere il titolo del capitolo a cui appartiene all'inizio di ogni pezzo. Pertanto, anche un pezzo sconnesso come "Per 14 giorni" è sia meglio incorporato che più significativo come "Congedo annuale - 14 giorni".
Chunking debole / Chunking forte
Debole (hardcut cieco, senza metadati):
Tronca il testo ogni 1000 caratteri. Mantieni solo il testo.# Risultato: le tabelle vengono divise a metà, "14 giorni" rimane senza contesto,# non si sa da quale documento provenga, non è possibile applicare alcun filtro.
Potente (consapevole della struttura + intestazione + metadati):
Dividere il documento per intestazioni; aggiungere il titolo della sezione a ciascuna parte; allegare fonte, pagina, data e metadati sulla privacy; converte le righe della tabella in testo semplice con le relative intestazioni.# Risultato: mirato, contestuale, filtrabile, reperibile in fonti.
Tre mini custodie
Caso 1 – Disastro pittorico. Un team finanziario ha diviso il listino prezzi di 200 pagine con un taglio netto e cieco; le righe della tabella sono state divise in modo casuale. "Qual è il prezzo del prodotto X?" Il modello ha letto la riga sbagliata e ha dato il prezzo sbagliato (9 casi su 12 sono sbagliati). Quando ho convertito le righe della tabella in testo semplice nel formato "Prodotto: … | Prezzo: … | Unità: …” l'errore è diminuito a 0 su 12.
Caso 2 – Pezzo estremamente grande. In un wiki, ogni pagina è composta da un singolo pezzo (alcuni dicono 3.000 token). L'incorporamento è sfocato perché su una pagina sono presenti "ferie", "straordinari" e "buste paga"; Per quanto riguarda la questione ferie è entrata in gioco anche la sezione relativa all'orario di lavoro. Quando le pagine sono state divise in dimensioni medie per titolo, il ricordo@5 è aumentato dal 64% al 91%.
Caso 3 – Frase troncata senza sovrapposizioni. Taglio fisso di 250 gettoni per una squadra legale, nessuna sovrapposizione. Una definizione critica cadeva proprio sul confine di due parti e si divideva in due; Né l'uno né l'altro contengono la risposta completa. Quando sono state aggiunte 60 sovrapposizioni di token, la stessa definizione è rimasta intatta e è stata restituita la risposta corretta.
Errori comuni
- Taglio fisso cieco: divide frasi e tabelle al centro; il significato è perso.
- Lasciare la sovrapposizione a zero: le informazioni che cadono sul confine vengono divise e perse.
- Non aggiungere metadati: il filtraggio e la visualizzazione della sorgente diventano impossibili.
- Lasciare le tabelle grezze: il modello non può risolvere la struttura della tabella; Converti righe in testo semplice.
- Imporre una strategia: PDF, codice e tabella non vengono divisi con lo stesso metodo; Adattarsi al genere.
Attenzione: non impostare Chunking una volta e dimenticarlo. Rimisura la qualità del recupero quando arrivano nuovi tipi di documenti (ticket da un nuovo sistema, PDF scansionati). Dati di input errati significano una risposta errata ("garbage in, garbage out").
In sintesi
- Il pezzo è la più piccola unità di recupero; Né troppo grande né troppo piccolo: va bilanciato in base al contenuto.
- La dimensione del blocco indica l'equilibrio del focus-contesto; La sovrapposizione gestisce la perdita dei confini.
- La suddivisione in blocchi basata su parentesi e consapevole della struttura è il punto di partenza della maggior parte dei sistemi di generazione; il suddivisione semantica è di buona qualità ma costoso.
- Tipi come tabella, script e chat richiedono le proprie strategie; Converti tabelle in testo semplice.
- Aggiungi metadati fonte/data/capitolo/privacy e titolo della sezione a ciascuna traccia; Questa è la base del filtraggio e della citazione.
Compito dell'applicazione
Suddividi una sezione del documento che scegli in tre modi diversi: (1) piccoli pezzi da 200 gettoni, (2) pezzi medi da 500 gettoni (70 gettoni sovrapposti), (3) singoli pezzi grandi. Poni le stesse 3 domande per ciascuna strategia, contrassegna manualmente quale pezzo inserire e scrivi il ragionamento per cui la strategia funziona meglio per quel documento. Quindi aggiungi almeno quattro campi di metadati e un "titolo del capitolo" a ciascuna traccia. Se il documento contiene una tabella, converti una riga della tabella in testo semplice nel formato "campo:valore".
lista di controllo
- [] Posso dire che il pezzo è l'unità più piccola di recupero e la dimensione è l'equilibrio del focus-contesto.
- [] So perché Overlap previene la perdita dei confini.
- [ ] Posso distinguere tra suddivisioni basate su parentesi, semantiche e basate sulla struttura.
- [ ] Posso adattare la strategia per tabella, codice e chat.
- [] Rafforzo il recupero aggiungendo metadati e titolo del capitolo a ciascuna traccia.