Concetti chiave e considerazioni per la creazione di soluzioni di intelligenza artificiale generative
I modelli di linguaggio di grandi dimensioni sono incredibili, ma presentano limitazioni. Come sviluppatore, devi comprendere queste limitazioni, cosa gli LLM sono in grado di fare immediatamente e come modificarli per ottenere i migliori risultati per le soluzioni di intelligenza artificiale generativa che sviluppi. Questo articolo identifica diverse sfide e fattori di limitazione delle macchine virtuali. Illustra i modi comuni per superare le sfide e assumere il controllo del processo di generazione del contenuto indipendentemente dal tipo di funzionalità di intelligenza artificiale generative integrate nell'applicazione.
Problemi di progettazione quando si lavora con i moduli APM
L'elenco seguente riepiloga le sfide o le limitazioni più significative da tenere presenti quando si lavora con i modelli LLM.
limite di conoscenza: A causa dell'elevato costo dell'addestramento di un LLM, il corpo delle conoscenze di un LLM è limitato a ciò su cui è stato addestrato in un momento specifico. Senza plug-in o altri accorgimenti, un LLM non ha accesso alle informazioni in tempo reale e non può accedere ai dati privati.
Allucinazione: un LLM usa probabilità statistiche e un po' di casualità per generare informazioni. Sono in atto meccanismi per mantenere le risposte generate allineate all'intento umano espresso nelle domande e alle informazioni su cui un LLM è stato addestrato, ma è possibile per un LLM creare risposte non accurate.
Trasparenza: Anche a causa del modo in cui viene addestrato un LLM, non ha più accesso alle conoscenze fondamentali su cui è stato addestrato. Anche se lo avesse fatto, non c'è garanzia che le informazioni siano state veritiere e fondate fin dall'inizio. Inoltre, non esiste alcun passaggio di verifica per assicurarsi che la risposta generata sia accurata.
Nessuna conoscenza specifica del dominio: analogamente al cutoff delle conoscenze, se si dispone di informazioni private come documenti aziendali solo interni, l'LLM non è stato sottoposto a training su queste informazioni. Non ha alcuna conoscenza dei dati specifici del dominio.
Cosa è possibile fare per attenuare le possibili sfide o problemi con i moduli APM e ottenere i migliori risultati possibili per aiutare gli utenti e l'organizzazione? Inizia comprendendo i modi in cui è possibile integrare da dove un LLM ottiene i suoi dati.
Dove i llms ottengono le informazioni
Un buon punto di partenza per ottenere i migliori risultati da un LLM consiste nel comprendere dove o come i llms ottengono le informazioni. Le categorie seguenti rappresentano approcci diversi al modo in cui i llms interagiscono con varie origini di informazioni per generare risposte.
generazione senza recupero (ROG): gli LLM tradizionali usano questo modello. Il modello genera risposte basate esclusivamente sulla conoscenza su cui è stato eseguito il training, senza accedere o recuperare informazioni esterne durante il processo di generazione. La conoscenza del modello è statica e limitata a ciò che è stato incluso nei dati di training fino alla data di scadenza. Oltre alla scrittura creativa, può rispondere a domande sulle informazioni che sono facilmente disponibili su Internet.
Generazione aumentata dal recupero (RAG): combina le capacità generative dei modelli LLM con la possibilità di recuperare informazioni da database o documenti esterni in tempo reale. Il modello esegue una query su un'origine esterna per trovare informazioni pertinenti. Usa quindi le informazioni per formare la risposta. Questo approccio consente al modello di fornire informazioni più accurate e up-to-date rispetto a quelle fornite usando solo le proprie conoscenze con training preliminare. I casi d'uso includono verifica dei fatti, risposte a domande basate su dati in tempo reale o risposte a domande basate su dati privati e specifici del dominio.
generazione basata sul recupero (RCG): pone ancora più attenzione al contenuto recuperato esternamente, spesso strutturando le risposte attorno alle informazioni recuperate da fonti esterne. Il modello potrebbe incorporare direttamente segmenti di testo recuperati nei relativi risultati, modificandoli o annotandoli per adattarli alla query dell'utente. Questo approccio può essere considerato un ibrido tra metodi basati sul recupero e metodi generativi, in cui l'equilibrio potrebbe pesantemente favorire le informazioni recuperate rispetto alle capacità generative proprie del modello. I casi d'uso includono il riepilogo di un documento più lungo, l'assistenza alla ricerca per fornire confronti ed esplorazioni tematiche in più documenti simili e la compilazione o la collazione di diverse fonti di materiale in un risultato combinato.
Un buon esempio di ROG è ChatGPT. Al contrario, Copilot (tramite Bing) estende un LLM utilizzando fonti esterne di notizie (e fornendo collegamenti a tali fonti).
A prima vista, RAG e RCG appaiono simili perché entrambi implicano l'integrazione di informazioni esterne nel processo di generazione del linguaggio. Tuttavia, differiscono in base alla priorità e all'uso delle informazioni recuperate nel processo di generazione.
In un sistema RAG, il recupero dei dati esterni viene usato per aumentare le capacità generative di un modello linguistico pre-addestrato. Le informazioni recuperate forniscono più dati di contesto o specifici usati dal modello per informare le relative risposte. In un sistema RAG, l'aspetto generativo del modello linguistico rimane centrale per la risposta. I dati recuperati fungono da elemento di supporto per migliorare l'accuratezza o la profondità.
Un sistema RCG pone un'enfasi più forte sulle informazioni recuperate. In un sistema RCG, i dati recuperati spesso sono il elemento centrale della risposta e il ruolo del modello generativo consiste principalmente nel perfezionare, formattare o migliorare leggermente il testo recuperato. Questo approccio viene usato in particolare quando l'accuratezza e la rilevanza diretta delle informazioni sono fondamentali e meno la sintesi creativa o l'estrapolazione è necessaria.
I meccanismi per il recupero esterno dei dati che alimentano RAG e RCG sono discussi negli articoli sull'archiviazione di incorporazioni vettoriali di documenti rispetto all'affinamento di un LLM, i due approcci più diffusi per integrare le conoscenze disponibili per l'LLM in base al training iniziale.
Comprendere le differenze tra i modelli di recupero consente di scegliere l'approccio appropriato per applicazioni specifiche. Consente di bilanciare la necessità di sintesi creativa rispetto all'accuratezza e alla fedeltà al materiale di origine.
Fattori che influiscono sul funzionamento dell'inferenza
Poiché probabilmente si ha familiarità con l'interfaccia utente basata sul Web di ChatGPT, comprendere come funziona per rispondere alle domande può aiutare a comprendere i concetti fondamentali quando si creano funzionalità di intelligenza artificiale generative nelle proprie applicazioni.
Quando un utente chatta con ChatGPT, la progettazione dell'interfaccia utente dà l'illusione di una sessione di chat prolungata nel tempo che mantiene lo stato nel corso di diversi scambi botta e risposta tra l'utente e LLM. In realtà, per una determinata sessione di chat, tutte le richieste e tutte le risposte LLM (chiamate anche completamenti ) vengono inviate con ogni nuova richiesta. Man mano che la conversazione cresce, si invia sempre più testo all'LLM da elaborare. Con ogni nuova richiesta, si inviano tutte le richieste e i completamenti precedenti. ChatGPT usa il contesto dell'intera sessione di chat e non solo il prompt corrente, quando compone una risposta al prompt corrente. L'intera sessione di chat viene chiamata finestra di contesto .
Una finestra di contesto ha un limite di lunghezza che varia in base alla versione di ChatGPT con cui si lavora. Qualsiasi parte della conversazione di chat che supera il limite di lunghezza della finestra di contesto viene ignorata quando ChatGPT compone una risposta al prompt più recente.
Le conversazioni lunghe possono sembrare inizialmente una buona idea, ma le finestre di contesto lunghe possono influire sulla quantità di calcolo necessaria per elaborare la richiesta e comporre un completamento. Le dimensioni delle finestre di contesto influiscono sulla latenza della risposta e sulla quantità di costi per OpenAI per elaborare la richiesta.
Che cos'è il limite della finestra di contesto di ChatGPT? Ovvero, quante parole possono usare ChatGPT?
Il limite della finestra di contesto dipende dal modello, dalla versione e dall'edizione LLM in uso. Inoltre, le lunghezze del contesto vengono misurate in token, non in parole. I token sono le unità di testo più piccole che il modello può comprendere e generare. Queste unità possono essere parole, parti di parole (come sillabe o steli) o persino singoli caratteri. I token sono al centro dell'elaborazione del linguaggio naturale (NLP).
L'uso dei token influisce su due considerazioni importanti per gli sviluppatori:
- Limite massimo della finestra di contesto
- Il prezzo per richiesta e completamento
Che cos'è la tokenizzazione?
La tokenizzazione è il processo di conversione del testo in token. È un passaggio fondamentale per preparare i dati per l'addestramento o l'inferenza (il processo di composizione dei completamenti a partire dai prompt) con un LLM. Il processo prevede diversi passaggi, tra cui la suddivisione di testo complesso in parti gestibili (token), che il modello può quindi elaborare. Questo processo può essere semplice, ad esempio suddividere il testo per spazi e punteggiatura, o più complesso, con algoritmi sofisticati per gestire linguaggi diversi, morfologie (la struttura delle parole) e sintassi (la disposizione delle parole). I ricercatori e gli sviluppatori LLM decidono il metodo di tokenizzazione in base a ciò che stanno cercando di realizzare.
La pagina tokenizer openAI illustra altre informazioni sulla tokenizzazione. La pagina include anche un calcolatore che illustra come una frase o un paragrafo si suddivide in token.
Come viene indicato in una nota nella parte inferiore della pagina Tokenizer di OpenAI, nei testi tipici in inglese, un token equivale a circa quattro caratteri. In media, 100 token sono approssimativamente uguali a 75 parole o tre quarti di una parola per token.
La pagina OpenAI Tokenizer illustra anche tiktoken, un pacchetto per Python e JavaScript che è possibile usare per stimare a livello di codice il numero di token necessari per inviare una richiesta specifica all'API OpenAI.
L'utilizzo dei token influisce sulla fatturazione
Ogni API OpenAI di Azure ha una metodologia di fatturazione diversa. Utilizzando l'API Completamento chat per l'elaborazione e la generazione di testo, si viene fatturati in base al numero di token inviati come prompt e al numero di token generati come risultato (completamento).
Ogni modello LLM (ad esempio, GPT-3.5, GPT-3.5 Turbo o GPT-4) ha in genere un prezzo diverso, che riflette la quantità di calcolo necessaria per elaborare e generare token. Molte volte, il prezzo viene presentato come "prezzo per 1.000 token" o "prezzo per 1 milione di token".
Questo modello di determinazione prezzi ha un effetto significativo sul modo in cui si progettano le interazioni dell'utente e sulla quantità di pre-elaborazione e post-elaborazione aggiunte.
Richieste di sistema e richieste utente
Fino a questo punto, la discussione si è concentrata esclusivamente sulle richieste dell'utente . Un prompt utente è il tipo di richiesta che costituisce l'interscambio tra un utente e ChatGPT.
OpenAI ha introdotto il prompt di sistema (chiamato anche istruzioni personalizzate ). Una richiesta di sistema è un set generale di istruzioni definite e aggiunte a tutte le conversazioni di chat. Pensa a un set di metainstruzioni che vuoi tu che l'LLM osservi sempre ogni volta che inizi una nuova sessione di chat. Ad esempio, è possibile impostare la richiesta di sistema su "rispondere sempre in forma poetica di haiku". Da quel momento in poi, ogni nuova richiesta a ChatGPT restituisce un haiku contenente la risposta.
Anche se "risposta in formato haiku" non è un esempio utile, illustra l'idea che è possibile influenzare la risposta di un LLM al tuo prompt modificando il prompt stesso.
Perché vorresti modificare la richiesta dell'utente? Se si sta creando una funzionalità di intelligenza artificiale generativa o un'applicazione per un pubblico professionale, che può includere dipendenti aziendali, clienti e partner, è senza dubbio necessario aggiungere misure di sicurezza per limitare l'ambito di argomenti o domini a cui può rispondere.
Tuttavia, la modifica della richiesta dell'utente è un solo metodo per migliorare l'esperienza di generazione del testo per gli utenti.
Metodi per migliorare l'esperienza di generazione del testo per gli utenti in ChatGPT
Per migliorare i risultati della generazione di testo, gli sviluppatori sono limitati al semplice miglioramento del prompt, e ci sono molte tecniche di ingegneria del prompt che possono essere utili. Tuttavia, se si sta creando un'applicazione di intelligenza artificiale generativa, esistono diversi modi per migliorare l'esperienza di generazione del testo per gli utenti e provare a implementarli tutti:
- Modificare programmaticamente i messaggi dell'utente.
- Implementare una pipeline di inferenza.
- Generazione Retrieval-Augmented (descritta in altri articoli).
- Ottimizzazione (descritta in altri articoli).
Modificare i prompt utente tramite programmazione
Per aggiungere una richiesta di sistema a una conversazione utente, non si usa un'API speciale. È sufficiente aggiungere istruzioni al prompt in base alle esigenze.
Tuttavia, è possibile usare alcune tecniche per migliorare le richieste degli utenti:
- Priming contestuale: Crea prompt di sistema che definiscono esplicitamente il contesto della conversazione all'interno del dominio. Questo approccio prevede la fornitura di una breve descrizione o di un set di istruzioni all'inizio di ogni interazione. Le istruzioni guidano l'intelligenza artificiale per rimanere all'interno del dominio del problema.
- indicazioni basate su esempi: nella richiesta iniziale possono essere inclusi esempi di tipi di domande e risposte rilevanti per il tuo dominio. Questo approccio consente all'intelligenza artificiale di comprendere il tipo di risposte da aspettarsi.
È possibile utilizzare una qualsiasi tecnica di ingegneria dei prompt. Se è possibile eseguire questa operazione a livello di codice, puoi migliorare l'interfaccia utente per suo conto.
L'avvertenza di questo approccio è che più lungo è il prompt, maggiore è il costo per ogni chiamata all'LLM. Anche in questo caso, questo approccio è probabilmente l'approccio meno costoso descritto in questo articolo.
Implementare una pipeline di inferenza
Il passaggio successivo oltre alla modifica della richiesta dell'utente a livello di codice consiste nel creare un'intera pipeline di inferenza.
Una pipeline di inferenza è un processo end-to-end che "pulisce" l'input non elaborato (ad esempio testo o immagine) prima di usarlo per eseguire il prompt primario (pre-elaborazione) o controlla il completamento per assicurarsi che soddisfi le esigenze dell'utente prima di visualizzarlo (post-elaborazione).
La pre-elaborazione può comportare il controllo delle parole chiave, l'assegnazione dei punteggi di pertinenza o la trasformazione della query in modo da adattarsi meglio al linguaggio di dominio previsto. Ad esempio, è possibile analizzare il prompt iniziale inviato dall'utente. Iniziare chiedendo all'LLM se il prompt ha senso, se è entro i limiti di ciò che si è disposti ad accettare, se si basa su una premessa difettosa o se deve essere riscritto per evitare determinati pregiudizi. Se LLM analizza la richiesta e rileva i problemi, è possibile procedere ulteriormente. È possibile chiedere all'LLM di riformulare il prompt per migliorare potenzialmente la risposta.
La post-elaborazione potrebbe comportare la convalida della pertinenza e dell'adeguatezza della risposta al dominio. Potrebbe includere la rimozione o il contrassegno delle risposte che non soddisfano i requisiti del dominio. Ad esempio, è possibile controllare il completamento fornito dall'LLM per garantire che soddisfi i requisiti di qualità e sicurezza. È possibile chiedere all'LLM di valutare la risposta per verificare se soddisfa effettivamente i requisiti che hai richiesto. In caso contrario, è possibile chiedere all'LLM di modificare il completamento. Ripetere questi passaggi fino a quando non si ottiene un risultato soddisfacente.
C'è una nota importante da considerare quando si aggiungono passaggi di pre-elaborazione: ogni volta che si aggiunge una chiamata a un LLM nella pipeline di inferenza, si aumenta sia la latenza complessiva (tempo di risposta) che il costo di ogni interazione con l'utente. In qualità di sviluppatore software esperto, probabilmente si è già a conoscenza di questi tipi di compromessi che influiscono sul budget, sulle prestazioni e sull'efficacia di un sistema software.
Per informazioni sui passaggi specifici da eseguire per creare una pipeline di inferenza, vedere Costruire un sistema di generazione aumentato con recupero.
Altri fattori che influenzano i completamenti
Oltre a modificare il prompt a livello di codice, creare una pipeline di inferenza e altre tecniche, altri dettagli sono descritti in l'aumento di un modello di linguaggio di grandi dimensioni con generazione aumentata di recupero e ottimizzazione. È anche possibile modificare i parametri quando si effettuano chiamate all'API OpenAI di Azure.
Per esaminare i parametri obbligatori e facoltativi da passare che possono influire su vari aspetti del completamento, vedere la documentazione dell'endpoint di Chat. Se si usa un SDK, vedere la documentazione dell'SDK per il linguaggio usato. Puoi sperimentare con i parametri nel Playground.
Temperature
: controllare la casualità dell'output generato dal modello. A livello zero, il modello diventa deterministico, selezionando in modo coerente il token successivo più probabile dai dati di addestramento. A una temperatura pari a 1, il modello bilancia tra la scelta di token ad alta probabilità e l'introduzione della casualità nell'output.Max Tokens
: controlla la lunghezza massima della risposta. L'impostazione di un limite superiore o inferiore può influire sui dettagli e sull'ambito del contenuto generato.Top P
(campionamento del nucleo): Usato conTemperature
per controllare la casualità della risposta.Top P
limita l'intelligenza artificiale a considerare solo la percentuale superiore di massa di probabilità (P
) quando genera ogni token. I valori inferiori portano a testo più incentrato e prevedibile. I valori più elevati consentono una maggiore diversità.Frequency Penalty
: riduce la probabilità che il modello ripeti la stessa riga o frase. L'aumento di questo valore consente di evitare la ridondanza nel testo generato.Presence Penalty
: incoraggia il modello a introdurre nuovi concetti e termini nel completamento.Presence Penalty
è utile per generare output più diversificati e creativi.Stop Sequences
: è possibile specificare una o più sequenze per indicare all'API di interrompere la generazione di più token.Store Sequences
sono utili per controllare la struttura dell'output, ad esempio terminando un completamento alla fine di una frase o di un paragrafo.Logit Bias
: consente di modificare la probabilità che i token specificati compaiano nelle completazioni.Logit Bias
può essere usato per guidare il completamento in una determinata direzione o per eliminare contenuto specifico.
Misure di sicurezza di Microsoft OpenAI
Oltre a mantenere le risposte dell'LLM legate a determinati argomenti o domini, è probabile che tu sia preoccupato per il tipo di domande che gli utenti rivolgono all'LLM. È importante considerare i tipi di risposte che genera.
In primo luogo, le chiamate API ai servizi Microsoft OpenAI filtrano automaticamente il contenuto che l'API trova potenzialmente offensivo e lo comunica in diverse categorie di filtro.
È possibile usare direttamente l'API Di moderazione OpenAI per controllare qualsiasi contenuto potenzialmente dannoso.
È quindi possibile utilizzare la Sicurezza dei Contenuti di Azure AI per facilitare la moderazione del testo e delle immagini, il rilevamento dei rischi di evasione e il rilevamento di materiali protetti. Questo combina un'esperienza di configurazione, configurazione e creazione di report del portale con il codice che è possibile aggiungere all'applicazione per identificare il contenuto dannoso.
Considerazioni finali per la progettazione di applicazioni
Informazioni sulla tokenizzazione, sui prezzi, sulle finestre di contesto e sull'implementazione di miglioramenti a livello di codice per migliorare l'esperienza di generazione del testo degli utenti influisce sulla progettazione del sistema di intelligenza artificiale generativa.
Ecco un breve elenco di aspetti da considerare e altre considerazioni di questo articolo che potrebbero influire sulle decisioni di progettazione dell'applicazione:
- Valutare la necessità di usare il modello di intelligenza artificiale più recente rispetto alle considerazioni sui costi. I modelli meno costosi potrebbero essere sufficienti per le esigenze dell'applicazione. Bilanciare le prestazioni con vincoli di budget.
- Valutare la possibilità di ottimizzare la lunghezza della finestra di contesto per gestire i costi senza influire significativamente sull'esperienza utente. Il taglio di parti non necessarie della conversazione potrebbe ridurre i costi di elaborazione mantenendo al tempo stesso interazioni di qualità.
- Valutare il modo in cui la tokenizzazione e la granularità degli input e degli output influiscono sulle prestazioni. Comprendere in che modo l'LLM scelto gestisce la tokenizzazione consente di ottimizzare l'efficienza delle chiamate API, riducendo potenzialmente i costi e migliorando i tempi di risposta.
Se vuoi iniziare subito a sperimentare nella creazione di una soluzione di intelligenza artificiale generativa, ti consigliamo di dare un'occhiata a Inizia con la chat usando il tuo esempio di dati per Python. L'esercitazione è disponibile anche in .NET, Javae JavaScript.