Ingegneria dell’interazione come ingannare l’IA per risolvere i tuoi problemi

Ingegneria dell'interazione come ingannare l'IA per risolvere i tuoi problemi

7 trucchi per la sollecitazione, LangChain e codice di esempio in Python

Questo è il quarto articolo di una serie sull’utilizzo dei modelli di linguaggio estesi (LLM) nella pratica. Qui, discuterò l’ingegneria delle sollecitazioni (PE) e come utilizzarla per creare applicazioni abilitate da LLM. Inizio con una revisione delle tecniche chiave di PE e poi passo al codice di esempio in Python di utilizzo di LangChain per creare un’applicazione basata su LLM.

Foto di Jason Leung su Unsplash

Quando si sente parlare per la prima volta di ingegneria delle sollecitazioni, molte persone tecniche (me compreso) tendono a deridere l’idea. Potremmo pensare: “Ingegneria delle sollecitazioni? Bah, che noia. Dimmi come costruire un LLM da zero.”

Tuttavia, dopo essercisi addentrati più a fondo, consiglierei agli sviluppatori di non scartare automaticamente l’ingegneria delle sollecitazioni. Vado ancora oltre e dico che l’ingegneria delle sollecitazioni può realizzare l’80% del valore dei casi d’uso più comuni di LLM con uno sforzo (relativamente) molto basso.

Il mio obiettivo con questo articolo è trasmettere questo punto attraverso una revisione pratica dell’ingegneria delle sollecitazioni ed esempi illustrativi. Sebbene ci siano sicuramente delle limitazioni in ciò che l’ingegneria delle sollecitazioni può fare, essa apre la porta alla scoperta di soluzioni semplici e intelligenti ai nostri problemi.

Cos’è l’Ingegneria delle Sollecitazioni?

Nel primo articolo di questa serie, ho definito ingegneria delle sollecitazioni come qualsiasi utilizzo di un LLM così com’è (cioè senza addestrare alcun parametro interno del modello). Tuttavia, si può dire molto di più a riguardo.

  1. L’ingegneria delle sollecitazioni è “il modo in cui i LLM vengono programmati con le sollecitazioni”. [1]
  2. L’ingegneria delle sollecitazioni è “un’arte empirica di comporre e formattare la sollecitazione per massimizzare le prestazioni di un modello su un determinato compito”. [2]
  3. “i modelli di linguaggio… vogliono completare i documenti, quindi puoi ingannarli a eseguire compiti semplicemente organizzando documenti finti”. [3]

La prima definizione trasmette l’innovazione chiave derivante dai LLM, ovvero che ora i computer possono essere programmati utilizzando l’inglese comune. Il secondo punto presenta l’ingegneria delle sollecitazioni come un’attività in gran parte empirica, in cui i praticanti, i sperimentatori e i costruttori sono gli esploratori chiave di questo nuovo modo di programmazione.

Il terzo punto (di Andrej Karpathy) ci ricorda che i LLM non sono esplicitamente addestrati a fare quasi tutto ciò che chiediamo loro di fare. Pertanto, in un certo senso, “inganniamo” questi modelli di linguaggio per risolvere i problemi. Sento che questo cattura l’essenza dell’ingegneria delle sollecitazioni, che si basa meno sulle tue competenze tecniche e più sulla tua creatività.

2 Livelli di Ingegneria delle Sollecitazioni

Esistono due modi distinti in cui è possibile fare ingegneria delle sollecitazioni, che ho chiamato “modo facile” e “modo meno facile” nel primo articolo di questa serie.

Il Modo Facile

Questo è il modo in cui la maggior parte del mondo fa ingegneria delle sollecitazioni, ovvero tramite ChatGPT (o qualcosa di simile). È un modo intuitivo, senza codice e gratuito per interagire con un LLM.

Anche se questo è un ottimo approccio per qualcosa di rapido e semplice, ad esempio riassumere una pagina di testo, riscrivere una e-mail, aiutarti a fare brainstorming per i piani di una festa di compleanno, ecc., ha i suoi svantaggi. Uno dei principali è che non è facile integrare questo approccio in un processo automatizzato o in un sistema software più ampio. Per fare ciò, dobbiamo fare un passo avanti.

Il Modo Meno Facile

Questo risolve molti degli svantaggi del “modo facile” interagendo con i LLM in modo programmato, cioè utilizzando Python. Abbiamo avuto un’idea di come fare ciò nei due articoli precedenti di questa serie, in cui abbiamo esplorato l’API Python di OpenAI e la libreria Hugging Face Transformers.

Anche se ciò richiede una maggiore conoscenza tecnica, qui risiede la vera potenza dell’ingegneria delle sollecitazioni perché consente agli sviluppatori di integrare moduli basati su LLM in sistemi software più ampi.

Un buon (e forse ironico) esempio di questo è ChatGPT. Il cuore di questo prodotto consiste nel sollecitare un modello pre-addestrato (cioè GPT-3.5-turbo) a comportarsi come un chatbot e quindi avvolgerlo in un’interfaccia web facile da usare.

Ovviamente, lo sviluppo di GPT-3.5-turbo è la parte difficile, ma non è qualcosa di cui dobbiamo preoccuparci qui. Con tutti i LLM pre-addestrati che abbiamo a portata di mano, quasi chiunque con competenze di programmazione di base può creare un’applicazione di intelligenza artificiale potente come ChatGPT senza essere un ricercatore di intelligenza artificiale o un dottorato di ricerca in apprendimento automatico.

Creazione di app di intelligenza artificiale con la tecnica dello sviluppo di prompt

Il modo meno semplice sblocca un nuovo paradigma di programmazione e sviluppo software. I programmatori non sono più tenuti a definire ogni singolo aspetto della logica nei loro sistemi software. Hanno ora la possibilità di affidare una parte non banale agli LLM. Vediamo un esempio concreto di come potrebbe apparire.

Supponiamo che si voglia creare un correttore automatico per una classe di storia delle scuole superiori. Il problema, però, è che tutte le domande hanno risposte scritte, quindi spesso possono esserci versioni multiple di una risposta corretta. Ad esempio, le seguenti risposte a “Chi è stato il 35° presidente degli Stati Uniti d’America?” potrebbero essere corrette.

  • John F. Kennedy
  • JFK
  • Jack Kennedy (un soprannome comune)
  • John Fitzgerald Kennedy (probabilmente cercando di ottenere un credito extra)
  • John F. Kenedy (cognome con errore di ortografia)

Nel paradigma di programmazione tradizionale, spettava al programmatore capire come considerare tutte queste variazioni. Per fare ciò, potrebbero elencare tutte le possibili risposte corrette e utilizzare un algoritmo di corrispondenza esatta delle stringhe o forse utilizzare la corrispondenza approssimata per aiutare con le parole con errori di ortografia.

Tuttavia, con questo nuovo paradigma abilitato da LLM, il problema può essere risolto attraverso una semplice tecnica di sviluppo di prompt. Ad esempio, potremmo utilizzare il seguente prompt per valutare le risposte degli studenti.

Sei un insegnante di storia delle scuole superiori che valuta i compiti a casa. \In base alla domanda dei compiti indicata da "Q:" e alla risposta corretta \indicata da "A:", il tuo compito è determinare se la risposta dello studente è \corretta. La valutazione è binaria; quindi, le risposte degli studenti possono essere corrette o errate. Sono ammessi errori di ortografia. Q: {domanda}A: {risposta_corretta} Risposta dello studente: {risposta_studente}

Possiamo pensare a questo prompt come a una funzione, in cui data una domanda, una risposta_corretta e una risposta_studente, genera il voto dello studente. Ciò può quindi essere integrato in un pezzo di software più grande che implementa il correttore automatico.

In termini di risparmio di tempo, ho impiegato circa 2 minuti per scrivere questo prompt, mentre se dovessi cercare di sviluppare un algoritmo per fare la stessa cosa, mi ci vorrebbero ore (se non giorni) e probabilmente avrebbe prestazioni peggiori. Quindi il risparmio di tempo per compiti come questo è di 100-1000 volte.

Naturalmente, ci sono molti compiti in cui gli LLM non forniscono alcun beneficio sostanziale e altri metodi esistenti sono molto più adatti (ad esempio, previsioni del tempo di domani). In nessun modo gli LLM sono la soluzione a ogni problema, ma creano un nuovo insieme di soluzioni per compiti che richiedono l’elaborazione efficace del linguaggio naturale, qualcosa che storicamente è stato difficile per i computer.

7 Trucchi per lo sviluppo di prompt

Sebbene l’esempio di prompt precedente possa sembrare un modo naturale ed ovvio per formulare il compito di correzione automatica, ha deliberatamente impiegato specifici euristici di sviluppo di prompt (o “trucchi”, come li chiamerò). Questi (e altri) trucchi sono emersi come modi affidabili per migliorare la qualità delle risposte LLM.

Anche se ci sono molti consigli e trucchi per scrivere buoni prompt, qui restrinco la discussione a quelli che sembrano i più fondamentali (secondo me) basati su alcune fonti [1,3-5]. Per un approfondimento, consiglio al lettore di esplorare le fonti citate qui.

Trucco 1: Sii Descrittivo (Più è Meglio)

Un tratto distintivo degli LLM è che vengono addestrati su enormi corpora di testo. Ciò li dota di una vasta conoscenza del mondo e della capacità di svolgere un’enorme varietà di compiti. Tuttavia, questa impressionante generalità può ostacolare le prestazioni su un compito specifico se non viene fornito il contesto appropriato.

Per esempio, confrontiamo due prompt per generare un messaggio di compleanno per mio padre.

Senza Trucco

Scrivimi un messaggio di compleanno per mio padre.

Con Trucco

Scrivimi un messaggio di compleanno per mio padre, ma non più lungo di 200 caratteri. Questo è un compleanno importante perché compie 50 anni. Per festeggiare, ho prenotato un viaggio per noi ragazzi a Cancun. Assicurati di includere un po' di umorismo scherzoso, gli piace molto.

Trucco 2: Dare Esempi

Il prossimo trucco consiste nel fornire all’LLM degli esempi di risposte per migliorare le sue prestazioni su un compito specifico. Il termine tecnico per questo è few-shot learning, ed è stato dimostrato che migliora significativamente le prestazioni dell’LLM [6].

Guardiamo un esempio specifico. Supponiamo che vogliamo scrivere un sottotitolo per un articolo di Towards Data Science. Possiamo utilizzare esempi esistenti per guidare il completamento dell’LLM.

Senza Trucco

Dato il titolo di un articolo del blog Towards Data Science, scrivi un sottotitolo per esso.Titolo: Prompt Engineering - Come ingannare l'IA per risolvere i tuoi problemiSottotitolo:

Con Trucco

Dato il titolo di un articolo del blog Towards Data Science, scrivi un sottotitolo per esso.Titolo: Un'introduzione pratica agli LLMSottotitolo: 3 livelli di utilizzo degli LLM nella praticaTitolo: Scoprire le API OpenAI (Python)Sottotitolo: Un'introduzione completa per principianti con codice di esempioTitolo: Prompt Engineering - Come ingannare l'IA per risolvere i tuoi problemiSottotitolo:

Trucco 3: Utilizzare Testo Strutturato

Assicurarsi che i prompt seguire una struttura organizzata non solo li rende più facili da leggere e scrivere, ma tende anche ad aiutare il modello a generare completamenti validi. Abbiamo utilizzato questa tecnica nell’esempio per il Trucco 2, dove abbiamo etichettato esplicitamente il titolo e il sottotitolo per ogni esempio.

Tuttavia, ci sono innumerevoli modi in cui possiamo dare una struttura ai nostri prompt. Ecco alcuni esempi: utilizzare TUTTE MAIUSCOLE per enfasi, utilizzare delimitatori come “` per evidenziare un blocco di testo, utilizzare linguaggi di markup come Markdown o HTML per formattare il testo, utilizzare JSON per organizzare le informazioni, ecc. Ora vediamo questo in azione.

Senza Trucco

Scrivimi una ricetta per i biscotti al cioccolato.

Con Trucco

Crea una ricetta ben organizzata per i biscotti al cioccolato. Utilizza gli elementi di formattazione seguenti:**Titolo**: Biscotti al Cioccolato Classici**Ingredienti**: Elenca gli ingredienti con misurazioni precise e formattazione.**Istruzioni**: Fornisci istruzioni dettagliate passo-passo nel formato numerato, descrivendo il processo di cottura.**Consigli**: Includi una sezione separata con suggerimenti utili per la cottura e possibili variazioni.

Trucco 4: Catena di Pensiero

Questo trucco è stato proposto da Wei et al. [7]. L’idea di base è guidare un LLM a pensare “passo dopo passo”. Questo aiuta a suddividere problemi complessi in sottoproblemi gestibili, dando all’LLM “tempo per pensare” [3,5]. Zhang et al. hanno dimostrato che questo può essere semplice come includere il testo “Pensiamo passo dopo passo” nel prompt [8].

Questo concetto può essere esteso a qualsiasi processo simile a una ricetta. Ad esempio, se voglio creare un post su LinkedIn basato sul mio ultimo blog di VoAGI, posso guidare l’LLM a seguire il processo passo dopo passo che seguo.

Senza Trucco

Scrivimi un post su LinkedIn basato sul seguente blog di VoAGI.Blog di VoAGI: {testo del blog di VoAGI}

Con Trucco

Scrivimi un post su LinkedIn basato sul processo passo dopo passo e sul blog di VoAGI riportato di seguito.  Passo 1: Trova un gancio di una sola riga rilevante per il blog. Passo 2: Estrapola 3 punti chiave dall'articolo. Passo 3: Comprimi ogni punto a meno di 50 caratteri. Passo 4: Combina il gancio, i punti chiave compressi dal Passo 3 e una call to action per generare l'output finale.Blog di VoAGI: {testo del blog di VoAGI}

Trucco 5: Personaggi dei Chatbot

Una tecnica sorprendente che tende a migliorare le prestazioni di LLM è quella di fargli assumere una particolare personalità, ad esempio “sei un esperto”. Questo è utile perché potresti non sapere il modo migliore per descrivere il tuo problema a LLM, ma potresti sapere chi ti aiuterebbe a risolverlo [1]. Ecco come potrebbe apparire nella pratica.

Senza trucco

Crea per me un itinerario di viaggio per un weekend a New York City.

Con trucco

Fingiti un abitante di NYC e un tassista che sa tutto sulla città. Per favore, crea per me un itinerario di viaggio per un weekend a New York City basato sulla tua esperienza. Non dimenticare di includere il tuo affascinante accento di New York nella tua risposta.

Trucco 6: Approccio Invertito

Può essere difficile indirizzare in modo ottimale un LLM quando non sappiamo cosa sa o come pensa. Ecco dove può essere utile l'”approccio invertito”. Consiste nel chiedere all’LLM di farti domande finché non ha una comprensione sufficiente (cioè contesto) del problema che stai cercando di risolvere.

Senza trucco

Cosa è un'idea per un'applicazione basata su LLM?

Con trucco

Voglio che mi faccia domande per aiutarmi a trovare un'idea per un'applicazione basata su LLM. Fammene una domanda alla volta per mantenere la conversazione.

Trucco 7: Rifletti, Rivedi e Migliora

Questo ultimo trucco induce il modello a riflettere sulle sue risposte precedenti per migliorarle. I casi d’uso comuni sono far valutare criticamente al modello il suo stesso lavoro chiedendogli se ha “completato l’assegnazione” o chiedendogli di “spiegare il ragionamento e le supposizioni” dietro una risposta [1, 3].

Inoltre, puoi chiedere all’LLM di perfezionare non solo le sue risposte ma anche le tue indicazioni. Questo è un modo semplice per riscrivere automaticamente le indicazioni in modo che siano più facili per il modello da “capire”.

Con trucco

Rivedi la tua risposta precedente, individua le aree da migliorare e offri una versione migliorata. Poi spiega il tuo ragionamento su come hai migliorato la risposta.

Esempio di Codice: Valutatore Automatico con LangChain

Ora che abbiamo esaminato diverse euristiche di indirizzamento, vediamo come possiamo applicarle a un caso d’uso specifico. Per fare ciò, torneremo all’esempio del valutatore automatico visto in precedenza.

Sei un insegnante di storia delle scuole superiori che valuta i compiti per casa. In base alla domanda dei compiti indicata da "D:" e alla risposta corretta indicata da "R:", il tuo compito è determinare se la risposta dello studente è corretta. La valutazione è binaria; quindi, le risposte degli studenti possono essere corrette o sbagliate. Sono ammessi semplici errori di ortografia. D: {domanda} R: {risposta_corretta} Risposta dello studente: {risposta_studente}

A una seconda occhiata, alcuni dei trucchi precedentemente menzionati dovrebbero essere evidenti, ovvero Trucco 6: personaggio del chatbot, Trucco 3: utilizzo di testo strutturato e Trucco 1: essere descrittivi. Questo è ciò che tipicamente caratterizza un buon indirizzamento nella pratica, ossia la combinazione di più tecniche in un’unica indicazione.

Anche se potremmo copiare e incollare questo modello di indicazione in ChatGPT e sostituire i campi domanda, risposta_corretta e risposta_studente, questo non è un modo scalabile per implementare il valutatore automatico. Piuttosto, ciò che vogliamo è integrare questa indicazione in un sistema software più ampio in modo da poter costruire un’applicazione user-friendly che possa essere utilizzata da un essere umano.

LangChain

Un modo per farlo è tramite LangChain, che è una libreria Python che aiuta a semplificare la creazione di applicazioni basate su grandi modelli di linguaggio. Ciò avviene fornendo una varietà di astrazioni utili per l’uso programmabile di LLM.

La classe centrale che lo fa si chiama chain (da qui il nome della libreria). Questa astrae il processo di generazione di un’indicazione, l’invio ad un LLM e l’analisi dell’output in modo che possa essere facilmente chiamata e integrata in uno script più ampio.

Vediamo come utilizzare LangChain per il nostro caso d’uso di valutazione automatica. Il codice di esempio è disponibile nel repository GitHub per questo articolo.

Importazioni

Iniziamo importando i moduli della libreria necessari.

from langchain.chat_models import ChatOpenAIfrom langchain.prompts import PromptTemplatefrom langchain.chains import LLMChainfrom langchain.schema import BaseOutputParser

Qui utilizzeremo gpt-3.5-turbo che richiede una chiave segreta per l’API di OpenAI. Se non ne hai una, ho fornito una guida passo-passo su come ottenerne una in un articolo precedente di questa serie. Mi piace memorizzare la chiave segreta in un file Python separato (sk.py) e importarla con la seguente riga di codice.

from sk import my_sk #importo la chiave segreta da un altro file Python

La nostra prima catena

Per definire la nostra catena, abbiamo bisogno di due elementi principali: il LLM e il prompt. Iniziamo creando un oggetto per il LLM.

# definire l'oggetto LLMchat_model = ChatOpenAI(openai_api_key=my_sk, temperature=0)

LangChain ha una classe specifica per i modelli di chat di OpenAI (e molti altri). Passo la mia chiave API segreta e imposto la temperatura a 0. Il modello predefinito qui è gpt-3.5-turbo, ma è possibile utilizzare anche gpt-4 utilizzando l’argomento di input “model_name”. È possibile personalizzare ulteriormente il modello di chat impostando altri argomenti di input.

Successivamente, definiamo il nostro prompt template. Questo oggetto ci consente di generare prompt in modo dinamico tramite stringhe di input che aggiornano automaticamente un template di base. Ecco a cosa assomiglia.

# definire il prompt templateprompt_template_text = """Sei un insegnante di storia delle scuole superiori che valuta i compiti a casa. \In base alla domanda dei compiti indicata da "**Q:**" e la risposta corretta indicata da "**A:**", il tuo compito è determinare se la risposta dello studente è corretta. \La valutazione è binaria; quindi, le risposte degli studenti possono essere corrette o sbagliate. \Sono ammesse semplici sviste ortografiche.**Q:** {question}**A:** {correct_answer}**Risposta dello studente:** {student_answer}"""prompt = PromptTemplate(input_variables=["question", "correct_answer", "student_answer"], \                  template = prompt_template_text)

Con il nostro LLM e il prompt, possiamo ora definire la nostra catena.

# definire la catenachain = LLMChain(llm=chat_model, prompt=prompt)

Successivamente, possiamo passare input alla catena e ottenere un punteggio in una sola riga di codice.

# definire gli inputquestion = "Chi è stato il 35° presidente degli Stati Uniti d'America?"correct_answer = "John F. Kennedy"student_answer =  "FDR"# eseguire la catenachain.run({'question':question, 'correct_answer':correct_answer, \    'student_answer':student_answer})# output: La risposta dello studente è sbagliata.

Anche se questa catena può svolgere efficacemente il compito di valutazione, i suoi output potrebbero non essere adatti per un processo automatizzato. Ad esempio, nel blocco di codice sopra, il LLM ha correttamente indicato che la risposta dello studente “FDR” era sbagliata, ma sarebbe meglio se il LLM ci desse un output in un formato standard che potesse essere utilizzato in un’elaborazione successiva.

Output parser

Ecco dove sono utili gli output parser. Queste sono funzioni che possiamo integrare in una catena per convertire gli output del LLM in un formato standard. Vediamo come possiamo creare un output parser che converte la risposta del LLM in un output booleano (cioè True o False).

# definire l'output parserclass GradeOutputParser(BaseOutputParser):    """Determina se il punteggio è corretto o sbagliato"""    def parse(self, text: str):        """Parsa l'output di una chiamata LLM."""        return "sbagliato" not in text.lower()

Qui creiamo un semplice output parser che controlla se la parola “sbagliato” è presente nell’output del LLM. Se non lo è, restituiamo True, indicando la risposta corretta dello studente. Altrimenti, restituiamo False, indicando che la risposta dello studente era errata.

Poi possiamo incorporare questo output parser nella nostra catena per parsare automaticamente il testo quando eseguiamo la catena.

# aggiornare la catenachain = LLMChain(    llm=chat_model,    prompt=prompt,    output_parser=GradeOutputParser())

Infine, possiamo eseguire la catena per un’intera lista di risposte degli studenti e stampare gli output.

# esegui la catena in un ciclo forstudent_answer_list = ["John F. Kennedy", "JFK", "FDR", "John F. Kenedy", \                  "John Kennedy", "Jack Kennedy", "Jacquelin Kennedy", "Robert F. Kenedy"]for student_answer in student_answer_list:    print(student_answer + " - " + str(chain.run({'question':question, 'correct_answer':correct_answer, 'student_answer':student_answer})))    print('\n')# Output:# John F. Kennedy - True# JFK - True# FDR - False# John F. Kenedy - True# John Kennedy - True# Jack Kennedy - True# Jacqueline Kennedy - False# Robert F. Kenedy - False

YouTube-Blog/LLMs/langchain-example su main · ShawhinT/YouTube-Blog

Codici per completare video di YouTube e articoli sul blog su VoAGI. – YouTube-Blog/LLMs/langchain-example su main ·…

github.com

Limitazioni

La progettazione dell’input è più di chiedere aiuto a ChatGPT per scrivere una email o imparare sulla computazione quantistica. È un nuovo paradigma di programmazione che cambia il modo in cui gli sviluppatori possono creare applicazioni.

Sebbene si tratti di un’innovazione potente, ha le sue limitazioni. Per esempio, le strategie di input ottimali dipendono dal LLM. Ad esempio, l’input di GPT-3 per “pensare passo dopo passo” ha portato a significativi miglioramenti delle prestazioni nei compiti di ragionamento matematico semplice [8]. Tuttavia, per l’ultima versione di ChatGPT, la stessa strategia non sembra essere utile (già pensa passo dopo passo).

Un’altra limitazione della progettazione dell’input è che richiede modelli di linguaggio di largo consumo su larga scala come ChatGPT, che comportano significativi costi computazionali e finanziari. Questo può essere eccessivo per molti casi d’uso più specifici, come la ricerca di corrispondenze di stringhe, l’analisi del sentiment o la sintesi del testo.

Possiamo superare entrambe queste limitazioni tramite raffinamento di modelli di linguaggio pre-addestrati. Qui prendiamo un modello di linguaggio esistente e lo adattiamo per un caso d’uso specifico. Nel prossimo articolo di questa serie, esploreremo le tecniche di raffinamento più popolari integrate con esempi di codice Python.

👉 Ulteriori informazioni su LLM: Introduzione | OpenAI API | Hugging Face Transformers

Risorse

Collegamenti: Il mio sito web | Prenota una chiamata | Chiedimi qualsiasi cosa

Social: YouTube 🎥 | LinkedIn | Twitter

Supporto: Offrimi un caffè ☕️

Gli Imprenditori dei Dati

Una community per imprenditori nel settore dei dati. 👉 Unisciti al Discord!

VoAGI.com

[1] arXiv:2302.11382 [cs.SE]

[2] arXiv:2106.09685 [cs.CL]

[3] State of GPT by Andrej Karpathy at Microsoft Build 2023

[4] arXiv:2206.07682 [cs.CL]

[5] ChatGPT Prompt Engineering for Developers by deeplearning.ai

[6] arXiv:2005.14165 [cs.CL]

[7] arXiv:2201.11903 [cs.CL]

[8] arXiv:2210.03493 [cs.CL]