Creazione di un agente LLaMa 2 potenziato con la conoscenza di Wikipedia |  di Gabriele Sgroi |  Settembre 2023

 | Intelligenza-Artificiale

In questo post del blog spiegherò come creare un semplice agente in grado di basare le sue risposte sui contenuti recuperati da Wikipedia per dimostrare la capacità degli LLM di cercare e utilizzare informazioni esterne. Su richiesta dell’utente, il modello cercherà le pagine appropriate su Wikipedia e baserà le sue risposte sul loro contenuto. Ho reso disponibile il codice completo in questo repository GitHub.

In questa sezione descriverò i passaggi necessari per creare un semplice agente Llama 2 che risponda a domande basate sulle informazioni recuperate da Wikipedia. In particolare, l’agente…

  • Crea query appropriate per cercare pagine su Wikipedia pertinenti alla domanda dell’utente.
  • Recuperare, dalle pagine trovate su Wikipedia, quella con il contenuto più attinente alla domanda dell’utente.
  • Estrarre, dalla pagina recuperata, i passaggi più rilevanti per il prompt dell’utente.
  • Rispondi alla domanda dell’utente in base agli estratti della pagina.

Si noti che, più in generale, il modello potrebbe ricevere un prompt arricchito con l’intero contenuto della pagina più rilevante o con più estratti provenienti da diverse pagine principali classificate in base alla pertinenza rispetto al prompt dell’utente. Sebbene ciò possa migliorare la qualità della risposta del modello, aumenterà la memoria richiesta poiché porterà inevitabilmente a richieste più lunghe. Per semplicità e per creare un esempio minimo in esecuzione su GPU Google Colab di livello gratuito, ho limitato l’agente a utilizzare solo alcuni estratti dell’articolo più pertinente.

Andiamo ora ad approfondire i vari passaggi. Il primo passaggio che l’agente deve eseguire è creare una query di ricerca adatta per recuperare contenuto da Wikipedia che contenga informazioni per rispondere alla richiesta dell’utente. Per fare ciò, chiederemo a un modello di chat di Llama 2 di restituire parole chiave che rappresentano il prompt dell’utente. Prima di entrare nello specifico del prompt utilizzato, ricorderò brevemente il formato generale del prompt per i modelli di chat di Llama 2.

Il modello utilizzato durante la procedura di addestramento per i modelli di chat di Llama 2 ha la seguente struttura:

<s>(INST) <<SYS>>
{{ system_prompt }}
<</SYS>>

{{ user_message }} (/INST)

Il {{ system prompt}} specifica il comportamento del modello di chat rispetto ai prompt successivi e può essere utile per adattare la risposta del modello a diverse attività. Il {{user_message}} è la richiesta dell’utente a cui il modello deve rispondere.

Tornando al problema di ottenere query di ricerca per Wikipedia, il nostro agente utilizzerà un modello Llama 2 con il seguente prompt:

<s>(INST) <<SYS>>
You are an assistant returning text queries to search Wikipedia articles containing relevant information about the prompt. Write the queries and nothing else.
Example: (prompt) Tell me about the heatwave in Europe in summer 2023 (query) heatwave, weather, temperatures, europe, summer 2023.
<</SYS>>

(prompt) {prompt} (/INST) (query)

{prompt} verrà sostituito, prima della generazione, dall’input dell’utente. L’esempio fornito come parte del prompt del sistema mira a sfruttare le capacità di apprendimento contestuale del modello. L’apprendimento nel contesto si riferisce alla capacità del modello di risolvere nuovi compiti sulla base di alcuni esempi dimostrativi forniti come parte del prompt. In questo modo, il modello può apprendere che ci aspettiamo che fornisca parole chiave pertinenti al prompt fornito separate da virgole dopo il testo (domanda). Quest’ultimo viene utilizzato come delimitatore per distinguere il prompt dalla risposta nell’esempio ed è utile anche per estrarre le query dall’output del modello. Viene già fornito come parte dell’input in modo che il modello dovrà generare solo ciò che verrà dopo.

Una volta ottenute le query dall’output del modello, vengono utilizzate per effettuare ricerche su Wikipedia e recuperare i metadati e il testo delle pagine restituite. Nel codice che accompagna il post, ho utilizzato il file Wikipedia pacchettoche è un semplice pacchetto Python che racchiude il file API MediaWikiper cercare e recuperare i dati da Wikipedia.

Dopo aver estratto il testo dai risultati della ricerca, viene selezionata la pagina più pertinente alla richiesta utente originale. Ciò riallineerà le informazioni recuperate al prompt dell’utente originale, eliminando potenzialmente le divergenze originate dalle query di ricerca generate dal modello. Per fare ciò, sia la richiesta dell’utente che il riepilogo delle pagine del risultato della ricerca sono incorporati e archiviati in un database vettoriale. Viene quindi recuperato l’articolo con l’incorporamento più simile al prompt dell’utente. Ho usato i trasformatori di frasi tutto-MiniLM-L6-v2 modello come modello di incorporamento e un database vettoriale FAISS con l’integrazione fornita da langchain pacchetto.

Dopo aver trovato una pagina pertinente da Wikipedia, poiché l’aggiunta dell’intero testo al prompt potrebbe richiedere molta memoria (o superare il limite dei token del modello per la lunghezza del contesto), il nostro agente troverà gli estratti più rilevanti per aumentare il prompt. Questo viene fatto dividendo prima il testo della pagina in blocchi e poi, come prima, incorporandoli in uno spazio vettoriale e recuperando quelli più vicini al prompt di incorporamento. Ho usato di nuovo il tutto-MiniLM-L6-v2 modello per incorporare i blocchi e un database vettoriale FAISS per archiviarli e recuperarli.

Ora che abbiamo ottenuto i passaggi recuperati dall’articolo, possiamo combinarli con la richiesta dell’utente e inviarli al modello Llama 2 per ottenere una risposta. Il modello utilizzato per l’input è il seguente

<s>(INST) <<SYS>>
You are a helpful and honest assistant. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content.
You have retrieved the following extracts from the Wikipedia page {title}:
{extracts}.
You are expected to give truthful answers based on the previous extracts. If it doesn't include relevant information for the request just say so and don't make up false information.
<</SYS>>

{prompt} (/INST)

Prima della generazione, {prompt} viene sostituito dal prompt dell’utente, {title} dal titolo della pagina Wikipedia e {extracts} viene sostituito dai passaggi estratti. Si potrebbero anche fornire alcuni esempi per sfruttare nuovamente le capacità di apprendimento nel contesto del modello, ma ciò renderebbe il prompt significativamente più lungo aumentando i requisiti di memoria.

Verifichiamo ora se il modello è in grado di rispondere utilizzando informazioni aggiornate che non erano presenti durante il suo addestramento estraendole da Wikipedia. L’esempio seguente è stato ottenuto utilizzando la versione chat più piccola di LLaMa 2 con 7 miliardi di parametri in esecuzione sulle GPU di livello gratuito di Google Colab.

Ho dato al modello il seguente messaggio:

prompt: "Tell me about the earthquake in Marrakesh"

Il modello ha creato la seguente query da cercare su Wikipedia:

"earthquake, Marrakesh, Morocco, recent earthquakes, seismic activity."

Dopo aver estratto i passaggi dalla pagina più rilevante, il modello ha restituito la seguente risposta:

The earthquake that occurred in Marrakesh on September 8, 2023, was a
devastating event that caused widespread destruction and loss of life in
the region. According to the information provided on Wikipedia, the
earthquake had a moment magnitude of 6.8-6.9 and a maximum Mercalli
intensity of VIII (Severe), making it the strongest instrumentally recorded
earthquake in Morocco and the deadliest since the 1960 Agadir earthquake.
The earthquake's epicentre was located approximately 45 miles (73.4 km)
southwest of Marrakesh, near the town of Ighil and the Oukaïmeden ski
resort in the Atlas Mountains. The earthquake occurred as a result of
shallow oblique-thrust faulting beneath the mountain range. According to
the World Health Organization, around 300,000 people from Marrakesh and the
surrounding areas were affected by the earthquake, including 100,000
children. The earthquake resulted in at least 2,946 deaths, with most
occurring outside of Marrakesh. It is important to note that the
information provided on Wikipedia is based on available data and may not be
exhaustive or up-to-date. If you have any specific questions

L’agente restituisce inoltre i metadati e gli estratti della pagina che ha utilizzato per la risposta, consentendo all’utente di verificarne la correttezza e di entrare più nel dettaglio leggendo la pagina originale. Ecco i metadati per la risposta precedente

RETRIEVED WIKIPEDIA PAGE: 
title: 2023 Marrakesh–Safi earthquake
url: https://en.wikipedia.org/wiki/2023_Marrakesh%E2%80%93Safi_earthquake
Retrieved extracts:
Extract_0:Earthquake aftermath in Marrakesh and Moulay Brahim Extract_1:.
Damage was widespread, and historic landmarks in Marrakesh were destroyed.
The earthquake was also felt in Spain, Portugal, and Algeria.It is the
strongest instrumentally recorded earthquake in Morocco, the deadliest in
the country since the 1960 Agadir earthquake and the second-deadliest
earthquake of 2023 after the Turkey–Syria earthquake. The World Health
Organization estimated about 300,000 people from Marrakesh and the
surrounding areas were affected, including 100,000 children Extract_2:On 8
September 2023 at 23:11 DST (22:11 UTC), an earthquake with a moment
magnitude of 6.8–6.9 and maximum Mercalli intensity of VIII (Severe) struck
Morocco's Marrakesh–Safi region. The earthquake's epicentre was located
73.4 km (45.6 mi) southwest of Marrakesh, near the town of Ighil and the
Oukaïmeden ski resort in the Atlas Mountains. It occurred as a result of
shallow oblique-thrust faulting beneath the mountain range. At least 2,946
deaths were reported, with most occurring outside Marrakesh

In questo post ho spiegato come creare un semplice agente in grado di rispondere al prompt di un utente effettuando una ricerca su Wikipedia e basando la sua risposta sulla pagina recuperata. Nonostante la sua semplicità, l’agente è in grado di fornire risposte aggiornate e precise anche con il modello più piccolo Llama 2 7B. L’agente restituisce anche gli estratti della pagina che ha utilizzato per generare la sua risposta, consentendo all’utente di verificare la correttezza delle informazioni fornite dal modello e di entrare più nel dettaglio leggendo l’intera pagina originale.

Wikipedia è un terreno di gioco interessante per dimostrare la capacità di un agente LLM di cercare e utilizzare informazioni esterne che non erano presenti nei dati di formazione, ma lo stesso approccio può essere applicato in altri contesti in cui è necessaria conoscenza esterna. È il caso, ad esempio, di applicazioni che richiedono risposte aggiornate, campi che necessitano di conoscenze specifiche non presenti nei dati di addestramento o estrazione di informazioni da documenti privati. Questo approccio evidenzia anche il potenziale della collaborazione tra LLM e gli esseri umani. Il modello può restituire rapidamente una risposta significativa cercando informazioni rilevanti da una base di conoscenza esterna molto ampia, mentre l’utente umano può verificare la validità della risposta del modello e approfondire la questione esaminando la fonte originale.

Un semplice miglioramento dell’agente descritto in questo post può essere ottenuto combinando più estratti da pagine diverse per fornire una maggiore quantità di informazioni al modello. In caso di prompt complessi, infatti, potrebbe essere utile estrarre informazioni da più pagine di Wikipedia. Il conseguente aumento dei requisiti di memoria dovuto ai contesti più lunghi può essere parzialmente compensato implementando tecniche di quantizzazione come GPTQ. I risultati potrebbero essere ulteriormente migliorati dando al modello la possibilità di ragionare sui risultati della ricerca e sul contenuto recuperato prima di dare la sua risposta finale agli utenti, seguendo ad esempio il framework ReAct descritto nel documento ReAct: sinergia tra ragionamento e azione nei modelli linguistici. In questo modo, ad esempio, è possibile costruire un modello che raccolga iterativamente i passaggi più rilevanti da diverse pagine, scartando quelli non necessari e combinando informazioni provenienti da argomenti diversi.

Grazie per aver letto!

Fonte: towardsdatascience.com

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *