מדריך לשאילתות יעילות ל Chat GPT

כל אחד יכול לשאול את GPT, אבל אם תרצו לשאול אותו שאלות על תכנות - יש כמה שיטות וטיפים ליעל את העבודה מולו.

מטבע הדברים, קשה לכתוב מדריך לצ׳אט GPT או עבודה עם בינה מלאכותית – התחום משתנה באופן מאוד מהיר וכלי שהוא פופולרי היום יכול להזנח מחר או לחלופין יכולים לצאת פתרונות טובים ומהירים יותר. בפוסט הזה אני מנסה לעשות סדר ולסייע לכל מתכנת שיש לו ידע בתכנות איך משלבים בינה מלאכותית בתהליך הפיתוח היום. מה שנכתב פה הוא מניסיוני האישי כמתכנת שמשתמש ב-GPT לצרכי תכנות. 

מומלץ לקרוא את הפוסט הקודם שלי בנושא שמנתח את נקודות החוזק והחולשה של GPT.

מבוא

ראשית, נגדיר כמה הגדרות בסיסיות GPT הוא המודל, צ׳אט GPT הוא המוצר של openai הנתמכת על ידי מיקרוסופט וגם נותנת שירותים לחברות ושירותים אחרים. אבל יש גם את בארד של גוגל ומודולים אחרים. בנוסף, יש מודלים ספציפיים המיועדים לכתיבת קוד בלבד – למשל OpenAI קודקס וישנם גם מוצרים נוספים שמשפרים את הקוד. לסקירה שלהם ניתן להכנס למאמר בקישור הזה.

במדריך הקצר הזה אנו נתייחס ספציפית לצ׳אט GPT  (מכאן ואילך אתייחס אליו כGPT בלבד) שהוא הממשק הקל ביותר להפעלה של בינה מלאכותית למתחילים – וזאת מכמה סיבות – הראשונה היא שהוא חינמי ופתוח לכל והשניה היא שהוא קל לשימוש – הממשק הוא ממשק וובי וקל לשאול בו שאלות ותשובות. יש ליצור חשבון באתר https://chat.openai.com ולהכנס אליו. בחלון הצ׳אט יש לשאול שאלה – עדיפות גבוהה מאד לאנגלית, כיוון שנכון לעכשיו בגרסה באנגלית מודל GPT עובד יותר טוב. בגרסה היקרה העברית טובה יותר וגם הביצועים טובים יותר, אז מי שמעדיף בעברית – יצטרך לשלם. לפחות נכון לכתיבת שורות אלו (מאי 2023).

מבוא קצר ל-GPT

השאלות שאנו כותבים ל-GPT נקראות prompt. במדריך זה אני מתייחס אליהן כ״פרומפט״.

דוגמה של ממשק צ׳אט GPT - שאילתה שלי ותשובה של GPT לשאילתה. השאילתה מובאת ממש אחרי התמונה.

דוגמה לפרומפט ראשוני הרלוונטי למתכנתים:

create a Node.js http server that replies with "hello world" to a GET message

אם תעתיקו את הפרומפט הזה, תראו שאתם מקבלים קוד והסבר. את הקוד אפשר להעתיק בקלות באמצעות copy code ולהדביק בכל מקום שתרצו כדי להריץ אותו. 

ניתן לנהל שיחה עם GPT על אופי הקוד. אם למשל אני מעוניין לשאול שאלה המשכית או לבקש שינוי בקוד, אני יכול לעשות זאת באופן מיידי. GPT זוכר מה היה בעבר. כך למשל אני יכול לכתוב לו:

״can you use express instead?״

וייבנה לי קוד ממשי המתחשב בפרומפט הקודם. השאלות החוזרות נקראות איטרציות ומקובל להשתמש בהן.

במידה ויש שגיאות שנוצרו בהרצת הקוד, ניתו לכתוב בפרומפט המשכי את סוג השגיאה ואפילו להדביק את השגיאה שנוצרה על מנת לקבל מענה.

זה השימוש הבסיסי בצ׳אט GPT ואפשר לקחת אותו לסיבוב מייד. נסו לכתוב בו פונקציות, בדיקות וכל קוד שהוא ותראו שהוא בהחלט יכול לספק את הסחורה, בטח ובטח במקרים פשוטים. 

למה צריך בנייה נכונה של פרומפטים

יש מקרים שבהן GPT לא מספק את התשובות שאנו רוצים. לעתים הפלט הוא קוד ישן, קוד שלא עובד טוב, קוד שיש בו בעיות אבטחה וכו׳. לעתים גם אחרי הערות והסברים שונים ומשונים אנחנו לא מצליחים לקבל את מבוקשנו. במקרים האלו הנטייה האנושית היא להאשים את GPT. בעוד של-GPT יש מגבלות שונות, לעתים הבעיה היא בדרך שבה אנו שואלים את השאלות ובאמצעות כיוונון נכון של הפרומפטים נוכל להפיק תוצאות טובות יותר ולהמעיט את כמות האיטרציות.

יש בעבודה מול בינה מלאכותית מוצלחת כמו GPT שתי בעיות מרכזיות. הראשונה היא ש-GPT מקנה אשליה של אדם שעונה על שאלות. השניה היא שמחשבים עושים מה שאומרים להם, לא מה שמתכוונים שהם יעשו. GPT, למרות היכולת החזקה שלו להבין מהטקסט את כוונתנו, הוא לא אדם, אלא מחשב וחשוב להיות מדויקים בפרומפטים שנותנים לו ככל האפשר. הדיוק חשוב גם לקבל מענה מדויק בלי איטרציות מיותרות וכן מענה מדויק על שאלות המשך.

הדיוק נעשה גם על ידי הכנסת מונחים מקצועיים ופירוט מדוקדק של מה שאנו צריכים וגם מתן קונטקסט כללי. זה לא מסובך לתת פרומפטים מדויקים והם יכולים להיות ארוכים. צריכים לדמיין את GPT כאיש מקצוע מנוסה שמגיע לשולחן שלנו. יש לו ידע וניסיון אבל הוא לא מכיר אותנו ואת הקוד שלנו. כשאנו מתקשרים איתו זה חשוב לזכור את זה. זה נשמע מעט אבסטרקטי, אז אולי הקוים המנחים הבאים, יחד עם הדוגמאות, יסייעו בהבנה.

הכנסת pre prompt

GPT נותן תשובה כאדם כללי והתשובה מיועדת לאדם הכללי, אנחנו יכולים לשנות את ההתנהגות הזו ואפילו עדיף אם אנו אומרים ל-GPT איך להתנהג ומי הפרסונה שהוא מדבר אליה. אפשר, לפני הצגת השאלות, להגדיר לו איך לענות. אלון אורינג קורא לפיצ׳ר הזה pre prompt וזה שם נהדר בעיני. אני אדגים עם pre prompt משלי.

I want you to act like stackoverflow. I will ask you questions about code, just give me the code in Python. Do not try to explain the code.

תמונה של השאילה I want you to act like stackoverflow. I will ask you questions about code, just give me the code in Python. Do not try to explain the code.

התשובות שתקבלו יהיו קצרות יותר ויכילו את הקוד שאני רוצה ולא הסברים מפורטים על כל שורה אחר כך.

ניתן לכוון את GPT באמצעות בקשה ממנו להעמיד פנים שיש לו תפקיד או פוזיציה מסוימת. זה מעולה כאשר אנו רוצים לקבל מידע על קוד. למשל, לפני שאני רוצה ממנו הסבר על קוד מסוים, אני אכתוב לו כך:

I want you to act as  a senior Python programmer and you are explaining this code to a junior programmer.

דוגמה של השאילתה: I want you to act as  a senior Python programmer and you are explaining this code to a junior programmer.

ואז, אחרי ש-GPT יגיב בחיוב, אני אוכל להדביק את הקוד ולקבל הכוונה טובה ממש.

הכנסת פועל מדויק ולא שלילי

חשוב להכניס פועל שמבהיר היטב את הבקשה ולהמנע מפעלים כלליים כמו write או give. למשל,  אם אני מדביק קוד קיים או מבקש לשנות קוד שניתן כבר בשיחה – להשתמש בפועל refactor ולא write.

להמנע מ not

נסו לא להוסיף not לפועל אלא למצוא פועל חיובי. אם למשל אני רוצה שהוא ישתמש בספרית sharp ולא בספרית imgFlip, אז עדיף לכתוב use sharp מאשר do not use imgFlip 

דוגמה נוספת היא למשל בקוד קיים שניתן לי כתשובה שאינו מטפל או מתייחס לשגיאות – ואני רוצה שהוא יכיל טיפול בשגיאות – עדיף לי לציין בפרומפט ההמשך:

  refactor the code to handle errors 

ולא פשוט להטיח בו:

 The code does not handle errors.

הקפדה על גרסה ושפה

ציינו את הגרסה והשפה של שפת התכנות שבה אתם משתמשים וכן את סביבת ההרצה. למשל הפרומפט

In Python 3.2 on Mac, write a program that reads all files In a directory and subdirectories  and deletes all files larger than 20 MB

יניב תוצאה שונה, גם בקוד הפייתון עצמו, מהפרומפט:

In Python 3.1 on MS Windows, write a program that reads all files in a directory and subdirectories  and deletes all files larger than 20 MB

שמות הפונקציה

כאשר אנו מבקשים ממנו לכתוב פונקציות – אזי לנוסח השאלה שלכם בפרומפט יש השפעה על שם הפונקציות. השתדלו להשתמש במונחים מקצועיים כמו transform, reduce, minimise בשאלה כדי לייצר שמות טובים יותר לפונקציה. GPT מתחשב בנתונים שהכנסתם בפרומפט כדי לייצר את שמות הפונקציה.

למשל, הפרומפט:

ֿIn Node.js create a function that transform an image to a 400 to 400 pixels size

יניב שם פונקציה transformImageTo400x400 בוודאות גבוהה יותר.

הפרומפט

In Node.js, create a function that changes an image to a 400 to 400 pixels size

יניב שם פונקציה ששמה הוא resizeImage

מרכאות – יש להן חשיבות

במונחים חיצוניים, מוטב להכניס מרכאות כדי לסמן ל GPT שמדובר במונח או מחרוזת טקסט. 

למשל הפרומפט

create a BASH script that outputs "General system status"

יניב את התוצאה:

#!/bin/bash
echo "General system status"

לעומת הפרומפט

 create a BASH script that outputs General system status

שיניב את התוצאה:

#!/bin/bash

# Output system information
echo "System Information:"
echo "-------------------"
echo "Hostname: $(hostname)"
echo "Kernel Version: $(uname -r)"
echo "Uptime: $(uptime -p)"
echo "Current Users: $(who | wc -l)"
echo

# Output CPU information
echo "CPU Information:"
echo "----------------"
echo "$(lscpu)"
echo

# Output memory information
echo "Memory Information:"
echo "-------------------"
echo "$(free -h)"
echo

# Output disk usage
echo "Disk Usage:"
echo "-----------"
echo "$(df -h)"
echo

# Output network interfaces
echo "Network Interfaces:"
echo "-------------------"
echo "$(ifconfig)"

מתן קונטקסט: שאלות על קוד קיים

במידה ואתם עובדים על codebase קיים ואתם רוצים להוסיף לו פונקציונליות, מוטב להעתיק דוגמת קוד ולציין בפניו ליצור את הפונקציונליות החדשה לפי הקוד הזה.

למשל – יש לי במערכת קוד שמשנה תמונה שנראה כך:

const sharp = require("sharp");

async function resizeImage() {
 try {
   await sharp("sammy.png")
     .resize({
       width: 150,
       height: 97
     })
     .toFile("sammy-resized.png");
 } catch (error) {
   console.log(error);
 }
}

resizeImage();

אם אני אבקש מ-GPT לייצר את הקוד באופן הבא:

The following code is a good example and you should use it in order to create similar code that add a greyscale filter to the image
[The code]

הסיכוי לתשובה שנראית זהה ל-coding standard וגם משתמשת בספריה עולה. אם אני אבקש ממנו:

Create Node.js function that transform image to greyscale

יש סיכוי גבוה שאקבל ספריה אחרת כמו Jimp למשל וב-coding standard אחר.

השתמשו בטייפים

אם יש לכם יכולת – השתמשו בטייפים כדי לסמן סוגי מידע. למשל הפרומפט הזה:

Create in jest tests for resizeImage(inputPath, outputPath, width, height).  

יעבוד ויניב בדיקות בסיסיות. אבל אם אתם משתמשים בטייפים, אז הבדיקות יהיו טובות יותר. למשל:

Create in jest  tests for resizeImage(inputPath:string, outputPath:string, width?:number, height?:number):string. 

קחו בחשבון שצריך להיות מדויק בפרומפט הראשוני ולהגדיר גם את הפלט וגם התנהגות במקרה של שגיאות. למשל הפרומפט הזה יניב בהסתברות גבוהה קוד טוב יותר:

Create in jest  tests for resizeImage(inputPath:string, outputPath:string, width?:number, height?:number):string.  The output is a string with the location and name of the resized image after it was resized. an error will be thrown if inputPath is invalid, outputPath is invalid or some general errors in the transformation process.

אבטחה ובטיחות

כרגע מאד מומלץ להזהר מאד עם הקלט שנותנים ל GPT ולהתייחס אליו מבחינת אבטחה בדיוק כמו stackoverflow – כלומר לא לחלוק עם GPT פרטים סודיים, טוקנים או מידע מסחרי מוגן.

חשוב לציין שיש גם סיכון נוסף – של קוד פגיע. יתרון גדול של GPT בתכנות הוא שניתן לבדוק את התוצר באופן מיידי. זה יתרון אבל גם חסרון כיוון שמתכנתים נוטים לסמוך על הכלים האלו (יותר מקוד מStack overflow למשל) אז הם נוטים להדביק אותו ולא לבחון אותו לעומק. צוות של חוקרים מסטנפורד הראו שמי שמשתמש בבינה מלאכותית נמצא בסיכון יותר גבוה להכניס קוד בעייתי לאפליקציה שלו. חייבים לבדוק את הקוד המתקבל בשבע עיניים.

סיכום

כלי בינה מלאכותית הם מצוינים ויכולים להגדיל מאוד את הפרודוקטיביות של כל מתכנת. לא נדרשים כישורים טכניים מיוחדים על מנת לעשות בהם שימוש וכל אחד יכול להשתמש בצ׳אט GPT או בכלים דומים כבר עכשיו. אבל, בדיוק כמו גוגל עם פילטרי החיפוש שלו, יש כמה טכניקות מוצלחות מאד שאפשר לנקוט בהן על מנת לטייב את התוצאות שמתקבלות ולחסוך זמן רב. 

תודות

אני מודה מאד לאלון אורינג, מרצה ללמידה חישובית באוניברסיטת רייכמן ומנהל מחקר בסטארטאפ, לרועי בן יוסף, ארכיטקט בכיר בסייברארק ולדביר פינצ׳בסקי, cmo בקבוצת לקי על הסיוע בכתיבת הפוסט.

מקורות וקריאה נוספת

מעבר לניסיוני האישי, נעזרתי בכמה מאמרים וסרטונים ברשת על מנת לכתוב מאמר זה, חלקם של openAI וחלקם של מתכנתים שכמוני עובדים עם הכלי הזה. אני מציג פה רשימה קצרה של הטובים שבהם.

ChatGPT Prompt Engineering for Developers

Best practices for prompt engineering with OpenAI API

How to use chat gpt as a developer?🚀

How We Used Chat GPT to Speed Up the Software Development Process

פוסטים נוספים שכדאי לקרוא

פתרונות ומאמרים על פיתוח אינטרנט

רינדור של קליינט סייד עם SSR

הסבר קצר על SSR מול רינדור קלאסי ולא. לא תמיד זה טוב להשתמש בו. אין כדור כסף שיכול לפתור הכל.

גלילה לראש העמוד