בדיקות אוטומטיות ל-AI: המדריך המלא של אילון אוריאל להקמת מערך Eval אמין (בלי לנחש)

בעולם פיתוח התוכנה המסורתי, אנחנו חיים בעולם דטרמיניסטי: אם נכתוב פונקציה שמחברת 2 ועוד 2, אנחנו מצפים לקבל 4. תמיד. אם קיבלנו 4, הטסט עבר. אם קיבלנו 5, הטסט נכשל. אבל כשנכנסים לעולם הבינה המלאכותית הגנרטיבית (Generative AI), הקרקע נשמטת לנו מתחת לרגליים. "2 ועוד 2" יכול להפוך ל-"לרוב 4", ולפעמים ל-"ארבע", ולעיתים נדירות ל-"התוצאה היא סכום של שני מספרים זוגיים".

הבעיה הגדולה ביותר שארגונים נתקלים בה היום היא המעבר מפרויקט צדדי (POC) לייצור (Production). בשלב ה-POC, המפתח מריץ כמה פרומפטים, מסתכל על התשובות ואומר "וואלה, זה נראה טוב". זוהי גישת ה-"Vibes Based Testing" (בדיקה מבוססת תחושות). הבעיה? תחושות אינן ניתנות למדידה (Scale), הן סובייקטיביות, והן מסוכנות עסקית.

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

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

המלכודת הגדולה: למה בדיקות ידניות הן מתכון לאסון

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

בפיתוח תוכנה קלאסי, Unit Test יתפוס רגרסיה כזו מייד. ב-AI, אם אין לכם מערך Eval, אתם תגלו את הבעיה רק כשהלקוחות יתחילו להתלונן.

האתגרים המרכזיים בבדיקות AI הם:

היעדר "אמת אחת" (Ground Truth): בניגוד למתמטיקה, לשאלה "כתוב סיכום של המאמר" יש אינסוף תשובות נכונות. איך בודקים את זה אוטומטית?

עלויות וזמן: הרצת אלפי בדיקות על מודלים כמו GPT-4 או Claude 3.5 עולה כסף ולוקחת זמן.

הזיות (Hallucinations): המודל נשמע מאוד משכנע גם כשהוא משקר לחלוטין. בדיקה שטחית לא תגלה את זה.

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

השיטה של אילון אוריאל: ארבעת עמודי התווך של מערך בדיקות יציב

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

1. סט הנתונים (The Dataset / Golden Set)

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

2. המודל הנבדק (The Subject)

המערכת שאותה אנו בוחנים. זה כולל לא רק את המודל עצמו (למשל GPT-4o), אלא את כל השרשרת: הפרומפט, הקונטקסט שנשלף (RAG), והפרמטרים (Temperature).

3. המדדים (The Metrics)

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

4. השופט (The Evaluator)

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

סוגי מדדים: מעבר ל-Exact Match

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

מדדים דטרמיניסטיים (Deterministic Metrics)

אלו המדדים הפשוטים והמהירים ביותר. הם בינאריים לרוב (עבר/נכשל) ואינם דורשים בינה מלאכותית כדי לחשב אותם.

בדיקת פורמט (JSON/XML): אם ביקשתם מהמודל להחזיר JSON, המדד בודק האם הפלט הוא אכן JSON תקין (Parsable). זה קריטי למערכות אוטומציה.

נוכחות מילות מפתח: בדיקה האם מילים מסוימות הופיעו (או לא הופיעו) בתשובה. למשל, בבוט שירות לקוחות, נרצה לוודא שהמילה "מתחרה" לא מופיעה.

אורך תשובה: ודוא שהתשובה לא קצרה מדי ולא ארוכה מדי.

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

מדדים סמנטיים (Semantic Metrics)

כאן אנחנו נכנסים לטריטוריה של "משמעות". המילים לא חייבות להיות זהות, אבל הכוונה כן.

דמיון וקטורי (Embedding Similarity): אנחנו הופכים את תשובת המודל ואת התשובה הנכונה (Reference) לווקטורים מתמטיים (באמצעות מודל Embedding), ובודקים את הזווית ביניהם (Cosine Similarity). ציון גבוה אומר שהמשמעות קרובה מאוד, גם אם המילים שונות.

מדדי NLP קלאסיים (BLEU / ROUGE): אלו מדדים שמגיעים מעולם התרגום המכונה. הם בודקים חפיפה של מילים (N-grams). כיום השימוש בהם פוחת כי הם לא באמת "מבינים" משמעות, אבל הם זולים ומהירים לחישוב ראשוני.

מדדים מבוססי מודל (LLM-as-a-Judge)

זוהי הקפיצה הטכנולוגית האמיתית. אנחנו משתמשים ב-LLM חזק (כמו GPT-4o) כדי לשפוט את הביצועים של ה-LLM שלנו.

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

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

איך בונים את "סט הזהב" (Golden Set) כשאין נתונים?

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

הפתרון הוא יצירתיות ושימוש ב-AI כדי לייצר AI. הנה שלוש דרכים לבנות את סט הבדיקות הראשון שלכם:

1. ייצור דאטה סינתטי (Synthetic Data Generation – SDG)

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

התהליך הוא כזה: לוקחים את בסיס הידע שלכם (למשל, מסמכי PDF של החברה), ומבקשים ממודל ליצור 50 זוגות של שאלות ותשובות (QA pairs) על בסיס הטקסט.

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

חשוב לעבור ידנית (Human in the loop) על מדגם מהשאלות האלו כדי לוודא שהן הגיוניות, אבל זה חוסך 90% מהעבודה.

2. שימוש ביומני פרודקשן (Production Logs)

אם המערכת כבר באוויר, הזהב נמצא בלוגים. שלפו 100 שיחות אמיתיות אחרונות.

סווגו אותן לנושאים.

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

3. בדיקות קצה (Edge Cases)

אל תבדקו רק את המקרים הקלים ("מה שעות הפתיחה?"). כתבו מקרים שמיועדים לשבור את המערכת.

הזרקת פרומפט (Prompt Injection): נסו לשכנע את המודל להתעלם מההוראות שלו.

שאלות לא רלוונטיות: "מי ראש הממשלה?" (לבוט של חנות נעליים).

שפה פוגענית: ודאו שהמודל מגיב בצורה דיפלומטית ולא נגרר.

צלילה לעומק: מדידת מערכות RAG

רוב האפליקציות העסקיות כיום מבוססות על RAG (Retrieval-Augmented Generation). במערכות אלו, האתגר כפול: אנחנו צריכים לבדוק גם את איכות השליפה (Retrieval) וגם את איכות התשובה (Generation).

פריימוורק פופולרי בשם RAGAS (RAG Assessment) מגדיר את המדדים החשובים ביותר למערכות אלו. כאן אילון אוריאל נכנס לתמונה עם דגש חשוב: אל תסתכלו רק על התשובה הסופית, תפרקו את הצינור לחלקים.

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

רלוונטיות הקשר (Context Relevance): האם המסמכים שהמערכת שלפה בכלל קשורים לשאלה? אם המשתמש שאל על "מחיר" והמערכת שלפה מסמך על "מדיניות פרטיות", רכיב השליפה (Retriever) שלכם כושל, עוד לפני שהמודל יצר תשובה.

דיוק התשובה (Answer Correctness): האם התשובה הסופית תואמת את האמת (Ground Truth)?

כשאנחנו מבודדים את המדדים האלו, אנחנו יכולים לדעת בדיוק איפה הבעיה. אם ה-Faithfulness גבוה אבל ה-Context Relevance נמוך, הבעיה היא באלגוריתם החיפוש, לא בפרומפט של המודל.

איך מקימים את השופט האוטומטי (LLM-as-a-Judge)?

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

פרומפט השופט

הפרומפט חייב להיות מפורט ביותר. עליו לכלול סולם ציונים ברור (Rubric).

לדוגמה:

"דרג את התשובה מ-1 עד 5.

1 – תשובה שגויה לחלוטין או מסוכנת.

2 – תשובה חלקית עם טעויות משמעותיות.

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

4 – תשובה טובה ומדויקת.

5 – תשובה מצוינת, מקיפה, ובטון המתאים."

דרישת הסבר (Chain of Thought)

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

בחירת המודל השופט

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

אם אתם בודקים מודל קטן ומהיר (כמו GPT-4o-mini או Haiku), השופט צריך להיות מודל כבד (כמו GPT-4o או Sonnet 3.5).

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

הטיית השופט (Judge Bias)

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

אינטגרציה: להפוך את ה-Eval לחלק מה-CI/CD

מערך Eval שלא רץ באופן אוטומטי הוא חסר ערך. המטרה היא להגיע למצב שבו מפתח לא יכול לעשות "Merge" לקוד חדש או לפרומפט חדש, אם הציון הממוצע של ה-Eval ירד.

תהליך העבודה האידיאלי נראה כך:

שינוי: המפתח משנה את ה-System Prompt כדי להיות "יותר אמפתי".

הרצה מקומית: המפתח מריץ סקריפט קטן שבודק 10-20 דוגמאות מייצגות (Smoke Test).

Push: המפתח דוחף את הקוד ל-GitHub.

אוטומציה: מערכת ה-CI (כמו GitHub Actions) מריצה באופן אוטומטי את סט הבדיקות המלא (למשל, 200 דוגמאות) בלילה או בעת יצירת Pull Request.

דוח: המערכת מפיקה דוח: "האמפתיה עלתה ב-10%, אבל הדיוק העובדתי ירד ב-5%".

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

קיימים היום כלים מעולים בשוק שמקלים על התהליך הזה, כמו DeepEval, Promptfoo, ו-Arize Phoenix. הכלים הללו מתממשקים לקוד שלכם ומספקים דשבורדים ויזואליים של תוצאות הבדיקות. אני אישית מאוד מחבב את Promptfoo בשל הפשטות שלו והיותו מבוסס קונפיגורציה, מה שמאפשר לנהל את הבדיקות כקוד (Tests as Code).

שאלות ותשובות (FAQ) בנושא בניית מערך Eval

שאלה: כמה דוגמאות צריך בסט הבדיקות?

תשובה: אין מספר קסם, אבל החוק הסטטיסטי עובד גם כאן. לבדיקה מהירה (בזמן פיתוח) הייתי ממליץ על כ-20 עד 50 דוגמאות מגוונות. לבדיקת רגרסיה מלאה לפני שחרור גרסה, מומלץ להגיע ל-100-200 דוגמאות. מעבר לזה, העלויות מתחילות לעלות והתועלת השולית יורדת (Diminishing Returns), אלא אם כן המערכת שלכם מורכבת במיוחד.

שאלה: האם אפשר לסמוך על LLM שישפוט LLM אחר? זה לא הופך את זה למעגלי?

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

שאלה: איך מתמודדים עם העלויות של הבדיקות?

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

שאלה: מה עושים כשהמודל יצירתי והתשובה משתנה בכל הרצה?

תשובה: בבדיקות, מומלץ לקבע את ה-Temperature ל-0. זה הופך את המודל ליותר דטרמיניסטי. אם האפליקציה דורשת יצירתיות גבוהה (למשל, כתיבת שירים), המדדים לא צריכים להיות השוואה מדויקת לטקסט (Exact Match), אלא בדיקת סגנון, חריזה ומבנה באמצעות שופט LLM.

סיכום פרקטי: מאיפה מתחילים מחר בבוקר?

בניית מערך Eval היא לא פרויקט חד פעמי, אלא תרבות ארגונית. זה המעבר מחובבנות למקצוענות בפיתוח AI.

ההמלצה שלי לצעדים מיידיים:

התחילו בקטן: אל תנסו לבנות את המערכת המושלמת ביום הראשון. צרו קובץ CSV עם 10 שאלות ותשובות מצופות.

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

הוסיפו שופט: שלבו קריאה ל-LLM נוסף שנותן ציון (Pass/Fail) לכל זוג תשובות.

מדדו לאורך זמן: שמרו את התוצאות והתחילו לעקוב אחרי המגמה.

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