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)