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.
Le pagine web variano notevolmente in termini di dimensioni e struttura. Per un'elaborazione efficiente:
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:
Tag e attributi non standard:
Elementi annidati e deprecati:
Stile e formattazione in linea:
Struttura del documento incoerente:
Problemi di codifica e caratteri:
Script e contenuti dinamici:
Per mitigare l'impatto del vecchio codice HTML sulla qualità dei blocchi durante la scansione web per l'indicizzazione Elasticsearch, considera le seguenti strategie:
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.
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.
Casi d'uso:
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.
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.
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.
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.
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.
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.
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/
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:
Limitazioni:
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.
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:
Limitazioni:
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)
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:
Limitazioni:
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:
Limitazioni:
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)
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:
Limitazioni:
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/
Data di aggiornamento: 15 novembre 2024