LangChain 101 Parte 1. Costruzione di una semplice app di domande e risposte
LangChain 101 Part 1. Building a simple Q&A app
Introduzione
LangChain è un potente framework per la creazione di applicazioni che generano testo, rispondono a domande, traducono lingue e molte altre cose legate al testo. Lavoro con LangChain dall’inizio dell’anno e sono molto impressionato dalle sue capacità.
Questo articolo è l’inizio del mio corso LangChain 101. Inizierò condividendo concetti, pratiche ed esperienze mostrandoti come costruire le tue applicazioni LangChain.
Oggi discuteremo i seguenti argomenti:
- Cosa è esattamente LangChain?
- I concetti fondamentali e i componenti di LangChain
- Come costruire un’applicazione LangChain di base
Cosa è LangChain?
Lang sta per lingua, che è il focus principale di LangChain, e chain – la connotazione di connessione delle cose – si riferisce al componente chain utilizzato in LangChain. Le chain sono sequenze di istruzioni che il framework esegue per svolgere un compito. Questo semplifica l’uso di Large Language Models per compiti specifici e ti consente di combinare la potenza dei LLM (Large Language Models) con altre tecniche di programmazione.
- Avanza nella tua carriera con il 3° miglior programma online di laurea magistrale in Data Science
- L’IA viene addestrata per cercare vita extraterrestre
- Incontra Brain2Music un metodo di intelligenza artificiale per ricostruire la musica dall’attività cerebrale catturata utilizzando l’imaging a risonanza magnetica funzionale (fMRI)
Mi è stato chiesto in che cosa LangChain differisce da ChatGPT o LLM. Per rispondere a questa domanda, allego una tabella che evidenzia le differenze:
+==========+========================+====================+====================+| | LangChain | LLM | ChatGPT | +==========+========================+====================+====================+| Tipo | Framework | Modello | Modello | +----------+------------------------+--------------------+--------------------+| Scopo | Costruire applicazioni | Generare testo | Generare chat | | | con LLM | | conversazioni | +----------+------------------------+--------------------+--------------------+| Funzioni | Chain, prompt, LLM, | Ampio dataset di | Ampio dataset di | | | memoria, indice, agenti| testo e codice | conversazioni chat | +----------+------------------------+--------------------+--------------------+| Pro | Può combinare LLM con | Genera testo quasi | Genera conversazioni| | | tecniche di programmazione| della qualità umana| realistiche di chat | +----------+------------------------+--------------------+--------------------+| Contro | Richiede una certa | Non facile da usare| Non così versatile | | | conoscenza di | per compiti | come LangChain | | | programmazione | specifici | | +----------+------------------------+--------------------+--------------------+
Componenti di base di LangChain
Ci sono sei componenti di base di LangChain: – Modelli – Prompt – Chain – Memoria – Indici – Agenti e Strumenti
Parliamo brevemente di tutti i componenti.
Modelli
I modelli in LangChain sono grandi modelli di linguaggio (LLM) addestrati su enormi quantità di dataset massivi di testo e codice.
I modelli vengono utilizzati in LangChain per generare testo, rispondere a domande, tradurre lingue e molto altro. Vengono anche utilizzati per archiviare informazioni a cui il framework può accedere in seguito. Esempi: GPT-x, Bloom, Flan T5, Alpaca, LLama, Dolly, FastChat-T5, ecc.
Prompt
I prompt sono frammenti di testo che guidano il LLM per generare l’output desiderato. I prompt possono essere semplici o complessi e possono essere utilizzati per la generazione di testo, la traduzione di lingue, la risposta a domande e altro ancora.
In LangChain, i prompt svolgono un ruolo vitale nel controllare l’output del LLM. Puoi influenzare il LLM per generare l’output desiderato creando attentamente il prompt.
Ecco alcuni esempi di come possono essere utilizzati i prompt:
- Specificare il formato di output desiderato: Puoi, ad esempio, utilizzare un prompt per istruire il LLM a generare testo, tradurre lingue o rispondere a domande. Esempio: Traduci l’input in arabo
- Fornire contesto: Un prompt può fornire contesto per il LLM, come informazioni sull’argomento dell’output o esempi dell’output desiderato. Esempio: Spiega la risposta passo dopo passo come un insegnante scolastico
- Limitare l’output: Puoi utilizzare un prompt per limitare l’output del LLM specificando una lunghezza massima o selezionando un elenco di parole chiave da includere nell’output. Esempio: Genera un post su Twitter usando meno di 140 parole
Indici
Gli indici sono strutture dati uniche per memorizzare informazioni sul contenuto dei dati. Queste informazioni possono includere i termini trovati in ogni documento, la posizione dei documenti nel dataset, le relazioni tra i documenti, ecc. I vectorstore sono strutture dati che memorizzano rappresentazioni vettoriali dei termini di un dataset. Un retriever è un’interfaccia che restituisce documenti in risposta a una query non strutturata. Ha un campo di applicazione più ampio rispetto a un vector store.
Comprendere gli indici, i vectorstore e i retriever è fondamentale per creare un’applicazione sui tuoi dati specifici. Considera un altro esempio di una catena che include tutti e tre i componenti:
- Una catena viene creata per rispondere a domande finanziarie.
- La catena utilizza un indice per trovare tutti i documenti che contengono la parola “finanza“.
- La catena utilizza un vectorstore per trovare altri termini simili alla parola “finanza” (“denaro“, “investimenti“, ecc.).
- La catena utilizza un retriever per recuperare i documenti con il punteggio più alto per la query “Come investire?“.
Memoria
La memoria in LangChain è un metodo per memorizzare i dati a cui il LLM può accedere successivamente. Queste informazioni possono includere i risultati precedenti della catena, il contesto della catena corrente e qualsiasi altra informazione richiesta dal LLM. Consente anche all’applicazione di tenere traccia del contesto della conversazione corrente.
La memoria svolge un ruolo fondamentale in LangChain, consentendo al LLM di apprendere dalle interazioni precedenti e creare una base di conoscenza. Questa base di conoscenza può poi essere utilizzata per migliorare le prestazioni delle catene future.
Considera la creazione di una catena progettata per rispondere a domande legate all’immobiliare. La catena può utilizzare la memoria per memorizzare i risultati delle catene precedenti che hanno risposto a domande sull’immobiliare. Quando la catena pone una nuova domanda su un argomento simile, queste informazioni possono essere utilizzate per migliorarne le prestazioni.
Catene
Le catene sono sequenze di istruzioni che il framework LangChain esegue per svolgere un compito. Le catene possono connettere altri componenti di LangChain in base alle esigenze dell’applicazione. Consentono al framework di svolgere una vasta gamma di compiti.
Supponiamo di creare un’app per aiutarci nella preparazione di un colloquio:
- Prompt: “Mi sto preparando per un colloquio per una posizione di ingegnere del software. Puoi farmi delle domande comuni che potrei aspettarmi?”
- Funzione A: Questa funzione accederà alla conoscenza del LLM nel campo dell’ingegneria del software, ad esempio la sua conoscenza delle domande comuni per gli ingegneri del software. Può anche cercare dati appropriati nel vectorstore.
- Funzione B: Questa funzione manipolerà i dati, ad esempio generando un elenco di domande comuni per gli ingegneri del software o un elenco di risorse per aiutare lo studente a prepararsi per il colloquio. Selezionerà una domanda e la porrà.
- Memoria: potrebbero essere poste alcune domande di approfondimento per comprendere meglio la conoscenza dell’argomento scelto. L’implementazione della memoria consentirà alla catena di mantenere il contesto della conversazione.
Agenti e Strumenti
Gli agenti e gli strumenti sono due concetti importanti in LangChain. Gli agenti sono componenti riutilizzabili che possono svolgere compiti specifici come la generazione di testi, la traduzione linguistica e la risposta alle domande. Gli strumenti sono librerie di funzioni che possono essere utilizzate per aiutare nello sviluppo di vari agenti.
Esempi:
- Agente
NewsGenerator
– per la generazione di articoli o titoli di notizie. - Strumento
DataManipulator
– per la manipolazione dei dati (pulizia, trasformazione o estrazione di caratteristiche).
Applicazione. Costruzione di un sistema di domande e risposte.
Link a Colab e Github.
Costruiamo un sistema di domande e risposte per rispondere alle nostre domande riguardanti le festività ufficiali negli Emirati Arabi Uniti. Sulla base dei componenti che abbiamo appreso, possiamo disegnare uno schema simile al seguente:
Prima di tutto, installiamo tutte le dipendenze. Alcune versioni potrebbero essere aggiornate, ma l’installazione di una versione specifica risolverà la maggior parte, se non tutte, le dipendenze interne.
pip install chromadb==0.3.25 pydantic==1.10.9 openai==0.27.8 bs4 tiktoken==0.4.0 langchain==0.0.235 huggingface_hub==0.16.4 sentence_transformers==2.2.2 panda
I dati che utilizzeremo possono essere trovati sul seguente sito web, come mostrato nella tabella sottostante:
+--------+-----+-----------------------------+| Data | Giorno | Festività |+--------+-----+-----------------------------+| 1 Gen | Dom | Capodanno || 20 Apr | Gio | Festività di Eid al-Fitr || 21 Apr | Ven | Eid al-Fitr || 22 Apr | Sab | Festività di Eid al-Fitr || 23 Apr | Dom | Festività di Eid al-Fitr || 27 Giu | Mar | Giorno di Arafat || 28 Giu | Mer | Eid al-Adha || 29 Giu | Gio | Festività di Eid al-Adha || 30 Giu | Ven | Festività di Eid al-Adha || 21 Lug | Ven | Capodanno islamico || 29 Set | Ven | Compleanno del Profeta Muhammad || 1 Dic | Ven | Giorno della Commemorazione || 2 Dic | Sab | Giorno Nazionale || 3 Dic | Dom | Festività del Giorno Nazionale |+--------+-----+-----------------------------+
Dopo aver memorizzato i dati in memoria o in un dataframe, possiamo importare i pacchetti necessari:
# Carica il modello linguistico, gli embeddings e l'indice per l'IA conversazionalefrom langchain.chat_models import ChatOpenAI #modellofrom langchain.indexes import VectorstoreIndexCreator #indicefrom langchain.document_loaders.csv_loader import CSVLoader #strumentofrom langchain.prompts import PromptTemplate #promptfrom langchain.memory import ConversationBufferMemory #memoriafrom langchain.chains import RetrievalQA #catena
import osos.environ['OPENAI_API_KEY'] = 'sk-...'
In questo tutorial, utilizzeremo la chiave API di OpenAI. Ora possiamo mettere tutti i moduli al loro posto.
def load_llm(): # Impostazione del modello LLM llm = ChatOpenAI(temperature=0,model_name="gpt-3.5-turbo") return llm
def load_index(): # se vuoi evitare il passaggio di salvataggio/caricamento di un file, # puoi utilizzare il metodo `from_documents()` di VectorstoreIndexCreator() loader = CSVLoader(file_path='uae_holidays.csv') index = VectorstoreIndexCreator().from_loaders([loader]) return indextemplate = """Sei un assistente che aiuta a rispondere quando sono le festività ufficiali negli Emirati Arabi Uniti, basandosi solo sui dati forniti.Contesto: {context}-----------------------Cronologia: {chat_history}=======================Umano: {question}Chatbot:"""# Crea un prompt utilizzando il templateprompt = PromptTemplate( input_variables=["chat_history", "context", "question"], template=template)# Imposta la memoria della conversazionememory = ConversationBufferMemory(memory_key="chat_history", return_messages=True, input_key="question")# Imposta l'IA conversazionale basata su recuperoqa = RetrievalQA.from_chain_type( llm=load_llm(), chain_type='stuff', retriever=load_index().vectorstore.as_retriever(), verbose=True, chain_type_kwargs={ "prompt": prompt, "memory": memory, })
Parleremo in dettaglio di tutti i componenti. Per ora, abbiamo scelto gpt-3.5-turbo
da OpenAI, un prompt personalizzato, l’indice VectorstoreIndexCreator()
di default, impostato la ConversationBufferMemory
per tenere traccia della cronologia della chat e collegato tutto in una catena RetrievalQA
.
Vacanze a marzo/dicembre
query = "Ci sono festività a marzo?"print_response_for_query(query)
> Catena completata. Sulla base dei dati forniti, non ci sono festività a marzo.
Risposta corretta. E a dicembre?
query = "Scusa, intendevo dicembre"print_response_for_query(query)
> Catena completata. Sulla base dei dati forniti, a dicembre ci sono due festività ufficiali per gli Emirati Arabi Uniti. La prima è il Giorno della Commemorazione il 1º dicembre, che cade di venerdì. La seconda è il Giorno Nazionale il 2 dicembre, che cade di sabato. Inoltre, c'è una festa nazionale il 3 dicembre, che cade di domenica.
Hai notato come abbiamo usato la memoria qui? Se non fosse stato per essa, la risposta sarebbe stata:
> Catena completata. Scusa, non riesco a capire. Cosa stai cercando esattamente a dicembre?
Merita di essere notato che nonostante l’errore nel conteggio delle due festività ufficiali all’inizio, la risposta contiene tutte e tre le festività nell’elenco. Un miglioramento del prompt potrebbe risolvere il problema.
Esempio di Multichain durante il Ramadan
Ora facciamo una domanda più complicata.
query = "Quando inizia la festività di quest'anno che segna la fine del Ramadan?"print_response_for_query(query)
Quindi ora, la catena dovrà trovare le informazioni sul nome della festività che segna la fine del Ramadan e solo dopo recuperare le informazioni richieste dalla tabella.
> Catena completata. La festività di quest'anno che segna la fine del Ramadan, nota anche come Eid al-Fitr, inizia il 21 aprile.
Questo è molto interessante. La catena ha identificato correttamente Eid al-Fitr come la festività che segna la fine del Ramadan. Il problema è che i dati sono sporchi e il modello non può riconoscere che si tratta di un weekend di quattro giorni. Naturalmente, la soluzione facile qui sarebbe pulire i dati, eventualmente tramite strumenti o modificare il prompt.
Qual è la festività più vicina in arrivo?
Ultimo per oggi è recuperare quale festività ufficiale è la prossima in linea.
query = "Oggi è il 16 luglio. Quando è la festività più vicina?"print_response_for_query(query)
> Catena completata. La festività più vicina è il Capodanno islamico, che cade il 21 luglio.
Come si può vedere, la festività più vicina è rilevata correttamente. Lascio a te l’arduo compito di pensare alla possibile catena che è stata costruita per rispondere alla domanda.
Conclusioni
In questa lezione abbiamo imparato i concetti base di LangChain, tra cui modelli, catene, prompt, agenti, memoria e indici. Abbiamo anche visto esempi di come LangChain può svolgere diverse attività e creare un’app per rispondere alle domande.
Prossime lezioni
Il corso LangChain 101 è attualmente in fase di sviluppo.
In seguito nel corso, impareremo:
- come utilizzare modelli sui nostri computer
- come utilizzare dati personali
- come utilizzare catene per eseguire compiti più complessi
- come utilizzare la memoria per archiviare informazioni
- e molto altro.
Continueremo a creare app reali con LangChain.
Considera di seguirmi su VoAGI o LinkedIn per saperne di più su LangChain e ricevere aggiornamenti, inclusi nuovi corsi, funzionalità, tutorial ed esempi.
Grazie per il tuo tempo!