Scopri come creare un'applicazione RAG utilizzando le goccioline GPU
Introduzione al Retrieval Augmented Generation (RAG) per modelli linguistici
In questo articolo imparerai come creare un'applicazione RAG (Retrieval-Augmented Generation) che possa funzionare con i tuoi PDF o altre origini dati. Questo tipo di applicazione è utile per gestire grandi quantità di dati di testo, come libri o dispense, per creare un chatbot in grado di rispondere a qualsiasi domanda in base ai dati forniti. La parte migliore è che utilizzeremo un modello open source, quindi non sarà necessario pagare per l'accesso all'API.
RAG ha guadagnato un'enorme popolarità ed è uno dei framework AI più utilizzati per creare chatbot personalizzati. È anche un potente strumento per creare applicazioni IA basate sulla conoscenza.
RAG può essere pensato come un assistente AI esperto nei dati degli utenti e nel linguaggio umano. Quando viene posta una domanda, utilizza una libreria di informazioni per fornire una risposta dettagliata e accurata. È una potente combinazione di un sistema di recupero delle informazioni e un robusto LLM.
La Retrieval-Augmented Generation (RAG) migliora significativamente la precisione recuperando informazioni rilevanti da varie fonti esterne di conoscenza esterna, migliorando il contesto e la precisione delle risposte generate. Utilizzando dati reali durante il processo di recupero, RAG può anche ridurre le allucinazioni, un problema comune nei modelli linguistici di grandi dimensioni. Inoltre, RAG migliora l'apprendimento nel contesto recuperando informazioni specifiche e aggiornate, rendendolo ideale per casi d'uso come domande e risposte, riepilogo di documenti e flussi di lavoro interattivi.
Ad esempio, abbiamo utilizzato il documento di ricerca di YOLO v9 come fonte dati e il LLM era Llama-2-7b-chat. Abbiamo quindi posto alcune domande sul documento di ricerca ed ecco i risultati rilevanti delle risposte.
response=query_engine.query("What is YOLOv9")
YOLOv9 is a new object detection algorithm that improves upon existing methods in several ways. First, it uses a new architecture that reduces the number of parameters and computations while maintaining the same level of accuracy. Second, it uses a new technique called PGI to accurately retain and extract the information needed to map the data to the target. Finally, it is shown to have significantly improved performance compared to existing methods in all aspects.
response_2=query_engine.query("what is GELAN architecture?")
GELAN architecture is a deep neural network designed for object detection tasks. It consists of multiple prediction branches, each of which is connected to a deep supervision branch. The deep supervision branch is responsible for providing auxiliary information to the main branch, which is used to improve the accuracy of object detection. The GELAN architecture also includes an integration network that combines returned gradients from different prediction heads, allowing the main branch to retain complete information about all target objects. This allows the method to alleviate the broken information problem in deep supervision and improve the overall performance of object detection tasks.
response_3=query_engine.query("What is new with YOLO v9?")
YOLO v9 introduces several new features, including:
1. Conventional convolution: YOLO v9 uses conventional convolution instead of depth-wise convolution, which leads to better parameter utilization.
2. PGI: YOLO v9 uses a new technique called PGI (Progressive Gating and Integration) to accurately retain and extract information needed to map the data to the target.
3. Large models: YOLO v9 shows huge advantages in using large models, requiring only 66% of the parameters while maintaining accuracy as RT DETR-X.
4. Comparison with state-of-the-arts: YOLO v9 compares with other train-from-scratch real-time object detectors, showing significant improvement in all aspects.
Please let me know if you have any further questions or if there's anything else I can help you with.
Abbiamo anche provato l'applicazione con alcuni dati personali, ed ecco il risultato.
response=query_engine.query("Who is Shaoni")
Shaoni Mukherjee is a seasoned Technical Writer and AI Specialist with a deep passion for Generative AI and its transformative potential. With over four years of experience in data science and a strong foundation in AI/ML technologies, she specializes in creating in-depth, technical content that simplifies complex concepts. Currently contributing to DigitalOcean, Shaoni focuses on topics like GPU acceleration, deep learning, and large language models (LLMs), ensuring that developers and businesses alike can harness cutting-edge technology. Her expertise lies in breaking down technical innovations into digestible, actionable insights, making her a trusted voice in the world of AI.
Prerequisiti
- Fondamenti di machine learning: familiarità con concetti come incorporamenti, sistemi di recupero e trasformatori.
- Account DigitalOcean: configura un account con DigitalOcean per accedere ai Droplet GPU.
- Droplet GPU DigitalOcean: crea e configura droplet GPU ottimizzati per carichi di lavoro ML.
- Libreria dei trasformatori: utilizza la libreria
trasformatori
di Hugging Face per caricare modelli preaddestrati e perfezionarli per RAG. - Editor di codice/IDE: configura un IDE come VS Code o Jupyter Notebook per lo sviluppo del codice.
Come funziona la generazione aumentata di recupero (RAG)?
Sappiamo tutti che i modelli linguistici di grandi dimensioni (LLM) sono ottimi nel generare risposte, ma se fai domande in base allo stato finanziario della tua azienda, falliranno e inizieranno a fornire informazioni inaccurate. Ciò accade perché i LLM non hanno accesso al nostro personale e ai dati aggiornati. Incorporando funzionalità di generazione aumentata di recupero (RAG) nei modelli di fondazione, possiamo fornire a LLM il nostro personale e dati aggiornati. Ciò ci consente di porre qualsiasi domanda finanziaria all'applicazione LLM e fornirà risposte basate sulle informazioni accurate che forniamo come fonte dati. Quando aggiungiamo funzionalità potenziate dal recupero a un modello linguistico di grandi dimensioni (LLM), cambia il modo in cui il modello trova le risposte. Invece di utilizzare solo ciò che già conosce, il LLM ha ora accesso a informazioni più accurate.
Ecco come funziona:
- Input dell'utente: un utente pone una domanda.
- Passaggio di recupero: LLM controlla innanzitutto l'archivio dati per trovare informazioni pertinenti sulla domanda dell'utente.
- Generazione di risposte: dopo aver recuperato queste informazioni, LLM le combina con le sue conoscenze per fornire una risposta più accurata e informata.
Questo approccio consente al modello di migliorare le proprie risposte incorporando informazioni aggiuntive, i propri dati, anziché fare affidamento esclusivamente sulla conoscenza esistente. RAG (Retriever-Augmented Generation) aiuta a evitare la necessità di riqualificare il modello con nuovi dati. Invece, possiamo semplicemente aggiornare spesso i nostri dati di allenamento esistenti. Ad esempio, se vengono scoperti nuovi approfondimenti o dati, possiamo aggiungere queste nuove informazioni alle nostre risorse esistenti. Di conseguenza, quando un utente pone una domanda, il modello può accedere a questo contenuto aggiornato senza ripetere l'intero processo di formazione. Ciò garantisce che il modello sia sempre in grado di fornire le risposte più attuali e pertinenti basate sui dati più recenti.
L'implementazione di questo approccio riduce la probabilità che il modello generi informazioni errate. Consente inoltre al modello di riconoscere quando non ha una risposta, se non riesce a trovare una risposta sufficiente all'interno dell'archivio dati. Tuttavia, se il retriever non fornisce al modello di fondazione informazioni di alta qualità, il modello potrebbe non rispondere a una domanda che avrebbe potuto altrimenti risolvere.
1. Input dell'utente (query)
Un utente pone una domanda o fornisce input per un prompt aumentato, che può essere un'istruzione, una query o un'attività.
2. Codifica delle query
L’input dell’utente viene prima convertito in un formato leggibile dalla macchina utilizzando un modello di incorporamento. Gli incorporamenti rappresentano il significato della query in un formato vettoriale (numerico), semplificando la corrispondenza delle preferenze dell'utente con le informazioni pertinenti. Questa rappresentazione numerica è memorizzata in un database vettoriale.
3. Documentalista
Ricerca dati rilevanti: la query codificata viene passata a un sistema di recupero che esegue la ricerca nel database vettoriale. Il retriever cerca porzioni di testo, documenti o dati più rilevanti per la query.
- L'origine dati può essere costituita da basi di conoscenza, articoli o documentazione specifica dell'azienda.
- I suggerimenti in RAG aiutano a colmare il divario tra i sistemi di recupero e i modelli generativi, garantendo che il modello produca risposte accurate e pertinenti.
4. Combinazione di recupero e conoscenza del modello
-
I dati recuperati vengono inseriti in un modello di linguaggio generativo (come GPT o altri LLM). Questo modello combina le informazioni recuperate con la conoscenza preesistente per generare una risposta.
- Rapidare la risposta: la differenza fondamentale qui è che il modello non si basa solo sulla sua conoscenza interna (appresa durante la formazione). Utilizza invece i nuovi dati esterni recuperati per fornire una risposta più informata e accurata.
Demo e spiegazione del codice
Ti consigliamo di seguire il tutorial per configurare GPU Droplet ed eseguire il codice. Abbiamo aggiunto un collegamento alla sezione dei riferimenti che ti guiderà attraverso la creazione di un Droplet GPU e la sua configurazione utilizzando VSCode. Per iniziare, avremo bisogno di un PDF, Markdown o di qualsiasi file di documentazione. Assicurati di creare una cartella separata per archiviare i PDF.
Inizia installando tutti i pacchetti necessari. Il codice seguente fornisce tutti i pacchetti necessari da installare come primo passaggio.
!pip install pypdf
!pip install -U bitsandbytes
!pip install langchain
!pip install -U langchain-community
!pip install sentence_transformers
!pip install llama_index
!pip install llama-index-llms-huggingface
!pip install llama-index-llms-huggingface-api
!pip install llama-index-embeddings-langchain
from llama_index.core import VectorStoreIndex,SimpleDirectoryReader,ServiceContext,PromptTemplate
from llama_index.llms.huggingface import HuggingFaceLLM
from llama_index.core.prompts.prompts import SimpleInputPrompt
from llama_index.embeddings.openai import OpenAIEmbedding
from llama_index.core.node_parser import SentenceSplitter from llama_index.llms.openai import OpenAI
from llama_index.core import Settings
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.embeddings import HuggingFaceEmbeddings
La sezione seguente contiene il codice completo per la creazione dell'applicazione RAG. Ogni passaggio viene spiegato in tutto l'articolo mentre leggi.
import torch
documents=SimpleDirectoryReader("your/pdf/location/data").load_data()
print(documents)
system_prompt="""
You are a Q&A assistant. Your goal is to answer questions as
accurately as possible based on the instructions and context provided.
"""
## Default format supportable by LLama2
query_wrapper_prompt=SimpleInputPrompt("\<|USER|\>{query\_str}\<|ASSISTANT|\>")
!huggingface-cli login
llm = HuggingFaceLLM(
context_window=4096,
max_new_tokens=256,
generate_kwargs={"temperature": 0.0, "do_sample": False},
system_prompt=system_prompt,
query_wrapper_prompt=query_wrapper_prompt,
tokenizer_name="meta-llama/Llama-2-7b-chat-hf",
model_name="meta-llama/Llama-2-7b-chat-hf",
device_map="auto",
model_kwargs={"torch_dtype": torch.float16 , "load_in_8bit":True}
)
embed_model = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2"
)
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
Settings.num_output = 512
Settings.context_window = 3900 a vector store index only needs an embed model
index = VectorStoreIndex.from_documents(
documents, embed_model=embed_model
) create a query engine
query_engine = index.as_query_engine(llm=llm)
response=query_engine.query("what is GELAN architecture?")
print(response)
Una volta archiviati i dati, è necessario dividerli in blocchi. Il codice seguente carica i dati e li divide in blocchi.
# load the data
documents=SimpleDirectoryReader("//your repo path/data").load_data()
split the data into chunks
Settings.node_parser = SentenceSplitter(chunk_size=512, chunk_overlap=20)
Il documento conterrà tutto il contenuto o testo e metadati. Ora, un documento può essere molto lungo, quindi dobbiamo dividere ciascun documento in parti più piccole. Questa fa parte della fase di preelaborazione per preparare i dati per RAG. Queste informazioni più piccole e mirate aiutano il sistema a trovare e recuperare il contesto e i dettagli rilevanti in modo più accurato. Suddividendo i documenti in sezioni chiare, è più semplice individuare le informazioni specifiche del dominio, in passaggi o fatti, aumentando le prestazioni dell'applicazione RAG. Possiamo anche usare “RecursiveCharacterTextSplitter” da “langchain.text_splitter” nel nostro caso stiamo usando “SentenceSplitter” da “llama_index.core.node_parser. "
from langchain.text_splitter import RecursiveCharacterTextSplitter
text_splitter = RecursiveCharacterTextSplitter(
chunk_size=300,
chunk_overlap=100,
length_function=len,
add_start_index=True,
)
Per ulteriori informazioni su RecursiveCharacterTextSplitter, visitare il collegamento nella sezione di riferimento.
Ora impareremo a conoscere gli incorporamenti!
Gli incorporamenti sono rappresentazioni numeriche di dati di testo che aiutano a catturare il significato sottostante dei dati. Convertono i dati in vettori, essenzialmente matrici di numeri, rendendoli più facili da comprendere e da utilizzare per i modelli di apprendimento automatico.
Nel caso degli incorporamenti di testo (ad esempio incorporamenti di parole o frasi), i vettori sono progettati in modo tale che parole o frasi con significati simili siano vicine tra loro nello spazio vettoriale. Ad esempio, “re” e “regina” avrebbero vettori vicini, mentre “re” e “mela” sarebbero distanti. Inoltre, la distanza tra questi vettori può essere calcolata mediante la somiglianza del coseno o la distanza euclidea.
Ad esempio, qui utilizzeremo "sentence-transformers/all-mpnet-base-v2 " da HuggingFaceEmbeddings.
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
embed_model = HuggingFaceEmbeddings(
model_name="sentence-transformers/all-mpnet-base-v2"
)
Questo passaggio prevede la selezione di un modello pre-addestrato, in questo caso "sentence-transformers/all-mpnet-base-v2", per generare gli incorporamenti grazie alle sue dimensioni compatte e alle elevate prestazioni. Possiamo scegliere un modello dalla libreria Sentence Transformers, che mappa frasi e paragrafi in uno spazio vettoriale denso di 768 dimensioni e può essere utilizzato per attività come il clustering o la ricerca semantica nei motori di ricerca.
# a vector store index only needs an embed model
from llama_index.core import VectorStoreIndex
index = VectorStoreIndex.from_documents(
documents, embed_model=embed_model
)
Lo stesso modello di incorporamento verrà poi utilizzato per creare gli incorporamenti per i documenti durante il processo di costruzione dell'indice e per eventuali query per il motore di query.
# create a query engine
query_engine = index.as_query_engine(llm=llm)
response=query_engine.query("Who is Shaoni")
print(response)
Ora parliamo del nostro LLM, qui stiamo utilizzando il modello ottimizzato Llama 2, 7B per il nostro esempio. Meta ha sviluppato e rilasciato la famiglia Llama 2 di modelli linguistici di grandi dimensioni (LLM), che include una gamma di modelli di testo generativi pre-addestrati e ottimizzati con dimensioni da 7 miliardi a 70 miliardi di parametri. Questi modelli hanno costantemente sovraperformato molti modelli di chat open source e sono paragonabili a modelli closed source popolari come ChatGPT e PaLM.
Dettagli chiave
- Sviluppatori di modelli: Meta
- Variazioni: Llama 2 è disponibile nelle misure 7B, 13B e 70B, sia con opzioni pre-addestrate che ottimizzate.
- Input/Output: i modelli acquisiscono testo e lo generano come output.
- Architettura: Llama 2 utilizza un'architettura del trasformatore autoregressivo, con versioni ottimizzate che utilizzano la regolazione fine supervisionata (SFT) e l'apprendimento per rinforzo con feedback umano (RLHF) per allinearsi meglio alle preferenze umane in termini di disponibilità e sicurezza. Tuttavia, sentiti libero di utilizzare qualsiasi altro modello. Molti modelli open source di Hugging Face necessitano di una breve introduzione prima di ogni prompt, chiamata system_prompt. Inoltre, le query potrebbero richiedere un wrapper aggiuntivo attorno a query_str. Qui utilizzeremo sia system_prompt che query_wrapper_prompt.
system_prompt="""
You are a Q&A assistant. Your goal is to answer questions as
accurately as possible based on the instructions and context provided.
"""
## Default format supportable by LLama2
query_wrapper_prompt=SimpleInputPrompt("\<|USER|\>{query\_str}\<|ASSISTANT|\>")
Ora possiamo utilizzare il nostro LLM, il modello incorporato e i documenti per porre domande al riguardo e quindi utilizzare le righe di codice fornite qui.
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader
documents=SimpleDirectoryReader("//your repo path/data").load_data()
index = VectorStoreIndex.from_documents(
documents, embed_model=embed_model
)
query_engine = index.as_query_engine(llm=llm)
response=query_engine.query("what are the drabacks discussed in yolo v9?")
print(response)
YOLOv9 has several drawbacks discussed in the paper, including:
1. Computational complexity: While YOLOv9 is Pareto optimal in terms of accuracy and computation complexity among all models with different scales, it still has a relatively high computation complexity compared to other state-of-the-art methods.
2. Parameter utilization: YOLOv9 using conventional convolution has lower parameter utilization than YOLO MS using depth-wise convolution, and even worse, large models of YOLOv9 have lower parameter utilization than RT DETR using ImageNet pretrained model.
3. Training time: YOLOv9 requires a longer training time compared to other state-of-the-art methods, which can be a limitation for real-time object detection applications.
Please let me know if you have any further questions or if there's anything else I can help you with.
Perché utilizzare GPU Droplet per creare applicazioni basate sull'intelligenza artificiale di nuova generazione?
Sebbene questo tutorial non richieda ai nostri lettori di avere una GPU di fascia alta, le CPU standard non saranno sufficienti per gestire il calcolo in modo efficiente. Pertanto, la gestione di operazioni più complesse, come la generazione di incorporamenti di vettori o l'utilizzo di modelli linguistici di grandi dimensioni, sarà molto più lenta e potrebbe portare a problemi di prestazioni. Per prestazioni ottimali e risultati più rapidi, si consiglia di utilizzare una GPU capace, soprattutto quando disponiamo di un numero elevato di documenti o set di dati o se utilizziamo un LLM più avanzato come Falcon 180b. L'utilizzo delle goccioline GPU di DigitalOcean per la creazione di un'applicazione RAG (Retrieval-Augmented Generation) offrirà numerosi vantaggi:
- Velocità: le GPU Droplet sono progettate per gestire rapidamente calcoli complessi, essenziali per l'elaborazione di grandi quantità di dati. Ciò significa che può generare incorporamenti per un set di dati di grandi dimensioni in un tempo più breve.
- Efficienza con modelli di grandi dimensioni: le applicazioni RAG, come abbiamo visto nel nostro tutorial, utilizzano modelli di linguaggio di grandi dimensioni (LLM) per generare risposte basate sulle informazioni recuperate. Le GPU H100 possono eseguire questi modelli in modo efficiente, consentendo loro di gestire attività come la comprensione del contesto e la generazione di testo simile a quello umano. Ad esempio, se desideri creare un chatbot intelligente che risponda a domande basate su una base di conoscenza e disponi di una libreria di documenti, l'utilizzo di GPU Droplet ti aiuterà a elaborare i dati e a generare rapidamente le query degli utenti.
- Prestazioni migliori: con l'architettura avanzata dell'H100, gli utenti possono aspettarsi prestazioni più elevate quando lavorano con incorporamenti vettoriali e LLM. Ciò significa che la tua applicazione RAG sarà in grado di recuperare informazioni rilevanti e generare risposte più accurate e contestualmente appropriate.
- Scalabilità: se l'applicazione cresce e deve gestire più utenti o dati, le Droplet GPU H100 possono essere facilmente scalate per soddisfare tali esigenze. Ciò significa meno preoccupazioni relative ai problemi di prestazioni man mano che l'applicazione diventa più popolare.
Considerazioni conclusive
In conclusione, Retrieval-Augmented Generation (RAG) è un importante framework di intelligenza artificiale che migliora significativamente le capacità dei modelli linguistici di grandi dimensioni (LLM) per creare applicazioni di intelligenza artificiale. Combinando efficacemente i punti di forza del recupero delle informazioni con la potenza dei modelli linguistici di grandi dimensioni, i sistemi RAG possono fornire risposte accurate, contestualmente rilevanti e informative. Questa integrazione migliora la qualità delle interazioni in vari ambiti, come l'assistenza clienti, la creazione di contenuti e i consigli personalizzati, e consente alle organizzazioni di sfruttare grandi quantità di dati in modo efficiente. Con la crescita della domanda di applicazioni intelligenti e reattive, RAG si distinguerà come un potente framework che aiuta gli sviluppatori a costruire sistemi più intelligenti che soddisfano meglio le esigenze degli utenti. La sua adattabilità ed efficacia lo rendono un attore chiave nel futuro delle soluzioni basate sull’intelligenza artificiale.
Riferimenti aggiuntivi
- Configurazione dell'ambiente Droplet GPU per la codifica AI/ML - Jupyter Labs
- Diviso ricorsivamente per carattere
- Incorporamenti
- HuggingFace LLM - StableLM