Sistema RAG e TxtAi Parte 1: Trasformare la Generazione del Linguaggio con Intelligenza

Per questa prima parte della nostra serie di articoli, baseremo la nostra esplorazione su questo tutorial per implementare un processo RAG. Ma cos'è un RAG? RAG, o "Generazione Potenziata dal Recupero" (Retrieval-Augmented Generation), è una tecnica avanzata nell'intelligenza artificiale, specificatamente nel campo del processing del linguaggio naturale (NLP), che coinvolge l'arricchimento del processo di generazione del testo tramite l'incorporazione di una fase di recupero delle informazioni. Questo metodo ibrido combina la potenza dei modelli linguistici basati su deep learning con l'efficienza dei sistemi di recupero delle informazioni per produrre risposte più accurate e contestualmente rilevanti.

Attraverso questo articolo, esploreremo come i RAG trasformano l'approccio tradizionale alla generazione del linguaggio integrando elementi dinamici della ricerca di informazioni. Esamineremo i componenti chiave di questa tecnologia, compreso il modo in cui il modello identifica ed estrae informazioni rilevanti da un vasto database o corpus di testo prima di iniziare il processo di generazione delle risposte. Ciò permette al modello di fare affidamento non solo sul proprio apprendimento interno, ma anche su dati esterni specifici, il che è particolarmente vantaggioso per domande che richiedono conoscenze aggiornate o specializzate.

Inoltre, discuteremo le sfide e le opportunità associate all'implementazione dei RAG, mettendo in evidenza il loro potenziale in vari campi di applicazione, dall'assistenza virtuale ai sistemi di raccomandazione personalizzati. Infine, illustreremo come configurare un sistema RAG utilizzando tecnologie e strumenti all'avanguardia, fornendo una guida passo dopo passo basata sul tutorial dalla documentazione ufficiale dello strumento Txtai. Che tu sia uno sviluppatore esperto in PHP e data science o semplicemente curioso di scoprire gli ultimi avanzamenti nell'IA, questo articolo mira a fornire una comprensione approfondita della tecnologia RAG e del suo impatto sul futuro del processing del linguaggio naturale.

Componenti chiave di un sistema RAG

I RAG, per la loro natura ibrida, integrano due componenti essenziali: il sistema di recupero delle informazioni (Information Retrieval, IR) e il modello di generazione del linguaggio (Language Generation Model).

Sistema di Recupero delle Informazioni: La prima fase di un RAG consiste nella ricerca e nel recupero di informazioni pertinenti in risposta a una query. Questa fase utilizza tecniche di ricerca avanzate per analizzare rapidamente vasti insiemi di dati, selezionando estratti di testo che sono molto probabilmente rilevanti alla domanda posta.

Modello di Generazione del Linguaggio: Una volta recuperate le informazioni pertinenti, vengono inserite in un modello di generazione del linguaggio. Questo modello, spesso basato su architetture di rete neurale come i Transformers, utilizza queste informazioni per costruire una risposta coerente e contestualmente appropriata.

Sfide e Opportunità

I RAG presentano diverse sfide tecniche e pratiche. Ad esempio, l'accuratezza del recupero delle informazioni è critica; un recupero inaccurato può portare a risposte errate. Inoltre, bilanciare la velocità di elaborazione e l'accuratezza è una considerazione importante, specialmente per applicazioni in tempo reale.

Tuttavia, le opportunità presentate dai RAG sono notevoli. Nel supporto al cliente, ad esempio, i RAG possono fornire risposte più precise e personalizzate rispetto ai sistemi tradizionali di generazione del linguaggio. Nella ricerca scientifica, possono aiutare a formulare risposte basate sulle ultime pubblicazioni e scoperte.

Implementazione Pratica di un RAGDiversi passaggi sono necessari per implementare un RAG:

Selezione della Tecnologia: Modelli trasformatori come BERT o GPT possono essere utilizzati per il modello di generazione, mentre sistemi come Elasticsearch possono essere impiegati per il recupero delle informazioni. Qui, useremo MistralAI e il sistema interno di txtai. Vedremo poi come integrare gli indici direttamente in un database PostgreSQL.

Preparazione dei Dati: Preparare un grande e vario corpus di dati per la fase di recupero. Questo corpus dovrebbe essere rappresentativo dei tipi di query attesi. Per fare questo, recupereremo le pagine di contenuto di questo stesso blog.

Addestramento e Perfezionamento:

Addestrare il modello di generazione linguistica utilizzando sia il corpus di dati che le informazioni recuperate. Potrebbe essere necessario un perfezionamento per adattare il modello a casi d'uso specifici.

Integrazione e Test: Integrare il sistema RAG nella tua applicazione o servizio ed eseguire test approfonditi per valutare le sue prestazioni e accuratezza.

Conclusione

La "Generazione Migliorata dal Recupero" è un avanzamento entusiasmante nell'IA, che apre nuove vie per applicazioni di elaborazione del linguaggio naturale più sofisticate e accurate. Sebbene presenti delle sfide, il suo potenziale in vari settori la rende inestimabile per aziende e sviluppatori che cercano di sfruttare le ultime innovazioni dell'IA. Seguendo i passaggi e i principi descritti in questo articolo, sviluppatori PHP ed esperti di data science possono iniziare ad esplorare il mondo affascinante dei RAG per migliorare le capacità di elaborazione del linguaggio naturale delle loro applicazioni.

Nota dell'autore: Non illudiamoci. L'inizio di questo articolo è stato scritto con l'aiuto dell'intelligenza artificiale. Bisogna ammettere che ha fatto un buon lavoro. Sembra chiaro che un'intelligenza artificiale sia stata allenata con i propri concetti. Questo ha reso l'esercizio di scrittura molto divertente. Il mio ruolo è stato semplicemente quello di "mostrare" interattivamente la via per ottenere le informazioni più chiare possibile. Ora che abbiamo avuto un piccolo intermezzo teorico, possiamo passare più facilmente alla parte pratica.

Prima di tutto, la tecnologia scelta per questo primo articolo è TxtAi. Perché? Beh, perché è fatto per questo. E una volta capito come funziona, ci si rende conto che rappresenta un notevole risparmio di tempo. Considerato che ci saranno dati da preparare, un'infrastruttura da configurare e altri aspetti tecnici, se possiamo risparmiare tempo nello sviluppo, sarà sempre tempo guadagnato per il cliente finale. Vedrete che non tutto si fa con soli tre click. Avete bisogno di dati, e questo è in definitiva dove ci vorrà più tempo.

Passiamo al codice. Prendiamo per scontato che abbiate già completato la fase di installazione di Llama.cpp. Avete un account su Huggingface con un token e il vostro ambiente Python è già funzionante. Iniziamo installando le nostre piccole dipendenze:

pipenv shell
pipenv install txtai[pipeline] autoawq install nltk['punkt']
pipenv install  install git+https://github.com/abetlen/llama-cpp-python.git
pip install hf-transfer

Avremo bisogno di un modello, e abbiamo scelto TheBloke/Mistral-7B-OpenOrca-GGUF. Vedrete che il Llm di MistralAi è molto impressionante quando si tratta di scrivere contenuti. A seconda del vostro hardware, usate una versione più leggera del modello: https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF/tree/main

huggingface-cli download TheBloke/Mistral-7B-OpenOrca-GGUF mistral-7b-openorca.Q8_0.gguf --local-dir /Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q8_0.gguf --cache-dir /Data/Projets/Llm/Models/huggingface_cache/

export HF_HUB_ENABLE_HF_TRANSFER=1 &&  huggingface-cli download TheBloke/Mistral-7B-OpenOrca-GGUF mistral-7b-openorca.Q2_K.gguf --local-dir /Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q2_K.gguf --cache-dir /Data/Projets/Llm/Models/huggingface_cache/

Il vantaggio di questo repository è che il file in formato gguf è già preparato per noi, quindi possiamo utilizzarlo direttamente con llama.cpp e TxtAi. Non è quindi necessaria una GPU. Ancora una volta, l'idea è dimostrare come funziona e prospettare l'uso di apparecchiature destinate a questo scopo.

Avremo bisogno di materiale per eseguire le nostre estrazioni di dati. Grazie a neuml per averci fornito file di esempio. Scarica i documenti da questo indirizzo, oppure usa uno dei tuoi adattando il seguente codice.

from llama_cpp import Llama
from txtai.pipeline import Textractor
import nltk
# Création de notre connection à Llama.cpp avec ces parrametres par defauts.
llm = Llama(
    model_path="/Data/Projets/Llm/Models/MistralAi-OpenOrqa/mistral-7b-openorca.Q8_0.gguf/mistral-7b-openorca.Q8_0.gguf", n_ctx=2048)
# On récupere le texte de notre fichier docx.
textractor = Textractor()
text = textractor("datas/tuto1/document.docx")


# execution de notre appel au modèle.
def execute(question, context):
    # on crée un prompt de démarrage
    prompt = f"""<|im_start|>system You are a friendly assistant. You answer questions from users.<|im_end|> 
    <|im_start|>user Answer the following question using only the context below. Only include information 
    specifically discussed or general AI and LLMs related subject. 
  question: {question}
  context: {context} <|im_end|>
  <|im_start|>assistant
  """

    tokens = nltk.word_tokenize(text)
    print(len(tokens))
    return llm(prompt,
               temperature=0.1,
               max_tokens=10000,
               top_p=0.2,
               top_k=10,
               repeat_penalty=1.2)

# on lance notre methode avec une question mais aussi un contexte tiré de notre fichier docx.
result = execute("Write a long article about TxtAi explaining how it works. You can show code example. Explain how it could solve problem in small and larger company. Make the accurate answer you can do. Make an intro and a conclusion. This could be a general speech in a conference or a learning lesson at Partitech University. Make your answer in french", text)
print(result['choices'][0]['text'])
print(result['choices'][0]['text'])
print(result['usage'])

Ecco il risultato.

 Titre : TxtAi, la base de données d'embeddings pour les recherches sémantiques et l'orchestration des LLMs (Langage de Modèle Linguistique)

Dans cet article, nous allons expliquer comment TxtAi fonctionne en tant que base de données d'embeddings complète pour la recherche sémantique, l'orchestration des Langages de Modèles Linguistiques (LLMs) et les workflows linguistiques. Nous allons également présenter un exemple de code et montrer comment TxtAi peut résoudre des problèmes dans des entreprises de taille différente, que ce soit une petite ou grande entreprise.

TxtAi est une base de données d'embeddings conçue pour faciliter la recherche sémantique et l'orchestration des LLMs. Elle offre plusieurs fonctionnalités importantes, telles que :
1. Recherche vectorielle avec SQL, stockage objet, modélisation du sujet ;
2. Créer des embeddings pour le texte, les documents, la audio et l'image;
3. Pipelines alimentés par des LLMs qui exécutent des prompts de LLM;
4. Workflows permettant de joindre plusieurs pipelines ensemble et d'aggreguer des logiques métier ;
5. Construire avec Python ou YAML, avec des bindings API disponibles pour JavaScript, Java, Rust et Go.

Pour illustrer comment TxtAi fonctionne, voici un exemple de code en Python :


***python
from txtai import TextSearch, DocumentEmbeddings, ImageEmbeddings, Pipeline, Workflow

# Création d'un pipeline avec une LLM
llm_pipeline = Pipeline(model="gpt-3")

# Créer des embeddings pour le texte et l'image
text_embeddings = DocumentEmbeddings("documents.txt", model="all-MiniLM-L6-v2")
image_embeddings = ImageEmbeddings("images/*.jpg", model="BLIP")

# Créer une recherche vectorielle avec SQL et stockage objet
text_search = TextSearch(sql_query="SELECT * FROM documents WHERE similarity > 0.8", storage="object-store")

# Construire un workflow pour joindre les pipelines ensemble
workflow = Workflow([llm_pipeline, text_search, text_embeddings, image_embeddings])

# Exécutez le workflow et affichez les résultats
results = workflow.run()
print(results)
*** 
Ce code montre comment créer un pipeline avec une LLM, générer des embeddings pour du texte et des images, puis construire un workflow qui utilise ces pipelines pour effectuer une recherche vectorielle sur la base de données.

En ce qui concerne l'impact dans les entreprises, TxtAi peut aider à résoudre divers problèmes en améliorant la recherche sémantique et en facilitant le travail des LLMs. Pour une petite entreprise, cela signifie que les employés peuvent accélérer leurs processus de recherche grâce à l'utilisation d'embeddings pour indexer rapidement leur contenu. Dans un contexte plus grand, TxtAi peut aider à améliorer la performance des systèmes de recommandation et à simplifier le développement de workflows linguistiques complexes.

En conclusion, TxtAi est une base d'embeddings complète qui facilite la recherche sémantique et l'orchestration des LLMs pour les entreprises de toutes tailles. Grâce à ses fonctionnalités avancées en matière de vectorisation, de modélisation du sujet et de workflows linguistiques, TxtAi peut améliorer considérablement la productivité et l'efficacité des organisations dans divers domaines.

Notare che l'output è direttamente in formato Markdown. Ho modificato il marcatore del codice, altrimenti non sarebbe molto leggibile.

Passiamo ora a ulteriori spiegazioni riguardo ai parametri utilizzati nella nostra chiamata:

Primo, il prompt. Come definiamo il prompt che inviamo al modello? Niente magie qui. Dovrai andare direttamente alla documentazione del modello. Qui, su HuggingFace: https://huggingface.co/TheBloke/Mistral-7B-OpenOrca-GGUF

Come puoi vedere, il prompt previsto è chiaro: richiede zone <|im_start|>system <|im_start|>user e una zona <|im_start|> che lascia spazio al modello per rispondere. Il trucco qui è definire un contesto nel prompt. È importante capire che lo spazio dato al prompt deve essere predefinito.

n_ctx=2048 = Il numero di token allocati al contesto. È specificato nel documento su huggingface. Come definire il numero di token? Il calcolo del numero di token dipende dal metodo di tokenizzazione utilizzato. La tokenizzazione è il processo di suddivisione di un testo in token. Ecco alcuni passaggi generali per calcolare il numero di token:

import nltk
nltk.download('punkt')  # Assurez-vous d'avoir le package 'punkt' téléchargé pour la tokenisation
text = "Votre texte ici."
tokens = nltk.word_tokenize(text)
number_of_tokens = len(tokens)

Nel nostro esempio, il numero di token del nostro prompt calcolato è 264. Il numero di token restituiti nella risposta è 3182. In realtà, il modello ci restituisce le seguenti informazioni:

{'prompt_tokens': 552, 'completion_tokens': 938, 'total_tokens': 1490}

È quindi un po' più complicato prevedere in anticipo il numero di token.

temperature=0.1

La temperatura controlla il grado di casualità nella scelta di parole o frasi. Influenza le probabilità associate a ogni possibile scelta durante la generazione del testo.

  • A bassa temperatura (vicino a 0), il modello tende a scegliere le parole più probabili, portando a testi più prevedibili e coerenti. Tuttavia, ciò può anche rendere i testi generati meno vari e talvolta ripetitivi.
  • A temperatura elevata, il modello prende maggiori rischi scegliendo parole meno probabili. Questo può portare a testi più creativi, originali o sorprendenti, ma anche a volte meno coerenti o rilevanti. In un modello di generazione di testo, la temperatura funge da regolatore tra coerenza e creatività. Una regolazione attenta della temperatura può influenzare notevolmente la qualità e lo stile del testo generato.

max_tokens=10000

Il parametro max_tokens è utilizzato nei modelli di elaborazione del linguaggio naturale (NLP), come MistralAI e altri modelli basati su reti neurali. Svolge un ruolo cruciale nella definizione della lunghezza dell'output generato dal modello. Ecco alcuni dettagli chiave:

  • max_tokens specifica il numero massimo di token (parole, punteggiatura, simboli, ecc.) che il modello può generare o elaborare in una sola volta. Un "token" è la più piccola unità di elaborazione in NLP.
  • Quando si genera testo, max_tokens limita la lunghezza del testo prodotto. Se il modello raggiunge questo limite durante la generazione, smette di produrre ulteriore testo.
  • Nei compiti di comprensione o analisi del testo, questo parametro può limitare la quantità di testo analizzata in una sola volta.
  • Limitare il numero di token è importante per gestire il consumo delle risorse computazionali. Più alto è il valore di max_tokens, maggiore è la memoria e la potenza di calcolo richiesta per generare o elaborare il testo. Questo è particolarmente rilevante per i grandi modelli NLP, che possono consumare molte risorse.
  • Per brevi generazioni: Un basso valore di max_tokens può essere utilizzato per risposte brevi, come nei chatbot o nei sistemi di risposta a domande.
  • Per testi più lunghi: Un valore più alto è necessario per compiti come la generazione di articoli, racconti o altre forme di contenuti più estesi. La scelta del valore appropriato per max_tokens dipende dall'applicazione specifica e dalle capacità del sistema su cui il modello è in esecuzione.

È spesso necessario trovare un equilibrio tra la qualità e la lunghezza del testo generato e i vincoli di prestazione. In sintesi, max_tokens è un parametro essenziale che aiuta a controllare la lunghezza del testo generato da un modello NLP gestendo al contempo le risorse computazionali necessarie. La sua regolazione adeguata è cruciale per ottenere risultati ottimali in base alle esigenze specifiche dell'applicazione.

top_p=0.2

Il parametro top_p, noto anche come "campionamento del nucleo", è un'impostazione fondamentale nei modelli di generazione del testo come MistralAI. È utilizzato per controllare la diversità e la creatività dei testi generati. Ecco una spiegazione dettagliata: Quando il modello sta generando il testo, assegna una probabilità a ogni parola potenzialmente successiva. top_p opera per filtrare queste parole basandosi sulle loro probabilità cumulative. Praticamente, ciò significa che il modello considera solo un sottoinsieme di parole possibili la cui probabilità cumulativa raggiunge la soglia del top_p. Controllo della diversità del testo:

  • Con un basso top_p, il modello si limita a un minor numero di scelte altamente probabili, portando a testi più prevedibili e meno diversificati.
  • Con un alto top_p, il modello considera un numero maggiore di scelte possibili, aumentando così la diversità e la creatività del testo generato, ma a discapito della coerenza.
  • A differenza della temperatura, che regola le probabilità di tutte le scelte possibili, top_p semplicemente limita il pool di parole considerate per la generazione in base alle loro probabilità cumulative.

top_p offre un'alternativa al campionamento basato sul parametro top_k, dove sono considerate solo le k parole più probabili, a prescindere dalle loro probabilità assolute.

  • Per un testo più standard: Utilizzare un top_p più basso se si desiderano testi più coerenti e allineati con i dati di addestramento.
  • Per un testo più creativo: Un top_p più alto è adatto per compiti che richiedono creatività o originalità, come la scrittura creativa o la generazione di concetti unici.

Il valore di top_p è tipicamente un numero reale compreso tra 0 e 1. La scelta del valore appropriato per top_p dipende dal tipo di testo che si desidera generare e dall'equilibrio desiderato tra creatività e coerenza. In sintesi, top_p è un parametro importante per controllare la diversità e la creatività nella generazione del testo. La sua regolazione permette di trovare il giusto equilibrio tra la produzione di testi originali e il mantenimento di una certa coerenza con lo stile e il contenuto dei dati di addestramento.

top_k=10

Il parametro top_k è un'altra impostazione significativa. Gioca un ruolo vitale nel determinare le scelte di parole del modello durante la generazione del testo.Nella generazione di testo, il modello valuta la probabilità di molte parole potenziali come prossima parola. top_k limita questa selezione alle k parole più probabili.

Ad esempio, se top_k è impostato su 10, il modello considererà solo le prime 10 parole più probabili per continuare la frase ad ogni passaggio di generazione.

  • Un top_k basso (come 5 o 10) rende il testo generato più prevedibile e coerente, in quanto si limita alle scelte più probabili.
  • Un top_k alto aumenta la diversità delle parole generate, in quanto permette al modello di scegliere tra una gamma più ampia di possibilità, cosa che può portare a testi più creativi o sorprendenti.
  • A differenza di top_p, che seleziona le parole basate su una soglia di probabilità cumulativa, top_k si concentra unicamente sul numero fisso di scelte più probabili.
  • top_k viene spesso utilizzato insieme alla temperatura per perfezionare ulteriormente l'output generato.
  • Per testi più standardizzati: un top_k più basso viene spesso utilizzato per compiti che richiedono coerenza e precisione, come rispondere a domande.
  • Per testi più innovativi: un top_k più alto può essere utilizzato per stimolare la creatività, utile nella scrittura creativa o nella generazione di idee.
  • Il valore di top_k è di solito un intero. La scelta di questo valore dipende dal bilanciamento desiderato tra creatività e coerenza nel testo generato.

In sintesi, top_k è un parametro che influenza direttamente la varietà e l'originalità del testo generato da un modello NLP. Deve essere regolato secondo gli obiettivi specifici del compito di generazione del testo, tenendo presente l'equilibrio tra diversità di contenuto e fedeltà allo stile e alla struttura dei dati di allenamento.

repeat_penalty=1.2

Il repeat_penalty è un parametro usato per minimizzare le ripetizioni nel testo generato. È un aspetto importante per migliorare la qualità e la varietà del testo prodotto.

  • Questo parametro mira a penalizzare la ripetizione di parole o frasi che sono già apparse nel testo generato. In altre parole, diminuisce la probabilità di riscegliere parole o frasi che sono state utilizzate di recente.
  • Quando il modello genera testo, assegna punteggi (probabilità) a potenziali parole da utilizzare successivamente. Se una parola è già stata utilizzata, il repeat_penalty riduce il punteggio di quella parola, rendendola meno probabile essere scelta nuovamente.
  • Più alto è il repeat_penalty, più forte è la penalizzazione per la ripetizione di parole.
  • Con un repeat_penalty basso o nullo, il modello può generare testi con ripetizioni frequenti, il che può rendere il testo monotono o meno naturale.
  • Con un repeat_penalty alto, il modello tende ad evitare ripetizioni, il che può contribuire alla varietà e alla ricchezza del testo. Tuttavia, una penalità troppo alta può anche costringere il modello ad usare parole meno appropriate, potenzialmente influenzando la coerenza del testo.
  • Per testi più fluidi: Un repeat_penalty moderato è utile per evitare ripetizioni mantenendo allo stesso tempo consistenza e flusso naturale del testo.
  • Per testi altamente variati: Un repeat_penalty più alto può essere usato per stimolare la diversità nel testo, specialmente in contesti creativi.

Il valore esatto di repeat_penalty dipenderà dalle specifiche del modello e dal tipo di testo che si desidera generare. Spesso è necessario sperimentare con diversi valori per trovare il bilanciamento ideale.

Per ulteriori informazioni, ecco un estratto dalla documentazione di llama_cpp_python. Può essere utile per una migliore comprensione di alcuni parametri.

https://llama-cpp-python.readthedocs.io/en/latest/api-reference/

  • model_path (str) – Percorso del modello.

    • Spiegazione: Indica dove si trova il file del modello sul tuo computer.
  • n_gpu_layers (int, default: 0) – Numero di livelli da trasferire alla GPU (-ngl). Se vale -1, tutti i livelli vengono trasferiti.

    • Spiegazione: Determina quanti livelli del modello dovrebbero essere eseguiti sulla GPU. Utile per gestire il carico di lavoro tra CPU e GPU.
  • main_gpu (int, default: 0) - La GPU utilizzata per calcoli temporanei e tensori piccoli.

    • Spiegazione: Seleziona quale GPU (se ne sono disponibili più di una) viene utilizzata per le operazioni principali.
  • tensor_split (Optional[List[float]], default: None) - Come dividere i tensori tra le GPU. Se None, il modello non viene diviso.

    • Spiegazione: Permette di distribuire i dati del modello su più GPU, se disponibili.
  • vocab_only (bool, default: False) - Carica solo il vocabolario, non i pesi del modello.

    • Spiegazione: Utile se si necessita solo del vocabolario incorporato del modello, senza le parti addestrate.
  • use_mmap (bool, default: True) - Utilizza mmap se possibile.

    • Spiegazione: mmap consente una gestione della memoria più efficiente durante il caricamento di file di grandi dimensioni.
  • use_mlock (bool, default: False) - Forza il sistema a mantenere il modello in RAM.

    • Spiegazione: Garantisce che il modello rimanga nella memoria attiva per un accesso più rapido.
  • seed (int, default: LLAMA_DEFAULT_SEED) - Seme per il generatore di numeri casuali, -1 per casuale.

    • Spiegazione: Determina la sequenza di numeri casuali utilizzata, importante per la riproducibilità dei risultati.
  • n_ctx (int, default: 512) - Contesto testuale, 0 = quello proprio del modello.

    • Spiegazione: Definisce la dimensione del contesto (numero di token) che il modello prende in considerazione per le sue previsioni.
  • n_batch (int, default: 512) - Dimensione massima di elaborazione per batch per i prompt.

    • Spiegazione: Determina quanti prompt possono essere elaborati contemporaneamente.
  • n_threads (Optional[int], default: None) - Numero di thread da utilizzare per la generazione.

    • Spiegazione: Consente di configurare il multithreading per accelerare la generazione.
  • n_threads_batch (Optional[int], default: None) - Numero di thread da utilizzare per l'elaborazione in batch.

    • Spiegazione: Simile a n_threads, ma specifico per l'elaborazione in batch.
  • rope_scaling_type (Optional[int], default: LLAMA_ROPE_SCALING_UNSPECIFIED) - Tipo di scalatura RoPE, secondo l'enumerazione llama_rope_scaling_type. Rif: llama.cpp pull request #2054

    • Spiegazione: Parametro avanzato relativo alla scalatura di alcuni calcoli nel modello.
  • rope_freq_base (float, default: 0.0) - Frequenza di base di RoPE, 0 = quella propria del modello.

    • Spiegazione: Imposta un valore di base per il calcolo della frequenza in RoPE, un parametro avanzato del modello.
  • rope_freq_scale (float, default: 0.0) - Fattore di scala della frequenza di RoPE, 0 = quella propria del modello.

    • Spiegazione: Regola la scala della frequenza utilizzata in RoPE.
  • yarn_ext_factor (float, default: -1.0) - Fattore di estrazione della miscela YaRN, negativo = quella propria del modello.

    • Spiegazione: Parametro avanzato che influenza come YaRN, una parte del modello, mescola i dati.
  • yarn_attn_factor (float, default: 1.0) - Fattore di scala della magnitudine dell'attenzione YaRN.

    • Spiegazione: Regola la scala di alcuni calcoli in YaRN.
  • yarn_beta_fast (float, default: 32.0) – Dimensione della correzione bassa YaRN.

    • Spiegazione: Parametro tecnico relativo alla correzione rapida in YaRN.yarn_beta_slow (float, predefinito: 1.0) – Dimensione elevata della correzione in YaRN.

    • Spiegazione: Parametro tecnico per la correzione lenta in YaRN.

  • yarn_orig_ctx (int, predefinito: 0) – Dimensione del contesto originale di YaRN.

    • Spiegazione: Determina la dimensione del contesto originale per certi calcoli in YaRN.
  • f16_kv (bool, predefinito: Vero) – Usa fp16 per la cache KV, altrimenti fp32.

    • Spiegazione: Determina il formato dei dati nella cache chiave/valore, influenzando le prestazioni e l'utilizzo della memoria.
  • logits_all (bool, predefinito: Falso) – Restituisce i logits per tutti i token, non solo per l'ultimo. Dev'essere Vero perché la completamento restituisca logprob.

    • Spiegazione: Se Vero, il modello fornirà i logits (punteggi prima della funzione di attivazione) per ogni token generato.
  • embedding (bool, predefinito: Falso) – Modalità solo embedding.

    • Spiegazione: Se Vero, il modello opera in modalità embedding, utilizzata per ottenere rappresentazioni vettoriali dei dati.
  • last_n_tokens_size (int, predefinito: 64) – Numero massimo di token da mantenere nel deque last_n_tokens.

    • Spiegazione: Definisce la dimensione del buffer per gli ultimi token generati.
  • lora_base (Optional[str], predefinito: Nessuno) – Percorso opzionale al modello base, utile se stai utilizzando un modello base quantizzato e vuoi applicare LoRA a un modello f16.

    • Spiegazione: Consente di applicare aggiustamenti LoRA a un modello base specifico.
  • lora_path (Optional[str], predefinito: Nessuno) – Percorso a un file LoRA da applicare al modello.

    • Spiegazione: Specifica un file LoRA per modificare il modello.
  • numa (bool, predefinito: Falso) – Abilita il supporto NUMA. (NOTA: Il valore iniziale di questo parametro è utilizzato per il resto del programma poiché questo valore è impostato in llama_backend_init)

    • Spiegazione: Abilita o disabilita il supporto per NUMA, un metodo di ottimizzazione della gestione della memoria su sistemi con più CPU.
  • chat_format (str, predefinito: 'llama-2') – Stringa che specifica il formato della chat da utilizzare quando si chiama create_chat_completion.

    • Spiegazione: Determina il formato di output per le sessioni di chat generate.
  • chat_handler (Optional[LlamaChatCompletionHandler], predefinito: Nessuno) – Gestore della chat opzionale da utilizzare quando si chiama create_chat_completion.

    • Spiegazione: Permette la personalizzazione dell'elaborazione delle sessioni di chat.
  • verbose (bool, predefinito: Vero) – Visualizza output dettagliato su stderr.

    • Spiegazione: Se Vero, il modello fornirà informazioni dettagliate sul suo funzionamento durante l'esecuzione.

Ecco l'introduzione a RAG. Non siamo ancora arrivati al cuore della questione, ma questa prima parte ci ha permesso di evidenziare il concetto e di mostrare come funzionano le cose. Ci vediamo nella seconda parte dove inizieremo a inserire dati nel database. Vedremo come TxtAi riesce da solo a fare query per recuperare contenuti e fornirci una risposta coerente adatta all'utente.