Chat con i PDF | Potenziare l’interazione testuale con Python e OpenAI

Chat con i PDF | Potenziamento testuale con Python e OpenAI

Introduzione

In un mondo pieno di informazioni, i documenti PDF sono diventati un elemento essenziale per condividere e preservare dati preziosi. Tuttavia, estrarre informazioni dai PDF non è sempre stato semplice. Ed è qui che “Chat with PDFs” interviene in aiuto: un progetto innovativo che rivoluziona il modo in cui interagiamo con i PDF.

In questo articolo, ti presentiamo il progetto affascinante di “Chat with PDFs”, che combina la potenza delle Language Model Libraries (LLM) e la versatilità della libreria Python PyPDF. Questa fusione unica ti permette di avere conversazioni naturali con i tuoi documenti PDF, rendendo facile porre domande e ottenere risposte rilevanti in contesto.

Obiettivi di Apprendimento

  • Comprendere le Language Model Libraries (LLM) come modelli di intelligenza artificiale avanzati in grado di comprendere i modelli del linguaggio umano e generare risposte significative.
  • Esplorare PyPDF, una libreria Python versatile, per comprendere le sue funzionalità di estrazione, unione e divisione del testo nella manipolazione dei PDF.
  • Riconoscere l’integrazione delle Language Model Libraries (LLM) e PyPDF nella creazione di un chatbot interattivo per conversazioni naturali con i PDF.

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

Comprensione delle Language Model Libraries (LLM)

Il cuore di “Chat with PDFs” risiede nelle Language Model Libraries (LLM), modelli avanzati di intelligenza artificiale addestrati su grandi quantità di dati testuali. Pensaci come esperti linguistici, capaci di comprendere i modelli del linguaggio umano e generare risposte significative.

Per il nostro progetto, le LLM svolgono un ruolo vitale nella creazione di un chatbot interattivo. Questo chatbot può elaborare le tue domande e capire di cosa hai bisogno dai PDF. Il chatbot può fornire risposte e informazioni utili sfruttando la base di conoscenza nascosta nei PDF.

PyPDFs: il tuo assistente PDF super

PyPDF è una libreria Python versatile che semplifica le interazioni con i file PDF. Fornisce agli utenti varie funzionalità, come l’estrazione del testo, la fusione e la divisione dei documenti PDF. Questa libreria è un componente fondamentale del nostro progetto, poiché consente una gestione senza problemi dei PDF e ottimizza l’analisi successiva.

PyPDF ci aiuta a caricare i file PDF ed estrarne il testo all’interno del nostro progetto, preparando il terreno per un’elaborazione e un’analisi efficienti. Con questo assistente potente, puoi interagire con i PDF senza sforzo.

Chat with PDFs libera i documenti PDF dal loro stato statico, unendo insieme le Language Model Libraries (LLM) e PyPDFs. Ora puoi esplorare i tuoi PDF come mai prima d’ora, estrarre informazioni preziose e partecipare a conversazioni significative. Dai documenti accademici ai rapporti aziendali, “Chat with PDFs” rende l’interazione con i PDF un’esperienza piacevole.

Quindi, immergiamoci nel mondo affascinante del progetto “Chat with PDFs”.

Progetto

# Importazione delle librerie necessarie e configurazione delle chiavi API
import os
import pandas as pd
import matplotlib.pyplot as plt
from transformers import GPT2TokenizerFast
from langchain.document_loaders import PyPDFLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import FAISS
from langchain.chains.question_answering import load_qa_chain
from langchain.llms import OpenAI
from langchain.chains import ConversationalRetrievalChain

from key import openaiapi_key
os.environ["OPENAI_API_KEY"] = openaiapi_key

Il codice sopra avvia il progetto “Chat with PDFs” importando le librerie essenziali e configurando le chiavi API. Utilizziamo la libreria ‘os’ per interagire con il sistema operativo, ‘pandas’ per la manipolazione dei dati e ‘matplotlib’ per tracciare grafici. La libreria ‘transformers’ fornisce la classe ‘GPT2TokenizerFast’, essenziale per la tokenizzazione del testo. I moduli ‘langchain’ includono le classi necessarie per il caricamento dei PDF (‘PyPDFLoader’), la suddivisione del testo (‘RecursiveCharacterTextSplitter’), i embeddings (‘OpenAIEmbeddings’), il salvataggio dei vettori (‘FAISS’), le catene di domande e risposte (‘load_qa_chain’), i modelli di linguaggio (‘OpenAI’) e le catene di conversazione (‘ConversationalRetrievalChain’).

PyPDF Loader

Successivamente utilizziamo la classe ‘PyPDFLoader’ per caricare il file PDF e dividerlo in pagine separate. Infine, stampiamo il contenuto della prima pagina per verificare il corretto caricamento e divisione del PDF.

# Metodo semplice - Divisione per pagine
loader = PyPDFLoader("story.pdf")  
# Creiamo un'istanza di 'PyPDFLoader' e passiamo il percorso del file PDF con cui vogliamo lavorare.
pagine = loader.load_and_split()
print(pagine[0])  

Questa sezione riguarda il caricamento e la suddivisione del documento PDF. Vengono illustrati due metodi: il metodo semplice che suddivide il PDF per pagine e il metodo avanzato che prevede la conversione del PDF in testo e la suddivisione in frammenti più piccoli.

# Metodo avanzato - Divisione per frammenti

# Passo 1: Convertire il PDF in testo
import textract
doc = textract.process("story.pdf")

# Passo 2: Salvare come .txt e riaprire (per evitare problemi)
with open('story.txt', 'w') as f:
    f.write(doc.decode('utf-8'))

with open('story.txt', 'r') as f:
    testo = f.read()

# Passo 3: Creare una funzione per contare i token
tokenizer = GPT2TokenizerFast.from_pretrained("gpt2")

def conta_token(testo: str) -> int:
    return len(tokenizer.encode(testo))

# Passo 4: Suddividere il testo in frammenti
text_splitter = RecursiveCharacterTextSplitter(
    # Impostare una dimensione di frammento molto piccola, solo per mostrare.
    dimensione_frammento = 512,
    sovrapposizione_frammento  = 24,
    funzione_lunghezza = conta_token,
)

frammenti = text_splitter.create_documents([testo])

Passaggi per la suddivisione del PDF

Il metodo avanzato suddivide il PDF in frammenti più piccoli per un’elaborazione più efficiente. Ciò viene realizzato attraverso i seguenti passaggi:

Passo 1: Utilizziamo la libreria ‘textract’ per estrarre il testo dal file PDF e lo memorizziamo nella variabile ‘doc’.

Passo 2: Salviamo il testo estratto in un file di testo (‘story.txt’) per evitare eventuali problemi e lo riapriamo in modalità di lettura. Il contenuto viene memorizzato nella variabile ‘testo’.

Passo 3: Definiamo una funzione chiamata ‘conta_token’ per contare il numero di token in un determinato testo. Questa funzione utilizza la classe ‘GPT2TokenizerFast’ per tokenizzare il testo.

Passo 4: Utilizzando la classe ‘RecursiveCharacterTextSplitter’, suddividiamo il ‘testo’ in frammenti più piccoli (‘frammenti’) per garantire un’elaborazione efficiente, con ciascun frammento che ha un limite massimo di token.

# Incorpora il testo e memorizza le incorporazioni
# Ottieni il modello di incorporazione
incorporazioni = OpenAIEmbeddings()  
# Crea il database vettoriale
db = FAISS.from_documents(frammenti, incorporazioni)  

OpenAI Embeddings

In questa sezione, incorporiamo il testo utilizzando la classe ‘OpenAIEmbeddings’, che converte il testo in rappresentazioni numeriche (incorporazioni). Queste incorporazioni facilitano l’archiviazione e l’analisi efficiente dei dati testuali. Successivamente, creiamo un database vettoriale utilizzando la classe ‘FAISS’, che incorpora i frammenti di testo e le loro incorporazioni corrispondenti.

# Configura la funzione di recupero
# Verifica che la ricerca di similarità funzioni
query = "Qual è il nome dell'autore?" 

documenti = db.similarity_search(query)  

documenti[0]  

In questa parte, configuriamo una funzione di recupero. È possibile eseguire una ricerca di similarità con una query di esempio utilizzando il database vettoriale (‘db’). La variabile ‘query’ contiene la domanda che vogliamo porre al chatbot e la variabile ‘documenti’ memorizza i documenti pertinenti che contengono il contesto della query. Successivamente, stampiamo il primo documento restituito dalla ricerca di similarità.

chain = load_qa_chain(OpenAI(temperature=0), chain_type="stuff")
query = "Qual è il nome dell'autore?"  

documenti = db.similarity_search(query) 

chain.run(input_documents=documenti, question=query)  

In questo segmento, creiamo una catena di domande e risposte (‘chain’) che integra la ricerca di similarità con le query dell’utente. Carichiamo il modello di linguaggio ‘OpenAI’ e impostiamo la temperatura a 0 per ottenere risposte deterministiche. Otteniamo una risposta basata sulla base di conoscenza passando i documenti recuperati (‘documenti’) e la domanda dell’utente (‘query’) alla catena.

# Creare un chatbot con memoria di chat
from IPython.display import display 
import ipywidgets as widgets 
qa = ConversationalRetrievalChain.from_llm(OpenAI(temperature=0.1), db.as_retriever()) 

chat_history = [] 
def on_submit(_):  
    query = input_box.value  
    input_box.value = ""  

    if query.lower() == 'exit':  
        print("Grazie per aver utilizzato il chatbot Chat with PDFs!")
        return

    result = qa({"question": query, "chat_history": chat_history})  

    chat_history.append((query, result['answer'])) 

    display(widgets.HTML(f'<b>Utente:</b> {query}'))  
    display(widgets.HTML(f'<b><font color="blue">Chatbot:</font></b>{result["answer"]}')) 

print("Benvenuto nel chatbot Chat with PDFs! Digita 'exit' per interrompere.")  

input_box = widgets.Text(placeholder='Per favore inserisci la tua domanda:')  
input_box.on_submit(on_submit)  
display(input_box)  

Nella sezione finale, introduciamo una funzionalità chatbot in cui gli utenti possono interagire con il chatbot inserendo domande e ottenendo risposte.

Conclusioni

Questo articolo ha esplorato il progetto affascinante “Chat with PDFs” e la sua implementazione passo passo. Abbiamo acquisito una comprensione più profonda delle Librerie di Modelli Linguistici (LLM) e di PyPDFs, due componenti essenziali che alimentano questo strumento innovativo. Ora puoi elaborare ed analizzare documenti PDF senza sforzo, estrarre informazioni preziose e impegnarti in conversazioni interattive con un assistente chatbot. Che tu sia un ricercatore, uno studente o un professionista, “Chat with PDFs” ha rivoluzionato il modo in cui interagiamo con i PDF, rendendo i documenti statici di prima vita con il potere dell’intelligenza artificiale. Buona esplorazione dei PDF!

Punti chiave

  1. LLM permette al chatbot di fornire risposte precise e consapevoli del contesto alle domande degli utenti.
  2. PyPDF semplifica la manipolazione dei PDF, facilitando il lavoro con documenti complessi.
  3. La struttura del codice garantisce un’integrazione fluida delle funzionalità di embedding del testo e ricerca di similarità.
  4. PyPDF consente una gestione senza soluzione di continuità dei PDF, l’estrazione e la manipolazione dei testi.

Domande frequenti

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