Sfide nel rilevare il testo generato da intelligenza artificiale

Sfide nella rilevazione del testo generato dall'intelligenza artificiale

Esamineremo in modo approfondito le sfide della rilevazione del testo generato dall’IA e l’efficacia delle tecniche utilizzate nella pratica.

Foto di Houcine Ncib su Unsplash

Scritto in collaborazione con Naresh Singh.

Indice

  1. Introduzione
  2. Sviluppare un’intuizione per la rilevazione della fonte del testo
  3. Qual è la perplessità di un modello linguistico?
  4. Calcolare la perplessità della previsione di un modello di linguaggio
  5. Rilevazione del testo generato dall’IA
  6. Disinformazione
  7. Cosa succederà dopo?
  8. Conclusioni

Introduzione

Le tecnologie assistite dall’IA per la scrittura di articoli o post sono ovunque adesso! ChatGPT ha sbloccato numerose applicazioni basate sull’IA linguistica e l’uso dell’IA per qualsiasi tipo di generazione di contenuti ha raggiunto livelli enormi.

Tuttavia, negli incarichi scolastici come la scrittura creativa, ci si aspetta che gli studenti creino i propri contenuti. Tuttavia, a causa della popolarità e dell’efficacia dell’IA per tali compiti, potrebbero essere tentati di utilizzarla. In tali casi, è importante che gli insegnanti abbiano accesso a strumenti affidabili e affidabili per rilevare i contenuti generati dall’IA.

Questo articolo mira a fornire un’intuizione e le specifiche tecniche per la costruzione di uno strumento del genere. È destinato ai lettori che desiderano comprendere in modo intuitivo il funzionamento della rilevazione dell’IA e al pubblico tecnico che desidera costruire uno strumento del genere.

Salta subito dentro!

Sviluppare un’intuizione per la rilevazione della fonte del testo

A un livello elevato, stiamo cercando di rispondere alla domanda: “Quanto è probabile che un modello di linguaggio basato sull’IA come GPT-3 abbia generato tutto o parte di questo testo?”

Se ti fermi un attimo, ti renderai conto che si tratta di una situazione quotidiana tipica. Ad esempio, quanto sarebbe probabile che tua madre ti dica la seguente frase?

  1. Cara, vai a dormire prima delle 20:00.
  2. Cara, vai a dormire dopo le 23:00.

Prenderemmo in considerazione che la prima è molto più probabile della seconda perché hai sviluppato una comprensione del mondo intorno a te e hai un’idea di quali eventi sono più probabili che si verifichino.

Questo è esattamente come funziona un modello linguistico. I modelli linguistici imparano qualcosa sul mondo intorno a loro, specificamente sulla lingua. Imparano a prevedere il token o la parola successiva data una frase incompleta.

Nell’esempio sopra, se ti viene detto che tua madre sta dicendo qualcosa e cosa è stato detto finora è “Cara, vai a dormire”, allora la continuazione più probabile della frase sarà “prima delle 20:00” e non “dopo le 23:00”. In termini tecnici, diciamo che saresti più perplesso nell’ascoltare la seconda frase rispetto alla prima.

Approfondiamo cosa significa perplessità nel contesto di un modello di linguaggio.

Qual è la perplessità di un modello linguistico?

Secondo dictionary.com, la perplessità è definita come

lo stato di essere perplessi; confusione; incertezza.

<p+nel a="" aspetti,="" aspetti.

Ad esempio, quando guidi su una strada, se vedi un semaforo, allora è meno probabile che tu sia perplesso rispetto a se vedi una capra che attraversa la strada.

Allo stesso modo, per un modello di linguaggio che sta cercando di prevedere la prossima parola in una frase, diciamo che il modello ci perplessa se completa la frase usando una parola che non ci aspettiamo rispetto a se usa una parola che ci aspettiamo. Alcuni esempi.

Le frasi con una bassa perplessità sembrerebbero le seguenti

  1. È una bella giornata fuori.
  2. Mi dispiace di aver perso il volo e di non essere riuscito a raggiungere il parco nazionale in tempo.

Le frasi con una alta perplessità sembrerebbero le seguenti

  1. È una giornata di pane fuori.
  2. Sono comodamente fuori luce e non sono riuscito a raggiungere il parco nazionale.

Successivamente, vediamo come possiamo calcolare la perplessità di una previsione fatta dal modello di linguaggio.

Calcolare la perplessità di una previsione di un modello di linguaggio

La perplessità di un modello di linguaggio è correlata alla probabilità di poter prevedere senza sorprese il prossimo token (parola) di una frase.

Supponiamo di addestrare un modello di linguaggio con un vocabolario di 6600 token e di eseguire un singolo passaggio di previsione per far predire al modello il prossimo token in una frase. Supponiamo che la probabilità di scegliere questo token sia 5/6600 (cioè questo token non era molto probabile). La sua perplessità è l’inverso della probabilità, che è 6600/5 = 1320, che suggerisce che siamo molto perplessi da questa suggerimento. Se la probabilità di scegliere questo token fosse invece 6000/6600, allora la perplessità sarebbe 6600/6000 = 1.1, che suggerisce che siamo solo leggermente perplessi da questa suggerimento.

Quindi, la perplessità del nostro modello su una previsione più probabile è inferiore alla perplessità del nostro modello su una previsione meno probabile.

La perplessità di prevedere tutti i token in una frase “x” è definita formalmente come la radice N-esima dell’inverso del prodotto delle probabilità dei token.

Tuttavia, per garantire la stabilità numerica, possiamo definirla in termini di funzione logaritmica.

Che è e (2.71828) elevato alla potenza del logaritmo negativo-medio-verosimiglianza del token predetto essere il token della verità.

Perplessità di addestramento e di validazione

La perplessità di addestramento e di validazione del modello può essere calcolata direttamente dalla perdita di batch o di epoca.

Perplessità di previsione

Non è possibile calcolare la perplessità di previsione in quanto richiede avere un insieme di etichette della verità per ogni previsione.

Codice PyTorch per calcolare la perplessità

Supponiamo che la variabile probs sia un torch.Tensor di forma (lunghezza_sequenza,), che contiene la probabilità del token della verità predetto dal modello di linguaggio in quella posizione nella sequenza.

La perplessità per token può essere calcolata utilizzando questo codice.

perplessità_token = (probs.log() * -1.0).exp()print(f"Perplessità per token: {perplessità_token}")

La perplessità campione può essere calcolata utilizzando questo codice.

# La perplessità è e^(media NLL).perplessità_frase = (probs.log() * -1.0).mean().exp().item()print(f"Perplessità per frase: {perplessità_frase:.2f}")

Successivamente, diamo un’occhiata al codice che calcola questa probabilità per token data una frase.

def get_pointwise_loss(self, inputs: List[str], tok):    self.model.eval()    all_probs = []    with torch.inference_mode():        for input in inputs:            ids_list: List[int] = tok.encode(input).ids            # ids ha forma (1, len(ids_list))            ids: Torch.Tensor = torch.tensor(ids_list, device=self.device).unsqueeze(0)            # probs sotto è la probabilità che il token in quella posizione            # completi la frase (in ids) fino a quel punto.            y = self.model(ids)            criterion = nn.CrossEntropyLoss(reduction='none', ignore_index=0)            # Calcola la perdita a partire dal 2° token nell'output del modello.            loss = criterion(y[:,:,:-1], ids[:,1:])            # Per calcolare la probabilità di ogni token, dobbiamo calcolare la            # negazione del log della perdita ed esponenziarla.            loss = loss * -1.0            # Imposta le probabilità che non ci interessano a -infinito.            # Questo viene fatto per far sì che la funzione softmax le imposti a 0.0            loss[loss == 0.0] = float("-inf")            # probs contiene la probabilità di ogni previsione del token            # a partire dal 2° token poiché non vogliamo includere            # la probabilità del modello di prevedere l'inizio di            # una frase senza contesto.            #            # Per calcolare la perplessità, probabilmente dovremmo ignorare            
            # le prime previsioni del modello poiché c'è un contesto insufficiente.            
            # Non lo facciamo qui, però.            
            probs = loss.exp()            all_probs.append(probs)        #    #    return all_probs#

Ora che sappiamo qualcosa sul funzionamento dei modelli linguistici e su come possiamo calcolare la perplessità per token e per frase, cerchiamo di mettere tutto insieme e vediamo come è possibile sfruttare queste informazioni per costruire uno strumento in grado di rilevare se un certo testo è stato generato dall’IA.

Rilevazione del testo generato dall’IA

Abbiamo tutto il necessario per verificare se un pezzo di testo è stato generato dall’IA. Ecco tutto ciò di cui abbiamo bisogno:

  1. Il testo (frase o paragrafo) che desideriamo verificare.
  2. La versione tokenizzata di questo testo, tokenizzata utilizzando il tokenizzatore che è stato utilizzato per tokenizzare l’insieme di dati di addestramento per questo modello.
  3. Il modello linguistico addestrato.

Utilizzando 1, 2 e 3 sopra, possiamo calcolare quanto segue:

  1. La probabilità per token come prevista dal modello.
  2. La perplessità per token utilizzando la probabilità per token.
  3. La perplessità totale per l’intera frase.
  4. La perplessità del modello sull’insieme di dati di addestramento.

Per verificare se un testo è stato generato dall’IA, dobbiamo confrontare la perplessità della frase con la perplessità del modello moltiplicata per un fattore di correzione, alpha. Se la perplessità della frase è maggiore della perplessità del modello con la correzione, allora è probabile che il testo sia stato scritto da un essere umano (ossia non generato dall’IA). In caso contrario, è probabile che sia stato generato dall’IA. Il motivo di ciò è che ci aspettiamo che il modello non sia perplesso da un testo che potrebbe generare da solo, quindi se incontra un testo che non genererebbe da solo, c’è motivo di credere che il testo non sia stato generato dall’IA. Se la perplessità della frase è inferiore o uguale alla perplessità di addestramento del modello con la correzione, è probabile che sia stato generato utilizzando questo modello linguistico, ma non possiamo essere molto sicuri. Questo perché è possibile che un essere umano abbia scritto quel testo, ed è semplicemente qualcosa che il modello potrebbe avere generato anche lui. Dopotutto, il modello è stato addestrato su molti testi scritti dagli esseri umani quindi in un certo senso, il modello rappresenta la “scrittura media di un essere umano”.

ppx(x) nella formula sopra significa la perplessità dell’input “x”.

Successivamente, diamo un’occhiata a esempi di testo generato dall’IA rispetto a testo scritto da umani.

Esempi di testo generato dall’IA rispetto a testo scritto da umani

Abbiamo scritto del codice Python che colora ogni token in una frase in base alla sua perplessità rispetto alla perplessità del modello. Il primo token è sempre colorato di nero se non si considera la sua perplessità. I token che hanno una perplessità inferiore o uguale alla perplessità del modello con correzione sono colorati di rosso, indicando che potrebbero essere stati generati dall’IA, mentre i token con una perplessità più alta sono colorati di verde, indicando che sono stati sicuramente generati non dall’IA.

I numeri tra parentesi quadrate prima della frase indicano la perplessità della frase calcolata utilizzando il modello di linguaggio. Nota che alcune parole sono in parte rosse e in parte blu. Questo è dovuto al fatto che abbiamo usato un tokenizer di sottoinsiemi di parole.

Ecco il codice che genera l’HTML sopra.

def get_html_for_token_perplexity(tok, sentence, tok_ppx, model_ppx):    tokens = tok.encode(sentence).tokens    ids = tok.encode(sentence).ids    cleaned_tokens = []    for word in tokens:        m = list(map(ord, word))        m = list(map(lambda x: x if x != 288 else ord(' '), m))        m = list(map(chr, m))        m = ''.join(m)        cleaned_tokens.append(m)    #    html = [        f"<span>{cleaned_tokens[0]}</span>",    ]    for ct, ppx in zip(cleaned_tokens[1:], tok_ppx):        color = "black"        if ppx.item() >= 0:            if ppx.item() <= model_ppx * 1.1:                color = "red"            else:                color = "green"            #        #        html.append(f"<span style='color:{color};'>{ct}</span>")    #    return "".join(html)#

Come possiamo vedere dagli esempi sopra, se un modello rileva del testo come generato dall’uomo, è sicuramente generato dall’uomo, ma se rileva il testo come generato da AI, c’è una possibilità che non sia generato da AI. Ma perché succede questo? Vediamo dopo!

Falsi positivi

Il nostro modello di linguaggio è addestrato su MOLTO testo scritto da esseri umani. È generalmente difficile rilevare se qualcosa è stato scritto (digitalmente) da una persona specifica. Gli input del modello per l’addestramento comprendono molti, molti stili di scrittura diversi, probabilmente scritti da un gran numero di persone. Ciò fa sì che il modello impari molti stili di scrittura e contenuti diversi. È molto probabile che il tuo stile di scrittura corrisponda molto da vicino allo stile di scrittura di qualche testo su cui il modello è stato addestrato. Questo è il risultato di falsi positivi e spiega il motivo per cui il modello non può essere sicuro che un certo testo sia generato da AI. Tuttavia, il modello può essere sicuro che un certo testo sia stato generato dall’uomo.

OpenAI: OpenAI ha recentemente annunciato che avrebbe interrotto i suoi strumenti per rilevare il testo generato da AI, citando un basso tasso di accuratezza (Fonte: Hindustan Times).

La versione originale dello strumento di classificazione AI aveva determinate limitazioni e imprecisioni fin dall’inizio. Gli utenti dovevano immettere almeno 1.000 caratteri di testo manualmente, che OpenAI analizzava per classificare come generato da AI o scritto dall’uomo. Purtroppo, le prestazioni dello strumento sono state deludenti, in quanto ha identificato correttamente solo il 26 percento dei contenuti generati da AI e ha erroneamente etichettato il testo scritto dall’uomo come AI circa il 9 percento delle volte.

Ecco il post di blog di OpenAI. Sembra che abbiano utilizzato un approccio diverso rispetto a quello menzionato in questo articolo.

Il nostro classificatore è un modello di linguaggio raffinato su un set di dati di coppie di testi scritti dall’uomo e testi scritti da AI sullo stesso argomento. Abbiamo raccolto questi dati da una varietà di fonti che riteniamo siano stati scritti da esseri umani, come i dati di preaddestramento e dimostrazioni umane su prompt inviati a InstructGPT. Abbiamo diviso ogni testo in un prompt e una risposta. Su questi prompt, abbiamo generato risposte da una varietà di diversi modelli di linguaggio addestrati da noi e da altre organizzazioni. Per la nostra applicazione web, abbiamo regolato la soglia di confidenza per mantenere basso il tasso di falsi positivi; in altre parole, marchiamo come testo probabilmente scritto da AI solo se il classificatore è molto sicuro.

GPTZero: Un altro popolare strumento per rilevare il testo generato da AI è GPTZero. Sembra che GPTZero utilizzi perplessità e burstiness per rilevare il testo generato da AI. “Burstiness si riferisce al fenomeno in cui certe parole o frasi appaiono in modo concentrato all’interno di un testo. In altre parole, se una parola appare una volta in un testo, è probabile che appaia di nuovo in prossimità” (fonte).

GPTZero afferma di avere un tasso di successo molto elevato. Secondo le FAQ di GPTZero, “Con una soglia di 0,88, l’85% dei documenti AI viene classificato come AI, e il 99% dei documenti umani viene classificato come umano”.

La generalità di questo approccio

L’approccio menzionato in questo articolo non generalizza bene. Ciò significa che se si hanno 3 modelli linguistici, ad esempio GPT3, GPT3.5 e GPT4, è necessario passare il testo di input attraverso tutti e 3 i modelli e controllare la perplessità su ognuno di essi per vedere se il testo è stato generato da uno di essi. Questo perché ciascun modello genera il testo leggermente in modo diverso, e tutti devono valutare indipendentemente il testo per vedere se uno di essi potrebbe aver generato il testo.

Con la proliferazione di grandi modelli linguistici nel mondo ad agosto 2023, sembra improbabile che si possa verificare se un testo provenga da uno dei modelli linguistici nel mondo.

In effetti, nuovi modelli vengono addestrati ogni giorno, e cercare di tenere il passo con questo progresso rapido sembra essere difficile al meglio.

L’esempio di seguito mostra il risultato di chiedere al nostro modello di predire se le frasi generate da ChatGPT sono generate dall’AI o no. Come si può vedere, i risultati sono misti.

Le frasi nella casella viola sono identificate correttamente come generate dall'AI dal nostro modello, mentre le altre sono identificate erroneamente come scritte da umani.

Ci sono molte ragioni per cui ciò può accadere.

  1. Dimensione del corpus di addestramento: Il nostro modello è addestrato su pochissimo testo, mentre ChatGPT è stato addestrato su terabyte di testo.
  2. Distribuzione dei dati: Il nostro modello è addestrato su una diversa distribuzione dei dati rispetto a ChatGPT.
  3. Aggiustamento fine: Il nostro modello è solo un modello GPT, mentre ChatGPT è stato tarato per risposte di tipo chat, il che lo rende generare testo con un tono leggermente diverso. Se si avesse un modello che genera testi legali o consigli medici, il nostro modello si comporterebbe male anche su testi generati da quei modelli.
  4. Dimensione del modello: Il nostro modello è molto piccolo (meno di 100 milioni di parametri rispetto a oltre 200 miliardi di parametri per modelli simili a ChatGPT).

È evidente che abbiamo bisogno di un approccio migliore se speriamo di fornire un risultato di qualità ragionevolmente elevata per verificare se un testo è generato dall’IA.

Successivamente, diamo uno sguardo a una disinformazione su questo argomento che sta circolando in Internet.

Disinformazione

Alcuni articoli interpretano erroneamente la perplessità. Ad esempio, se si cerca su google.com “il contenuto scritto dagli umani ha una perplessità alta o bassa?”, si otterrà il seguente risultato in prima posizione.

Questo è sbagliato poiché i contenuti scritti dagli umani hanno di solito una perplessità più alta rispetto ai contenuti generati dall’IA.

Esaminiamo quindi le tecniche che i ricercatori in questo campo stanno esplorando per fare meglio di quanto fatto finora.

Cosa succederà in futuro?

Abbiamo stabilito che rilevare il testo generato dall’IA è un problema difficile e che i tassi di successo sono così bassi che non sono migliori delle congetture. Vediamo quali tecniche all’avanguardia stanno esplorando i ricercatori in questo campo per gestire meglio le cose.

Inserimento di filigrana: OpenAI e Google hanno promesso di inserire una filigrana nel testo generato dall’IA in modo che sia possibile identificarlo programmaticamente.

I dettagli tecnici su come potrebbe funzionare questo watermark non sono chiari e né l’una né l’altra azienda hanno divulgato dettagli a riguardo.

Anche se OpenAI e Google adottassero una tecnica di watermarking, non possiamo essere certi che ogni modello linguistico che viene distribuito lo avrà incluso. Sarebbe comunque possibile per le persone distribuire i propri modelli per generare testo e renderlo disponibile. Anche se le aziende decidessero di applicare un watermark al testo generato, non è chiaro se sarà uno standard oppure se ogni azienda avrà la propria strategia proprietaria e potenzialmente uno strumento a pagamento per verificare se un testo è stato generato utilizzando i loro strumenti di generazione di testo basati sull’intelligenza artificiale. Se fosse uno standard aperto, esisterebbe la possibilità che le persone possano aggirarlo a meno che non si tratti di un cifrario crittografico che richiede un notevole calcolo per essere decifrato. Se non si tratta di uno standard aperto, allora le persone sarebbero alla mercé di queste aziende per ottenere accesso libero e gratuito agli strumenti e alle API necessarie per effettuare queste verifiche. C’è anche il problema di quanto efficaci saranno nel lungo periodo, poiché potrebbe essere possibile addestrare modelli a elaborare il testo generato dall’IA con un watermark e restituire un testo generato dall’IA senza watermark.

Questo articolo discute una possibile tecnica per aggiungere un watermark al testo generato dall’IA e menziona le notevoli sfide connesse all’approccio proposto.

Personalizzazione: Secondo noi, il problema di rilevare il testo generato dall’IA rimarrà una sfida nel breve termine. Riteniamo che le strategie dovranno diventare più invasive e personalizzate per essere più efficaci. Ad esempio, anziché chiedersi se un testo è stato generato dall’IA, potrebbe essere più ragionevole chiedersi se è stato scritto da una persona specifica. Tuttavia, ciò richiederebbe al sistema di avere accesso a grandi quantità di testo scritto da quella specifica persona. Inoltre, il problema diventa più complesso se qualcosa è stato scritto da più di una persona, come questo articolo.

Analizziamo l’impatto che un sistema personalizzato per rilevare il testo scritto da umani avrebbe su educatori e studenti.

Se esistesse una soluzione del genere, gli educatori sarebbero più inclini ad assegnare compiti individuali agli studenti anziché incarichi di gruppo. Ciò richiederebbe anche che ogni studente fornisca inizialmente una grande quantità di testo scritto da loro stessi. Ciò potrebbe significare passare diverse ore di persona presso un’università prima di iscriversi ai corsi. Sicuramente, ciò avrebbe un effetto negativo sulla capacità di insegnare agli studenti l’importanza di lavorare insieme come squadra per raggiungere un obiettivo comune.

D’altra parte, avere accesso alla generazione di testo basata sull’IA potrebbe liberare gli studenti in alcuni casi per concentrarsi sul problema effettivo, come svolgere una ricerca o uno studio di letteratura, anziché passare il tempo a scrivere i propri apprendimenti in modo accurato. Si può immaginare che gli studenti finiranno per dedicare più tempo all’apprendimento di concetti e tecniche in matematica o scienze anziché a scriverne. Quella parte potrebbe essere gestita dall’IA.

Conclusione

In questo articolo, abbiamo sviluppato intuizioni su come rilevare il testo generato dall’IA. Il principale indicatore che possiamo utilizzare è l’entropia del testo generato. Abbiamo visto del codice PyTorch per verificare se un dato testo potrebbe essere stato generato dall’IA utilizzando l’entropia di quel testo. Abbiamo anche visto alcuni svantaggi di questo approccio, inclusa la possibilità di falsi positivi. Speriamo che ciò vi aiuti a comprendere e apprezzare i dettagli precisi dietro il rilevamento del testo generato dall’IA.

Questa è un’area in costante evoluzione e i ricercatori stanno cercando di trovare un modo per rilevare con maggiore precisione il testo generato dall’IA. L’impatto di questa tecnologia sulle nostre vite promette di essere significativo e in molti casi sconosciuto.

Mentre abbiamo discusso delle tecniche per rilevare il testo generato dall’IA, abbiamo ipotizzato che l’intero testo sia scritto interamente da umani oppure generato interamente dall’IA. Nella pratica, il testo tende ad essere in parte scritto da umani e in parte generato dall’IA, e ciò complica notevolmente le cose.

Se volete leggere approcci aggiuntivi per rilevare il testo generato dall’IA, come l’utilizzo di metriche di burstiness, potete leggerne qui.

Tutte le immagini presenti in questo articolo (tranne la prima) sono state create dagli autori.