Componenti

Nel contesto di un sistema di intelligenza artificiale o di un modello di machine learning, ci sono diversi componenti e concetti chiave che lavorano insieme per creare un flusso di lavoro funzionale e efficiente.

Response

La componente responsabile di inviare la lista di messaggi, che è stata creata attraverso trasformazioni e raccolta dati, alla rete neurale.

Fantasy: Questo è un parametro che determina il grado di creatività del modello. Valori più alti come 8 rendono l'output del modello più imprevedibile e innovativo, mentre valori più bassi come 2 lo rendono più concentrato e prevedibile.

Lunghezza della Risposta (MAX): Questo parametro stabilisce il numero massimo di token (unità di informazione) che la risposta del modello può contenere. Determina essenzialmente la lunghezza massima della risposta generata dal modello.

Messaggio di Sistema: Questo parametro serve a personalizzare il comportamento e le caratteristiche del modello. È qui che definiamo la personalità, l'obiettivo e le linee guida generali per il modello. Ad esempio, potremmo definire il modello come un assistente virtuale utile, oppure come un bot che emula il comportamento sarcastico di un personaggio chiamato Marco, o come un chatbot aziendale progettato per rispondere esclusivamente a domande relative al settore X.Questi parametri sono fondamentali per affinare le capacità del modello, rendendolo un assistente versatile e adattabile, capace di rispondere in modo efficace a una vasta gamma di requisiti.

Request

Questa componente svolge un ruolo fondamentale nel processo di comunicazione con la chat. Il suo compito è quello di estrapolare e filtrare la conversazione dalla chat, assicurandosi di gestire in modo appropriato il volume dei dati in modo da non superare il limite di token che la rete neurale è in grado di gestire.

Questa componente opera in due fasi. La prima fase consiste nel prelevare l'intera conversazione dalla chat. Ciò include non solo i messaggi dell'utente, ma anche le risposte precedenti del modello, in quanto entrambi i tipi di messaggi forniscono contesto per la risposta successiva.La seconda fase riguarda il filtraggio dei messaggi. A causa di limitazioni tecniche, una rete neurale può gestire solo un numero specifico di token per volta. Questa componente, quindi, deve assicurarsi che il numero totale di token nei messaggi non superi questo limite. Per fare ciò, può adottare diverse strategie. Ad esempio, potrebbe scegliere di troncare o eliminare alcuni messaggi, o potrebbe scegliere di riformulare o comprimere i messaggi per ridurre il loro numero di token.In poche parole, questa componente agisce come un interfaccia di gestione efficace tra l'utente, la chat e la rete neurale, garantendo un flusso di comunicazione fluido e ottimizzato.

Serialize

Questa componente ha il compito cruciale di trasformare una lista di messaggi in un unico testo serializzato. Il processo di serializzazione converte più messaggi, ciascuno con la propria individualità e contenuto, in un flusso di dati continuo e sequenziale.

Per capire meglio, immaginiamo di avere una serie di messaggi separati: Messaggio 1, Messaggio 2, Messaggio 3, e così via. Ogni messaggio ha la propria identità e funzione all'interno della conversazione. Tuttavia, per facilitare il processo di elaborazione da parte della rete neurale, questi messaggi devono essere convertiti in un formato più gestibile. Qui entra in gioco la componente che stiamo discutendo.Questa componente prende ciascun messaggio e lo combina con gli altri in un unico testo. Questo non significa semplicemente mettere insieme i messaggi uno dopo l'altro. La serializzazione implica la creazione di un flusso di dati che mantiene la sequenza e il contesto dei messaggi originali.Il risultato è un unico testo che contiene tutte le informazioni rilevanti dei messaggi originali, presentate in sequenza. Questo testo serializzato è quindi pronto per essere inviato alla rete neurale per l'elaborazione successiva.

Last

Questa componente ha il compito specifico di estrapolare il testo dell'ultimo messaggio dalla lista di messaggi in una conversazione. Questa funzione è particolarmente importante per mantenere il contesto attuale e pertinente della conversazione.

Quando una conversazione è in corso, vengono scambiati una serie di messaggi. Ogni messaggio contribuisce al filo della conversazione, aggiungendo nuove informazioni, rispondendo a domande precedenti o introducendo nuovi argomenti. Tuttavia, l'ultimo messaggio in una conversazione ha spesso un'importanza particolare, perché rappresenta la richiesta più recente o il punto più attuale della discussione.Ecco dove interviene questa componente. Il suo compito è identificare e prelevare il testo di questo ultimo messaggio. Questo non è un compito semplice come potrebbe sembrare. Richiede la capacità di navigare attraverso la lista di messaggi, identificare correttamente l'ultimo messaggio e poi estrapolare con precisione il suo testo.Una volta che il testo è stato prelevato, può essere utilizzato per vari scopi. Ad esempio, può essere inviato alla rete neurale per generare una risposta appropriata, o può essere utilizzato per aggiornare il contesto della conversazione.

List

Questa particolare componente del sistema svolge una funzione essenziale nel gestire e organizzare un insieme di messaggi o 'N messaggi'. Il suo compito centrale è quello di prendere questi messaggi e ordinarli in una lista strutturata, basandosi sulle connessioni tra i messaggi. Questo processo di ordinamento può essere vitale per mantenere la coerenza e il flusso logico della conversazione.

Se supponiamo di avere un insieme di messaggi etichettati come A, B, C, e così via. Ogni messaggio potrebbe rappresentare una specifica interazione o un punto di discussione all'interno di una conversazione. Tuttavia, l'ordine in cui questi messaggi vengono ricevuti o processati potrebbe non essere necessariamente sequenziale o logico.Ecco dove questa componente mostra il suo valore. Analizza ogni messaggio e identifica le connessioni tra di loro. Queste connessioni potrebbero basarsi su una varietà di fattori, come il contenuto del messaggio, il tempo di arrivo del messaggio, o la risposta a un messaggio precedente.Una volta identificate queste connessioni, la componente procede a riordinare i messaggi in una lista strutturata. Questo ordinamento garantisce che i messaggi siano presentati in un modo che rispetti il flusso logico e temporale della conversazione.

PDF

Il componente PDF è un elemento specifico all'interno di un sistema di intelligenza artificiale o di un software che ha il compito di generare un documento in formato PDF.

Il PDF viene gestito dal VECTOR DB

Per crearlo infatti dovrai andare nella sezione Dynamic context e creare un nuovo Vector DB. Una volta creato il tuo PDF specifico sarà presente tra le voci per poter essere selezionato.

CSV

Questa componente svolge un ruolo critico nell'interfacciamento di un file .CSV con il modello. I file .CSV (Comma-Separated Values) sono un tipo di file di dati che memorizzano le informazioni in forma tabulare, con ogni campo separato da una virgola. Questi file sono ampiamente utilizzati per la gestione dei dati grazie alla loro semplicità e portabilità.

L'interfacciamento di un file .CSV all'interno del modello è un processo che richiede accuratezza e precisione. Innanzitutto, la componente deve aprire e leggere il file .CSV. Questa operazione può includere la decodificazione del file, la gestione di eventuali errori o problemi di compatibilità, e l'interpretazione corretta dei dati in esso contenuti.Una volta che i dati sono stati letti, la componente deve trasformare questi dati in un formato che il modello possa comprendere e utilizzare. Questo può significare la conversione dei dati in specifici tipi di dati, la mappatura dei dati in determinate strutture, o l'applicazione di altre trasformazioni a seconda delle esigenze del modello.Dopo che i dati sono stati adeguatamente preparati, la componente poi li inoltra al modello. Questo può comportare l'alimentazione dei dati al modello in determinati modi, come l'inserimento dei dati in specifiche parti del modello, o l'adattamento dei dati alle specifiche funzioni del modello.

Text

Questa componente ha il ruolo cruciale di manipolare e gestire i risultati precedenti durante l'esecuzione, o "run-time", unendo vari pezzi di testo. Questa funzione è particolarmente importante per creare risposte coerenti e pertinenti basate sul contesto di una conversazione o su dati precedenti.

Il run-time si riferisce al periodo di tempo in cui un programma o un sistema è in esecuzione. Durante il run-time, vari processi avvengono, tra cui la ricezione dei dati in input, l'elaborazione dei dati e la generazione di dati in output.Ora, parlando della componente specifica, il suo compito è quello di gestire e manipolare i risultati generati in precedenza durante il run-time. Questi risultati possono essere dati di output da precedenti operazioni di elaborazione o risposte generate in precedenza dal modello.La componente prende questi risultati e li unisce con vari pezzi di testo. Questo processo di unione può servire a vari scopi. Ad esempio, potrebbe essere usato per creare una risposta più dettagliata o complessa, combinando varie parti di informazioni. Oppure potrebbe essere usato per mantenere la coerenza e il contesto in una conversazione, collegando la risposta attuale con le informazioni precedenti.Il processo di unione richiede un'attenta gestione e manipolazione dei dati. La componente deve essere in grado di identificare quali pezzi di testo devono essere uniti, e come devono essere uniti in modo da mantenere la coerenza e la pertinenza. Inoltre, la componente deve essere in grado di eseguire queste operazioni in modo efficiente durante il run-time, per garantire un flusso di comunicazione fluido e tempestivo.

Logic

Il componente LOGIC che si occupa di aggiungere logiche condizionali è un elemento fondamentale di un sistema di intelligenza artificiale o di un software. Questo componente è responsabile dell'introduzione di regole e condizioni che guidano il funzionamento del sistema, permettendogli di prendere decisioni basate su specifici criteri o condizioni.

Le logiche condizionali sono essenzialmente istruzioni di "se, allora" che determinano come un sistema dovrebbe reagire in base a determinate situazioni o input. Per esempio, in un assistente virtuale, una logica condizionale potrebbe essere: "Se l'utente chiede l'ora, allora rispondi con l'ora corrente". Queste istruzioni guidano il sistema per eseguire determinate azioni basate su specifici input o condizioni.Il componente LOGIC lavora costantemente per valutare queste condizioni e determinare quale azione intraprendere. Questo richiede competenze di elaborazione avanzate, dato che il sistema deve essere in grado di interpretare correttamente l'input, valutare le condizioni applicabili e quindi eseguire l'azione appropriata.Inoltre, il componente LOGIC può anche gestire logiche condizionali più complesse. Queste potrebbero includere istruzioni annidate, dove diverse condizioni devono essere soddisfatte, o istruzioni di "se, allora, altrimenti", dove diverse azioni possono essere intraprese a seconda di diverse condizioni.

Create User Message

Il componente "CREA MESSAGGIO UTENTE" è un elemento cruciale nel design di un assistente virtuale o di un sistema di intelligenza artificiale. Questo componente ha il compito di raccogliere, strutturare e preparare l'input dell'utente per essere processato dal sistema.

Il componente create user message ha il compito di creare un oggetto messaggio definendo che ruolo ha quest ultimo nella conversazione In questo caso viene creato un messaggio utente, questo significa che quando la rete analizzerà la conversazione per rispondere, questo messaggio sarà considerato come scritto dall’ utente

Create Assistant Message

Il componente "CREA MESSAGGIO ASSISTENTE" ha il compito di generare risposte o messaggi da parte dell'assistente.

Il componente assistant message è una parte essenziale nel contesto della conversazione. Esso ha la funzione di creare un oggetto messaggio, che ha il compito di definire il ruolo che il determinato messaggio ha all'interno della conversazione.In questo caso, viene generato un messaggio di tipo "assistant". Questo vuol dire che, una volta che il modello della rete neurale procederà all'analisi della conversazione per fornire la risposta più appropriata, tale messaggio sarà interpretato come se fosse stato scritto dall'assistente virtuale stesso.Questa distinzione è fondamentale per il corretto funzionamento del modello AI, perché consente di distinguere chiaramente i contributi dell'utente da quelli dell'assistente. Inoltre, aiuta l'IA a capire il contesto e il flusso della conversazione, permettendole di generare risposte coerenti e pertinenti.Inoltre, il modello tiene conto non solo del contenuto di ciascun messaggio, ma anche dell'ordine in cui i messaggi sono stati scritti. Questo permette all'IA di mantenere un filo logico nel corso della conversazione, rispondendo in modo appropriato in base a ciò che è stato detto precedentemente sia dall'utente che dall'assistente.Pertanto, la creazione di un messaggio di tipo "assistant" è un aspetto chiave per garantire un'interazione fluida e naturale tra l'utente e l'assistente virtuale, contribuendo a creare un'esperienza di conversazione più realistica e coinvolgente per l'utente.

Create Function Message

Il componente "CREA MESSAGGIO FUNCTION" è un elemento chiave del sistema che gestisce la creazione di messaggi funzionali o di output all'interno di un assistente virtuale o di un sistema di intelligenza artificiale.

Questo componente è responsabile dell'elaborazione dei risultati di un'azione o di una funzione specifica e della loro trasformazione in un messaggio strutturato che può essere presentato all'utente. Il componente create message ha il compito di creare un oggetto messaggio definendo che ruolo ha quest ultimo nella conversazione In questo caso viene creato un messaggio di tipo funzione, questo significa che quando la rete analizzerà la conversazione per rispondere, questo messaggio sarà considerato come risultato dell’ esecuzione e la reta saprà che dovrà usare questo mesaggio come verità assoluta e lo dovrà usare per rispondere
CONTENT - contenuto del mesaggio
NAME- nome della funzione per ricorsare quale funzione è stata chiamata per avere la risposta

Dynamic Context

Nella sezione "Generale" dei contesti dinamici è possibile configurare diverse informazioni chiave che riguardano il modello.

Settings

Sezioni più specifiche per il modello.

- Icona del modello: Qui è possibile caricare un'icona che rappresenta visivamente il modello. L'icona può essere un'immagine o un logo che identifica in modo univoco il modello.
- Titolo: Questo campo consente di inserire il titolo del modello. Il titolo dovrebbe essere breve e descrittivo, in modo da fornire agli utenti una panoramica chiara del modello.
- Descrizione: Qui è possibile fornire una descrizione più dettagliata del modello. La descrizione può includere informazioni sulle caratteristiche, le funzionalità e gli utilizzi del modello, al fine di fornire agli utenti una comprensione approfondita di cosa aspettarsi.
- BIO (più lunga): Questo campo consente di inserire una biografia o una descrizione più estesa del modello.

Modelli

Sezioni più specifiche per il modello.

Nella sezione "Model" dei contesti dinamici è possibile personalizzare il comportamento del modello inserendo un prompt specifico. Il prompt è la frase o la domanda che viene presentata al modello per guidarne l'elaborazione e generare una risposta. È possibile scrivere un prompt adatto al contesto specifico in cui si intende utilizzare il modello, in modo da ottenere risposte più accurate e rilevanti.La sezione "Share" consente di condividere il modello con altre persone o utenti. In questo modo possono accedere al modello e utilizzarlo per ottenere risposte alle loro domande o per sperimentare diverse interazioni.Infine, nella sezione "Delete" si ha la possibilità di eliminare il modello. Configurando correttamente queste sezioni, è possibile personalizzare il modello, condividerlo con altri utenti e gestirne la rimozione, per adattarsi alle proprie esigenze e garantire un'esperienza ottimale nell'utilizzo dei contesti dinamici.

Plug-in

Estensione che viene utilizzato per arricchire le funzionalità di CINZIA

Il componente chiamato "layer" è una struttura dati nel formato JSON. Questa struttura svolge definisce i parametri che una determinata funzione può accettare. Ma il suo ruolo non si ferma qui: il layer ha anche il compito di estrarre queste informazioni dalla conversazione e formattarle in modo che possano essere correttamente interpretate ed elaborate dal sistema.All'interno del layer, ogni plugin viene identificato da un ID univoco. Questo ID serve a descrivere in maniera univoca il plugin e a distinguerlo da tutti gli altri.Successivamente, c'è un campo denominato "type", che specifica il tipo di dato richiesto per il parametro. Questo può variare: "string" indica che il parametro deve essere un testo; "number" significa che deve essere un numero; "array", invece, specifica che il parametro deve essere una lista.Il campo "description" fornisce ulteriori dettagli sul parametro. In particolare, esso descrive cosa il parametro deve contenere e come deve essere formattato. Queste indicazioni sono fondamentali per garantire che il parametro sia corretto e possa essere utilizzato in maniera efficace dal sistema.Infine, il campo "required" presenta la lista dei parametri che sono obbligatori. Questi devono essere necessariamente forniti per garantire il corretto funzionamento del sistema.

Vector DB

Il Vector DB è un componente che consente di caricare file PDF nel sistema per poterli utilizzare successivamente in un modello o in altre operazioni. Una volta che i file PDF sono stati caricati nel Vector DB, il sistema è in grado di leggere e analizzare il contenuto di tali file per estrarre informazioni o eseguire operazioni specifiche.

Lunghezza del chunk: Questa funzione consente di definire la dimensione di ogni blocco di testo (chunk). Questo può aiutare a mantenere il documento organizzato e coerente, assicurando che ogni blocco di testo sia della stessa dimensione.

Ridondanza: Questa funzione consente di definire la quantità di sovrapposizione tra i blocchi di testo. Questo è utile per assicurare che nessuna informazione importante venga persa tra un blocco e l'altro e che ci sia una certa quantità di ripetizione per rafforzare i punti chiave.

Filtro: Questa funzione è particolarmente utile quando si lavora con un grande numero di risultati. Consente di filtrare i risultati in base a un punteggio specifico. Per esempio, potresti chiedere al sistema di mostrarti solo i primi 10 risultati con un punteggio superiore a 0.7.

TOP K: Questa funzione consente di limitare il numero di risultati restituiti dal sistema. Se imposti K a 10, il sistema ti mostrerà solo i primi 10 risultati. Questo può aiutare a gestire un grande numero di risultati, mostrandoti solo i più rilevanti o utili.

Ricorda, tutti questi parametri sono configurabili in base alle tue esigenze specifiche per aiutarti a gestire meglio i tuoi file PDF.

Guida di sopravvivenza ai prompt

Questa guida condivide strategie e tattiche per ottenere risultati migliori da Cinzia. I metodi descritti qui possono talvolta essere combinati per un effetto maggiore. Incoraggiamo l'esperimento per trovare i metodi che funzionano meglio per te.

Sei strategie per ottenere risultati migliori:

Scrivi istruzioni chiare

Cinzia non può leggere nella tua mente. Se gli output sono troppo lunghi, chiedi delle risposte brevi. Se gli output sono troppo semplici, chiedi della scrittura di livello esperto. Se non ti piace il formato, mostra il formato che vorresti vedere. Meno Cinzia deve indovinare ciò che vuoi, più probabile è che tu lo ottenga.

Tattiche:

Fornisci testo di riferimento

Cinzia può inventare con sicurezza risposte false, specialmente quando si tratta di argomenti che richiedono conoscenze dettagliate (numeri di telefono aziendali o sapere con certezza l'orario) o per citazioni e URL. Allo stesso modo in cui un foglio di appunti può aiutare uno studente a fare meglio in un test, fornire un testo di riferimento a Cinzia può contribuire a rispondere con meno invenzioni.

Tattiche:

Suddividi compiti complessi in sottocompiti più semplici

Proprio come è buona pratica nell'ingegneria del software scomporre un sistema complesso in un insieme di componenti modulari, lo stesso vale per i compiti sottoposti a Cinzia. I compiti complessi tendono ad avere tassi di errore più elevati rispetto ai compiti più semplici. Inoltre, i compiti complessi possono spesso essere ridefiniti come un flusso di lavoro di compiti più semplici in cui gli output dei compiti precedenti vengono utilizzati per costruire gli input dei compiti successivi.

Tattiche:

Dai tempo a Cinzia per "pensare"

Se ti viene chiesto di moltiplicare 17 per 28, potresti non saperlo istantaneamente, ma puoi comunque calcolarlo con il tempo. Allo stesso modo, Cinzia commette più errori di ragionamento quando cerca di rispondere subito, invece di prendersi il tempo per elaborare una risposta. Chiedere una catena di ragionamenti prima di una risposta può aiutare Cinzia a ragionare in modo più affidabile verso risposte corrette.

Tattiche:

Usa strumenti esterni

Compensa le debolezze di Cinzia alimentandola con gli output di altri strumenti. Ad esempio, un sistema di recupero testo può informare Cinzia sui documenti pertinenti. Un motore di esecuzione del codice può aiutare Cinzia a fare matematica ed eseguire il codice.

Tattiche:

Testa i cambiamenti sistematicamente

Migliorare le prestazioni è più facile se puoi misurarle. In alcuni casi, una modifica a un prompt otterrà una migliore performance su alcuni esempi isolati ma porterà a una peggiore prestazione complessiva su un insieme di esempi più rappresentativo. Pertanto, per essere sicuri che un cambiamento sia positivo per le prestazioni, potrebbe essere necessario definire una suite di test esaustiva (nota anche come "eval").

Tattiche:

Tattiche:

Ogni strategia elencata sopra può essere istanziata con tattiche specifiche. Queste tattiche sono pensate per fornire idee su cosa provare. Non sono esaustive e puoi liberamente provare idee creative che qui non sono rappresentate.

Strategia: Scrivere istruzioni chiare

Tattica: Includere dettagli nella tua richiesta per ottenere risposte più pertinenti.

Per ottenere una risposta altamente pertinente, assicurati che le richieste forniscano eventuali dettagli o contesto importanti. Altrimenti stai lasciando al modello il compito di indovinare cosa intendi.

Peggiore
Migliore

Come aggiungere numeri in Excel?

Come sommare una riga di importi in dollari in Excel? Voglio farlo automaticamente per l'intera scheda di righe, con tutti i totali che finiscono sulla destra in una colonna chiamata "Totale".

Chi è il presidente?

Chi era il presidente Italiano nel 2021 e con quale frequenza si svolgono le elezioni?

Scrivi del codice per calcolare la sequenza di Fibonacci.

Scrivi una funzione TypeScript per calcolare efficientemente la sequenza di Fibonacci. Commenta il codice liberamente per spiegare cosa fa ogni parte e perché è stato scritto in quel modo.

Sintetizza le note della riunione.

Sintetizza in un unico paragrafo il riassunto della riunione. Quindi scrivi un elenco di markdown degli speaker e dei loro punti chiave. Infine, elenca le prossime azioni o compiti suggeriti dagli speaker, se presenti.

Tattica: Chiedi al modello di adottare una persona

Il messaggio di sistema può essere utilizzato per specificare la persona adottata dal modello nelle sue risposte.

Sistema

Quando chiedo aiuto per scrivere qualcosa, risponderai con un documento che contiene almeno una battuta o un commento giocoso in ogni paragrafo.

User

Scrivi una nota di ringraziamento al mio fornitore di bulloni in acciaio per aver consegnato il materiale in tempo e con poco preavviso. Ciò ha reso possibile la consegna di un ordine importante.

Tattica: Usa delimitatori per indicare chiaramente le parti distinte dell'input

Delimitatori come le triple virgolette, i tag XML, i titoli di sezione, ecc. possono aiutare a delimitare le sezioni di testo da trattare in modo diverso.

User

Sintetizza il testo delimitato dalle triple virgolette con un haiku.

“””Inserisci qui il testo”””

Sistema

Ti verrà fornita una coppia di articoli (delimitati da tag XML) sullo stesso argomento. In primo luogo, sintetizza gli argomenti di ciascun articolo. Indica poi quale dei due articoli presenta un argomento migliore e spiega il motivo.

User

<article> inserisci qui il primo articolo </article>

<article> inserisci qui il secondo articolo </article>

Sistema

Ti verrà fornito un abstract di tesi e un titolo suggerito per esso. Il titolo della tesi dovrebbe dare al lettore una buona idea dell'argomento della tesi ma dovrebbe anche essere accattivante. Se il titolo non soddisfa questi criteri, suggerisci 5 alternative.

User

Abstract: inserisci qui l'abstract

Titolo: inserisci qui il titolo

Per compiti semplici come questi, l'uso dei delimitatori potrebbe non fare la differenza nella qualità dell'output. Tuttavia, più complesso è il compito, più è importante disambiguare i dettagli del compito. Non far lavorare Cinzia per capire esattamente ciò che le stai chiedendo.

Tattica: Specificare i passaggi necessari per completare un compito

Alcuni compiti sono meglio specificati come una sequenza di passaggi. Scrivere esplicitamente i passaggi può rendere più facile per il modello seguirli.

Sistema

Usa le seguenti istruzioni passo-passo per rispondere agli input dell'utente.

Passo 1 - L'utente ti fornirà un testo tra triple virgolette. Sintetizza questo testo in una sola frase con un prefisso che dice "Sommario: ".

Passo 2 - Traduci il riassunto dal Passo 1 in spagnolo, con un prefisso che dice "Traduzione: ".

User

"""inserisci qui il testo"""

Tattica: Fornire esempi

Fornire istruzioni generali che si applicano a tutti gli esempi è generalmente più efficiente che dimostrare tutte le permutazioni di un compito tramite esempi, ma in alcuni casi fornire esempi può essere più facile. Ad esempio, se si intende che il modello copi un particolare stile di risposta alle richieste dell'utente che è difficile da descrivere esplicitamente. Questo è noto come "few-shot" prompting.

Sistema

Rispondi in uno stile coerente.

User

Insegnami la pazienza.

Assistente

Il fiume che scava la valle più profonda sgorga da una modesta sorgente; la più grande sinfonia ha origine da una singola nota; il tessuto più intricato inizia con un singolo filo.

User

Insegnami riguardo all’oceano

Tattica: Specificare la lunghezza desiderata dell'output

È possibile chiedere al modello di produrre output di una data lunghezza obiettivo. La lunghezza dell'output mirato può essere specificata in termini di conteggio di parole, frasi, paragrafi, elenchi puntati, ecc. Tuttavia, si noti che istruire il modello a generare un numero specifico di parole non funziona con alta precisione. Il modello può generare output con un numero specifico di paragrafi o elenchi puntati in modo più affidabile.

User

Sintetizza il testo delimitato dalle triple virgolette in circa 50 parole.

“””Inserisci qui il testo”””

User

Sintetizza il testo delimitato dalle triple virgolette in 2 paragrafi.

“””Inserisci qui il testo”””

User

Riassumi il testo delimitato dalle triple virgolette in 3 punti elenco.

“””Inserisci qui il testo”””

Strategia: Fornire testo di riferimento

Tattica: Istruire il modello a rispondere utilizzando un testo di riferimento

Se possiamo fornire al modello informazioni affidabili pertinenti alla query corrente, possiamo istruire il modello a utilizzare le informazioni fornite per comporre la sua risposta.

Sistema

Usa gli articoli forniti tra triple virgolette per rispondere alle domande. Se la risposta non può essere trovata negli articoli, scrivi "Non sono riuscito a trovare una risposta."

User

<inserisci articoli, ognuno delimitato dalle triple virgolette>

Domanda: <inserisci qui la domanda>

Considerando che Cinzia ha finestre di contesto limitate, per applicare questa tattica abbiamo bisogno di un modo per cercare dinamicamente informazioni rilevanti alla domanda posta. Le embedding possono essere utilizzate per implementare un recupero delle conoscenze efficiente. Consultare la tattica "Usare la ricerca basata su embedding per implementare un recupero delle conoscenze efficiente" per ulteriori dettagli su come implementare questa soluzione.

Tattica: Istruire il modello a rispondere con citazioni da un testo di riferimento

Se l'input è stato integrato con conoscenze rilevanti, è facile richiedere che il modello aggiunga citazioni alle sue risposte facendo riferimento a passaggi dei documenti forniti. Si noti che le citazioni nell'output possono poi essere verificate programmaticamente tramite il confronto di stringhe nei documenti forniti.

Sistema

Ti verrà fornito un documento delimitato dalle triple virgolette e una domanda. Il tuo compito è quello di rispondere alla domanda utilizzando solo il documento fornito e di citare il passaggio (o i passaggi) del documento utilizzati per rispondere alla domanda. Se il documento non contiene le informazioni necessarie per rispondere a questa domanda, scrivi semplicemente: "Informazioni insufficienti". Se viene fornita una risposta alla domanda, deve essere annotata con una citazione. Utilizza il seguente formato per citare i passaggi rilevanti ({"citazione":...}).

User

"""<inserisci qui il documento>"""

Domanda: <inserisci qui la domanda>

Strategia: Dividere compiti complessi in sottocompiti più semplici

Tattica: Utilizzare la classificazione delle intenzioni per identificare le istruzioni più rilevanti per una richiesta dell'utente

Per i compiti in cui sono necessari molti insiemi indipendenti di istruzioni per gestire diversi casi, può essere utile classificare prima il tipo di richiesta e utilizzare tale classificazione per determinare quali istruzioni sono necessarie. Ciò può essere ottenuto definendo categorie fisse e codificando le istruzioni rilevanti per gestire compiti in una determinata categoria. Questo processo può anche essere applicato ricorsivamente per decomporre un compito in una sequenza di fasi. Il vantaggio di questo approccio è che ogni richiesta conterrà solo quelle istruzioni necessarie per eseguire la fase successiva di un compito, il che può portare a errori più bassi rispetto all'utilizzo di una singola richiesta per eseguire l'intero compito. Ciò può anche comportare costi inferiori poiché prompt più grandi costano di più (vedi informazioni sui prezzi).

Supponiamo, ad esempio, che per un'applicazione di assistenza clienti, le richieste potrebbero essere classificate utilmente come segue:

Sistema

Ti verranno fornite richieste di assistenza clienti. Classifica ogni richiesta in una categoria primaria e una secondaria. Fornisci il tuo output in formato json con
le chiavi: primario e secondario.

Categorie primarie: Fatturazione, Supporto Tecnico, Gestione Account o Richiesta Generale.

Categorie secondarie di fatturazione:
-Disiscrizione o aggiornamento
-Aggiungi un metodo di pagamento
-Spiegazione della spesa
-Contestare una spesa

Categorie secondarie di supporto tecnico:
-Risoluzione dei problemi
-Compatibilità del dispositivo
-Aggiornamenti software

Categorie secondarie di gestione account:
-Reimpostazione della password
-Aggiornare le informazioni personali
-Chiudi account
-Sicurezza dell'account

Categorie secondarie di richiesta generale:
-Informazioni sul prodotto
-Prezzi
-Feedback
-Parlare con un essere umano

User

Devo far funzionare di nuovo la mia connessione internet.

In base alla classificazione della richiesta del cliente, è possibile fornire un insieme di istruzioni più specifiche a Cinzia per gestire i passaggi successivi. Ad esempio, supponiamo che il cliente richieda aiuto con la "risoluzione dei problemi".

Sistema

Ti verranno fornite richieste di assistenza clienti che richiedono la risoluzione di problemi in un contesto di supporto tecnico. Aiuta l'utente:

-Chiedi loro di verificare che tutti i cavi verso/dal router siano collegati. Nota che è comune che i cavi si allentino nel tempo.
-Se tutti i cavi sono collegati e il problema persiste, chiedi loro quale modello di router stanno usando.
-Ora li consiglierai su come riavviare il loro dispositivo:
-- Se il numero del modello è MTD-327J, consigliali di premere il pulsante rosso e tenerlo premuto per 5 secondi, poi di aspettare 5 minuti prima di testare la connessione.
-- Se il numero del modello è MTD-327S, consigliali di scollegarlo e ricollegarlo, poi di aspettare 5 minuti prima di testare la connessione.
-Se il problema del cliente persiste dopo aver riavviato il dispositivo e aver atteso 5 minuti, connettigli all'assistenza IT producendo {"Assistenza IT richiesta"}.
-Se l'utente inizia a fare domande non correlate a questo argomento, conferma se desiderano terminare la chat corrente sulla risoluzione dei problemi e classifica la loro richiesta secondo lo schema seguente:

<inserisci qui lo schema di classificazione primario/secondario sopra indicato>

User

Ho bisogno di far funzionare di nuovo internet.

Si noti che il modello è stato istruito per emettere stringhe speciali per indicare quando lo stato della conversazione cambia. Ciò ci consente di trasformare il nostro sistema in una macchina a stati in cui lo stato determina quali istruzioni vengono iniettate. Tenendo traccia dello stato, delle istruzioni pertinenti in quello stato e, opzionalmente, delle transizioni di stato consentite da quel stato, possiamo creare delle limitazioni nell'esperienza utente che sarebbero difficili da ottenere con un approccio meno strutturato.

Poiché Cinzia ha una lunghezza di contesto fissa, il dialogo tra un utente e un assistente in cui l'intera conversazione è inclusa nella finestra di contesto non può continuare indefinitamente.

Esistono varie soluzioni a questo problema, una delle quali è riassumere i turni precedenti nella conversazione. Una volta raggiunta una lunghezza di input predeterminata, ciò potrebbe innescare una query che riassume parte della conversazione e il riassunto della conversazione precedente potrebbe essere incluso come parte del messaggio di sistema. In alternativa, la conversazione precedente potrebbe essere riassunta in modo asincrono in background durante l'intera conversazione.

Una soluzione alternativa è selezionare dinamicamente le parti precedenti della conversazione più rilevanti per la query corrente. Vedere la tattica "Utilizzare la ricerca basata su embedding per implementare il recupero efficiente delle conoscenze".

Tattica: Riassumere documenti lunghi pezzo per pezzo e costruire un riassunto completo in modo ricorsivo

Poiché Cinzia ha una lunghezza di contesto fissa, non può essere utilizzata per riassumere un testo più lungo della lunghezza del contesto meno la lunghezza del riassunto generato in una singola query.

Per riassumere un documento molto lungo come un libro, possiamo utilizzare una sequenza di query per riassumere ciascuna sezione del documento. I riassunti delle sezioni possono essere concatenati e riassunti producendo riassunti di riassunti. Questo processo può procedere ricorsivamente fino a quando l'intero documento viene riassunto. Se è necessario utilizzare informazioni sulle sezioni precedenti per comprendere le sezioni successive, allora un ulteriore trucco utile è includere un riassunto in corso del testo che precede un dato punto nel libro mentre si riassume il contenuto in quel punto.

Strategia: Dare a Cinzia tempo per "pensare"

Tattica: Instruire il modello a elaborare la propria soluzione prima di giungere frettolosamente a una conclusione

A volte otteniamo risultati migliori quando istruire esplicitamente il modello a ragionare dai primi principi prima di giungere a una conclusione. Supponiamo, ad esempio, che vogliamo che un modello valuti la soluzione di uno studente a un problema di matematica. Il modo più ovvio per affrontare questo è chiedere semplicemente al modello se la soluzione dello studente è corretta o meno.

Sistema

Determina se la soluzione dello studente è corretta o meno.

User

Problema: Sto costruendo un impianto fotovoltaico e ho bisogno di aiuto per calcolare i costi.
-Il terreno costa 100 € al metro quadro
-Posso acquistare pannelli solari a 250 € al metro quadro
-Ho negoziato un contratto per la manutenzione che mi costerà una somma fissa di 100.000 € all'anno e ulteriori 10 € al metro quadro
Qual è il costo totale per il primo anno di funzionamento in funzione del numero di metri quadrati?

Soluzione dello studente: Sia x la dimensione dell'impianto in metri quadrati.
1.Costo del terreno: 100x
2.Costo dei pannelli solari: 250x
3.Costo di manutenzione: 100.000 + 10x
Costo totale: 100x + 250x + 100.000 + 10x = 360x + 100.000

Assistente

La soluzione dello studente è corretta.

Ma la soluzione dello studente in realtà non è corretta! Possiamo far sì che il modello se ne accorga con successo, chiedendo al modello di generare prima la propria soluzione.

Sistema

Prima elabora la tua soluzione al problema. Poi confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o meno. Non decidere se la soluzione dello studente è corretta finché non hai risolto il problema tu stesso.

User

Problema: Sto costruendo un impianto fotovoltaico e ho bisogno di aiuto per calcolare i costi.
-Il terreno costa 100 € al metro quadro
-Posso acquistare pannelli solari a 250 € al metro quadro
-Ho negoziato un contratto per la manutenzione che mi costerà una somma fissa di 100.000 € all'anno e ulteriori 10 € al metro quadro
Qual è il costo totale per il primo anno di funzionamento in funzione del numero di metri quadrati?

Soluzione dello studente: Sia x la dimensione dell'impianto in metri quadrati.
1.Costo del terreno: 100x
2.Costo dei pannelli solari: 250x
3.Costo di manutenzione: 100.000 + 10x
Costo totale: 100x + 250x + 100.000 + 10x = 360x + 100.000

Assistente

Sia x la dimensione dell'impianto in metri quadrati.
1.Costo del terreno: 100x
2.Costo dei pannelli solari: 250x
3.Costo di manutenzione: 100.000 + 10x
Costo totale: 100x + 250x + 100.000 + 10x = 360x + 100.000

La soluzione dello studente non è corretta. Hanno commesso un errore nel calcolo del costo di manutenzione, utilizzando 100x invece di 10x. Il costo totale corretto per il primo anno di funzionamento è 360x + 100.000.

Tattica: Utilizzare il monologo interiore o una sequenza di query per nascondere il processo di ragionamento del modello

La tattica precedente dimostra che a volte è importante che il modello ragioni in dettaglio su un problema prima di rispondere a una domanda specifica. Per alcune applicazioni, il processo di ragionamento che un modello utilizza per arrivare a una risposta finale potrebbe essere inappropriato da condividere con l'utente. Ad esempio, nelle applicazioni di tutoraggio potremmo voler incoraggiare gli studenti a trovare le proprie risposte, ma il processo di ragionamento del modello sulla soluzione dello studente potrebbe rivelare la risposta allo studente stesso.

Il monologo interiore è una tattica che può essere utilizzata per mitigare questo. L'idea del monologo interiore è di istruire il modello a inserire parti dell'output che devono essere nascoste all'utente in un formato strutturato che ne facilita l'analisi. Quindi, prima di presentare l'output all'utente, l'output viene analizzato e solo una parte dell'output viene resa visibile.

Sistema

Segui questi passaggi per rispondere alle domande dell'utente.

Passo 1 - Prima elabora la tua soluzione al problema. Non fare affidamento sulla soluzione dello studente, poiché potrebbe essere errata. Racchiudi tutto il tuo lavoro per questo passaggio tra virgolette triple (""").

Passo 2 - Confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o meno. Racchiudi tutto il tuo lavoro per questo passaggio tra virgolette triple (""").

Passo 3 - Se lo studente ha commesso un errore, determina quale suggerimento potresti dare allo studente senza rivelare la risposta. Racchiudi tutto il tuo lavoro per questo passaggio tra virgolette triple (""").

Passo 4 - Se lo studente ha commesso un errore, fornisci il suggerimento dal passaggio precedente allo studente (fuori dalle virgolette triple). Invece di scrivere "Passo 4 - ..." scrivi "Suggerimento:".

User

Problema: <inserisci il problema>

Soluzione dello studente: <inserisci la soluzione dello studente>

In alternativa, ciò può essere ottenuto con una sequenza di query in cui tutte tranne l'ultima hanno il loro output nascosto all'utente finale.

Innanzitutto, possiamo chiedere al modello di risolvere il problema da solo. Poiché questa prima query non richiede la soluzione dello studente, può essere omessa. Ciò fornisce il vantaggio aggiuntivo che non c'è alcuna possibilità che la soluzione del modello sia influenzata dal tentativo di soluzione dello studente.

User

<inserire la descrizione del problema>

Successivamente, possiamo far utilizzare al modello tutte le informazioni disponibili per valutare la correttezza della soluzione dello studente.

Sistema

Confronta la tua soluzione con quella dello studente e valuta se la soluzione dello studente è corretta o meno.

User

Enunciato del problema: """<inserisci l'enunciato del problema>"""

La tua soluzione: """<inserisci la soluzione generata dal modello>"""

Soluzione dello studente: """<inserisci la soluzione dello studente>"""

Infine, possiamo far utilizzare al modello la propria analisi per costruire una risposta nella persona di un tutor disponibile.

Sistema

Tu sei un tutor di matematica. Se lo studente ha commesso un errore, offri un suggerimento allo studente in modo tale da non rivelare la risposta. Se lo studente non ha commesso errori, offri loro un commento incoraggiante.

User

Enunciato del problema: """<inserisci l'enunciato del problema>"""

La tua soluzione: """<inserisci la soluzione generata dal modello>"""

Soluzione dello studente: """<inserisci la soluzione dello studente>"""

Analisi: """<inserisci l'analisi generata dal modello dal passaggio precedente>"""

Tattica: Chiedere al modello se ha tralasciato qualcosa nei passaggi precedenti

Supponiamo di utilizzare un modello per elencare estratti da una fonte che sono rilevanti per una determinata domanda. Dopo aver elencato ogni estratto, il modello deve determinare se iniziare a scrivere un altro estratto o se fermarsi. Se il documento di origine è ampio, è comune che un modello si fermi troppo presto e non riesca a elencare tutti gli estratti rilevanti. In tal caso, è possibile ottenere una migliore prestazione sollecitando il modello con domande di approfondimento per trovare eventuali estratti che ha tralasciato nei passaggi precedenti.

Sistema

Ti verrà fornito un documento delimitato da virgolette triple. Il tuo compito è selezionare gli estratti che riguardano la seguente domanda: "Quali cambiamenti significativi di paradigma si sono verificati nella storia dell'intelligenza artificiale".

Assicurati che gli estratti contengano tutto il contesto rilevante necessario per interpretarli - in altre parole, non estrarre piccoli frammenti privi di contesto importante. Fornisci l'output in formato JSON come segue:

[{"excerpt": "..."},
...
{"excerpt": "..."}]

User

"""<inserisci il documento qui>"""

Assistente

[{"excerpt": "il modello scrive un estratto qui"},
...
{"excerpt": "il modello scrive un altro estratto qui"}]

User

Ci sono altri estratti rilevanti? Evita di ripetere estratti. Assicurati inoltre che gli estratti contengano tutto il contesto rilevante necessario per interpretarli, ovvero non estrarre piccoli frammenti privi di contesto importante.

Strategia: Utilizzare strumenti esterni

Tattica: Utilizzare la ricerca basata sugli embedding per implementare un efficiente recupero delle conoscenze

Un modello può sfruttare fonti esterne di informazioni se fornite come parte del suo input. Ciò può aiutare il modello a generare risposte più informate e aggiornate. Ad esempio, se un utente pone una domanda su un film specifico, potrebbe essere utile aggiungere informazioni di alta qualità sul film (ad es. attori, regista, ecc.) all'input del modello. Gli embedding possono essere utilizzati per implementare un efficiente recupero delle conoscenze, in modo che le informazioni rilevanti possano essere aggiunte all'input del modello dinamicamente durante l'esecuzione.

Un embedding di testo è un vettore che può misurare la correlazione tra stringhe di testo. Stringhe simili o rilevanti saranno più vicine tra loro rispetto a stringhe non correlate. Questo fatto, insieme all'esistenza di algoritmi di ricerca vettoriale veloci, significa che gli embedding possono essere utilizzati per implementare un efficiente recupero delle conoscenze. In particolare, un corpus di testo può essere suddiviso in frammenti, e ogni frammento può essere incorporato e memorizzato. Quindi, una determinata query può essere incorporata e si può eseguire una ricerca vettoriale per trovare i frammenti di testo incorporati nel corpus che sono più correlati alla query (cioè più vicini nello spazio degli embedding).

Esempi di implementazione si possono trovare nell'OpenAI Cookbook. Consulta la tattica "Instruct the model to use retrieved knowledge to answer queries" per un esempio su come utilizzare il recupero delle conoscenze per ridurre al minimo la probabilità che un modello inventi fatti errati.

Tattica: Utilizzare l'esecuzione del codice per eseguire calcoli più accurati o chiamare API esterne

Cinzia non può essere considerata affidabile per eseguire calcoli aritmetici o lunghi con precisione da soli. Nei casi in cui questo è necessario, si può istruire un modello a scrivere ed eseguire codice al posto di fare i propri calcoli. In particolare, si può istruire un modello a inserire il codice che deve essere eseguito in un formato designato come le triple parentesi graffe. Dopo aver prodotto un output, il codice può essere estratto ed eseguito. Infine, se necessario, l'output dal motore di esecuzione del codice (ad es. l'interprete Python) può essere fornito come input al modello per la query successiva.

Sistema

Puoi scrivere ed eseguire codice Python racchiudendolo in triple parentesi graffe, ad es. ```il codice va qui```. Utilizza questo per eseguire calcoli.

User

Trova tutte le radici reali del seguente polinomio: 3*x**5 - 5*x**4 - 3*x**3 - 7*x - 10.

Un altro buon caso d'uso per l'esecuzione del codice è la chiamata di API esterne. Se un modello viene istruito nell'uso corretto di un'API, può scrivere codice che ne faccia uso. Un modello può essere istruito su come utilizzare un'API fornendogli documentazione e/o esempi di codice che mostrano come utilizzare l'API.

Sisitema

Puoi scrivere ed eseguire codice Python racchiudendolo in triple parentesi graffe. Inoltre, nota che hai accesso al seguente modulo per aiutare gli utenti a inviare messaggi ai loro amici:

```python
import message
message.write(to="John", message="Hey, vuoi incontrarti dopo il lavoro?")```

ATTENZIONE: L'esecuzione di codice prodotto da un modello non è intrinsecamente sicura e precauzioni dovrebbero essere prese in qualsiasi applicazione che intende farlo. In particolare, è necessario un ambiente di esecuzione del codice sandboxato per limitare il danno che il codice non affidabile potrebbe causare.

Strategia: Testare i cambiamenti sistematicamente

A volte può essere difficile capire se un cambiamento - ad esempio, una nuova istruzione o un nuovo design - rende il tuo sistema migliore o peggiore. Guardando alcuni esempi, si può intuire quale sia migliore, ma con piccole dimensioni del campione può essere difficile distinguere tra un miglioramento reale o una fortuna casuale. Forse il cambiamento migliora le prestazioni su alcuni input, ma danneggia le prestazioni su altri.

Le procedure di valutazione (o "evals") sono utili per ottimizzare i design del sistema. Buoni evals sono:

DIFFERENZA DA RILEVARE

DIMENSIONE DEL CAMPIONE NECESSARIA PER UNA CONFIDENZA DEL 95%

30%

~10

10%

~100

3%

~1,000

1%

~10,000

La valutazione degli output può essere effettuata da computer, persone o una combinazione di entrambi. I computer possono automatizzare evals con criteri oggettivi (ad esempio, domande con risposte corrette singole) e alcuni criteri soggettivi o sfumati, in cui gli output del modello vengono valutati da altre query del modello. OpenAI Evals è un framework software open source che fornisce strumenti per creare evals automatizzati.

Le evals basate sul modello possono essere utili quando esiste una gamma di possibili output che sarebbero considerati ugualmente di alta qualità (ad esempio, per domande con risposte lunghe). Il confine tra ciò che può essere valutato realisticamente con un'eval basata sul modello e ciò che richiede una valutazione umana è sfumato e cambia costantemente man mano che i modelli diventano più capaci. Incoraggiamo la sperimentazione per capire quanto bene le evals basate sul modello possono funzionare nel tuo caso d'uso.

Tattica: Valutare gli output del modello in relazione alle risposte di riferimento

Prova questa tattica grazie a Cinzia Dev Mode

P.IVA: 03880931203
Sede OPERATIVA: Via Callegherie, 27 IMOLA (BO)
TELEFONO:
Sede LEGALE: Via Appia, 31 IMOLA (BO)
Linkedin - PineApp srlFacebook - PineApp srlWhatsapp - PineApp srl
© 2023 PineApp srl. All rights reserved.