Ingineria prompturilor (prompt engineering) este o disciplină relativ recentă, care joacă un rol esențial în obținerea unor rezultate remarcabile prin folosirea modelelor de limbaj de mari dimensiuni (Large Language Models - LLM) nou apărute.
Din experiența noastră practică, constatăm că este cel mai important factor care determină succesul sau eșecul unei soluții bazate pe Generative AI. Spre deosebire de fluxul tradițional de adunare, procesare și stocare a unor cantități enorme de date pentru antrenarea modelelor, situația se schimbă în cazul LLM-urilor. Având în vedere pre-antrenarea lor pe seturi masive de date, accentul se mută pe arta de a crea prompturi.
În rândurile de mai jos, vom oferi mai multe detalii despre ce este de fapt un prompt și vom arăta câteva dintre strategiile comune de utilizare a lor.
Un prompt reprezintă un "input" sau o instrucțiune oferită unui model de limbaj de mari dimensiuni pentru a obține un răspuns. Poate fi un singur cuvânt, frază, propoziție sau chiar o listă detaliată de instrucțiuni, fiind un punct de pornire pentru ca modelul să genereze un text coerent și relevant din punct de vedere contextual.
Structura unui prompt poate varia în funcție de tipul LLM-ului folosit și de modul în care au fost pregătite datele de antrenament. De exemplu, în cazul modelelor Claude de la Anthropic, se așteaptă ca promptul să înceapă cu "nnHuman:" și să se încheie cu "nnAssistant:"—subliniind nuanțele structurale.
Dincolo de diferențele structurale, este esențial să recunoaștem că, deși conceptele de bază ale unui prompt sunt în general consecvente, nu toate modelele interpretează același prompt în mod identic. Acest aspect poate să nu fie evident în teorie, însă devine evident în aplicarea practică.
Strategiile prezentate mai jos sunt aplicabile în interacțiunile cu majoritatea LLM-urilor. Cu toate acestea, eficacitatea lor poate varia în funcție de tipul și de furnizorul modelului cu care lucrați.
Pentru o abordare sigură și consecventă în crearea unui prompt, atunci când avem un set complex de instrucțiuni, trebuie să avem în considerare o structură.
Deși nu toate prompturile vor conține fiecare din aceste elemente, înțelegerea lor vă va furniza o bază solidă pentru a crea prompturi eficiente.
Vom numi aceasta structură de prompt RIRO (Role, Instructions, Rules, Output).
Sfat: Când creăm prompturi, putem folosi exact aceste titluri în promptul propriu-zis și le putem defini în sintaxa Markdown.
** Rol
Acționează ca …
** Instrucțiuni
Analizează inputul și …
** Reguli
Fă asta și aia, nu face cealaltă
** Output
Folosește structura json, în acest format.
Abordați acest pas ca și când ați pregăti o scenă: îi indicați AI-ului ce ar trebui să facă - îi atribuiți rolul în marea schemă a lucrurilor. Îi solicitați să revizuiască un fragment de cod, să fie creativ și să creeze poezii sau să vă spună care este sensul vieții? Cereți-o clar, de la început.
Cu cât rolul este mai clar și detaliat, cu atât vor fi mai bune răspunsurile. Rolul poate fi generic, specific, real sau imaginar. Nu trebuie să conțină definiții formale, dar trebuie să specificați precis ce personalitate ar trebui să adopte.
Exemple:
"Ești un programator senior care trebuie să revizuiască acest fragment de cod în căutarea problemelor de performanță."
"Acționează ca un translator de limba engleză, corectând și îmbunătățind în același timp. Voi vorbi cu tine în orice limbă, iar tu vei traduce în engleză și vei răspunde cu versiunea corectată și revizuită a datelor oferite.
"Vreau să te comporți ca William Shakespeare și să răspunzi doar în stilul său."
Păstrați totul simplu, dar nu prea simplu. Trebuie să oferiți inteligenței artificiale toate informațiile de care are nevoie pentru a îndeplini sarcina. Este ca și cum i-ați explica o problemă de programare unui prieten - pas cu pas și fără jargon.
Este foarte important să faceți cât mai puține presupuneri cu putință și să fiți foarte clari în legătură cu succesiunea de pași pe care doriți să îi urmeze. Dacă lista de instrucțiuni este lungă, separați în mod clar în prompt fiecare instrucțiune.
De exemplu, să ne imaginăm că dezvoltăm un asistent AI care generează un rezumat al unei discuții dintre mai mulți oameni.
Modelele mai capabile vor genera un rezumat decent chiar și cu instrucțiuni simple precum "Generează un rezumat bazat pe acest text". Dar, în acest exemplu, lăsăm AI-ul să facă foarte multe presupuneri.
Vă întrebați ce fel de presupuneri? Să fim mai preciși:
"Generează un rezumat bazat pe acest text, urmând acești pași:
Identifică limba în care este scris textul și oferă răspunsul în aceeași limbă.
Începe rezumatul cu un paragraf introductiv care oferă o prezentare generală a subiectului.
Surprinde perspectivele tuturor persoanelor implicate.
Sfat: În prompt engineering, fiecare cuvânt contează. De exemplu, "Generează un rezumat" versus "Generează un rezumat complet și detaliat" pot duce la răspunsuri foarte diferite.
Fiecare joc are regulile lui. La fel este și în cazul prompturilor. Acestea sunt niște măsuri de protecție care împiedică AI-ul să devieze de la subiect. Este important să vă gândiți aici în special la fluxurile negative. Care sunt cele câteva reguli specifice pentru afacerea voastră pe care doriți ca inteligența artificială să le gestioneze sau nu? Ca în orice alt aspect atunci când creăm promptul perfect, fiți cât mai clari posibil.
De exemplu, să presupunem că dezvoltăm un chatbot:
Întotdeauna răspunde în engleză. Dacă întrebarea este în altă limbă, specifică: "Te rog folosește limba engleză, pentru că nu sunt capabil să răspund în orice altă limbă"
Răspunde numai la întrebările din industria auto și refuză respectuos întrebările care nu sunt relevante.
Sfat: Furnizarea de exemple (atunci când se aplică) ajută foarte mult la clarificarea așteptărilor.
Până la urmă, ce ne dorim să obținem de la AI? Un raport de buguri, un fragment de cod rescris sau o implementare a unei noi funcționalități? Fiți preciși cu privire la ceea ce vă așteptați, nu neapărat cu privire la conținutul în sine (care a fost gestionat prin stabilirea adecvată a rolului, instrucțiunilor clare și regulilor), ci cu privire la structura acestuia.
Dacă utilizați AI în mod programatic, prin API, pentru a obține răspunsuri fiabile, este extrem de important să furnizați descrieri lămuritoare ale modului în care ar trebui să arate rezultatul.
Dacă extrageți mai multe tipuri de informații în răspuns, puteți solicita o structura clară cu cheile pe care le așteptați.
"Răspundeți cu un obiect JSON valid cu următoarea structură:
{ "language": "Engleză", // limbă detectată în pasul X "answer": "Răspuns la întrebarea utilizatorului aici"
// Răspuns determinat prin urmarea instrucțiunilor specificate }"
Modul în care funcționează LLM constă în prezicerea următorului cuvânt/token. În esența lor, aceste modele sunt funcții matematice, algoritmi, care nu au nicio capacitate de raționament precum o avem noi, oamenii. Din acest motiv, atunci când un LLM este instruit să răspundă la o problemă matematică sau să utilizeze logica comună, s-ar putea să greșească.
O modalitate de a rezolva această problemă este de a instrui modelul cu privire la modul în care trebuie să "gândească" pentru a obține rezultatul corect. Iată două dintre cele mai frecvente strategii folosite.
În această strategie, adăugăm unul sau mai multe exemple în prompt pentru a explica modelului raționamentul și obținerea răspunsului dorit. Ca regulă generală, cu cât oferim mai multe exemple, cu atât răspunsurile devin mai precise.
Sfat: Cu cât modelul este mai slab, cu atât strategia este mai eficientă.
În mod contrastant, când promptul conține numai întrebarea/instrucțiunea specifică fără exemple, îl numim "Zero-Shot Prompt".
Spre exemplu, să utilizăm modelul mistralai/Mistral-7B-Instruct-v0.2 cu următorul prompt:
John a adăugat un nou commit.
Fiecare fișier are 5 linii adăugate și 3 linii șterse.
Sunt 3 fișiere în commit.
Întrebare: Câte linii s-au schimbat?
În total, commitul lui John a adăugat 5 linii pentru fiecare fișier (deoarece sunt trei fișiere), deci 5 * 3 = 15 linii au fost adăugate. Similar, 3 linii au fost șterse din fiecare fișier, deci 3 * 3 = 9 linii au fost șterse. Schimbarea netă este, prin urmare, diferența dintre numărul de linii adăugate și numărul de linii șterse, care este 15 - 9 = 6 linii.
După cum se poate observa în răspuns, deși șirul gândirii și raționamentului a fost aproape corect, la final, a scăzut numărul de linii eliminate din numărul de linii adăugate, în loc să fie adunate.
Acum, haideți să luăm același exemplu, dar oferindu-i exemple de interogări similare cu rezultatele lor corespunzătoare.
John a adăugat un nou commit.
Fiecare fișier are 5 linii adăugate și 3 linii șterse.
Sunt 3 fișiere în commit.
Întrebare: Câte linii s-au schimbat?
Răspuns: Răspunsul este: 15 adăugate, 9 șterse,
în total 15 + 9 = 24 linii schimbate.
Dan a adăugat un nou commit.
Fiecare fișier are 7 linii adăugate și 2 linii șterse.
Sunt 5 fișiere în commit.
Întrebare: Câte linii s-au schimbat?
Pentru commitul lui Dan, sunt 5 fișiere cu 7 linii adăugate
la fiecare fișier (decii 5 * 7 = 35 linii adăugate).
De asemenea, sunt 5 fișiere cu 2 linii șterse din fiecare
fișier (decii 5 * 2 = 10 linii șterse).
Deci, numărul total de linii schimbate este suma linilor
adăugate și a celor șterse, care este 35 + 10 = 45 linii.
O altă abordare este să determinăm modelul să gândească pe cont propriu ca să ajungă la rezultat.
Putem face acest lucru adăugând: "Să gândim aceasta pas cu pas." la sfârșitul promptului. Uneori, acest demers poate fi suficient, alteori putem fi chiar mai specifici și să detaliem cum ar trebui să arate fiecare pas.
Astfel, vom obține rezultate mai bune pentru problemele matematice sau de comune, deoarece încurajează AI-ul să abordeze instrucțiunile pas cu pas și să raționeze între ele
Să luăm următorul exemplu de prompt:
Dan a adăugat un nou commit.
Fiecare fișier are 7 linii adăugate și 2 linii eliminate.
Sunt 5 fișiere în commit.
Întrebare: Câte linii s-au schimbat?
Să gândim pas cu pas, să calculăm numărul total de linii adăugate și să îl adunăm cu numărul total de linii eliminate.
Pentru a determina numărul total de linii schimbate în
commitul lui Dan, puteți urma acești pași:
1. Calculați numărul de linii adăugate pentru toate fișierele:
Linii adăugate = Numărul de fișiere *
Linii adăugate pe fișier = 5 * 7 = 35 de linii
2. Calculați numărul de linii eliminate pentru toate fișierele:
Linii eliminate = Numărul de fișiere
* Linii eliminate pe fișier = 5 * 2 = 10 linii
3. Găsiți numărul total de linii schimbate:
Total linii schimbate = Linii adăugate +
Linii eliminate = 35 + 10 = 45 de linii
Prin urmare, commitul lui Dan a rezultat într-o
schimbare de 45 de linii în total.
Sfat: Există deja furnizori care aplică acest lucru în mod implicit, cum ar fi modelele GPT ale OpenAI sau seria Gemini a Google.
Aceasta este ingineria prompturilor pe scurt!
Ingineria prompturilor nu este doar despre a oferi instrucțiuni, ci este despre a fi foarte clar, având o structură precisă pe care inteligența artificială să o urmeze; la acestea se adaugă cunoștințele necesare pentru a utiliza cele mai bune strategii de prompt engineering pentru necesități specifice.
Detaliul cel mai remarcabil este că ne aflăm în etapele pionieratului, când încă descoperim empiric cum să creăm promptul perfect.
În prezent, abilitatea de a stăpâni ingineria prompturilor reprezintă una dintre cele mai esențiale competențe necesare pentru a utiliza sau integra cu succes modelele lingvistice mari (LLM) în aplicații. Este important să subliniem că, pe măsură ce inteligența artificială devine tot mai avansată și sofisticată, procesul de inginerie a prompturilor va deveni, cel mai probabil, mai accesibil și intuitiv, deschizând astfel calea inovației și posibilităților remarcabile.
În calitate de persoană profund implicată în domeniul integrării modelelor lingvistice mari (LLM), am avut oportunitatea să constat personal influența semnificativă a prompturilor bine formulate asupra modelării comportamentului și capacităților inteligenței artificiale.
Aprofundarea acestor concepte vă va permite să ajustați prompturile în concordanță cu sarcina în lucru, garantând astfel obținerea rezultatelor dorite.