Scopri di più su ciò che il RAG Cookbook ha da offrire per approfondire le soluzioni RAG di oggi

Un leadspace ricolorato che utilizza come base il leadspace Watson for Customer Care.
Informazioni generali

Nel campo della scansione web e dell'indicizzazione dei documenti, metodologie efficaci di scansione web sono fondamentali per ottimizzare le prestazioni e la rilevanza delle ricerche. Quando si lavora con pagine web HTML o PDF, la strategia che si adotta può influire significativamente sull'efficienza e l'accuratezza della tua applicazione di ricerca. Ecco una guida completa a metodologie di divisione in blocchi efficaci per diverse circostanze, in particolare nel contesto dell'utilizzo di Elasticsearch come database vettoriale. 

 

Segmentazione dei documenti

Le pagine web variano notevolmente in termini di dimensioni e struttura. Per un'elaborazione efficiente:

  • Analisi HTML: suddivide le pagine HTML in blocchi gestibili in base ai tag HTML (ad esempio, <p> per i paragrafi, <div> per le sezioni).
  • Estrazione di contenuti: si concentra sull'estrazione di contenuti significativi come il testo principale, le intestazioni e i dati strutturati.
Strategia di divisione in blocchi
  • Per URL: tratta ogni URL come un documento separato. Questo metodo è semplice ed utile per siti web in cui ogni pagina è relativamente piccola e autonoma.
  • Per sezioni di pagina: segmenta i documenti in sezioni significative (ad esempio articoli, post sul blog). Questo approccio è vantaggioso per contenuti di lunga durata e siti con tipi di contenuti diversi.
  • Lunghezza del contenuto: evita blocchi estremamente grandi; trova un equilibrio tra granularità per la pertinenza della ricerca e le prestazioni. Blocchi più piccoli possono migliorare la precisione della ricerca ma potrebbero aumentare il sovraccarico di elaborazione.
Pipeline di elaborazione
  • Usa librerie come Beautiful Soup o Scrapy per il web scraping.
  • Normalizza il testo rimuovendo i tag HTML e gestendo i problemi di codifica.
  • Applica analizzatori specifici della lingua (ad esempio, stemming, stop words) per migliorare la precisione della ricerca.
Sfide con il vecchio codice HTML

Quando la scansione web coinvolge codice HTML più vecchio, può avere un impatto significativo sulla qualità dei blocchi estratti per l'indicizzazione in Elasticsearch. Ecco alcune sfide chiave e strategie di mitigazione:

Incongruenze strutturali

Tag e attributi non standard:

  • Il codice HTML più vecchio può utilizzare tag o attributi non standard che i parser moderni potrebbero non gestire correttamente o comprendere appieno.
  • Questo può portare a un'estrazione incompleta o errata dei segmenti di contenuto, specialmente se il crawler si basa su librerie di parsing HTML standard.

Elementi annidati e deprecati:

  • Il vecchio codice HTML spesso include elementi annidati o tag obsoleti come <font>, <center> o <strike>, che potrebbero non essere analizzati correttamente dai moderni parser HTML.
  • Di conseguenza, la segmentazione dei contenuti basata su questi elementi può produrre blocchi frammentati o strutturati in modo errato.

Qualità e pertinenza dei contenuti

Stile e formattazione in linea:

  • L'HTML più vecchio può fare molto affidamento su tag di styling e formattazione inline (<font>, <b>, <i>, ecc.), che possono sovraccaricare il testo estratto e ridurre la qualità dei blocchi indicizzati.
  • La qualità della ricerca potrebbe risentirne, in quanto Elasticsearch analizza e indicizza questi blocchi, incidendo potenzialmente sulla pertinenza nei risultati di ricerca.

Struttura del documento incoerente:

  • La mancanza di una struttura del documento standardizzata nelle pagine HTML più vecchie può portare a dimensioni dei blocchi e segmenti di contenuto incoerenti.
  • Questa incoerenza rende difficile stabilire confini chiari tra sezioni di contenuto significative, influenzando la granularità dei blocchi e la rilevanza della ricerca.

Sfide tecniche

Problemi di codifica e caratteri:

  • Le pagine HTML più vecchie possono avere problemi di codifica, come set di caratteri errati o entità (&nbsp;, &lt;), che devono essere gestiti correttamente durante l'estrazione del testo.
  • La mancata gestione corretta può causare testo confuso o una rappresentazione errata del contenuto nei blocchi indicizzati.

Script e contenuti dinamici:

  • Gli elementi dinamici e gli script incorporati nelle pagine HTML più vecchie (ad esempio, JavaScript, Flash) potrebbero non essere elaborati efficacemente dai web crawler di base.
  • Ciò può portare a un'estrazione incompleta dei contenuti o all'omissione di testo generato dinamicamente, compromettendo la completezza dei blocchi indicizzati.

Strategie di mitigazione

Per mitigare l'impatto del vecchio codice HTML sulla qualità dei blocchi durante la scansione web per l'indicizzazione Elasticsearch, considera le seguenti strategie:

  • Usa librerie di parsing robuste: impiega librerie avanzate di parsing HTML che possono gestire varie versioni HTML ed elementi non standard.
  • Normalizza il testo: pre-elabora il testo estratto per normalizzare la formattazione e rimuovere tag o attributi non necessari.
  • Pulisci i contenuti: filtra gli elementi irrilevanti o obsoleti durante il processo di estrazione per migliorare la qualità dei blocchi indicizzati.
  • Adatta la logica di estrazione: sviluppa una logica personalizzata per gestire peculiarità specifiche delle pagine HTML più vecchie, garantendo una segmentazione più accurata in blocchi di contenuti significativi.
  • Aggiornamenti regolari: mantieni la logica del crawler e analizza le librerie per adattarsi ai cambiamenti degli standard web e delle pratiche HTML nel tempo.

Affrontando queste sfide in modo proattivo, puoi migliorare la qualità dei segmenti di contenuto estratti da pagine HTML più vecchie, migliorando così l'efficacia complessiva e la rilevanza delle applicazioni di ricerca basate su Elasticsearch.

Indicizzazione dei PDF

Estrazione di contenuti PDF

  • Estrai testo dai PDF, tenendo conto di elementi come titoli, paragrafi e tabelle.
  • Gestisci separatamente i metadati (titolo, autore, data) per l'indicizzazione.

Strategia di divisione in blocchi

  • Per documento: tratta ogni file PDF come un singolo documento da indicizzare.
  • Per pagina: in alternativa, dividi i PDF in blocchi in base alle pagine o alle sezioni logiche, se necessario.
  • Blocchi di testo: segmenta blocchi di grandi dimensioni in unità più piccole in base alle interruzioni naturali del contenuto (ad esempio, paragrafi).

Sfide, fatti e miti sull'estrazione del testo

  • Fatto: i PDF possono contenere immagini o documenti scansionati, che richiedono l'OCR (Optical Character Recognition) per l'estrazione del testo. watsonx Discovery ha l'OCR, quindi non dovrebbe essere una sfida.
  • Gestisce la codifica del testo e i problemi di formattazione propri dei PDF (ad esempio, sillabazione, interruzioni di riga).

Pipeline di indicizzazione

  • Normalizza il testo estratto eliminando i caratteri speciali e gestendo la sillabazione.
  • Applica analizzatori specifici per linguaggio al testo elaborato per migliorare le funzionalità di ricerca.
Considerazioni

Considerazioni generali

  • Prestazioni: bilancia le dimensioni dei blocchi per un'indicizzazione efficiente e le prestazioni delle query.
  • Pertinenza: assicurati che i blocchi catturino segmenti di contenuto significativi per ottenere risultati di ricerca accurati.
  • Overhead di indicizzazione: considera il sovraccarico dell'indicizzazione di grandi volumi di dati; ottimizza le impostazioni di indicizzazione e l'allocazione degli shard in Elasticsearch.
  • Qualità della ricerca: testa e perfeziona le query di ricerca per garantire che forniscano risultati pertinenti su documenti suddivisi.

Scelta di un metodo di suddivisione in blocchi

  • Caratteristiche del contenuto: per messaggi brevi, la divisione in blocchi a livello di frase può essere sufficiente. Per i documenti lunghi, prendi in considerazione la suddivisione in blocchi in base al contenuto o addirittura esplora la suddivisione in blocchi eterogenei con un mix di dimensioni dei blocchi.
  • Requisiti applicativo: se l'efficienza computazionale è fondamentale, la divisione in blocchi a dimensione fissa potrebbe essere un buon punto di partenza. Se il recupero ricco di contesto è fondamentale, la divisione in blocchi relativa al contenuto è un'opzione migliore.

In sintesi, la migliore strategia di divisione in blocchi per utilizzare Elasticsearch con la scansione web o indicizzazione PDF consiste nel suddividere i contenuti in unità gestibili (documenti, pagine, sezioni) che bilanciano granularità con efficienza nell'indicizzazione e nelle interrogazioni. Adatta la strategia in base alla natura della fonte di contenuto (ad esempio, pagine web vs. PDF) e ai requisiti specifici della tua applicazione di ricerca. Implementando queste metodologie, puoi migliorare le prestazioni e l'accuratezza del tuo motore di ricerca, offrendo agli utenti risultati più rilevanti e precisi.

Confronto delle metodologie di divisione in blocchi

Benefici Semplicità, facile da gestire

 

Casi d'uso:

  • <b style=" font-family: inherit; ">Websites with small, self-contained pages:<span style=" font-family: inherit;
  • "> Facile gestire ogni URL come documento separato.
  • Situazioni in cui ogni URL rappresenta un documento distinto: Garantisce chiarezza e semplicità nella gestione dei documenti.
Benefici Granularità migliorata, rilevanza aumentata per le query di ricerca

 

Casi d'uso: 

- Siti web con contenuti lunghi: migliora la rilevanza della ricerca segmentando gli articoli o i post di grandi dimensioni.

- Siti con tipi di contenuto diversificati: consente una migliore organizzazione e recupero di contenuti diversi.

 

Benefici Equilibrio tra granularità e prestazioni, maggiore precisione di ricerca

 

Casi d'uso: 

- Siti web ricchi di contenuti: garantisce che i blocchi non siano troppo grandi, migliorando la precisione e le prestazioni della ricerca.

- Siti web in cui non sono desiderabili blocchi estremamente grandi: bilancia la necessità di un'indicizzazione dettagliata con le prestazioni.

Benefici Efficienza computazionale, prestazioni prevedibili

 

Casi d'uso: 

- Applicazioni con elevati requisiti di efficienza computazionale: prestazioni prevedibili e utilizzo delle risorse.

- Attività di trattamento dei dati standardizzate: adatto per ambienti in cui dimensioni uniformi dei blocchi sono vantaggiose.

Benefici Controllo dettagliato sui contenuti, risultati di ricerca altamente pertinenti

 

Casi d'uso: 

 

- Indicizzazione di messaggi brevi: ideale per la ricerca e il recupero preciso di testi brevi.

Applicazioni di analisi del testo: consente un'analisi dettagliata e la comprensione di segmenti brevi.

Benefici Divisione in blocchi basata sul contesto, migliora la pertinenza della ricerca

 

Casi d'uso: 

- Documenti lunghi con contenuti vari: garantisce che i blocchi mantengano un contesto significativo.

- Analisi dettagliata dei contenuti: migliora la qualità dei risultati della ricerca, mantenendo il contesto.

Benefici Segmentazione logica, leggibilità migliorata

 

Casi d'uso:

- Indicizzazione dei PDF: tratta ogni pagina come un'unità logica, migliorando la leggibilità e la ricercabilità.

Documenti in cui ogni pagina è un'unità distinta: mantiene l'integrità dei contenuti basati sulle pagine.

 

Benefici Interruzioni naturali nei contenuti, migliore gestione dei contenuti strutturati

 

Casi d'uso: 

Documenti di grandi dimensioni con interruzioni di paragrafo chiare: facilita la lettura e l'elaborazione.

- Indicizzazione strutturata dei documenti: assicura che le sezioni significative siano indicizzate separatamente.

Soluzioni IBM

Divisione in blocchi in watsonx

La piattaforma IBM® watsonx consente e accelera l'implementazione dei pattern RAG e consente la suddivisione e la comprensione dei documenti.  watsonx Orchestrate insieme a watsonx Discovery consente la suddivisione dei documenti da implementazioni a uso limitato di codice/no-code a soluzioni più personalizzate. 

I metodi elencati sono considerazioni comuni sulle tecniche di divisione in blocchi da implementare in un caso d'uso RAG. La tecnica ibrida è disponibile con watsonx per fornire maggiore precisione e velocità. L'intero processo divide un documento in singole frasi, per garantire una granularità significativa. Quindi, le frasi vengono raggruppate in blocchi utilizzando un LLM. L'LLM valuta se il contesto della frase corrisponde al blocco, altrimenti viene avviato un nuovo blocco. Utilizzando questo blocco, vengono estratti metadati significativi tramite LLM, tra cui titolo, ID e riepilogo.

Per ulteriori informazioni su questo metodo, fare riferimento al blog IBM: https://developer.ibm.com/articles/awb-enhancing-llm-performance-document-chunking-with-watsonx/

Strumenti open source

Divisione in blocchi sintattica

La divisione in blocchi sintattica utilizza un approccio guidato dalla struttura per separare il testo in base alla formattazione del documento. Nella maggior parte dei casi e in modo naturale, i titoli delle sezioni vengono utilizzati come separatori. Tuttavia, con i formati di documento senza informazioni codificate (ad esempio PDF), le dimensioni dei font possono essere usate come indicatori per separare i blocchi.

Punti di forza:

  • Implementazione semplice

Limitazioni:

  • L'algoritmo presuppone una gerarchia informativa; quindi, i marcatori sintattici possono essere mancati.

La divisione in blocchi sintattica può essere vantaggiosa nelle circostanze in cui la struttura topologica del documento è prevedibile e formattata in modo pulito per la suddivisione.

Divisione in blocchi a dimensione fissa

Nella divisione in blocchi a dimensione fissa, i dati di ingresso sono suddivisi in blocchi di uguale dimensione. Questo metodo spesso separa il testo in dimensioni predefinite in base al numero di token. Questo metodo è semplice da implementare e comprendere, rendendolo adatto a compiti in cui i dati in input hanno una dimensione costante e prevedibile.

Punti di forza:

  • Facile da implementare e da capire
  • Computazionalmente efficiente

Limitazioni:

  • Rigido e non può adattarsi al contesto del testo
  • Può omettere informazioni contestuali importanti nel testo

La divisione in blocchi a dimensione fissa è meglio utilizzata nei casi in cui i dati di input sono prevedibili e non richiedono un contesto approfondito.

from langchain.text_splitter import CharacterTextSplitter

# Example text
text = "The quick brown fox jumps over the lazy dog."

# Create a splitter for fixed size chunks
splitter = CharacterTextSplitter(chunk_size=10, chunk_overlap=0)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

Chunking semantico

La divisione in blocchi semantica separa il testo in base al contesto e raggruppa i componenti significativi utilizzando tecniche algoritmiche. La divisione in blocchi semantica è importante quando il significato del contenuto è fondamentale per ottenere una risposta, come nel caso della documentazione legale.

Punti di forza:

  • I dati recuperati hanno maggiore accuratezza e rilevanza
  • Coesione della base di conoscenza mantenuta nella divisione in blocchi

Limitazioni:

  • Implementazione complessa mediante algoritmi sofisticati
  • Computazionalmente più esteso

Esempio:

from langchain.text_splitter import RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Create a splitter for semantic chunking
splitter = RecursiveCharacterTextSplitter(chunk_size=50, chunk_overlap=10)

# Split the text
chunks = splitter.split(text)

# Print the chunks
for chunk in chunks:
 print(chunk)

La divisione in blocchi ibrida utilizza le informazioni contestuali e strutturali per combinare i punti di forza della divisione a dimensione fissa e della divisione semantica. Questo metodo è particolarmente indicato per situazioni in cui è presente un ampio corpus di dati in diversi caso d'uso, con formattazione e materiale diversi, come ad esempio una knowledge base aziendale.

Punti di forza:

  • Precisione e velocità ottimali con tecniche di divisione in blocchi flessibili basate sulla struttura e sul contesto della knowledge base

Limitazioni:

  • Maggiore manutenzione e impegno da implementare a causa degli elevati requisiti di risorse

Esempio:

from langchain.text_splitter import CharacterTextSplitter, RecursiveCharacterTextSplitter

# Example text
text = "Steve Jobs was born in California. He co-founded Apple in 1976."

# Fixed-size splitter
fixed_size_splitter = CharacterTextSplitter(chunk_size=50, chunk_overlap=10)
fixed_size_chunks = fixed_size_splitter.split(text)

# Semantic splitter
semantic_splitter = RecursiveCharacterTextSplitter(chunk_size=100, chunk_overlap=20)
semantic_chunks = semantic_splitter.split(text)

# Print the fixed-size chunks
print("Fixed-size chunks:")
for chunk in fixed_size_chunks:
 print(chunk)

# Print the semantic chunks
print("\nSemantic chunks:")
for chunk in semantic_chunks:
 print(chunk)

Agentic chunking

Questa strategia di divisione in blocchi prevede l'uso di modelli linguistici di grandi dimensioni (LLM) per determinare la lunghezza e il contenuto appropriati dei blocchi di testo in base al contesto in cui saranno utilizzati. La strategia si ispira al concetto di proposizioni, che prevede l'estrazione di affermazioni autonome da un testo grezzo.

Per implementare questo approccio, la strategia utilizza un template di recupero proposizionale fornito da Langchain per estrarre le proposizioni dal testo. Queste proposizioni vengono poi inviate a un agente basato su LLM, che determina se ogni proposizione debba essere inclusa in un blocco esistente o se ne debba essere creato un nuovo.

L'agente basato su LLM utilizza una varietà di fattori per determinare, inclusa la rilevanza della proposizione per il blocco corrente, la coerenza complessiva del blocco e gli obiettivi e le intenzioni del modello. Utilizzando gli LLM in questo modo, la strategia mira a generare blocchi di testo che non siano solo coerenti e contestualmente appropriati, ma anche allineati con gli obiettivi e le intenzioni del modello.

Punti di forza:

  • Autonomia: gli LLM possono prendere decisioni su quali proposizioni includere in un blocco e quando crearne uno nuovo senza intervento umano, consentendo una generazione di testo più efficiente e scalabile.
  • Coerenza: gli LLM sono progettati per generare testo coerente e contestualmente appropriato, il che può aiutare a garantire che i blocchi generati siano significativi e facili da comprendere.

Limitazioni:

  • Computazionalmente esaustivo: generare testo usando LLM può essere computazionalmente costoso, soprattutto per modelli grandi o complessi. Questo può limitare la scalabilità e la praticità dell'utilizzo degli LLM per determinate applicazioni.
  • Allucinazioni: questo può accadere quando il modello genera un testo basato sui propri pregiudizi o presupposti interni, piuttosto che sui dati o sul contesto reale.

Ora, come possiamo implementare alcune di queste tecniche nella documentazione a blocchi? Esistono molte librerie open source per eseguire questi algoritmi e tecniche di divisione in blocchi. Un buon punto di partenza è usare gli splitter di testo Langchain; fare riferimento alla seguente documentazione sugli specifici divisori di testo disponibili. https://python.langchain.com/v0.1/docs/modules/data_connection/document_transformers/

Fasi successive

Ricevi gli ultimi modelli tecnologici, le architetture di soluzioni e le pubblicazioni sull'architettura di IBM.

  1. Vai all'IBM Architecture Center
Collaboratori

Haneen Bakbak, Luke Major

Data di aggiornamento: 15 novembre 2024