LangChain 101 Parte 2ab. Tutto quello che devi sapere sui modelli (grandi) di lingua

LangChain 101 Parte 2ab. Tutto ciò che devi sapere sui modelli di lingua (grandi)

Questa è la parte 2ab del corso LangChain 101. È vivamente consigliato controllare la prima parte per comprendere meglio il contesto di questo articolo (segui l’autore per non perdere la prossima parte):

LangChain 101: Parte 1. Costruzione di un’app di domande e risposte semplice

In questo articolo, ti presenterò le basi di LangChain, un framework per la costruzione di applicazioni complesse…

pub.towardsai.net

Il componente Models è il fulcro di LangChain. È il nucleo responsabile della generazione di token che rende la tecnologia magica.

Il componente Models consente l’utilizzo di diversi modelli di linguaggio, tra cui ChatGPT, GPT-4, LLAMA, ecc. Questi modelli possono essere utilizzati per molteplici compiti, tra i più popolari: rispondere alle domande e generare testo.

Il componente Models è facile da utilizzare. Per generare testo, è possibile passare al modello un prompt e creerà una risposta. Lo stesso vale per tradurre una frase o rispondere a una domanda.

Il componente Models è anche molto versatile. Puoi combinarlo con altri componenti LangChain per creare sistemi più complessi. Ad esempio, potresti combinare il componente Models con il componente Prompts per creare un chatbot in grado di generare diversi tipi di formati di testo creativi, come codice o script, poesie o brani musicali, lettere o email, ecc. Combina i componenti Models e Indexes per creare un motore di ricerca che può rispondere alle domande utilizzando informazioni da varie fonti.

Tutto il codice (incluse le note di colab) e materiali extra sono disponibili su GitHub.

Panoramica

LangChain supporta una varietà di modelli diversi, quindi puoi scegliere quello più adatto alle tue esigenze:

  • LLMs utilizzano API che prendono in input del testo e generano output di testo
  • Modelle di Chat utilizzano modelli che elaborano messaggi di chat e producono risposte
  • Modelle di Rappresentazione Testuale convertono il testo in rappresentazioni numeriche

Tokenizzazione

La tokenizzazione suddivide il linguaggio umano in unità più piccole come parole o sottostringhe per convertire il testo in rappresentazioni numeriche leggibili dalla macchina. Inoltre, quando parliamo di generazione di testo o codice, intendiamo diverse forme di generazione di token.

Generazione di testo

Supponiamo di voler generare il continuo della frase:

“Parigi è la città…”.

L’Encoder invia logit per tutti i token che abbiamo (se non sai cosa sono i logit, considerali come punteggi) che possono essere convertiti, utilizzando la funzione softmax, in probabilità che il token venga selezionato per la generazione.

Per saperne di più sulla generazione di testo:

Come genera testo un LLM?

In questo articolo non discuteremo dei transformers o di come vengono addestrati i modelli di linguaggio di grandi dimensioni. Invece, ci concentreremo sull’uso di…

pub.towardsai.net

.from_pretrained(<model>)

In molti modelli di linguaggio pre-addestrati, il tokenizzatore e l’architettura del modello sono progettati e addestrati insieme. La ragione di questo accoppiamento è che il tokenizzatore e l’architettura del modello devono essere compatibili per garantire una tokenizzazione coerente e una decodifica corretta.

Se il tokenizzatore e l’architettura del modello fossero diversi o non sincronizzati, potrebbero verificarsi errori di tokenizzazione, incorporazioni non corrispondenti e previsioni errate.

Chiavi API

Per prima cosa avrai bisogno di una chiave API per il provider LLM che desideri utilizzare. Dovremo scegliere tra modelli di base proprietari o open-source in base a un compromesso tra prestazioni e costo.

Molti modelli open-source sono organizzati ed ospitati su Hugging Face come community hub. I modelli open-source di solito sono più piccoli con meno funzionalità rispetto a quelli proprietari, ma sono più convenienti dal punto di vista economico.

Esempi: BLOOM (BigScience), LLaMA (Meta), Flan-T5 (Google), ecc.

I modelli proprietari sono modelli di base a codice chiuso di proprietà di aziende. Solitamente sono più grandi dei modelli open-source e quindi hanno migliori prestazioni, ma possono avere API costose.

Esempi: OpenAI, co:here, AI21 Labs, Anthropic, ecc.

Embeddings

Gli embeddings sono rappresentazioni numeriche compatte di parole o entità che aiutano i computer a comprendere e elaborare il linguaggio in modo più efficace. Queste rappresentazioni codificano il significato e il contesto delle parole, consentendo alle macchine di lavorare con il linguaggio in modo più significativo ed efficiente.

  • OpenAIEmbeddings
  • HuggingFaceEmbeddings
  • GPT4AllEmbeddings
  • SpacyEmbeddings
  • FakeEmbeddings

Di seguito puoi vedere gli embeddings per le nove frasi di diversi argomenti. I valori delle heatmap sono stati preordinati per una migliore visualizzazione.

  1. Miglior cuscino da viaggio per voli lunghi
  2. Zaino leggero per escursioni e viaggi
  3. Borsa impermeabile per avventure all’aperto
  4. Set di pentole in acciaio inossidabile per piani di cottura a induzione
  5. Set di coltelli da chef di alta qualità
  6. Sbattitore ad alte prestazioni per la preparazione dolci
  7. Nuove uscite nella letteratura di fiction
  8. Biografie e memorie ispirazionali
  9. I migliori libri di auto-aiuto per la crescita personale

Come si può notare, la somiglianza della frase 1 è vicina alla 2 e alla 3, con una somiglianza relativamente bassa con le altre frasi. Si può vedere che tutte le frasi possono essere raggruppate in tre gruppi.

Modelli di Lingua e Chat Grandi

Un modello di linguaggio è un modello probabilistico di un linguaggio naturale che può generare probabilità di una serie di parole basate su corpora di testo in una o più lingue su cui è stato allenato.

Un modello di linguaggio grande è un modello di linguaggio avanzato allenato utilizzando tecniche di apprendimento profondo su un’enorme quantità di dati testuali.

Di solito un modello di linguaggio supporta modelli di chat, ma le loro API sono strutturate in modo diverso. Questi modelli prendono in input una lista di messaggi di chat e restituiscono un messaggio di chat.

Rivolgergli una domanda GPT

Non è necessario collegare LangChain per fare una domanda al modello. Nell’esempio seguente, stiamo preparando un prompt, collegandoci al pacchetto openai e restituendo la risposta estratta.

import openaidef get_completion(prompt, model="gpt-3.5-turbo"):    """    Genera un completamento per un prompt dato utilizzando il modello specificato.    Args:        prompt (str): Il prompt di input per generare il completamento.        model (str): Il nome del modello da utilizzare per generare il completamento.    Returns:        str: Il testo del completamento generato.    """    # Crea una lista di dizionari di messaggi con il prompt dell'utente    messages = [{"role": "user", "content": prompt}]    # Genera un completamento chat utilizzando l'API di OpenAI    response = openai.ChatCompletion.create(        model=model,        messages=messages,        temperature=0,  # Imposta la temperatura a 0 per un output deterministico    )    # Estrae e restituisce il contenuto del completamento generato    return response.choices[0].message["content"]

Come si può vedere, le domande semplici possono essere risposte correttamente dal modello. Ma per richieste complicate, LangChain potrebbe essere la strada da seguire.

Quanta RAM?

Per determinare la dimensione del modello in byte, si moltiplicano i parametri per la dimensione di precisione scelta.

Diciamo che la precisione che abbiamo scelto è bfloat16 (16 bit = 2 byte). Vogliamo usare il modello BLOOM-176B. Ciò significa che abbiamo bisogno di 176 miliardi di parametri * 2 byte = 352GB!

Nell’apprendimento automatico viene utilizzato un approccio di precisione mista, dove l’allenamento e l’inferenza vengono idealmente eseguiti in FP32, ma il calcolo viene eseguito in FP16/BF16 per un addestramento più veloce. I pesi sono mantenuti in FP32 e i gradienti FP16/BF16 vengono utilizzati per aggiornarli. Durante l’inferenza, i pesi a mezza precisione spesso offrono una qualità simile a FP32, consentendo un elaborazione più rapida con meno GPU.

La quantizzazione è una tecnica di compressione che riduce l’utilizzo della memoria del modello e migliora l’efficienza dell’inferenza. La quantizzazione post-addestramento consiste nel convertire i pesi di un modello pre-addestrato in una precisione inferiore senza riallenamento.

Nel codice, è probabile che si trovino i seguenti parametri di quantizzazione:

# Configurare BitsAndBytesConfig per la quantizzazione a 4 bitbnb_config = BitsAndBytesConfig(    load_in_4bit=True,    bnb_4bit_use_double_quant=True,    bnb_4bit_quant_type="nf4",    bnb_4bit_compute_dtype=torch.bfloat16,)

Per avere una comprensione completa della Quantizzazione, leggi il mio articolo sull’argomento:

Come adattare grandi modelli di linguaggio in piccole memorie: Quantizzazione

Come eseguire llm sulla tua macchina locale

pub.towardsai.net

Esecuzione di Modello Solo-CPU

Potrebbe sorprendere, ma è possibile eseguire un LLM solo sulla CPU:

# Controlla le versioni del modello https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/tree/main!wget --output-document=llama-2-7b-chat.bin https://huggingface.co/TheBloke/Llama-2-7B-Chat-GGML/resolve/main/llama-2-7b-chat.ggmlv3.q8_0.binfrom langchain.llms import CTransformers# Inizializza un wrapper CTransformers locale per il modello Llama-2-7B-Chatllm = CTransformers(    model="llama-2-7b-chat.bin",  # Posizione del modello GGML scaricato    model_type="llama",  # Specifica il tipo di modello come Llama    config={        "max_new_tokens": 256,        "temperature": 0.1,    },  # Imposta una configurazione specifica)# Inizializza un'istanza di LLMChain con la prompt, llm e impostazione verbose fornite.llm_chain = LLMChain(prompt=prompt, llm=llm, verbose=True)

La risposta richiederà alcuni minuti, ma dimostra la possibilità di eseguire llms anche su dispositivi Raspberry!

Questo conclude la Parte 1ab. La prossima parte (cde) sarà dedicata all’ottimizzazione dei modelli.

Aplausi e seguimi, questo mi motiva a scrivere nuovi articoli 🙂