Fase di suddivisione in blocchi RAG
Dopo aver raccolto i documenti e le query di test ed eseguire un'analisi dei documenti durante la fase di preparazione , la fase successiva è la suddivisione in blocchi. Suddividere i documenti in blocchi di dimensioni appropriate che contengono contenuti rilevanti in modo semantico è fondamentale per il successo dell'implementazione di Retrieval-Augmented Generation (RAG). Il passaggio di interi documenti o blocchi sovradimensionati è costoso, potrebbe sovraccaricare i limiti dei token del modello e non produce i risultati migliori. Il passaggio di informazioni a un modello linguistico irrilevante per la query può comportare risposte imprecise o non correlate. È necessario ottimizzare il processo di passaggio delle informazioni pertinenti e rimuovere informazioni irrilevanti usando strategie efficaci di suddivisione in blocchi e ricerca. Questo approccio riduce al minimo i falsi positivi e i falsi negativi e ottimizza i veri positivi e i veri negativi.
I blocchi troppo piccoli e che non contengono contesto sufficiente per risolvere la query possono comportare risultati scarsi. Il contesto pertinente presente in più blocchi potrebbe non essere acquisito. La chiave consiste nell'implementare approcci efficaci di suddivisione in blocchi per i tipi di documento specifici e le relative strutture e contenuti specifici. Esistono diversi approcci di suddivisione in blocchi da considerare, ognuno con le proprie implicazioni sui costi e l'efficacia, a seconda del tipo e della struttura del documento a cui sono applicati.
Questo articolo descrive vari approcci di suddivisione in blocchi ed esamina il modo in cui la struttura dei documenti può influenzare l'approccio di suddivisione in blocchi scelto.
Questo articolo fa parte di una serie. Leggere la introduzione prima di continuare.
Economia della suddivisione in blocchi
Quando si determina la strategia complessiva di suddivisione in blocchi, è necessario prendere in considerazione il budget e i requisiti di qualità e velocità effettiva per la raccolta documenti. Sono previsti costi di progettazione per la progettazione e l'implementazione di ogni implementazione univoca della suddivisione in blocchi e dei costi di elaborazione per documento che differiscono a seconda dell'approccio. Se i documenti hanno un supporto incorporato o collegato, è necessario considerare l'economia dell'elaborazione di tali elementi. Per la suddivisione in blocchi, questa elaborazione usa in genere modelli linguistici per generare descrizioni dei supporti. Tali descrizioni vengono quindi suddivise in blocchi. Un approccio alternativo per alcuni supporti consiste nel passarli as-is a un modello multi modale in fase di inferenza. Tuttavia, questo approccio non influisce sull'economia della suddivisione in blocchi.
Le sezioni seguenti esaminano l'economia delle immagini in blocchi e la soluzione complessiva.
Economia della suddivisione in blocchi di immagini
È previsto un costo per l'uso di un modello linguistico per generare una descrizione di un'immagine in blocchi. Ad esempio, i servizi basati sul cloud, come il servizio OpenAI di Azure, addebitano per transazione o secondo il provisioning prepagato. Le immagini più grandi comportano un costo maggiore. Tramite l'analisi dei documenti, è necessario determinare quali immagini sono utili per suddividere in blocchi e quali immagini ignorare. Da qui è necessario comprendere il numero e le dimensioni delle immagini nella soluzione. È quindi necessario valutare il valore della suddivisione in blocchi delle descrizioni delle immagini rispetto al costo per generare tali descrizioni.
Un modo per determinare quali immagini elaborare consiste nell'usare un servizio come Visione artificiale di Azure per classificare immagini, contrassegnare immagini o eseguire il rilevamento dei logo. È quindi possibile usare i risultati e gli indicatori di attendibilità per determinare se l'immagine aggiunge valore contestuale significativo e deve essere elaborato. Le chiamate a Vision potrebbero essere meno costose rispetto alle chiamate ai modelli linguistici, quindi questo approccio potrebbe comportare risparmi sui costi. Sperimentare per determinare quali livelli di confidenza e quali classificazioni o tag forniscono i risultati migliori per i dati. Un'altra opzione consiste nel creare un modello di classificatore personalizzato. Se si usa questo approccio, assicurarsi di prendere in considerazione i costi per compilare, ospitare e gestire il proprio modello.
Un'altra strategia di ottimizzazione dei costi consiste nel memorizzare nella cache usando il modello di Cache-Aside. È possibile generare una chiave basata sull'hash dell'immagine. Come primo passaggio, verificare se si dispone di un risultato memorizzato nella cache da un documento precedentemente elaborato o eseguito in precedenza. Se lo fai, puoi usare quel risultato. Questo approccio elimina i costi di chiamata di un classificatore o di un modello linguistico. Se non è presente alcuna cache, quando si chiama al classificatore o al modello linguistico, il risultato viene memorizzato nella cache. Le chiamate future per questa immagine usano la cache.
Il flusso di lavoro semplice seguente integra tutti questi processi di ottimizzazione dei costi:
Controllare se l'elaborazione dell'immagine è memorizzata nella cache. In tal caso, usare i risultati memorizzati nella cache.
Eseguire il classificatore per determinare se è necessario elaborare l'immagine. Memorizzare nella cache il risultato della classificazione. Se la logica di classificazione determina che l'immagine aggiunge valore, procedere con il passaggio successivo.
Generare la descrizione per l'immagine. Memorizzare nella cache il risultato.
Economia della soluzione complessiva
Quando si valuta il costo della soluzione complessiva, tenere presenti i fattori seguenti:
Numero di implementazioni univoche di suddivisione in blocchi: Ogni implementazione univoca presenta costi di progettazione e manutenzione. Assicurarsi di considerare il numero di tipi di documento univoci nella raccolta e il costo rispetto ai compromessi qualitativi delle implementazioni univoche per ognuna.
costo per documento di ogni implementazione: Alcuni approcci di suddivisione in blocchi potrebbero comportare blocchi di qualità migliori, ma hanno un costo finanziario e temporale superiore per generare tali blocchi. Ad esempio, l'uso di un modello predefinito in Intelligence per i documenti di Intelligenza artificiale di Azure ha probabilmente un costo maggiore per documento rispetto a un'implementazione di analisi del testo puro, ma potrebbe comportare blocchi migliori.
Numero di documenti iniziali: Numero di documenti iniziali da elaborare per avviare la soluzione.
Numero di documenti incrementali: Numero e frequenza dei nuovi documenti che è necessario elaborare per la manutenzione continuativa del sistema.
Caricamento e suddivisione in blocchi
Durante la suddivisione in blocchi, è necessario prima caricare il documento in memoria in un formato specifico. Il codice di suddivisione in blocchi opera quindi sulla rappresentazione in memoria del documento. È possibile combinare il codice di caricamento con la suddivisione in blocchi o separare il caricamento nella propria fase. L'approccio scelto deve essere basato principalmente sui vincoli architetturali e sulle preferenze. Le sezioni seguenti illustrano brevemente entrambe le opzioni e forniscono raccomandazioni generali.
Separare il caricamento e la suddivisione in blocchi
Esistono diversi motivi per cui è possibile scegliere di separare le fasi di caricamento e suddivisione in blocchi. È possibile incapsulare la logica nel codice di caricamento. È possibile rendere persistente il risultato del codice di caricamento prima della suddivisione in blocchi, soprattutto quando si sperimentano varie permutazioni di suddivisione in blocchi per risparmiare tempo o costi di elaborazione. Infine, potrebbe essere necessario eseguire il caricamento e la suddivisione in blocchi del codice in processi separati per motivi di architettura, ad esempio il bulkheading del processo o la segmentazione di sicurezza che comporta la rimozione dei dati personali.
Incapsulare la logica nel codice di caricamento
È possibile scegliere di incapsulare la logica di pre-elaborazione nella fase di caricamento. Questo approccio semplifica il codice di suddivisione in blocchi perché non richiede alcuna pre-elaborazione. La pre-elaborazione può essere semplice come rimuovere o annotare parti del documento che si desidera ignorare nell'analisi dei documenti, ad esempio filigrane, intestazioni e piè di pagina, per attività più complesse, ad esempio la riformattazione del documento. Ad esempio, è possibile includere le attività di pre-elaborazione seguenti nella fase di caricamento:
Rimuovere o annotare gli elementi da ignorare.
Sostituire i riferimenti alle immagini con le descrizioni delle immagini. Durante questa fase si usa un modello linguistico di grandi dimensioni per generare una descrizione per l'immagine e aggiornare il documento con tale descrizione. Se si determina nella fase di analisi dei documenti che il testo circostante fornisce contesto prezioso all'immagine, passare tale testo, insieme all'immagine, al modello linguistico di grandi dimensioni.
Scaricare o copiare immagini nello spazio di archiviazione dei file, come Azure Data Lake Storage, da elaborare separatamente dal testo del documento. Se nell'analisi del documento si determina la presenza di testo circostante che fornisce un contesto prezioso all'immagine, archiviare questo testo insieme all'immagine nella memoria del file.
Riformattare le tabelle in modo che vengano elaborate più facilmente.
Rendere persistente il risultato del codice di caricamento
Esistono diversi motivi per cui è possibile scegliere di rendere persistente il risultato del codice di caricamento. Un motivo è se si vuole controllare i documenti dopo il caricamento e la pre-elaborazione, ma prima dell'esecuzione della logica di suddivisione in blocchi. Un altro motivo è che potrebbe essere necessario eseguire una logica di suddivisione in blocchi diversa rispetto allo stesso codice pre-elaborato durante lo sviluppo o nell'ambiente di produzione. Il salvataggio permanente del codice caricato accelera questo processo.
Eseguire il caricamento e la suddivisione in blocchi del codice in processi separati
Separare il codice di caricamento e suddivisione in blocchi in processi separati per eseguire più implementazioni di suddivisione in blocchi sullo stesso codice pre-elaborato. Questa separazione consente anche di eseguire il caricamento e la suddivisione in blocchi del codice in ambienti di calcolo diversi e su hardware diverso. È possibile usare questa progettazione per ridimensionare in modo indipendente il calcolo usato per il caricamento e la suddivisione in blocchi.
Combinare il caricamento e la suddivisione in blocchi
La combinazione del codice di caricamento e suddivisione in blocchi è un'implementazione più semplice nella maggior parte dei casi. Molte delle operazioni che è possibile considerare durante la pre-elaborazione in una fase di caricamento separata possono essere eseguite nella fase di suddivisione in blocchi. Ad esempio, invece di sostituire gli URL di immagine con una descrizione nella fase di caricamento, la logica di suddivisione in blocchi può effettuare chiamate al modello linguistico di grandi dimensioni per ottenere una descrizione di testo e suddividere la descrizione.
Quando si dispone di formati di documento come HTML con tag con riferimenti alle immagini, assicurarsi che il lettore o il parser che il codice di suddivisione in blocchi usi non rimuove i tag. Il codice di suddivisione in blocchi deve essere in grado di identificare i riferimenti alle immagini.
Consigli
Quando si determina se combinare o separare la logica di suddivisione in blocchi, prendere in considerazione i consigli seguenti.
Iniziare combinando la logica di caricamento e suddivisione in blocchi. Separarli quando la soluzione lo richiede.
Evitare di convertire i documenti in un formato intermedio se si sceglie di separare i processi. Questo tipo di operazione può comportare la perdita di dati.
Approcci di suddivisione in blocchi
Questa sezione offre una panoramica degli approcci comuni di suddivisione in blocchi. È possibile usare più approcci nell'implementazione, ad esempio combinando l'uso di un modello linguistico per ottenere una rappresentazione testuale di un'immagine con molti degli approcci elencati.
Ogni approccio è accompagnato da una matrice riepilogata del processo decisionale che evidenzia gli strumenti, i costi associati e altro ancora. Il lavoro di progettazione e i costi di elaborazione sono soggettivi e sono inclusi per il confronto relativo.
Analisi basata su frasi
Questo approccio semplice suddivide i documenti di testo in blocchi composti da frasi complete. I vantaggi di questo approccio includono il costo di implementazione basso, il costo di elaborazione basso e l'applicabilità a qualsiasi documento basato su testo scritto in prosa o frasi complete. Uno svantaggio di questo approccio è che ogni blocco potrebbe non acquisire il contesto completo di un'idea o di un significato. Più frasi devono essere spesso prese insieme per acquisire il significato semantico.
Strumenti di :tokenizzatore di frasi spaCy, splitter di testo ricorsivo LangChain, tokenizzatore di frasi NLTK
sforzo ingegneristico: Basso
costo di elaborazione : basso
Casi d'uso: documenti non strutturati scritti in prosa o frasi complete e la raccolta di documenti contiene un numero proibitivo di tipi di documento diversi che richiedono strategie di suddivisione in blocchi individuali
esempi: contenuto generato dall'utente, come feedback aperto da sondaggi, post del forum, recensioni, messaggi di posta elettronica, un romanzo o un saggio
Analisi a dimensione fissa, con sovrapposizione
Questo approccio suddivide un documento in blocchi in base a un numero fisso di caratteri o token e consente una sovrapposizione di caratteri tra blocchi. Questo approccio presenta molti degli stessi vantaggi e svantaggi dell'analisi basata su frasi. Un vantaggio di questo approccio rispetto all'analisi basata su frasi è la possibilità di ottenere blocchi con significati semantici che si estendono su più frasi.
È necessario scegliere le dimensioni fisse dei blocchi e la quantità di sovrapposizione. Poiché i risultati variano per i diversi tipi di documento, è consigliabile usare uno strumento come il visualizzatore di blocchi Hugging Face per eseguire l'analisi esplorativa. È possibile usare strumenti come questo per visualizzare il modo in cui i documenti vengono suddivisi in blocchi in base alle decisioni. È consigliabile usare i token BERT anziché i conteggi dei caratteri quando si usa l'analisi con dimensioni fisse. I token BERT sono basati su unità significative di linguaggio, quindi mantengono più informazioni semantiche rispetto ai conteggi dei caratteri.
Strumenti :LangChain, strumento di suddivisione ricorsiva del testo,, Hugging Face visualizzatore di blocchi
Sforzo ingegneristico: Basso
Costo di elaborazione: Basso
Casi d'uso: documenti non strutturati scritti in prosa o non prosa con frasi complete o incomplete. La raccolta di documenti contiene un numero proibitivo di tipi di documenti diversi che richiedono strategie di suddivisione in blocchi individuali
esempi: contenuto generato dall'utente, ad esempio commenti e suggerimenti aperti da sondaggi, post del forum, recensioni, messaggi di posta elettronica, note personali, note di ricerca, elenchi
Codice personalizzato
Questo approccio analizza i documenti usando codice personalizzato per creare blocchi. Questo approccio è più efficace per i documenti basati su testo in cui la struttura è nota o può essere dedotta e è necessario un alto grado di controllo sulla creazione di blocchi. È possibile usare tecniche di analisi del testo come espressioni regolari per creare blocchi basati su modelli all'interno della struttura del documento. L'obiettivo è creare blocchi con dimensioni simili in lunghezza e blocchi con contenuto distinto. Molti linguaggi di programmazione forniscono supporto per le espressioni regolari e alcuni dispongono di librerie o pacchetti che offrono funzionalità di manipolazione delle stringhe più eleganti.
Strumenti: Python (, regex, BeautifulSoup, lxml, html5lib, marko), R (stringr, xml2), Julia (Gumbo.jl)
lavoro di progettazione: medio
costo di elaborazione: basso
Casi d'uso: documenti semistrutturati in cui è possibile dedurre la struttura
Esempi: domande di brevetto, documenti di ricerca, polizze assicurative, script e sceneggiature
Aumento del modello linguistico
È possibile usare i modelli linguistici per creare blocchi. Ad esempio, è possibile usare un modello linguistico di grandi dimensioni, ad esempio GPT-4, per generare rappresentazioni testuali di immagini o riepiloghi di tabelle che possono essere usate come blocchi. L'aumento del modello linguistico viene usato con altri approcci di suddivisione in blocchi, ad esempio codice personalizzato.
Se l'analisi del documento determina che il testo prima o dopo l'immagine consente di rispondere ad alcune domande sui requisiti, passare questo contesto aggiuntivo al modello linguistico. È importante sperimentare se questo contesto aggiuntivo migliora le prestazioni della soluzione.
Se la logica di suddivisione in blocchi suddivide la descrizione dell'immagine in più blocchi, assicurarsi di includere l'URL dell'immagine in ogni blocco. Includere l'URL dell'immagine in ogni blocco per assicurarsi che i metadati vengano restituiti per tutte le query eseguite dall'immagine. Questo passaggio è fondamentale per gli scenari in cui l'utente finale deve accedere all'immagine di origine tramite tale URL o usare immagini non elaborate durante il tempo di inferenza.
Strumenti di :Azure OpenAI, OpenAI
lavoro di progettazione: medio
Costo di elaborazione: Elevato
Casi d'uso: immagini, tabelle
Esempi: Generare rappresentazioni di testo di tabelle e immagini, riepilogare trascrizioni da riunioni, discorsi, interviste o podcast
Analisi del layout dei documenti
Le raccolte e i servizi di analisi del layout dei documenti combinano funzionalità di riconoscimento ottico dei caratteri con modelli di Deep Learning per estrarre sia la struttura che il testo dei documenti. Gli elementi strutturali possono includere intestazioni, piè di pagina, titoli, intestazioni di sezione, tabelle e figure. L'obiettivo è fornire un significato semantico migliore al contenuto contenuto contenuto nei documenti.
Le raccolte e i servizi di analisi del layout del documento espongono un modello che rappresenta il contenuto strutturale e testuale del documento. È comunque necessario scrivere codice che interagisce con il modello.
Nota
Document Intelligence è un servizio basato sul cloud che richiede di caricare il documento. È necessario assicurarsi che le normative di sicurezza e conformità consentano di caricare documenti in tali servizi.
Strumenti di :modelli di analisi dei documenti di Document Intelligence, Donut, Layout Parser
Impegno ingegneristico: Medio
Costo elaborazione: Medio
Casi d'uso: documenti semistrutturati
esempi: articoli notizie, pagine Web, riprendi
Modello predefinito
Servizi come Document Intelligence forniscono modelli predefiniti che è possibile sfruttare per vari tipi di documento. Alcuni modelli vengono sottoposti a training per tipi di documento specifici, ad esempio il modulo fiscale U.S. W-2, mentre altri sono destinati a un genere più ampio di tipi di documento, ad esempio le fatture.
strumenti di :modelli predefiniti di Document Intelligence, Power Automate per l'elaborazione intelligente dei documenti, LayoutLMv3
lavoro di progettazione: Basso
Costo elaborazione: medio/alto
Casi d'uso: documenti strutturati in cui esiste un modello predefinito
Esempi specifici: fatture, ricevute, carte di assicurazione sanitaria, moduli W-2
Modello personalizzato
Per i documenti altamente strutturati in cui non esiste alcun modello predefinito, potrebbe essere necessario creare un modello personalizzato. Questo approccio può essere efficace per immagini o documenti altamente strutturati, che rendono difficile l'uso delle tecniche di analisi del testo.
strumenti di :modelli personalizzati di Document Intelligence, Tesseract
lavoro di progettazione: Alto
Costo elaborazione: medio/alto
Casi d'uso: documenti strutturati in cui non esiste un modello predefinito
esempi di : programmi di riparazione e manutenzione automobilistica, trascrizioni accademiche, registrazioni, manuali tecnici, procedure operative, linee guida per la manutenzione
Struttura del documento
I documenti variano in base alla quantità di struttura di cui dispongono. Alcuni documenti, come i moduli governativi, hanno una struttura complessa e ben nota, ad esempio un modulo fiscale statunitense W-2. All'altra estremità dello spettro sono documenti non strutturati come note in formato libero. Il grado di struttura a un tipo di documento è un buon punto di partenza per determinare un approccio efficace per la suddivisione in blocchi. Anche se non esistono regole specifiche, questa sezione fornisce alcune linee guida da seguire.
Documenti strutturati
I documenti strutturati, talvolta definiti documenti in formato fisso, hanno layout definiti. I dati in questi documenti si trovano in posizioni fisse. Ad esempio, la data o il nome della famiglia di clienti si trova nella stessa posizione in ogni documento con lo stesso formato fisso. Un esempio di documento in formato fisso è il documento fiscale U.S. W-2.
I documenti in formato fisso potrebbero essere scannerizzati come immagini di documenti originali compilati a mano o con strutture di layout complesse. Questo formato rende difficile l'elaborazione usando un approccio di analisi del testo di base. Un approccio tipico all'elaborazione di strutture di documenti complesse consiste nell'usare modelli di Machine Learning per estrarre i dati e applicare un significato semantico a tali dati, quando possibile.
Esempi: modulo W-2, carta assicurativa
Approcci tipici: modelli predefiniti, modelli personalizzati
Documenti semistrutturati
I documenti semistrutturati non hanno un formato fisso o uno schema, ad esempio il modulo W-2, ma forniscono coerenza per il formato o lo schema. Ad esempio, tutte le fatture non sono disposte allo stesso modo. Tuttavia, in genere hanno uno schema coerente. È possibile prevedere che una fattura includa un numero di fattura e una qualche forma di nome e indirizzo per la fatturazione e la spedizione , tra gli altri dati. Una pagina Web potrebbe non avere coerenza dello schema, ma hanno elementi strutturali o di layout simili, ad esempio corpo, titolo, H1e p che può aggiungere significato semantico al testo circostante.
Come i documenti strutturati, i documenti semistrutturati con strutture di layout complesse sono difficili da elaborare usando l'analisi del testo. Per questi tipi di documento, i modelli di Machine Learning sono un buon approccio. Esistono modelli predefiniti per determinati domini con schemi coerenti, ad esempio fatture, contratti o documenti di assicurazione sanitaria. Prendere in considerazione la creazione di modelli personalizzati per strutture complesse in cui non esiste alcun modello predefinito.
esempi: fatture, ricevute, pagine Web, file markdown
Approcci tipici: modelli di analisi dei documenti
Struttura dedotta
Alcuni documenti hanno una struttura, ma non sono scritti nel markup. Per questi documenti, è necessario dedurre la struttura. Un buon esempio è il seguente documento di regolamentazione dell'UE.
Poiché è possibile comprendere chiaramente la struttura del documento e non sono disponibili modelli noti, è possibile determinare che è possibile scrivere codice personalizzato. Un formato di documento come questo potrebbe non giustificare lo sforzo di creare un modello personalizzato, a seconda del numero di documenti diversi di questo tipo con cui si sta lavorando. Ad esempio, se la raccolta contiene tutte le normative ue o le leggi statali degli Stati Uniti, un modello personalizzato potrebbe essere un buon approccio. Se si usa un singolo documento, ad esempio il regolamento UE nell'esempio, il codice personalizzato potrebbe risultare più conveniente.
esempi : documenti di legge, script, specifiche di produzione
Approcci tipici: codice personalizzato, modelli personalizzati
Documenti non strutturati
Un buon approccio per i documenti che hanno poca o nessuna struttura è utilizzare approcci basati su frasi o su dimensioni fisse con sovrapposizione.
esempi: contenuto generato dall'utente, ad esempio commenti e suggerimenti aperti da sondaggi, post del forum, recensioni, messaggi di posta elettronica, note personali, note di ricerca
Approcci tipici: Basato sulle frasi o basato sui limiti con sovrapposizione
Sperimentazione
Questo articolo descrive gli approcci di suddivisione in blocchi più adatti per ogni tipo di documento, ma in pratica qualsiasi approccio potrebbe essere appropriato per qualsiasi tipo di documento. Ad esempio, l'analisi basata su frasi potrebbe essere appropriata per documenti altamente strutturati o un modello personalizzato potrebbe essere appropriato per i documenti non strutturati. Parte dell'ottimizzazione della soluzione RAG consiste nell'sperimentare diversi approcci di suddivisione in blocchi. Prendere in considerazione il numero di risorse disponibili, la competenza tecnica delle risorse e il volume di documenti da elaborare. Per ottenere una strategia di suddivisione in blocchi ottimale, osservare i vantaggi e i compromessi di ogni approccio testato per assicurarsi di scegliere l'approccio appropriato per il caso d'uso.