Trasformare l’IA con LangChain una rivoluzione nel trattamento dei dati testuali

LangChain una rivoluzione nell'IA per il trattamento dei dati testuali

 

Negli ultimi anni, i Large Language Models (LLM), o LLM per gli amici, hanno preso d’assalto il mondo dell’intelligenza artificiale. Con l’innovativo lancio del GPT-3 di OpenAI nel 2020, abbiamo assistito a un costante aumento della popolarità dei LLM, che si è intensificato ulteriormente con i recenti progressi nel campo.

Questi potenti modelli di intelligenza artificiale hanno aperto nuove possibilità per le applicazioni di elaborazione del linguaggio naturale, consentendo agli sviluppatori di creare interazioni più sofisticate e simili a quelle umane.

Non è così, vero?

Tuttavia, quando si affronta questa tecnologia di intelligenza artificiale, è difficile scalare e generare algoritmi affidabili.

In questo scenario in rapida evoluzione, LangChain si è affermato come un framework versatile progettato per aiutare gli sviluppatori a sfruttare pienamente il potenziale dei LLM per una vasta gamma di applicazioni. Uno dei casi d’uso più importanti è gestire grandi quantità di dati testuali.

Immergiamoci e iniziamo a sfruttare oggi il potere dei LLM!

LangChain può essere utilizzato in chatbot, sistemi di risposta alle domande, strumenti di sintesi e oltre. Tuttavia, uno degli usi più utili e diffusi di LangChain è gestire il testo.

Il mondo di oggi è invaso dai dati. E uno dei tipi più noti è il dato testuale.

Tutti i siti web e le app sono bombardati con tonnellate di parole ogni singolo giorno. Nessun essere umano può elaborare questa quantità di informazioni…

Ma i computer possono farlo?

Le tecniche LLM insieme a LangChain sono un ottimo modo per ridurre la quantità di testo mantenendo le parti più importanti del messaggio. Ecco perché oggi parleremo di due casi d’uso di base, ma davvero utili, di LangChain per gestire il testo.

  • Summarizzazione: esprimere i fatti più importanti su un corpo di testo o un’interazione in chat. Può ridurre la quantità di dati mantenendo le parti più importanti.
  • Estrazione: estrarre dati strutturati da un corpo di testo o da una query dell’utente. Può individuare ed estrarre parole chiave all’interno del testo.

Sia che tu sia nuovo nel mondo dei LLM o che tu voglia portare i tuoi progetti di generazione del linguaggio al livello successivo, questa guida ti fornirà preziose informazioni ed esempi pratici per sbloccare il pieno potenziale di LangChain per gestire il testo.

⚠️ Se vuoi avere una comprensione di base, puoi dare un’occhiata qui 👇🏻

LangChain 101: Crea le tue applicazioni potenziate da GPT – VoAGI

Ricorda sempre che per lavorare con OpenAI e i modelli GPT, è necessario avere la libreria OpenAI installata sul proprio computer locale e disporre di una chiave OpenAI attiva. Se non sai come fare, puoi dare un’occhiata qui.

 

1. Summarizzazione

 

ChatGPT insieme a LangChain può riassumere informazioni in modo rapido e molto affidabile.

Le tecniche di riassunto LLM sono un ottimo modo per ridurre la quantità di testo mantenendo le parti più importanti del messaggio. Ecco perché i LLM possono essere il miglior alleato per qualsiasi azienda digitale che ha bisogno di elaborare e analizzare grandi volumi di dati testuali.

Per eseguire gli esempi seguenti, sono richieste le seguenti librerie:

# LangChain & LLM
from langchain.llms import OpenAI
from langchain import PromptTemplate
from langchain.chains.summarize import load_summarize_chain
from langchain.text_splitter import RecursiveCharacterTextSplitter

#Wikipedia API
import wikipediaapi

 

1.1. Riassunto di brevi testi

 

Per i riassunti di brevi testi, il metodo è semplice, infatti, non è necessario fare nulla di complicato se non semplicemente fornire istruzioni di input.

Che in pratica significa generare un modello con una variabile di input.

So che potresti chiederti… cosa esattamente è un modello di prompt?

Un modello di prompt si riferisce a un modo riproducibile per generare un prompt. Contiene una stringa di testo, ovvero un modello, che può prendere un insieme di parametri dall’utente finale e generare un prompt.

Un modello di prompt contiene:

  • istruzioni per il modello di linguaggio – che ci permettono di standardizzare alcuni passaggi per il nostro LLM.
  • una variabile di input – che ci permette di applicare le istruzioni precedenti a qualsiasi testo di input.

Vediamo un semplice esempio. Posso standardizzare un prompt che genera il nome di un marchio che produce un prodotto specifico.

Come puoi osservare nell’esempio precedente, la magia di LangChain sta nel fatto che possiamo definire un prompt standardizzato con una variabile di input che cambia.

  • Le istruzioni per generare un nome per un marchio rimangono sempre le stesse.
  • La variabile del prodotto funziona come un input che può essere modificato.

Ciò ci permette di definire prompt versatili che possono essere utilizzati in diversi scenari.

Ora che sappiamo cos’è un modello di prompt…

Immaginiamo di voler definire un prompt che riassuma qualsiasi testo utilizzando un vocabolario estremamente semplice da capire. Possiamo definire un modello di prompt con alcune istruzioni specifiche e una variabile di testo che cambia in base alla variabile di input che definiamo.

# Creiamo la nostra stringa di prompt.
template = """
%ISTRUZIONI:
Si prega di riassumere il seguente testo.
Utilizzare sempre un vocabolario semplice da capire, in modo che un alunno delle scuole elementari possa comprendere.

%TESTO:
{input_text}
"""

Ora definiamo il LLM con cui vogliamo lavorare - in questo caso il GPT di OpenAI - e il modello di prompt.


# Il modello predefinito è già 'text-davinci-003', ma può essere modificato.
llm = OpenAI(temperature=0, model_name='text-davinci-003', openai_api_key=openai_api_key)

# Creiamo un modello di prompt LangChain a cui possiamo inserire valori successivamente
prompt = PromptTemplate(
   input_variables=["input_text"],
   template=template,
)

Iniziamo a provare questo modello di prompt. Utilizzando l’API di Wikipedia, otterrò il riassunto del paese USA e lo riassumerò ulteriormente con un tono estremamente facile da capire.

Ora che sappiamo come riassumere un breve testo… posso renderlo un po’ più interessante?

Certo, possiamo farlo con…

1.2. Riassunto di testi lunghi

Quando si tratta di testi lunghi, il problema principale è che non possiamo comunicarli direttamente al nostro modello di intelligenza artificiale tramite un prompt, in quanto contengono troppi token.

E ora potresti chiederti… cosa è un token?

I token sono il modo in cui il modello vede l’input – singoli caratteri, parole, parti di parole o segmenti di testo. Come puoi osservare, la definizione non è molto precisa e dipende da ogni modello. Ad esempio, i 1000 token di GPT di OpenAI corrispondono approssimativamente a 750 parole.

Ma la cosa più importante da imparare è che il costo dipende dal numero di token e che non possiamo inviare al nostro API un numero illimitato di token in un unico prompt. Per avere un testo più lungo, ripeteremo lo stesso esempio di prima ma utilizzando l’intero testo della pagina di Wikipedia.

Se controlliamo quanto è lungo… è di circa 17.000 token.

Che è abbastanza per essere inviato direttamente alla nostra API.

Cosa possiamo fare ora?

Prima di tutto, dovremo dividerlo. Questo processo è chiamato chunking o splitting del testo in pezzi più piccoli. Di solito uso RecursiveCharacterTextSplitter perché è facile da controllare, ma ce ne sono molti altri che puoi provare.

Dopo averlo utilizzato, anziché avere un singolo pezzo di testo, otteniamo 23 pezzi che facilitano il lavoro del nostro modello GPT.

Successivamente dobbiamo caricare una catena che effettuerà chiamate successive al LLM per noi.

LangChain fornisce l’interfaccia Chain per applicazioni concatenate come questa. Definiamo una catena in modo molto generico come una sequenza di chiamate ai componenti, che possono includere altre catene. L’interfaccia di base è semplice:

class Chain(BaseModel, ABC):
    """Interfaccia di base che tutte le catene dovrebbero implementare."""
    memory: BaseMemory
    callbacks: Callbacks
    def __call__(
        self,
        inputs: Any,
        return_only_outputs: bool = False,
        callbacks: Callbacks = None,
    ) -> Dict[str, Any]:
        ...

Se vuoi saperne di più sulle catene, puoi consultare direttamente la documentazione di LangChain.

Quindi, se ripetiamo la stessa procedura con il testo suddiviso – chiamato docs – l’LLM può facilmente generare un riassunto dell’intera pagina.

 

Utile, vero?

Ora che sappiamo come riassumere il testo, possiamo passare al secondo caso d’uso!

2. Estrazione

Estrazione è il processo di parsing dei dati da un pezzo di testo. Questo viene comunemente utilizzato con il parsing degli output per strutturare i nostri dati.

Estrarre dati chiave è davvero utile per identificare e analizzare parole chiave all’interno di un testo. I casi d’uso comuni includono l’estrazione di una riga strutturata da una frase da inserire in un database o l’estrazione di più righe da un documento lungo da inserire in un database.

Immaginiamo di gestire un’azienda di e-commerce digitale e dobbiamo elaborare tutte le recensioni presenti sul nostro sito web.

Potrei leggerle tutte una per una… sarebbe pazzesco.

O posso semplicemente ESTRARRE le informazioni di cui ho bisogno da ognuna di esse e analizzare tutti i dati.

Sembra facile… vero?

Iniziamo con un esempio piuttosto semplice. Prima di tutto, dobbiamo importare le seguenti librerie:

# Per aiutare a costruire i nostri messaggi di chat
from langchain.schema import HumanMessage
from langchain.prompts import PromptTemplate, ChatPromptTemplate, HumanMessagePromptTemplate

# Utilizzeremo un modello di chat, di default gpt-3.5-turbo
from langchain.chat_models import ChatOpenAI

# Per analizzare gli output e ottenere dati strutturati
from langchain.output_parsers import StructuredOutputParser, ResponseSchema

chat_model = ChatOpenAI(temperature=0, model_name='gpt-3.5-turbo', openai_api_key=openai_api_key)

2.1. Estrazione di parole specifiche

Puoi provare a cercare parole specifiche all’interno di un testo. In questo caso, voglio analizzare tutte le frutta contenute in un testo. Ancora una volta, è piuttosto semplice come prima. Possiamo facilmente definire un prompt dando istruzioni chiare al nostro LLM per identificare tutte le frutta contenute in un testo e restituire una struttura simile a JSON contenente tali frutta e i loro colori corrispondenti.

 

E come possiamo vedere, funziona perfettamente!

Quindi ora… giochiamo un po’ di più con esso. Anche se questa volta ha funzionato, non è un metodo affidabile a lungo termine per casi d’uso più avanzati. Ed è qui che entra in gioco un fantastico concetto di LangChain…

2.2. Utilizzo dello schema di risposta di LangChain

Lo schema di risposta di LangChain farà due cose principali per noi:

  1. Generare un prompt con istruzioni di formato autentiche. Questo è fantastico perché non devo preoccuparmi del lato dell’ingegneria del prompt, lascerò che se ne occupi LangChain!
  2. Leggere l’output dall’LLM e trasformarlo in un oggetto Python corretto per me. Ciò significa che genererà sempre una struttura data che è utile e che il mio sistema può analizzare.

E per farlo, devo solo definire quale risposta mi aspetto dal modello.

Immaginiamo quindi di voler determinare i prodotti e i marchi che gli utenti indicano nei loro commenti. Potrei facilmente eseguire come prima con un semplice prompt – sfruttare LangChain per generare un metodo più affidabile.

Quindi prima devo definire uno schema di risposta in cui definisco ogni parola chiave che voglio analizzare con un nome e una descrizione.

# Lo schema che desidero
response_schemas = [
   ResponseSchema(name="prodotto", description="Il nome del prodotto da acquistare"),
   ResponseSchema(name="marca", description="La marca del prodotto.")
]
E poi genero un oggetto output_parser che prende come input il mio schema di risposta.
# Il parser che cercherà l'output LLM nel mio schema e me lo restituirà
output_parser = StructuredOutputParser.from_response_schemas(response_schemas)

Dopo aver definito il nostro parser, generiamo il formato delle nostre istruzioni utilizzando il comando .get_format_instructions() da LangChain e definiamo il prompt finale utilizzando il ChatPromptTemplate. E ora è semplice utilizzare questo oggetto output_parser con qualsiasi query di input che mi venga in mente, e genererà automaticamente un output con le parole chiave desiderate.

   

Come si può osservare nell’esempio qui sotto, con l’input “Mi sono rimasti senza Yogurt Danone, Latte d’Avena senza marca e quei buger vegani fatti da Heura”, il LLM mi restituisce il seguente output:

  Screenshot del mio Jupyter Notebook.

Punti principali

 

LangChain è una libreria Python versatile che aiuta gli sviluppatori a sfruttare al massimo il potenziale dei LLM, soprattutto per gestire grandi quantità di dati testuali. Eccelle in due casi d’uso principali per quanto riguarda il trattamento del testo. I LLM consentono agli sviluppatori di creare interazioni più sofisticate e simili a quelle umane nelle applicazioni di elaborazione del linguaggio naturale.

  1. Riassunto: LangChain può riassumere rapidamente e in modo affidabile le informazioni, riducendo la quantità di testo pur preservando le parti più importanti del messaggio.
  2. Estrazione: La libreria può analizzare i dati da un pezzo di testo, consentendo un output strutturato e facilitando operazioni come l’inserimento di dati in un database o la chiamata di API basata su parametri estratti.
  3. LangChain facilita l’ingegneria del prompt, che è una tecnica fondamentale per massimizzare le prestazioni dei modelli AI come ChatGPT. Con l’ingegneria del prompt, gli sviluppatori possono progettare prompt standardizzati che possono essere riutilizzati in diversi casi d’uso, rendendo l’applicazione AI più versatile ed efficace.

In generale, LangChain è uno strumento potente per migliorare l’uso dell’IA, soprattutto quando si tratta di dati testuali, e l’ingegneria del prompt è una competenza chiave per sfruttare in modo efficace modelli AI come ChatGPT in diverse applicazioni.     Josep Ferrer è un ingegnere di analisi da Barcellona. Si è laureato in ingegneria fisica e attualmente lavora nel campo della scienza dei dati applicata alla mobilità umana. È un creatore di contenuti a tempo parziale focalizzato sulla scienza dei dati e sulla tecnologia. Puoi contattarlo su LinkedIn, Twitter o VoAGI.