Sbloccare LangChain & Flan-T5 XXL | Una guida per un’efficiente interrogazione dei documenti

Sbloccare LangChain & Flan-T5 XXL | Guida interrogazione documenti efficiente

Introduzione

Una specifica categoria di modelli di intelligenza artificiale noti come modelli di linguaggio di grandi dimensioni (LLM) è progettata per comprendere e generare testi simili a quelli umani. Il termine “grande” è spesso quantificato dal numero di parametri che possiedono. Ad esempio, il modello GPT-3 di OpenAI ha 175 miliardi di parametri. Può essere utilizzato per una varietà di compiti, come la traduzione di testi, la risposta a domande, la scrittura di saggi, la sintesi di testi. Nonostante l’abbondanza di risorse che dimostrano le capacità dei LLM e forniscono indicazioni su come configurare applicazioni di chat con essi, ci sono pochi sforzi che esaminano approfonditamente la loro idoneità per scenari aziendali reali. In questo articolo, imparerai come creare un sistema di interrogazione di documenti utilizzando LangChain & Flan-T5 XXL per costruire applicazioni basate su modelli di linguaggio di grandi dimensioni.

Obiettivi di Apprendimento

Prima di addentrarci nelle complessità tecniche, stabiliamo gli obiettivi di apprendimento di questo articolo:

  • Comprendere come LangChain può essere utilizzato per costruire applicazioni basate su modelli di linguaggio di grandi dimensioni
  • Una panoramica concisa del framework di testo a testo e del modello Flan-T5
  • Come creare un sistema di interrogazione di documenti utilizzando LangChain & qualsiasi modello LLM

Immergiamoci ora in queste sezioni per comprendere ciascuno di questi concetti.

Questo articolo è stato pubblicato come parte del Data Science Blogathon.

Ruolo di LangChain nella Costruzione di Applicazioni LLM

Il framework LangChain è stato progettato per lo sviluppo di varie applicazioni come chatbot, domande-risposte generative (GQA) e sintesi che sfruttano le capacità dei modelli di linguaggio di grandi dimensioni (LLM). LangChain fornisce una soluzione completa per la costruzione di sistemi di interrogazione di documenti. Ciò comporta la pre-elaborazione di un corpus attraverso la suddivisione in chunk, la conversione di questi chunk in uno spazio vettoriale, l’individuazione di chunk simili quando viene posta una query e il ricorso a un modello di linguaggio per raffinare i documenti recuperati in una risposta appropriata.

Panoramica del Modello Flan-T5

Flan-T5 è un modello LLM open source disponibile commercialmente sviluppato dai ricercatori di Google. È una variante del modello T5 (Text-To-Text Transfer Transformer). T5 è un modello di linguaggio all’avanguardia addestrato in un framework “testo-a-testo”. È addestrato per eseguire una varietà di compiti di NLP convertendo i compiti in un formato basato su testo. FLAN è l’abbreviazione di Finetuned Language Net.

Addentriamoci nella Costruzione del Sistema di Interrogazione di Documenti

Possiamo costruire questo sistema di interrogazione di documenti sfruttando il modello LangChain e Flan-T5 XXL direttamente nella versione gratuita di Google Colab. Per eseguire il codice seguente in Google Colab, è necessario scegliere “T4 GPU” come runtime. Segui i passaggi seguenti per costruire il sistema di interrogazione di documenti:

1: Importazione delle Librerie Necessarie

Dovremo importare le seguenti librerie:

from langchain.document_loaders import TextLoader  #per file di testo
from langchain.text_splitter import CharacterTextSplitter #suddivisione del testo
from langchain.embeddings import HuggingFaceEmbeddings #per l'uso di modelli HugginFace
from langchain.vectorstores import FAISS  
from langchain.chains.question_answering import load_qa_chain
from langchain.chains.question_answering import load_qa_chain
from langchain import HuggingFaceHub
from langchain.document_loaders import UnstructuredPDFLoader  #caricamento di PDF
from langchain.indexes import VectorstoreIndexCreator #indicizzazione del database vettorizzato con chromadb
from langchain.chains import RetrievalQA
from langchain.document_loaders import UnstructuredURLLoader  #caricamento di URL nel caricatore di documenti
from langchain.chains.question_answering import load_qa_chain
from langchain import HuggingFaceHub
import os
os.environ["HUGGINGFACEHUB_API_TOKEN"] = "xxxxx"

2: Caricamento del PDF utilizzando PyPDFLoader

Utilizziamo qui PyPDFLoader dalla libreria LangChain per caricare il nostro file PDF – “Data-Analysis.pdf”. L’oggetto “loader” ha un attributo chiamato “load_and_split()” che suddivide il PDF in base alle pagine.

#import csvfrom langchain.document_loaders import PyPDFLoader
# Carica il file PDF dalla directory di lavoro corrente
loader = PyPDFLoader("Data-Analysis.pdf")
# Suddivide il PDF in pagine
pages = loader.load_and_split()

3: Divisione del testo in base a una dimensione di chunk

I modelli utilizzati per generare vettori di incorporamento hanno limiti massimi sui frammenti di testo forniti in input. Se utilizziamo questi modelli per generare incorporamenti per i nostri dati testuali, diventa importante suddividere i dati in una dimensione specifica prima di passarli a questi modelli. Qui utilizziamo RecursiveCharacterTextSplitter per suddividere i dati, che funziona prendendo un grande testo e suddividendolo in base a una dimensione di chunk specificata. Lo fa utilizzando un insieme di caratteri.

#import from langchain.text_splitter import RecursiveCharacterTextSplitter
# Definisci la dimensione del chunk, sovrapposizione e separatori
text_splitter = RecursiveCharacterTextSplitter(
    chunk_size=1024,
    chunk_overlap=64,
    separators=['\n\n', '\n', '(?=>\. )', ' ', '']
)
docs  = text_splitter.split_documents(pages)

4: Recupero di incorporamenti numerici per il testo

Per rappresentare numericamente dati non strutturati come testo, documenti, immagini, audio, ecc., abbiamo bisogno di incorporamenti. La forma numerica cattura il significato contestuale di ciò che stiamo incorporando. Qui utilizziamo l’oggetto HuggingFaceHubEmbeddings per creare incorporamenti per ogni documento. Questo oggetto utilizza il modello transformer di HuggingFaceHub “all-mpnet-base-v2” per mappare frasi e paragrafi in uno spazio vettoriale denso a 768 dimensioni.

# Incorporamenti
from langchain.embeddings import HuggingFaceEmbeddings
embeddings = HuggingFaceEmbeddings()

5: Memorizzazione degli incorporamenti in un Vector Store

Ora abbiamo bisogno di un Vector Store per i nostri incorporamenti. Qui stiamo utilizzando FAISS. FAISS, abbreviazione di Facebook AI Similarity Search, è una potente libreria progettata per la ricerca e il clustering efficienti di vettori densi che offre una serie di algoritmi che possono cercare attraverso insiemi di vettori di qualsiasi dimensione, anche quelli che possono superare la capacità di RAM disponibile.

#Crea il database vettorializzato
# Vectorstore: https://python.langchain.com/en/latest/modules/indexes/vectorstores.html
from langchain.vectorstores import FAISS
db = FAISS.from_documents(docs, embeddings)

6: Ricerca di similarità con Flan-T5 XXL

Ci connettiamo qui all’hugging face hub per recuperare il modello Flan-T5 XXL.

Possiamo definire una serie di impostazioni del modello, come la temperatura e la lunghezza massima.

La funzione load_qa_chain fornisce un metodo semplice per fornire documenti a un LLM. Utilizzando il tipo di catena come “stuff”, la funzione prende una lista di documenti, li combina in un’unica richiesta e quindi passa quella richiesta al LLM.

llm=HuggingFaceHub(repo_id="google/flan-t5-xxl", model_kwargs={"temperature":1, "max_length":1000000})
chain = load_qa_chain(llm, chain_type="stuff")

#INTERROGAZIONE
query = "Spiega in dettaglio cos'è l'analisi dei dati quantitativi?"
docs = db.similarity_search(query)
chain.run(input_documents=docs, question=query)

7: Creazione di una catena QA con il modello Flan-T5 XXL

Utilizza RetrievalQAChain per recuperare documenti utilizzando un Retriever e quindi utilizza una catena di QA per rispondere a una domanda basata sui documenti recuperati. Combina il modello di linguaggio con le capacità di recupero di VectorDB

from langchain.chains import RetrievalQA
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", 
retriever=db.as_retriever(search_kwargs={"k": 3}))

8: Interrogare il nostro PDF

query = "Quali sono i diversi tipi di analisi dei dati?"
qa.run(query)

#Output
"Analisi dei dati descrittiva Analisi dei dati basata sulla teoria Analisi dei dati basata su dati o narrazione"

query = "Qual è il significato dell'Analisi dei Dati Descrittiva?"
qa.run(query)#import csv

#Output
"L'analisi dei dati descrittiva si occupa esclusivamente di elaborare e riassumere i dati."

Applicazioni nel mondo reale

Nell’attuale era di sovrabbondanza di dati, c’è una sfida costante nell’ottenere informazioni rilevanti da una grande quantità di dati testuali. I motori di ricerca tradizionali spesso non riescono a fornire risposte accurate e contestualizzate a specifiche richieste degli utenti. Di conseguenza, è emersa una crescente domanda di metodologie sofisticate di elaborazione del linguaggio naturale (NLP) con l’obiettivo di facilitare i sistemi di risposta a domande su documenti (DQA). Un sistema di interrogazione di documenti, come quello che abbiamo creato, potrebbe essere estremamente utile per automatizzare l’interazione con qualsiasi tipo di documento come PDF, fogli di calcolo Excel, file HTML e altri ancora. Utilizzando questo approccio, è possibile estrarre numerosi insights di valore da collezioni estese di documenti consapevoli del contesto.

Conclusioni

In questo articolo, abbiamo iniziato discutendo di come poter sfruttare LangChain per caricare dati da un documento PDF. Abbiamo esteso questa capacità ad altri tipi di documenti come CSV, HTML, JSON, Markdown e altro ancora. Abbiamo inoltre imparato come suddividere i dati in base a una dimensione specifica, che è un passaggio necessario prima di generare le rappresentazioni dei testi. Successivamente, abbiamo ottenuto le rappresentazioni dei documenti utilizzando HuggingFaceHubEmbeddings. Dopo aver memorizzato le rappresentazioni in un archivio vettoriale, abbiamo combinato il recupero con il nostro modello LLM ‘Flan-T5 XXL’ nella risposta alle domande. I documenti recuperati e una domanda inserita dall’utente sono stati passati al LLM per generare una risposta alla domanda posta.

Punti chiave

  • LangChain offre un framework completo per un’interazione senza soluzione di continuità con LLM, fonti di dati esterne, prompt e interfacce utente. Consente la creazione di applicazioni uniche basate su un LLM concatenando componenti da moduli multipli.
  • Flan-T5 è un LLM open source disponibile commercialmente. È una variante del modello T5 (Text-To-Text Transfer Transformer) sviluppato da Google Research.
  • Un archivio vettoriale memorizza i dati sotto forma di vettori ad alta dimensione. Questi vettori sono rappresentazioni matematiche di varie caratteristiche o attributi. Gli archivi vettoriali sono progettati per gestire efficientemente vettori densi e offrire funzionalità avanzate di ricerca di similarità.
  • Il processo di creazione di un sistema di domande e risposte basato su documenti utilizzando il modello LLM e LangChain comporta il recupero e il caricamento di un file di testo, la suddivisione del documento in sezioni gestibili, la conversione di queste sezioni in rappresentazioni vettoriali, la memorizzazione in un database vettoriale e la creazione di una catena di QA per consentire la risposta alle domande sul documento.

Domande frequenti

I media mostrati in questo articolo non sono di proprietà di Analytics Vidhya e vengono utilizzati a discrezione dell’autore.