top of page
Team I.A. Italia

LangChain: Introduzione ed esempi con python

Da quando i Large Language Models (LLM) hanno fatto il loro ingresso nel panorama mondiale con il lancio di GPT-3 di OpenAI nel 2020, la loro popolarità è cresciuta in modo costante.


Tuttavia, è stato solo fino alla fine del 2022 che l'interesse per gli LLM e per l'ampia disciplina dell'IA generativa è letteralmente esploso, grazie ai continui progressi compiuti in questo campo.


Abbiamo assistito alle notizie entusiasmanti sul chatbot LaMDA "senziente" di Google, al rilascio del primo LLM ad alte prestazioni e open source chiamato BLOOM e ai modelli di nuova generazione come l'innovativo modello di incorporamento del testo di OpenAI e la prossima generazione di modelli "GPT-3.5 e GPT4". E proprio mentre il mondo si concentrava su questi importanti progressi negli LLM, è emerso un nuovo protagonista: LangChain.


LangChain, sviluppato dal brillante creatore Harrison Chase, ha fatto la sua comparsa quasi contemporaneamente. Con il suo primo commit alla fine di ottobre 2022, Chase ha avuto qualche mese per perfezionare la libreria prima che essa venisse afferrata dall'onda di interesse sugli LLM.


Nonostante sia ancora agli inizi, LangChain è già dotato di incredibili funzionalità per la creazione di strumenti straordinari che ruotano attorno al cuore dei LLM. In questo articolo, ti introdurremo a questa promettente libreria e inizieremo esplorando il suo componente più fondamentale: l'LLM.


Con LangChain, avrai la possibilità di sperimentare e dare vita a potenti modelli di generazione del linguaggio, aprendo nuove prospettive per la creazione e l'innovazione. Pronto per un'avventura che ti condurrà nel cuore del futuro delle applicazioni basate su LLM? Allaccia la cintura e immergiti in LangChain.


LangChain: Introduzione ed esempi con python
LangChain: Introduzione ed esempi con python


Cos'è LangChain ?

Fondamentalmente, LangChain ti consente di creare applicazioni come chatbot, Generative Question-Answering (GQA), riepiloghi e molto altro ancora, sfruttando tutto il potenziale degli LLM.


L'idea centrale di questa libreria è la possibilità di "concatenare" insieme diversi componenti, creando così casi d'uso più avanzati e personalizzati basati sugli LLM. Puoi costruire una catena di componenti combinando diverse funzionalità provenienti da modelli di prompt, LLM, agenti e memoria.


I modelli di prompt sono specifici modelli progettati per diversi tipi di interazioni, come chatbot conversazionali, risposte a domande in linguaggio semplice (ELI5) e molto altro ancora. Potrai sfruttare la potenza dei LLM, come GPT-3, BLOOM e altri, per creare interazioni fluide e coinvolgenti con gli utenti.


Gli agenti, invece, sono responsabili di prendere decisioni basate sui risultati forniti dagli LLM. Puoi utilizzare strumenti come la ricerca Web o i calcolatori e integrarli in un ciclo logico di operazioni, consentendo agli agenti di agire in modo intelligente e reattivo.


La libreria LangChain offre anche soluzioni per la gestione della memoria, sia a breve che a lungo termine, consentendoti di creare applicazioni che traggono vantaggio dalla capacità di ricordare informazioni passate e di utilizzarle per prendere decisioni più informate.

Nei prossimi articoli che pubblicheremo del manuale LangChain, ci immergeremo in ogni componente in modo dettagliato, esplorando le loro funzionalità e applicazioni.


Ma per ora, iniziamo con le basi fondamentali dei modelli di prompt e degli LLM. Esploreremo anche due opzioni per l'utilizzo degli LLM offerte dalla libreria: attraverso i modelli disponibili su Hugging Face Hub o quelli forniti direttamente da OpenAI.

Preparati a scoprire un universo di possibilità illimitate mentre ci addentriamo nel cuore di LangChain.


LangChain: Introduzione ed esempi con python
LangChain: Introduzione ed esempi con python

Come creare prompt Template con LangChain?

Se hai mai usato chatgpt o chatbot simili puoi capire quanto possa essere comodo, creare un pompt template, da copiare e incollare per ottenere i risultati desiderati.


Nel mondo degli LLM, i prompt inseriti rivestono un ruolo fondamentale nel determinare i risultati che otterremo. Ciò che rende affascinante la creazione di prompt è la possibilità di strutturarli in modi diversi per ottenere risposte e risultati unici.


Nel contesto delle domande e risposte, ad esempio, possiamo prendere una domanda posta dall'utente e riformularla in diversi stili, come domande e risposte convenzionali, un elenco puntato di risposte o persino un riepilogo dei problemi associati alla domanda stessa. È un vero e proprio gioco di parole e di creatività che apre le porte a un'ampia gamma di possibilità.


Nel mondo di LangChain, possiamo mettere tutto ciò in pratica grazie alla creazione di modelli di prompt. Per iniziare, dobbiamo installare la libreria LangChain tramite il comando:


pip install -U langchain

Una volta fatto ciò, si aprono le porte a un mondo di creazione e personalizzazione.


Immagina di voler costruire un semplice modello di domande e risposte. Per farlo, importeremo la classe PromptTemplate da LangChain e inizializzeremo un modello seguendo una specifica struttura.

Se non hai mai usato chatgpt o simili farai fatica a capire l'importanza dei prompt template.

Ma in poche parole questi ci aiutano a "forzare" un output desiderato dal modello LLM che usiamo.


Ad esempio supponiamo che vogliamo aggiungere un chatbot al nostro sito che risponda alle domande in modo super coinciso. Normalmente un LLM se non esplicitiamo dei vincoli nel prompt darà unalibera interpretazione.


Vediamo un esempio pratico per rendere lampante l'esempio. Apriamo ChatGPT e su due chat diverse usaimo due prompt.

  1. Il primo sarà libero, quindi sarà composto solo dalla domande dell'utente.

  2. Il secondo sarà composto da un prompt template, ossia un testo di base , con l'aggiunta della domanda dell'utente.


Questo è il primo esempio composto solo dalla domanda dell'utente.

Questo è il primo esempio composto solo dalla domanda dell'utente.
Questo è il primo esempio composto solo dalla domanda dell'utente.


Questo è il secondo esempio composto da un prompt template.

Questo è il secondo esempio composto da un prompt template.
Questo è il secondo esempio composto da un prompt template.

Come potete vedere siamo riusciti usando questo template :


"""
Tu sei un chatbot super intelligente che risponde alle domande in modo coinciso e preciso. 

Domanda: {question}

Risposta: 
"""

A "forzare ChatGPT" a darci un output corto ma preciso. Ora vediamo come farlo a livello di programmazione usando le API.



Ad esempio:


from langchain import PromptTemplate

template = """
Tu sei un chatbot super intelligente che risponde alle domande in modo coinciso e preciso. 

Domanda: {question}

Risposta: """

prompt = PromptTemplate(
        template=template,
    input_variables=['question']
)

print(prompt)

Qui, abbiamo creato un modello di prompt che prevede una sezione per la domanda e una sezione per la risposta. Abbiamo specificato l'input variable 'question', che sarà sostituito con la domanda fornita dall'utente.


Prendiamo ad esempio la seguente domanda dell'utente:



question = "Qual'è la squadra NFL che ha vinto il Super Bowl nella stagione 2010?"

Quando utilizziamo questo modello di prompt con la domanda, otterremo:


Tu sei un chatbot super intelligente che risponde alle domande in modo coinciso e preciso. 

Domanda: Qual'è la squadra NFL che ha vinto il Super Bowl nella stagione 2010?

Risposta: 

In questo caso, abbiamo creato un prompt personalizzato che ha catturato la domanda dell'utente e lasciato spazio per inserire la risposta successivamente. Una volta ottenuto il prompt, siamo pronti per procedere e utilizzare questo stesso modello sia con le generazioni di Hugging Face Hub che con gli LLM di OpenAI.


Ricorda che questi modelli solitamente funzionano nemglio se interrogati in lingua inglese.



Usare gli LLMs gratis con LangChain

L'endpoint di Hugging Face Hub in LangChain si connette a Hugging Face Hub ed esegue i modelli tramite gli endpoint di inferenza gratuiti. Per utilizzare questi endpoint, è necessario avere un account Hugging Face e una chiave API.

Per impostare la chiave API nell'ambiente, è possibile utilizzare il seguente codice Python:


import os
os.environ['HUGGINGFACEHUB_API_TOKEN'] = 'HF_API_KEY'


Successivamente, installare la libreria huggingface_hub tramite pip:

!pip install huggingface_hub

Ora è possibile generare testo utilizzando un modello Hub. Ad esempio, useremo "google/flan-t5-x1".


Le API di inferenza predefinite di Hugging Face Hub non utilizzano hardware specializzato e possono essere lente. Inoltre, non sono adatte per l'esecuzione di modelli più grandi come "bigscience/bloom-560m" o "google/flan-t5-xxl".


Di seguito è riportato un esempio di generazione di testo utilizzando un modello Hub:



from langchain import HuggingFaceHub, LLMChain
from langchain import PromptTemplate

template = """Question: {question}

Answer: """

prompt = PromptTemplate(
        template=template,
    input_variables=['question']
)

question = "Which NFL team won the Super Bowl in the 2010 season?"

# Inizializza Hub LLM
hub_llm = HuggingFaceHub(
    repo_id='google/flan-t5-xl',
    model_kwargs={'temperature': 1e-10}
)

# Crea una catena di prompt con LLM
llm_chain = LLMChain(
    prompt=prompt,
    llm=hub_llm
)

# Fai una domanda all'utente sul NFL 2010
print(llm_chain.run(question))

Per la domanda fornita, otteniamo l'output corretto "green bay packers".


Se si desidera porre più domande, è possibile utilizzare il metodo generate per scorrere tutte le domande o inserire tutte le domande in un unico prompt per LLM più avanzati.

È importante notare che i risultati possono variare a seconda del modello utilizzato e della precisione delle risposte.


Fare domande multiple

Se desideriamo porre più domande, possiamo provare due approcci:

  1. Scorri tutte le domande usando il generatemetodo, rispondendo una alla volta.

  2. Inserisci tutte le domande in un unico prompt per il LLM; questo funzionerà solo per LLM più avanzati.

Partendo dall'opzione (1), vediamo come utilizzare il generatemetodo:



qs = [
    {'question': "Which NFL team won the Super Bowl in the 2010 season?"},
    {'question': "If I am 6 ft 4 inches, how tall am I in centimeters?"},
    {'question': "Who was the 12th person on the moon?"},
    {'question': "How many eyes does a blade of grass have?"}
]
res = llm_chain.generate(qs)
res

Output

LLMResult(generations=[[Generation(text='green bay packers', generation_info=None)], [Generation(text='184', generation_info=None)], [Generation(text='john glenn', generation_info=None)], [Generation(text='one', generation_info=None)]], llm_output=None)



Qui otteniamo pessimi risultati tranne che per la prima domanda. Questa è semplicemente una limitazione dell'LLM utilizzato.

Se il modello non è in grado di rispondere in modo accurato alle singole domande, è improbabile che il raggruppamento di tutte le query in un unico prompt funzioni. Tuttavia, per motivi di sperimentazione, proviamolo.



multi_template = """Answer the following questions one at a time.

Questions:
{questions}

Answers:
"""
long_prompt = PromptTemplate(template=multi_template, input_variables=["questions"])

llm_chain = LLMChain(
    prompt=long_prompt,
    llm=flan_t5
)

qs_str = (
    "Which NFL team won the Super Bowl in the 2010 season?\n" +
    "If I am 6 ft 4 inches, how tall am I in centimeters?\n" +
    "Who was the 12th person on the moon?" +
    "How many eyes does a blade of grass have?"
)

print(llm_chain.run(qs_str))

Output:

If I am 6 ft 4 inches, how tall am I in centimeters 

Come previsto, i risultati non sono utili. Vedremo in seguito che LLM più potenti possono farlo. Passiamo ora a vedere modelli LLm come GPT3 in grado di gestire domande molto più complesse.


Usare GPT3 con LangChain

Gli endpoint OpenAI in LangChain si connettono direttamente a OpenAI o tramite Azure. Per utilizzare questi endpoint, è necessario avere un account OpenAI e una chiave API.

Per impostare la chiave API nell'ambiente, è possibile utilizzare il seguente codice Python:



import os

os.environ['OPENAI_API_TOKEN'] = 'OPENAI_API_KEY'

Successivamente, è necessario installare la libreria OpenAI tramite pip:


!pip install openai

Ora è possibile generare testo utilizzando i modelli di generazione (o completamento) GPT-3 di OpenAI. Ad esempio, utilizzeremo il modello "text-davinci-003".


from langchain.llms import OpenAI

davinci = OpenAI(model_name='text-davinci-003') # se avete accesso alle api di gpt4 potete seglier

Se si utilizza OpenAI tramite Azure, è possibile utilizzare la classe AzureOpenAI:


from langchain.llms import AzureOpenAI

llm = AzureOpenAI(
    deployment_name="your-azure-deployment",
    model_name="text-davinci-003"
)

Utilizzeremo lo stesso semplice modello di prompt domanda-risposta utilizzato nell'esempio precedente con Hugging Face. L'unica differenza è che ora passiamo il nostro LLM OpenAI davinci:


llm_chain = LLMChain(
    prompt=prompt,
    llm=davinci
)

print(llm_chain.run(question))

Come previsto, otteniamo la risposta corretta. Possiamo fare lo stesso per più domande utilizzando il metodo generate:


qs = [
    {'question': "Which NFL team won the Super Bowl in the 2010 season?"},
    {'question': "If I am 6 ft 4 inches, how tall am I in centimeters?"},
    {'question': "Who was the 12th person on the moon?"},
    {'question': "How many eyes does a blade of grass have?"}
]
llm_chain.generate(qs)

La maggior parte dei risultati sono corretti o hanno un grado di verità. Il modello funziona senza dubbio meglio del modello "google/flan-t5-xl". Come prima, proviamo a inserire tutte le domande contemporaneamente nel modello:


llm_chain = LLMChain(
    prompt=long_prompt,
    llm=davinci
)

qs_str = (
    "Which NFL team won the Super Bowl in the 2010 season?\n" +
    "If I am 6 ft 4 inches, how tall am I in centimeters?\n" +
    "Who was the 12th person on the moon?" +
    "How many eyes does a blade of grass have?"
)

print(llm_chain.run(qs_str))

Output:

The New Orleans Saints won the Super Bowl in the 2010 season.
6 ft 4 inches is 193 centimeters.
The 12th person on the moon was Harrison Schmitt.
A blade of grass does not have eyes.


Man mano che continuiamo a eseguire le query, il modello occasionalmente commetterà errori, ma altre volte riuscirà a ottenere tutte le risposte corrette.




Conclusione su LangChain

Questo conclude la nostra introduzione a LangChain, una libreria che ci consente di creare app più avanzate utilizzando LLM come i modelli GPT-3 di OpenAI o le alternative open source disponibili tramite Hugging Face.



Come accennato, LangChain offre molte altre funzionalità che esploreremo nei prossimi articoli.

3 Comments

Rated 0 out of 5 stars.
No ratings yet

Add a rating
Guest
May 23, 2023

comunque solo su questo si trovano articoli interessanti sull'AI , in tutti gli altri siti trovi solo news o articoli clickbait inutile e che dicono un sacco di ca*ç°*ate . Grandi continuate così non vdo l'ora che escono i prossimi articoli su langchain.

Like

Guest
May 22, 2023

Salve. sono da poco approdato a questa affascinante avventura. Scrivo romanzi, racconti, poesie, e qualche breve sceneggiatura . Mi sarebbe di grande aiuto se da un imput , frase , o intera pagina si sviluppasse un testo, offredomi nuovi spunti per proseguire. Sono un giovanotto attempato (75) ma con mente fervida e allenata. Con PC e internet ho dimestichezza dalla loro nascita. Molto meno con linguaggi e programmazioni. Mi date qualche consiglio su come procedere? Grazie. Roberto

Like
Alvio Sciarretta
Alvio Sciarretta
May 23, 2023
Replying to

Non hai bisogno di conoscere la programmazione ma del prompt giusto. Prova ad andare su chatgpt e scrivere: Sei uno scrittore (sceneggiatore, romanziere, poeta ecc..) professionista e sei pronto ad aiutarmi. Scrivi da questo input: (il tuo testo) dei nuovi spunti per proseguire Più informazioni ed esempi dai nella domanda migliore sarà la risposta. Buon divertimento!

Like
PCR (5).gif
PCR (4).gif
PCR.gif
PCR.gif
PCR.gif
PCR.gif
PCR (5).gif
3.gif
Vediamo se riesci a cliccarmi ! Nascondo una Sorpresa... (2).png