עבודה עם GPT למתכנתים

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

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

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

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

נאמן לאמרה ש״כלי חדש לא גורם לאנשים להיות מובטלים, אלא גורם לאנשים שמסרבים להשתמש בכלי להיות מובטלים״ מייד התחלתי להתנסות ב openAI – בתחילה ב Chat GPT3 ואחרי כן בגרסה 3.5 וכן ב-API שלו (כלי המאפשר לא להשתמש בצ׳אט אלא לתחקר את GPT ישירות) ובאינטגרציות שלו לכלי כתיבת קוד (למשל Warp) ולאחר מכן בצ׳אט בתשלום של GPT4 וכן ב Auto GPT המדובר כדי לבדוק אותם בסביבה שלי ככותב קוד. 

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

באילו מקרים GPT מצליח?

כתיבה של משימה ממוקדת שנעשתה בעבר על ידי אנשים אחרים 

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

1. כתוב לי סקריפט בפייתון המבצע סריקה של כתובות IP בטווח 192.168.1.1/24 ומביא לי רשימה מסודרת של כל מה שהוא מוצא שם.

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

3. כתוב לי סקריפט בג׳אווהסקריפט המבצע המרה של תאריכים בפורמט גרמני, אמריקאי ל-ISO. ללא תלויות.

4. כתוב לי קומפוננטה גרפית המציגה טבלה ניתנת למיון של מבנה נתונים (סיפקתי דוגמה למבנה הנתונים).

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

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

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

כתיבה של בדיקות לקוד ממוקד קיים

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

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

הוכחת יכולת (POC) לתוספים או אפליקציות קטנות

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

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

באילו דברים הוא לא תפקד כמו שצריך?

משימות קטנות אך לא טריוויאליות

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

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

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

״I am getting Poetry error output – the directory is not there. What should I do?״

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

במקרה אחר של npm install שהשתבש, גם פה Chat GPT נתן תגובה מצוינת, שמפרטת דברים טרוויאליים שצריך לעשות כמו: ״שדרוג המודולים, בדיקת גרסת Node.js ושדרוגה, שנמוך המודולים״. במקרה הזה, זו היתה בעיה של peer dependencies שהיה אפשר לפתור אותה מהשורש עם תרומת קוד לאחד מתתי המודולים.

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

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

הגעה מ-80 ל-100

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

הבעיה המרכזית: הזיות 

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

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

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

״משימות שיקח לי הרבה זמן לעשות, ומעט זמן לבדוק את התוצאה שלהן״

למשל – הנה רשימה של מאכלים שאני אוהב, תן לי 10 רעיונות מה לאכול לארוחת ערב. 

כתוב לי תיאור משרה למתכנתת פרונטאנד, עם דגש על א׳ ב׳ ג׳.

סיכום

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

בשורה התחתונה – בהחלט כדאי ללמוד לעבוד עם GPT ומודלים אחרים מסוגו, הוא בהחלט חוסך זמן עבודה יקר מאד וגם חוסך שיטוט ב- Stack Overflow (לטוב ולרע, כי לעתים יש מידע שימושי ודיונים מעניינים ב-SO אבל הקריאה שלהם ארוכה ברוב הפעמים) אני כותב את זה כמי שעושה את זה כבר עכשיו בעבודתו. הטכנולוגיה תייתר חלק מעבודת התכנות. בדיוק כפי שטכנולוגיות אחרות ייתרו חלק מעבודת התכנות. דוגמה טובה היא למשל מחשוב ענן: בעבר נדרשה מכל מתכנת הבנה בשרתים, מערכות הפעלה ותקשורת. היום בעידן מחשוב ענן וטכנולוגית Serverless, ניתן לבנות דברים מאד מרשימים ללא הבנה כזו שנדרשת רק באפליקציות מורכבות.  כך גם GPT, חלק מהקוד שאנו עמלים עליו היום ייכתב על ידו הודות ליכולת שלו להבין טקסט ומשימות ולכתוב קוד סביר סטטיסטית. 

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

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

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

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

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

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

DALL·E 2023-10-21 22.28.58 - Photo of a computer server room with red warning lights flashing, indicating a potential cyber threat. Multiple screens display graphs showing a sudde
יסודות בתכנות

מבוא לאבטחת מידע: IDOR

הסבר על התקפה אהובה ומוצלחת שבאמצעותה שואבים מידע מאתרים

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

המנעו מהעלאת source control לשרת פומבי

לא תאמינו כמה אתרים מעלים את ה-source control שלהם לשרת. ככה תמצאו אותם וגם הסבר למה זה רעיון רע.

יסודות בתכנות

מספרים בינאריים בקוד

איך, ויותר חשוב למה, משתמשים במספרים בינאריים בתכנות? גם בפייתון ובג׳אווהסקריפט?

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