בפוסט הקודם ראינו שהבינה המלאכותית המפורסמת מתקשה קצת לכתוב קוד טוב לארדואינו. האם בפייתון היא תצליח יותר?
לפני שנים רבות, כשהאתר וולפרם אלפא עלה לאוויר, כתבתי עליו ביקורת בטור שהיה לי אז ב"נענע10". כמו ChatGPT, גם וולפרם אלפא מנסה לתת תשובות לשאלות שנשאלות בשפה טבעית, אם כי הוא מתמקד בנתונים, בעובדות ובחישובים מדויקים. חלק מהביקורת שלי אז הוקדש דווקא לבני האדם, שהסתערו בהמוניהם על התגלית החדשה בשביל לשאול אותה "מה משמעות החיים?" (כאשר בעצם הם רק רצו לראות את המספר 42. כל כך מקורי.) זה דומה למה שקורה עכשיו עם ChatGPT: אני רואה עוד ועוד אנשים מבקשים ממנה לכתוב את האלגוריתמים הפשוטים והמוכרים ביותר, או מכניסים בקוד את הטעויות הנפוצות ביותר, ומאושרים עד הגג כשהיא מוצאת את הטעויות האלה. היא מצליחה, בדרך כלל, אבל תגידו לי – בשביל זה צריך בינה מלאכותית?
כדי לשבור את השטאנץ בלי להקשות עליה יותר מדי בשלב ראשון, ביקשתי מג'יפְּטי משהו שהוא טיפ-טיפה פחות טריוויאלי: "כתבי לי קוד בפייתון, שממיין מערך של מספרים שלמים לפי הערך המוחלט של המרחק בין כל אלמנט לבין האלמנט הזוגי הגדול ביותר במערך." הנה מה שהתקבל:
יש בקוד הזה שתי טעויות. אחת מסתתרת היטב (מאחורי הנחה סמויה), והשנייה בפלט-לדוגמה שמוצג בהערה למטה. עם זאת הקוד עצמו מרשים בהחלט, פייתוני ואפילו מחזיר תשובה נכונה. איזה יופי! בניסיון להבין מה גרם לשיבוש בהערה, ביקשתי מהבינה המלאכותית לשנות את הרשימה לבדיקה כך שהמספר הגדול ביותר בה לא יהיה זוגי. הנה מה שיצא:
אהבתי מאוד את התוספת החדשה לפונקציה, שלא קשורה בכלל למה שביקשתי אבל כן מתייחסת להנחה הסמויה שהזכרתי קודם – גם אם זה לא פתרון טוב או מומלץ, כפי שנראה בהמשך. לעומת זאת, לא רק שהפתרונות בהערות עדיין שגויים, ג'יפטי לא התייחסה בכלל למה שביקשתי. היא הוסיפה רשימה לבדיקה, אבל גם בה המספר הגדול ביותר הוא זוגי. כדי להוסיף חטא על פשע, היא הסבירה מה עשתה:
יש משהו מטריד ברמות בבינה מלאכותית שיודעת להשתמש ב-List comprehension ובפונקציות למבדה, ומצד שני לא יודעת ש-10 ו-9 יותר גדולים מ-7. הערתי לה שהמספר הגדול ביותר במערך הוא 10 ולא 7, אז היא הוסיפה עוד מקרה לדוגמה:
ניסיתי שוב, בניסוח אחר: "לא, אני רוצה שהמספר הגדול ביותר במערך יהיה אי-זוגי, לא זוגי" (קראתי לזה מערך ולא רשימה, כי קודם לכן נראה שעם הטרמינולוגיה הזו היא דווקא מסתדרת). בתגובה, היא הוסיפה עוד רשימה לדוגמה:
"בכל הטסטים שהצעת," הסברתי באורך-רוח, "הערך הגדול ביותר ב-arr הוא 10, וזהו מספר זוגי. אני רוצה ש-arr יכיל ערך שיהיה גם הגדול ביותר וגם אי-זוגי." וסוף כל סוף זה קרה:
כעת ניסיתי לשכנע אותה לתקן את ההערות שלה בקוד, שמציגות מיונים שגויים (ביחס לדרישות וביחס לפלט הפונקציה שהיא-עצמה כתבה). אחרי מספר ניסיונות שווא, ולא אייגע אתכם עם צילומי המסך, התייאשתי ועברתי לנושא אחר. בתיקון הספונטני שלה לפונקציה, ג'יפטי הוסיפה ל-max את פרמטר ה-default, כך שאם המערך אינו כולל שום מספר זוגי, הערך שעל פיו יתבצע החישוב יהיה 0. הבקשה המקורית שלי כללה הנחה סמויה, שתמיד יהיה במערך ערך זוגי אחד לפחות. מה עושים אם ההנחה הזו לא מתקיימת? בקוד הראשון שקיבלתי קורה מה שלדעתי הוא הדבר הנכון ביותר: האינטרפרטר עוצר את ההרצה וזורק שגיאה [נ.ב., אלא אם המערך ריק לגמרי]. זו אחריות שלי כמתכנת לבדוק דברים כאלה, ואם פישלתי, ככה לפחות יש לי סיכוי לתפוס במקרה את התקלה. עם הקוד ה"משופר", המקרים הבעייתיים מקבלים פתרון שאף אחד לא ביקש ונשארים נסתרים. את הבאג הזה יהיה הרבה יותר קשה למצוא!
אז ביקשתי מהבינה המלאכותית לשנות את הפונקציה כך שאם אין אלמנט זוגי במערך, היא תזרוק שגיאה (ליתר דיוק חריגה, exception). זה מה שיצא:
היא הוסיפה את המבנה התחבירי הנכון, בצורה שלא עוזרת בכלל. ה-default הקסום מקודם מבטיח, למעשה, שה-try לעולם לא ייכשל ואנחנו לא נקבל את השגיאה. הפלט יהיה מערך ממוין רגיל, ולכן – שוב – גם ההערה שמסבירה את השורה האחרונה אינה נכונה. אמרתי לג'יפטי שהתוכנית הזו לא זורקת שגיאה, והיא מיהרה להציע תיקון:
זהו תיקון מעניין, כי לכאורה הוא עושה בדיוק מה שביקשתי בשאילתות האחרונות. הוא רק שוכח את הדרישות הקודמות. אמנם, אם לא יהיו שום אלמנטים זוגיים במערך, באמת נקבל שגיאה. הצרה היא שנקבל את השגיאה הזו גם אם יהיו במערך מספרים זוגיים, שהגדול מביניהם אפס – שהוא כידוע זוגי:
כששאלתי את ChatGPT אם אפס הוא מספר זוגי, היא הייתה פחות חד-משמעית: "בגדול כן, אבל זה תלוי בהקשר ובהגדרות," הסבירה. לרוע מזלה, בהקשר של פייתון, אפס בהחלט נחשב זוגי.
אפשר לומר, אם כך, שקוד ש-ChatGPT יוצרת בהנחיית בן אדם יגיע, לכל היותר, לרמת אמינות שתואמת את יכולת התכנות ואת ההבנה של אותו אדם. האם היא לפחות חוסכת זמן הקלדה? לא, רק תחשבו כמה זמן והקלדה השקעתי בלשכנע אותה להוסיף מספר אי-זוגי גדול למערך. האם היא יכולה לסדר את הקוד יותר יפה? כן, כמו כלים שיש בכל מקום כבר עשורים שלמים. האם, כפי שמישהו טען, היא יכולה לצמצם את הקוד ולהפוך אותו לקומפקטי יותר? גם אם היא לא תהרוס את הפונקציונליות בדרך, למי אכפת אם הקוד יהיה מצומצם? נגמר המקום בדיסק? קוד קצר יותר לא מבטיח יעילות גבוהה יותר. בקיצור, כמו כשכתבתי על DALL-E, המתכנתים יכולים לישון בינתיים בשקט.
לסיום, ובנימה קצת יותר אופטימית, הנה שיר שג'יפטי יצרה לפי השאילתה שלי, "כתבי שיר בחרוזים על ילד שמנסה להכין שיעורי בית במתמטיקה אך דעתו מוסחת על ידי פירות וירקות". גם פה יש מקום לשיפור, אף על פי שהקריטריונים באומנות גמישים יותר. ואם המשימה הזו מעוררת אצלכם אסוציאציה לסיפור הנפלא "החשמהד של טרוּל" מתוך "הקיבריאדה" של סטניסלב לם, אז סחתיין שאתם מכירים 🙂