Chatbot per i tuoi documenti Google utilizzando Langchain e OpenAI

Chatbot per documenti Google con Langchain e OpenAI

Introduzione

In questo articolo, creeremo un Chatbot per i tuoi documenti di Google con OpenAI e Langchain. Ma perché dobbiamo farlo in primo luogo? Diventerebbe noioso copiare e incollare il contenuto dei tuoi documenti di Google in OpenAI. OpenAI ha un limite di token di caratteri in cui puoi aggiungere solo quantità specifiche di informazioni. Quindi, se vuoi farlo su larga scala o vuoi farlo in modo programmato, avrai bisogno di una libreria che ti aiuti; ed è qui che entra in gioco Langchain. Puoi creare un impatto aziendale collegando Langchain a Google Drive e Open AI in modo da poter riassumere i tuoi documenti e fare domande correlate. Questi documenti potrebbero essere documenti di prodotto, documenti di ricerca o la base di conoscenza interna che la tua azienda sta utilizzando.

Obiettivi di apprendimento

  • Puoi imparare come recuperare il contenuto dei tuoi documenti di Google usando Langchain.
  • Impara come integrare il contenuto dei tuoi documenti di Google con OpenAI LLM.
  • Puoi imparare a riassumere e fare domande sul contenuto del tuo documento.
  • Puoi imparare come creare un Chatbot che risponde alle domande basandosi sui tuoi documenti.

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

Carica i tuoi documenti

Prima di iniziare, è necessario configurare i nostri documenti su Google Drive. La parte critica qui è un caricatore di documenti che Langchain fornisce chiamato GoogleDriveLoader. Usando questo, puoi inizializzare questa classe e quindi passarle un elenco di ID dei documenti.

from langchain.document_loaders import GoogleDriveLoader
import os
loader = GoogleDriveLoader(document_ids=["ID DEI TUOI DOCUMENTI"],
                          credentials_path="PERCORSO AL FILE credentials.json")
docs = loader.load()

Puoi trovare l’ID del tuo documento dal link del documento. Puoi trovare l’ID tra le barre oblique dopo /d/ nel link.

Ad esempio, se il tuo link del documento è https://docs.google.com/document/d/1zqC3_bYM8Jw4NgF, il tuo ID del documento è “1zqC3_bYM8Jw4NgF”.

Puoi passare l’elenco di questi ID dei documenti al parametro document_ids e la parte interessante è che puoi anche passare un ID della cartella di Google Drive che contiene i tuoi documenti. Se il tuo link della cartella è https://drive.google.com/drive/u/0/folders/OuKkeghlPiGgWZdM, l’ID della cartella è “OuKkeghlPiGgWZdM1TzuzM”.

Autorizza le credenziali di Google Drive

Passo 1:

Abilita l’API di GoogleDrive utilizzando questo link https://console.cloud.google.com/flows/enableapi?apiid=drive.googleapis.com. Assicurati di aver effettuato l’accesso allo stesso account Gmail in cui sono archiviati i tuoi documenti nel drive.

Passo 2: Vai alla console di Google Cloud cliccando su questo link. Seleziona “ID client OAuth”. Imposta il tipo di applicazione come “Applicazione desktop”.

Passo 3: Dopo aver creato il client OAuth, scarica il file delle credenziali cliccando su “DOWNLOAD JSON”. Puoi seguire i passaggi di Google se hai dubbi durante la creazione di un file di credenziali.

Passo 4: Aggiorna il client Python delle API di Google eseguendo il seguente comando pip

pip install --upgrade google-api-python-client google-auth-httplib2 google-auth-oauthlib

Quindi dobbiamo passare il percorso del nostro file JSON a GoogleDriveLoader.

Riassumendo i tuoi documenti

Assicurati di avere a disposizione le tue chiavi API di OpenAI. Se non le hai, segui i passaggi seguenti:

1. Vai su ‘https://openai.com/ e crea il tuo account.

2. Accedi al tuo account e seleziona ‘API’ nella tua dashboard.

3. Ora fai clic sull’icona del tuo profilo, quindi seleziona ‘Visualizza chiavi API’.

4. Seleziona ‘Crea nuova chiave segreta’, copiala e salvata.

Successivamente, dobbiamo caricare il nostro OpenAI LLM. Riassumiamo i documenti caricati utilizzando OpenAI. Nel codice sottostante, abbiamo utilizzato un algoritmo di sintesi chiamato summarize_chain fornito da langchain per creare un processo di sintesi che abbiamo memorizzato in una variabile chiamata chain che prende in input i documenti e produce riassunti concisi utilizzando l’approccio map_reduce. Sostituisci la tua chiave API nel codice sottostante.

from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose= False)
chain.run(docs)

Ottieni un riassunto dei tuoi documenti se esegui questo codice. Se vuoi vedere cosa stava facendo LangChain sotto la superficie, cambia verbose in True e potrai vedere la logica che Langchain sta utilizzando e come sta pensando. Puoi osservare che LangChain inserirà automaticamente la query per riassumere il tuo documento e l’intero testo (query + contenuto del documento) verrà passato a OpenAI. Ora OpenAI genererà il riassunto.

Ecco un caso d’uso in cui ho inviato un documento su Google Drive relativo a un prodotto chiamato SecondaryEquityHub e ho riassunto il documento utilizzando il tipo di catena map_reduce e la funzione load_summarize_chain(). Ho impostato verbose=True per vedere come Langchain sta lavorando internamente.

from langchain.document_loaders import GoogleDriveLoader
import os
loader = GoogleDriveLoader(document_ids=["ceHbuZXVTJKe1BT5apJMTUvG9_59-yyknQsz9ZNIEwQ8"],
                          credentials_path="../../desktop_credetnaisl.json")
docs = loader.load()
from langchain.llms import OpenAI
from langchain.chains.summarize import load_summarize_chain
llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])
chain = load_summarize_chain(llm, chain_type="map_reduce", verbose=True)
chain.run(docs)

Output:

Possiamo osservare che Langchain ha inserito il prompt per generare un riassunto per un determinato documento.

Possiamo vedere il riassunto conciso e le caratteristiche del prodotto presenti nel documento generato da Langchain utilizzando OpenAI LLM.

Altri casi d’uso

1. Ricerca: Possiamo utilizzare questa funzionalità durante la ricerca. Invece di leggere intensivamente l’intero articolo di ricerca parola per parola, possiamo utilizzare la funzionalità di riassunto per dare un’occhiata veloce all’articolo.

2. Istruzione: Le istituzioni educative possono ottenere riassunti curati del contenuto di libri di testo da dati estesi, libri accademici e articoli.

3. Business Intelligence: Gli analisti dei dati devono esaminare un gran numero di documenti per estrarre informazioni da essi. Utilizzando questa funzionalità, possono ridurre notevolmente l’impegno richiesto.

4. Analisi di casi legali: I professionisti del diritto possono utilizzare questa funzionalità per ottenere rapidamente argomenti critici in modo più efficiente da una vasta quantità di documenti di casi simili precedenti.

Diciamo che vogliamo fare domande sul contenuto di un determinato documento, dobbiamo caricare una catena diversa chiamata load_qa_chain. Successivamente, iniziamo questa catena con un parametro chain_type. Nel nostro caso, abbiamo utilizzato chain_type come “stuff”. Questo è un tipo di catena diretto; prende tutto il contenuto, lo concatena e lo passa a LLM.

Altri tipi di catene:

  • map_reduce: All’inizio, il modello guarda individualmente ogni documento e memorizza le sue informazioni, e alla fine, combina tutte queste informazioni e guarda di nuovo queste informazioni combinate per ottenere la risposta finale.
  • refine: Guarda iterativamente ogni documento fornito nella lista document_id, poi raffina le risposte con le informazioni recenti trovate nel documento man mano che procede.
  • Map re-rank: Il modello guarda individualmente ogni documento e assegna un punteggio alle informazioni. Alla fine, restituisce quella con il punteggio più alto.

Successivamente, eseguiamo la nostra catena passando i documenti di input e la query.

from langchain.chains.question_answering import load_qa_chain
query = "Chi è il fondatore di analytics vidhya?"
chain = load_qa_chain(llm, chain_type="stuff")
chain.run(input_documents=docs, question=query)

Quando esegui questo codice, langchain inserisce automaticamente il prompt con il contenuto del tuo documento prima di inviarlo a OpenAI LLM. Sotto il cofano, langchain ci aiuta con l’ingegneria del prompt fornendo prompt ottimizzati per estrarre i contenuti richiesti dai documenti. Se vuoi vedere quali prompt stanno usando internamente, basta impostare verbose=True, quindi puoi vedere il prompt nell’output.

from langchain.chains.question_answering import load_qa_chain
query = "Chi è il fondatore di analytics vidhya?"
chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
chain.run(input_documents=docs, question=query)

Costruisci il tuo Chatbot

Ora dobbiamo trovare un modo per trasformare questo modello in un Chatbot di domanda e risposta. Principalmente abbiamo bisogno di seguire i seguenti tre punti per creare un Chatbot.

1. Il Chatbot dovrebbe ricordare la cronologia delle chat per capire il contesto relativo alla conversazione in corso.

2. La cronologia delle chat dovrebbe essere aggiornata dopo ogni prompt che l’utente chiede al Chatbot.

2. Il Chatbot dovrebbe funzionare fino a quando l’utente vuole uscire dalla conversazione.

from langchain.chains.question_answering import load_qa_chain

# Funzione per caricare la catena di domande e risposte di Langchain
def load_langchain_qa():
    llm = OpenAI(temperature=0, openai_api_key=os.environ['OPENAI_API_KEY'])  
    chain = load_qa_chain(llm, chain_type="stuff", verbose=True)
    return chain

# Funzione per gestire l'input dell'utente e generare le risposte
def chatbot():
    print("Chatbot: Ciao! Sono il tuo amichevole Chatbot. Chiedimi qualsiasi cosa o digita 'exit' per terminare la conversazione.")
    from langchain.document_loaders import GoogleDriveLoader
    loader = GoogleDriveLoader(document_ids=["ID DEI TUOI DOCUMENTI"],
                          credentials_path="PERCORSO AL FILE credentials.json")
    docs = loader
    # Inizializza la catena di domande e risposte di Langchain
    chain = load_langchain_qa()
    
    # Lista per memorizzare la cronologia delle chat
    chat_history = []
    
    while True:
        user_input = input("Tu: ")
        
        if user_input.lower() == "exit":
            print("Chatbot: Arrivederci! Buona giornata.")
            break

        # Aggiungi la domanda dell'utente alla cronologia delle chat
        chat_history.append(user_input)

        # Elabora la domanda dell'utente utilizzando la catena di domande e risposte
        response = chain.run(input_documents=chat_history, question=user_input)
        
        # Estrai la risposta dalla risposta
        answer = response['answers'][0]['answer'] if response['answers'] else "Non sono riuscito a trovare una risposta alla tua domanda."

        # Aggiungi la risposta del Chatbot alla cronologia delle chat
        chat_history.append("Chatbot: " + answer)

        # Stampa la risposta del Chatbot
        print("Chatbot:", answer)

if __name__ == "__main__":
    chatbot()

Abbiamo inizializzato i nostri documenti di Google Drive e OpenAI LLM. Successivamente, abbiamo creato una lista per memorizzare la cronologia delle chat e abbiamo aggiornato la lista dopo ogni prompt. Poi abbiamo creato un ciclo while infinito che si interrompe quando l’utente dà “exit” come prompt.

Conclusioni

In questo articolo abbiamo visto come creare un Chatbot per fornire informazioni sul contenuto dei tuoi documenti di Google. Integrare Langchain, OpenAI e Google Drive è uno dei casi d’uso più vantaggiosi in qualsiasi campo, che sia medico, di ricerca, industriale o ingegneristico. Invece di leggere l’intero dataset e analizzare i dati per ottenere informazioni, il che richiede molto sforzo umano e tempo, possiamo implementare questa tecnologia per automatizzare la descrizione, il riassunto, l’analisi e l’estrazione di informazioni dai nostri file di dati.

Punti chiave

  • I documenti di Google possono essere ottenuti in Python utilizzando la classe GoogleDriveLoader di Python e le credenziali dell’API di Google Drive.
  • Integrando OpenAI LLM con Langchain, possiamo riassumere i nostri documenti e fare domande relative ai documenti stessi.
  • Possiamo ottenere informazioni da più documenti scegliendo tipi di catene appropriati come map_reduce, stuff, refine e map rerank.

Domande frequenti

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