Concetti e considerazioni importanti per gli sviluppatori che creano soluzioni di intelligenza artificiale generative

I modelli di linguaggio di grandi dimensioni sono sorprendenti, ma hanno anche le loro limitazioni. Gli sviluppatori devono comprendere queste limitazioni, quali llms sono in grado di "modificare" e come modificarli per ottenere i risultati migliori per le soluzioni di intelligenza artificiale generative che stanno creando. Questo articolo identifica diverse sfide e fattori di limitazione e illustra i modi comuni per superare tali sfide e assumere il controllo del processo di generazione del contenuto indipendentemente dal tipo di funzionalità di intelligenza artificiale generative che si sta creando nell'applicazione.

Problemi di progettazione quando si lavora con i moduli APM

Le sfide o le limitazioni più significative da tenere presenti quando si lavora con i moduli APM:

  • Cutoff delle conoscenze - A causa del costo elevato dell'addestramento di un LLM, il loro corpo di conoscenza è limitato a ciò che sono stati addestrati in un determinato momento. Senza plug-in o altre sistemazioni, non hanno accesso a informazioni in tempo reale, né hanno accesso ai dati privati.

  • Allucinazione - Un LLM usa probabilità statistiche e una piccola casualità per generare informazioni. Esistono meccanismi per mantenere le risposte generate allineate alla finalità dell'uomo nelle domande poste e alle informazioni su cui sono state addestrato, ma è possibile che creino risposte non accurate.

  • Trasparenza - Anche in questo caso, a causa del modo in cui vengono sottoposti a training i modelli, non hanno più accesso alla conoscenza di base su cui sono stati sottoposti a training. E anche se lo hanno fatto, non c'è garanzia che le informazioni siano state veritiere e fondate al primo posto. Inoltre, non esiste alcun passaggio di verifica per assicurarsi che la risposta generata sia accurata.

  • Nessuna conoscenza specifica del dominio: simile 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 e pertanto non ha alcuna conoscenza specifica 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? Iniziare comprendendo i modi in cui è possibile integrare la posizione da cui l'LLM sta recuperando i dati.

Informazioni sulla posizione in cui 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.

Diagramma che illustra tre diversi tipi di generazione di recupero con generazione di recupero disattivata nella parte superiore correlata alla conoscenza con training più pre-sottoposto a training, quindi la generazione aumentata e il recupero della generazione incentrata sul recupero nella parte inferiore correlata alla conoscenza più recuperata.

  • Retrieval-Off Generation (ROG) - Questo è il modo tradizionale in cui funzionano i llms tradizionali, in cui il modello genera risposte 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, limitata a ciò che è stato incluso nei dati di training fino alla data di scadenza. Oltre alla scrittura creativa, può rispondere a domande su informazioni facilmente disponibili su internet.

  • Retrieveal-Augmented Generation (RAG) - Combina le funzionalità generative di LLMs 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 le informazioni pertinenti, che quindi usa per informarne la risposta. Questo approccio consente al modello di fornire informazioni più accurate e aggiornate rispetto a quelle che potrebbero derivare dalla sola conoscenza con training preliminare. I casi d'uso includono il controllo dei fatti, la risposta a domande basate su dati in tempo reale o dati privati specifici del dominio.

  • Generazione basata sul recupero (RCG): pone ancora più enfasi sul contenuto recuperato esternamente, spesso strutturando le risposte relative alle informazioni recuperate da origini esterne. Il modello potrebbe incorporare direttamente segmenti di testo recuperati nei relativi output, modificandoli o annotandoli per adattarli alla query dell'utente. Questo approccio può essere considerato un ibrido tra metodi generativi e basati sul recupero, in cui l'equilibrio potrebbe favorire pesantemente le informazioni recuperate sulle proprie funzionalità generative 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 le regole di confronto di diverse fonti di materiale in un output combinato.

Un buon esempio di generazione Di recupero -Off (ROG) è ChatGPT. Al contrario, se necessario, Copilot (tramite Bing) estende l'LLM usando origini esterne da fonti di notizie (e fornendo collegamenti a tali origini).

A prima vista, la generazione rag (Retrieval-Augmented Generation) e Retrieval-Centric Generation (RCG) sono simili perché entrambe implicano l'integrazione di informazioni esterne nel processo di generazione del linguaggio. Tuttavia, differiscono in base al modo in cui assegnano priorità e utilizzano le informazioni recuperate all'interno del processo di generazione.

Nei sistemi RAG, il recupero dei dati esterni viene usato per aumentare le funzionalità generative di un modello linguistico con training preliminare. Le informazioni recuperate forniscono più dati di contesto o specifici usati dal modello per informare le relative risposte. In questo caso, l'aspetto generativo del modello linguistico rimane centrale per la risposta, mentre i dati recuperati fungono da elemento di supporto per migliorare l'accuratezza o la profondità.

I sistemi RCG, d'altra parte, pongono un'enfasi più forte sulle informazioni recuperate. In questi sistemi, i dati recuperati sono spesso il fulcro della risposta, con il ruolo del modello generativo principalmente per 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 illustrati negli articoli sull'archiviazione di incorporamenti vettorializzati di documenti rispetto all'ottimizzazione di un LLM, i due approcci prevalenti per integrare le conoscenze disponibili per l'LLM in base al training iniziale.

Comprendere le differenze tra i modelli di recupero può aiutare a scegliere l'approccio appropriato per applicazioni specifiche, bilanciando la necessità di sintesi creativa rispetto alla necessità di accuratezza e fedeltà al materiale di origine.

Comprendere i fattori che influenzano il 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 a esecuzione prolungata che mantiene lo stato nel corso di diversi scambi back-and-forth tra l'utente e l'LLM. In realtà, per una determinata sessione di chat, tutte le richieste e tutte le risposte dell'LLM (note anche come completamenti) vengono inviate con ogni nuova richiesta. Quindi, man mano che cresce la conversazione, si inviano sempre più testo all'LLM per elaborare, tutte le richieste e i completamenti precedenti. ChatGPT usa il contesto dell'intera sessione di chat, non solo il prompt corrente, quando si compone una risposta al prompt corrente. L'intera sessione di chat viene chiamata finestra di contesto.

Esiste un limite di lunghezza della finestra di contesto a seconda della versione di ChatGPT con cui si lavora. Qualsiasi parte della conversazione di chat che supera il limite di lunghezza della finestra di contesto verrà ignorata durante la composizione di una risposta alla richiesta 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. Ciò influisce 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? O meglio, 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
  • Prezzo per richiesta e completamento

Che cos'è la tokenizzazione?

"Tokenization" è il processo di conversione del testo in token. È un passaggio fondamentale per preparare i dati per il training o l'inferenza (il processo di composizione dei completamenti in base alle richieste) 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. OpenAI ha una pagina utile che illustra più informazioni sulla tokenizzazione e include anche una calcolatrice che illustra come una frase o un paragrafo si suddivide in token.

Come nota nella parte inferiore della pagina Tokenizer OpenAI indica che, in testi tipici in inglese, un token equivale a circa quattro caratteri. Ciò significa che, 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 consente di stimare a livello di codice il numero di token che verranno usati per una determinata richiesta inviata all'API OpenAI.

L'utilizzo dei token influisce sulla fatturazione

Ogni API OpenAI di Azure ha una metodologia di fatturazione diversa. Per l'elaborazione e la generazione di testo con l'API Completamento chat, vengono fatturati in base al numero di token inviati come richiesta e al numero di token generati come risultato (completamento).

Ogni modello LLM (ad esempio gpt-3.5, gpt-3.5-turbo, gpt-4 e così via) 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 un milione di token".

Questo modello di determinazione prezzi ha un impatto significativo sul modo in cui si progettano le interazioni dell'utente e sulla quantità di pre-elaborazione e post-elaborazione che si aggiunge.

Richieste di sistema e utente

Fino a questo punto, la discussione si è concentrata esclusivamente sulle richieste degli utenti, ovvero le richieste che costituiscono l'interscambio tra un utente e ChatGPT.

OpenAI ha introdotto il "prompt di sistema" (noto anche come "istruzioni personalizzate"), che è un set di istruzioni sovra-arco di istruzioni definite e viene aggiunto a tutte le conversazioni di chat. Si consideri come un set di meta istruzioni che si vuole che l'LLM osservi sempre ogni volta che si avvia 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 il completamento di un LLM al prompt modificando la richiesta stessa.

Perché 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 degli argomenti o dei domini a cui è consentito 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 della richiesta e sono disponibili molte tecniche di progettazione richieste 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 a livello di codice le richieste dell'utente
  • Implementare una pipeline di inferenza
  • Generazione aumentata di recupero (descritta in altri articoli)
  • Ottimizzazione (descritta in altri articoli)

Modifica delle richieste utente a livello di codice

Dal punto di vista programmatico, non esiste un'API speciale per l'aggiunta di una richiesta di sistema alle conversazioni degli utenti. È sufficiente aggiungere istruzioni al prompt in base alle esigenze. Esistono tuttavia alcune tecniche per migliorare le richieste degli utenti:

  • Priming contestuale: crea richieste di sistema che impostano in modo esplicito il contesto della conversazione all'interno del dominio desiderato. Ciò implica la fornitura di una breve descrizione o di un set di istruzioni all'inizio di ogni interazione, guidando l'intelligenza artificiale per rimanere all'interno del dominio del problema.
  • Indicazioni basate su esempi: includere esempi di tipi di domande e risposte rilevanti per il dominio nel prompt iniziale. Ciò consente all'intelligenza artificiale di comprendere il tipo di risposte previste.

Inoltre, è possibile applicare tutte le tecniche di progettazione richieste. Se è possibile eseguire questa operazione a livello di codice, è possibile migliorare la richiesta dell'utente per suo conto.

L'avvertenza di questo approccio è che il prompt più lungo, più costoso ogni chiamata a LLM. Anche in questo caso, questo è probabilmente il più economico degli approcci che verranno discussi.

Implementazione di 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 è il processo end-to-end che accetta input non elaborato (ad esempio testo o immagini) e lo "pulisce" prima di usarlo per eseguire il prompt primario (pre-elaborazione) o per controllare il completamento per assicurarsi che soddisfi le esigenze dell'utente prima di visualizzarlo all'utente (post-elaborazione).

La pre-elaborazione può comportare il controllo delle parole chiave, l'assegnazione dei punteggi per 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 e iniziare chiedendo all'LLM se il prompt ha senso, se si trova entro i limiti di ciò che si è disposti ad accettare, se si basa su una premessa difettosa o deve essere riscritto per evitare determinati pregiudizi. Se LLM analizza la richiesta e rileva i problemi, è possibile procedere ulteriormente: chiedere all'LLM di rimettere in parola la richiesta di migliorare potenzialmente la risposta.

La post-elaborazione potrebbe comportare la convalida della pertinenza e dell'adeguatezza della risposta al dominio. Ciò può 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 assicurarsi che soddisfi i requisiti di qualità e sicurezza. È possibile chiedere all'LLM di valutare la risposta per verificare se, in effetti, soddisfa i requisiti a cui è stato chiesto di aderire. In caso contrario, è possibile chiedere all'LLM di modificare il completamento e ripetere questa operazione fino a quando non si ottiene un risultato soddisfacente.

È necessario aggiungere passaggi di pre-elaborazione: ogni volta che si aggiunge una chiamata a un LLM nella pipeline di inferenza, si aumenta la latenza complessiva (tempo di risposta) e 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 devono essere fatti dalla leadership che influiscono sul budget, sulle prestazioni e sull'efficacia del sistema software.

L'articolo Building advanced Retrieval-Augmented Generation systems (Creazione di sistemi avanzati di generazione aumentata) illustra in modo approfondito i passaggi specifici della creazione di una pipeline di inferenza.

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 Aumento di un modello linguistico di grandi dimensioni con generazione aumentata e ottimizzazione avanzata del recupero. Sono inoltre disponibili parametri che possono essere modificati quando si effettuano chiamate all'API OpenAI di Azure.

La documentazione del punto finale di Chat elenca i parametri obbligatori e facoltativi da passare che possono influire sui vari aspetti del completamento. Se invece si usa un SDK, vedere la documentazione dell'SDK per il linguaggio preferito. Se vuoi provare i parametri, puoi farlo in Playground.

  • Temperatura: controllare la casualità dell'output generato dal modello. A zero, il modello diventa deterministico, selezionando in modo coerente il token successivo più probabile dai dati di training. A una temperatura pari a 1, il modello bilancia tra la scelta di token ad alta probabilità e l'introduzione della casualità nell'output.

  • Numero massimo di token: controlla la lunghezza massima della risposta. L'impostazione di un limite superiore o inferiore può influire sui dettagli e sull'ambito del contenuto generato.

  • P superiore (campionamento nucleo): usato con la temperatura per controllare la casualità della risposta. Top P limita l'intelligenza artificiale per considerare solo la percentuale P superiore di massa di probabilità durante la generazione di ogni token. I valori inferiori portano a testo più mirato e prevedibile, mentre i valori più elevati consentono una maggiore diversità.

  • Penalità frequenza: 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.

  • Penalità di presenza: incoraggia il modello a introdurre nuovi concetti e termini al completamento. La penalità di presenza è utile per generare output più diversificati e creativi.

  • Sequenze di interruzione: è possibile specificare una o più sequenze per indicare all'API di interrompere la generazione di altri token. Le sequenze di archiviazione 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 vengano visualizzati nel completamento. Logit Bias può essere usato per guidare il completamento in una determinata direzione o per eliminare il contenuto indesiderato.

Informazioni sulle misure di sicurezza di Microsoft OpenAI

Oltre a mantenere le risposte dell'LLM associate a domini o argomenti specifici, è probabile che ci si preoccupi anche dei tipi di domande che gli utenti stanno chiedendo al LLM. È importante considerare i tipi di risposte che genera.

In primo luogo, le chiamate API ai servizi Microsoft OpenAI filtrano automaticamente il contenuto che trova potenzialmente offensivo e lo segnala all'utente in molte categorie di filtro.

È possibile usare direttamente l'API Di moderazione di OpenAI per controllare in modo esplicito qualsiasi contenuto potenzialmente dannoso.

In secondo luogo, è possibile usare Azure AI Content Safety per facilitare la moderazione del testo, la moderazione delle immagini, il rilevamento dei rischi di jailbreak e il rilevamento dei 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 che potrebbero influenzare le decisioni di progettazione dell'applicazione

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 influiscono sulle decisioni di progettazione delle applicazioni:

  • Valutare la necessità di usare il modello di intelligenza artificiale più recente rispetto alle considerazioni sui costi. I modelli meno costosi possono essere sufficienti per le esigenze dell'applicazione, bilanciando 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 si vuole iniziare subito a sperimentare la creazione di una soluzione di intelligenza artificiale generativa, è consigliabile esaminare Introduzione alla chat usando un esempio di dati personalizzato per Python. Sono disponibili versioni dell'esercitazione anche in .NET, Java e JavaScript.