Document Loaders
Per chattare con i nostri dati, è essenziale caricarli in un formato che permetta la loro elaborazione. A questo scopo, utilizziamo i Document Loader di LangChain, che facilitano l’accesso e la conversione dei dati da un’ampia gamma di formati e fonti.
Questi Loader sono progettati per gestire le specificità dell’accesso ai dati da sorgenti diverse, quali:
- Siti web
- Database
- YouTube
- Twitter
- Hacker News
- E anche fonti come Figma, Notion, o servizi come Stripe.
Potete trovare maggiori dettagli sulla documentazione ufficiale di LangChain.
Utilizzo di UnstructuredMarkdownLoader
Per lavorare con documenti in formato Markdown, facciamo affidamento su UnstructuredMarkdownLoader. Implementiamo una classe DocumentManager per caricare efficacemente una directory contenente i documenti Markdown:
from langchain_community.document_loaders import DirectoryLoader
from langchain_community.document_loaders import UnstructuredMarkdownLoader
class DocumentManager:
def __init__(self, directory_path, glob_pattern="./*.md"):
self.directory_path = directory_path
self.glob_pattern = glob_pattern
self.documents = []
self.all_sections = []
def load_documents(self): loader = DirectoryLoader(self.directory_path,
glob=self.glob_pattern, show_progress=True,
loader_cls=UnstructuredMarkdownLoader)
self.documents = loader.load()
La classe DocumentManager permette il caricamento di documenti Markdown da una directory specificata. Attraverso l’uso di DirectoryLoader e UnstructuredMarkdownLoader, la classe è in grado di:
- Accedere alla directory: individua la directory dove si trovano i documenti Markdown.
- Filtrare i file: utilizza il
glob_pattern fornito (di default, tutti i file .md) per selezionare i documenti da caricare.
- Caricare i documenti: importa i file filtrati per l’elaborazione successiva.
Text Splitters
I Text Splitters giocano un ruolo fondamentale nell’elaborazione del testo, permettendoci di suddividere documenti complessi in parti più gestibili. La sfida principale in questo processo è preservare le relazioni semantiche tra i segmenti, per non perdere le relazioni significative tra i blocchi.
Prendiamo come esempio la descrizione della scheda grafica GeForce RTX 4090:
- Parte 1: GeForce RTX 4090, oltre la velocità
- Parte 2: 24 GB di memoria per offrire l’esperienza definitiva per giocatori e creativi.
Una suddivisione inadeguata del testo potrebbe separare informazioni strettamente correlate, come nel caso delle specifiche della GeForce RTX 4090, compromettendo la chiarezza dell’informazione. Per questo motivo, è cruciale affidarsi a Text Splitters avanzati, capaci di riconoscere e mantenere intatte le unità di significato all’interno del testo.
LangChain propone diverse soluzioni per affrontare questa sfida, visti in nostri documenti in md utilizzeremo il MarkdownHeaderTextSplitter. Per approfondire le diverse tipologie di splitter disponibili, potete trovare maggiori informazioni sulla documentazione ufficiale di LangChain.
# Class DocumentManager
from langchain.text_splitter import MarkdownHeaderTextSplitter
def split_documents(self):
headers_to_split_on = [("#", "Header 1"),
("##", "Header 2"),
("###", "Header 3"),
("####", "Header 4")]
text_splitter = MarkdownHeaderTextSplitter(headers_to_split_on=headers_to_split_on)
for doc in self.documents:
sections = text_splitter.split_text(doc.page_content)
self.all_sections.extend(sections)