הערכה של מערכות RAG באמצעות Vertex AI

1. סקירה כללית

בשיעור ה-Lab הזה תלמדו איך ליצור צינור עיבוד נתונים להערכה של מערכת Retrieval-Augmented Generation‏ (RAG). תשתמשו בשירות ההערכה של AI גנרטיבי ב-Vertex AI כדי ליצור קריטריוני הערכה בהתאמה אישית ולבנות מסגרת להערכה של משימה של מענה על שאלות.

תעבדו עם דוגמאות מתוך Stanford Question Answering Dataset (SQuAD 2.0) כדי להכין מערכי נתונים להערכה, להגדיר הערכות ללא הפניה והערכות מבוססות-הפניה ולפרש את התוצאות. בסיום המעבדה הזו, תבינו איך להעריך מערכות RAG ולמה בוחרים בגישות הערכה מסוימות.

הבסיס של מערך הנתונים

אנחנו נשתמש בדוגמאות שנבחרו בקפידה ומכסות תחומים רבים מתוך מערך הנתונים של SQuAD 2.0 לשאלות ותשובות:

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

המגוון הזה עוזר לכם להבין איך גישות ההערכה מתאימות לתחומים שונים.

קובצי עזר

מה תלמדו

בשיעור ה-Lab הזה תלמדו איך לבצע את המשימות הבאות:

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

2. הגדרת הפרויקט

חשבון Google

אם אין לכם חשבון Google אישי, אתם צריכים ליצור חשבון Google.

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

כניסה למסוף Google Cloud

נכנסים למסוף Google Cloud באמצעות חשבון Google אישי.

הפעלת חיוב

מימוש קרדיטים בשווי 5 $ל-Google Cloud (אופציונלי)

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

  1. לוחצים על הקישור הזה ונכנסים לחשבון Google אישי. יוצג לכם משהו כזה: כאן אפשר ללחוץ כדי לעבור לדף הקרדיטים
  2. לוחצים על הלחצן כאן אפשר לגשת לזיכויים. הפעולה הזו תעביר אתכם לדף להגדרת פרופיל החיוב הגדרת דף פרופיל החיוב
  3. לוחצים על אישור. עכשיו אתם מחוברים לחשבון לחיוב ב-Google Cloud Platform לניסיון. צילום מסך של סקירה כללית של החיוב

הגדרה של חשבון לחיוב לשימוש אישי

אם הגדרתם חיוב באמצעות קרדיטים של Google Cloud, אתם יכולים לדלג על השלב הזה.

כדי להגדיר חשבון לחיוב לשימוש אישי, עוברים לכאן כדי להפעיל את החיוב ב-Cloud Console.

טיפים ממשתמשים:

  • העלות של השלמת ה-Lab הזה במשאבי Cloud צריכה להיות פחות מ-1$.
  • כדי למחוק משאבים ולמנוע חיובים נוספים, אפשר לבצע את השלבים בסוף ה-Lab הזה.
  • משתמשים חדשים זכאים לתקופת ניסיון בחינם בשווי 300$.

יצירת פרויקט (אופציונלי)

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

3. מה זה Retrieval Augmented Generation (יצירה משולבת-אחזור, RAG)?

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

התהליך כולל את השלבים הבאים:

  1. המרת השאלה של המשתמש לייצוג מספרי (embedding).
  2. חיפוש בבסיס הידע מסמכים עם הטמעות דומות.
  3. המסמכים הרלוונטיים האלה מסופקים כהקשר למודל שפה גדול (LLM) יחד עם השאלה המקורית, כדי ליצור תשובה.

RAG

מה הופך את ההערכה של RAG למורכבת?

הערכת מערכות RAG שונה מהערכה של מודלים מסורתיים של שפה.

האתגר של מערכות מרובות רכיבים: מערכות RAG משלבות שלוש פעולות, שכל אחת מהן יכולה להיות נקודת כשל:

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

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

4. הגדרת הסביבה של Vertex AI Workbench

נתחיל בהפעלת סביבת מחברת חדשה שבה נריץ את הקוד שנדרש להערכת מערכות RAG.

  1. נכנסים אל הדף APIs & Services במסוף Cloud.
  2. לוחצים על הפעלה ליד Vertex AI API.מרכז הבקרה של Vertex

גישה אל Vertex AI Workbench

  1. במסוף Google Cloud, עוברים אל Vertex AI על ידי לחיצה על תפריט הניווט ☰ > Vertex AI > Workbench.
  2. יוצרים מכונת וירטואלית חדשה של סביבת עבודה.יצירת Workbench
  3. נותנים למכונה של Workbench את השם evaluation-workbench.
  4. בוחרים את האזור והאזור המשני אם הערכים האלה עדיין לא הוגדרו.
  5. לוחצים על יצירה.שם שולחן העבודה
  6. מחכים עד שהסביבה תוגדר. הפעולה עשויה להימשך כמה דקות.המתנה ל-Workbench
  7. אחרי שה-Workbench מוקצה, לוחצים על open jupyterlab.פתיחת שולחן העבודה
  8. ב-Workbench, יוצרים מחברת Python3 חדשה.יצירת notebook

מידע נוסף על התכונות והיכולות של הסביבה הזו זמין בתיעוד הרשמי של Vertex AI Workbench.

התקנה של Vertex AI evaluation SDK

עכשיו נתקין את ה-SDK המיוחד לבדיקה, שמספק את הכלים לבדיקת RAG.

  1. בתא הראשון של המחברת, מוסיפים ומריצים את הצהרת הייבוא שלמטה (SHIFT+ENTER) כדי להתקין את Vertex AI SDK (עם רכיבי ההערכה).
    %pip install --upgrade --user --quiet google-cloud-aiplatform[evaluation]
    
    הפקודה הזו מתקינה את Vertex AI SDK עם תוספי הערכה שכוללים:
    • EvalTask: המחלקה הראשית להרצת הערכות
    • MetricPromptTemplateExamples: מדדי הערכה מוגדרים מראש
    • PointwiseMetric: מסגרת ליצירת מדדים מותאמים אישית
    • notebook_utils: כלי ויזואליזציה לניתוח תוצאות
  2. חשוב: אחרי ההתקנה, תצטרכו להפעיל מחדש את ליבת המערכת כדי להשתמש בחבילות החדשות. בסרגל התפריטים בחלק העליון של חלון JupyterLab, עוברים אל Kernel > Restart Kernel.

5. אתחול ה-SDK וייבוא ספריות

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

  1. מגדירים את משתני ההגדרה למשימת הבדיקה. בתא חדש, מוסיפים ומריצים את הקוד הבא כדי להגדיר את PROJECT_ID, LOCATION ואת השם EXPERIMENT כדי לארגן את ההרצה הזו.
    import vertexai
    
    PROJECT_ID = "YOUR PROJECT ID"
    LOCATION = "YOUR LOCATION"  # @param {type:"string"}
    EXPERIMENT = "rag-eval-01"  # @param {type:"string"}
    
    if not PROJECT_ID or PROJECT_ID == "[your-project-id]":
        raise ValueError("Please set your PROJECT_ID")
    
  2. מאחלים את Vertex AI SDK. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו.
    vertexai.init(project=PROJECT_ID, location=LOCATION)
    
    בשלב הזה מתבצע אימות של מחברת ה-Notebook וחיבור שלה לפרויקט ב-Google Cloud.
  3. מייבאים את המחלקות הנדרשות מ-SDK ההערכה על ידי הפעלת הקוד הבא בתא הבא:
    import pandas as pd
    from vertexai.evaluation import EvalTask, MetricPromptTemplateExamples, PointwiseMetric
    from vertexai.preview.evaluation import notebook_utils
    
    סיכום של כל ייבוא:
    • pandas: ליצירה ולניהול של נתונים ב-DataFrames.
    • EvalTask: המחלקה המרכזית שמריצה עבודת הערכה.
    • MetricPromptTemplateExamples: מאפשר גישה למדדי ההערכה המוגדרים מראש של Google.
    • PointwiseMetric: המסגרת ליצירת מדדים מותאמים אישית משלכם.
    • notebook_utils: אוסף של כלים להצגת התוצאות.

6. הכנת מערך נתונים להערכה

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

  • פרומפט: הקלט הכולל שסופק למודל השפה. אתם צריכים לשלב את השאלה של המשתמש עם ההקשר שאוחזר על ידי מערכת ה-RAG שלכם (prompt = User Question + Retrieved Context). זה חשוב כדי ששירות ההערכה יידע באיזה מידע המודל השתמש כדי ליצור את התשובה.
  • תשובה: זו התשובה הסופית שנוצרה על ידי מודל ה-RAG.

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

עכשיו ניצור את מערכי הנתונים. תתחילו עם רשימת שאלות והתשובות שלהן מתוך מערכת RAG.retrieved_contexts לאחר מכן, מגדירים שתי קבוצות של תשובות: אחת ממודל שנראה שמניב ביצועים טובים (generated_answers_by_rag_a) ואחת ממודל שמניב ביצועים גרועים (generated_answers_by_rag_b).

לבסוף, תשלבו את החלקים האלה בשני pandas DataFrames, ‏ eval_dataset_rag_a ו-eval_dataset_rag_b, לפי המבנה שמתואר למעלה.

  1. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי להגדיר את השאלות ואת שתי קבוצות התשובות שנוצרו.
    questions = [
        "Which part of the brain does short-term memory seem to rely on?",
        "What provided the Roman senate with exuberance?",
        "What area did the Hasan-jalalians command?",
    ]
    
    generated_answers_by_rag_a = [
        "frontal lobe and the parietal lobe",
        "The Roman Senate was filled with exuberance due to successes against Catiline.",
        "The Hasan-Jalalians commanded the area of Syunik and Vayots Dzor.",
    ]
    
    generated_answers_by_rag_b = [
        "Occipital lobe",
        "The Roman Senate was subdued because they had food poisoning.",
        "The Galactic Empire commanded the state of Utah.",
    ]
    
    ההגדרה הזו מגדירה את רכיבי הליבה של מערך הנתונים: השאלות, קטעי ההקשר הארוכים שאוחזרו על ידי מערכת RAG לכל שאלה והתשובות שנוצרו על ידי שני מודלים שונים (מודל A עם ביצועים גבוהים ומודל B עם ביצועים נמוכים).
  2. מגדירים את הערך של retrieved_contexts. מוסיפים את הקוד הבא לתא חדש ומריצים אותו.
    retrieved_contexts = [
        "Short-term memory is supported by transient patterns of neuronal communication, dependent on regions of the frontal lobe (especially dorsolateral prefrontal cortex) and the parietal lobe. Long-term memory, on the other hand, is maintained by more stable and permanent changes in neural connections widely spread throughout the brain. The hippocampus is essential (for learning new information) to the consolidation of information from short-term to long-term memory, although it does not seem to store information itself. Without the hippocampus, new memories are unable to be stored into long-term memory, as learned from patient Henry Molaison after removal of both his hippocampi, and there will be a very short attention span. Furthermore, it may be involved in changing neural connections for a period of three months or more after the initial learning.",
        "In 62 BC, Pompey returned victorious from Asia. The Senate, elated by its successes against Catiline, refused to ratify the arrangements that Pompey had made. Pompey, in effect, became powerless. Thus, when Julius Caesar returned from a governorship in Spain in 61 BC, he found it easy to make an arrangement with Pompey. Caesar and Pompey, along with Crassus, established a private agreement, now known as the First Triumvirate. Under the agreement, Pompey's arrangements would be ratified. Caesar would be elected consul in 59 BC, and would then serve as governor of Gaul for five years. Crassus was promised a future consulship.",
        "The Seljuk Empire soon started to collapse. In the early 12th century, Armenian princes of the Zakarid noble family drove out the Seljuk Turks and established a semi-independent Armenian principality in Northern and Eastern Armenia, known as Zakarid Armenia, which lasted under the patronage of the Georgian Kingdom. The noble family of Orbelians shared control with the Zakarids in various parts of the country, especially in Syunik and Vayots Dzor, while the Armenian family of Hasan-Jalalians controlled provinces of Artsakh and Utik as the Kingdom of Artsakh.",
    ]
    
    עכשיו, אחרי שיש לכם את כל הרכיבים הגולמיים, אתם יכולים לשלב אותם ב-DataFrames מובנים של pandas שנדרשים לשירות ההערכה.
  3. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי ליצור את eval_dataset_rag_a ואת eval_dataset_rag_b.
    eval_dataset_rag_a = pd.DataFrame(
        {
        "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
        ],
        "response": generated_answers_by_rag_a,
        }
    )
    
    eval_dataset_rag_b = pd.DataFrame(
        {
        "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
        ],
        "response": generated_answers_by_rag_b,
        }
    )
    
  4. מריצים את הקוד הבא בתא חדש כדי לראות את השורות הראשונות של מערך הנתונים של מודל א'.
    eval_dataset_rag_a
    
    מומלץ לעשות את זה כדי לוודא שהחשבון נוצר בצורה נכונה.

7. בחירה ויצירה של מדדים

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

אפשר להשתמש בשילוב של שני סוגי מדדים:

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

בקטע הזה נסביר על המדדים המוגדרים מראש שזמינים ל-RAG.

עיון במדדים שהוגדרו מראש

ה-SDK כולל כמה מדדים מובנים להערכת מערכות למענה על שאלות. המדדים האלה משתמשים במודל שפה כ'מעריך' כדי לתת ציון לתשובות של המודל שלכם על סמך קבוצת הוראות.

  1. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי לראות את הרשימה המלאה של שמות המדדים המוגדרים מראש:
    MetricPromptTemplateExamples.list_example_metric_names()
    
    הפלט הוא רשימה של מדדים זמינים שאפשר להשתמש בהם ללא שינוי.
  2. כדי להבין איך המדדים האלה פועלים, אפשר לבדוק את תבניות ההנחיות הבסיסיות שלהם. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי לראות את ההוראות שניתנו למודל שפה גדול (LLM) של המעריך עבור המדד question_answering_quality.
    # See the prompt example for one of the pointwise metrics
    print(MetricPromptTemplateExamples.get_prompt_template("question_answering_quality"))
    

8. יצירת מדדים מותאמים אישית

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

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

  1. הגדרת תבנית ההנחיה: מחרוזת שמכילה את ההוראות שלכם ל-LLM של המעריך. תבנית טובה כוללת תפקיד ברור, קריטריוני הערכה, קריטריון הערכה עם ניקוד ומשתני placeholder כמו {prompt} ו-{response}.
  2. יצירת מופע של אובייקט PointwiseMetric: עוטפים את מחרוזת תבנית ההנחיה בתוך המחלקה הזו ונותנים שם למדד.

תצרו שני מדדים מותאמים אישית כדי להעריך את הרלוונטיות והתועלת של התשובות של מערכת RAG.

  1. מגדירים את תבנית ההנחיה למדד הרלוונטיות. התבנית הזו מספקת קריטריון מפורט למודל ה-LLM של המעריך. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו:
    relevance_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing relevance, which measures the ability to respond with relevant information when given a prompt.
    
    You will assign the writing response a score from 5, 4, 3, 2, 1, following the rating rubric and evaluation steps.
    
    ## Criteria
    Relevance: The response should be relevant to the instruction and directly address the instruction.
    
    ## Rating Rubric
    5 (completely relevant): Response is entirely relevant to the instruction and provides clearly defined information that addresses the instruction's core needs directly.
    4 (mostly relevant): Response is mostly relevant to the instruction and addresses the instruction mostly directly.
    3 (somewhat relevant): Response is somewhat relevant to the instruction and may address the instruction indirectly, but could be more relevant and more direct.
    2 (somewhat irrelevant): Response is minimally relevant to the instruction and does not address the instruction directly.
    1 (irrelevant): Response is completely irrelevant to the instruction.
    
    ## Evaluation Steps
    STEP 1: Assess relevance: is response relevant to the instruction and directly address the instruction?
    STEP 2: Score based on the criteria and rubrics.
    
    Give step by step explanations for your scoring, and only choose scores from 5, 4, 3, 2, 1.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## AI-generated Response
    {response}
    """
    
    
  2. מגדירים את תבנית ההנחיה למדד התועלת באותה הדרך. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    helpfulness_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing helpfulness, which measures the ability to provide important details when answering a prompt.
    
    You will assign the writing response a score from 5, 4, 3, 2, 1, following the rating rubric and evaluation steps.
    
    ## Criteria
    Helpfulness: The response is comprehensive with well-defined key details. The user would feel very satisfied with the content in a good response.
    
    ## Rating Rubric
    5 (completely helpful): Response is useful and very comprehensive with well-defined key details to address the needs in the instruction and usually beyond what explicitly asked. The user would feel very satisfied with the content in the response.
    4 (mostly helpful): Response is very relevant to the instruction, providing clearly defined information that addresses the instruction's core needs.  It may include additional insights that go slightly beyond the immediate instruction.  The user would feel quite satisfied with the content in the response.
    3 (somewhat helpful): Response is relevant to the instruction and provides some useful content, but could be more relevant, well-defined, comprehensive, and/or detailed. The user would feel somewhat satisfied with the content in the response.
    2 (somewhat unhelpful): Response is minimally relevant to the instruction and may provide some vaguely useful information, but it lacks clarity and detail. It might contain minor inaccuracies. The user would feel only slightly satisfied with the content in the response.
    1 (unhelpful): Response is useless/irrelevant, contains inaccurate/deceptive/misleading information, and/or contains harmful/offensive content. The user would feel not at all satisfied with the content in the response.
    
    ## Evaluation Steps
    STEP 1: Assess comprehensiveness: does the response provide specific, comprehensive, and clearly defined information for the user needs expressed in the instruction?
    STEP 2: Assess relevance: When appropriate for the instruction, does the response exceed the instruction by providing relevant details and related information to contextualize content and help the user better understand the response.
    STEP 3: Assess accuracy: Is the response free of inaccurate, deceptive, or misleading information?
    STEP 4: Assess safety: Is the response free of harmful or offensive content?
    
    Give step by step explanations for your scoring, and only choose scores from 5, 4, 3, 2, 1.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## AI-generated Response
    {response}
    """
    
  3. יוצרים מופעים של אובייקטים PointwiseMetric בשני המדדים המותאמים אישית. הפעולה הזו עוטפת את תבניות ההנחיות ברכיבים שאפשר לעשות בהם שימוש חוזר במשימת ההערכה. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    relevance = PointwiseMetric(
        metric="relevance",
        metric_prompt_template=relevance_prompt_template,
    )
    
    helpfulness = PointwiseMetric(
        metric="helpfulness",
        metric_prompt_template=helpfulness_prompt_template,
    )
    

עכשיו יש לכם שני מדדים חדשים לשימוש חוזר (relevance ו-helpfulness) שמוכנים למשימת ההערכה.

9. הפעלת משימת ההערכה

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

EvalTask מאגד את הרכיבים להרצת הערכה:

  • dataset: ה-DataFrame שמכיל את ההנחיות והתשובות.
  • metrics: רשימת המדדים שרוצים להשוות אליהם את הניקוד.
  • experiment: הניסוי ב-Vertex AI שאליו יתועדו התוצאות, כדי לעזור לכם לעקוב אחרי הרצות ולהשוות ביניהן.
  1. יוצרים EvalTask לכל מודל. האובייקט הזה כולל את מערך הנתונים, המדדים ושם הניסוי. מוסיפים את הקוד הבא לתא חדש ומריצים אותו כדי להגדיר את המשימות:
    rag_eval_task_rag_a = EvalTask(
        dataset=eval_dataset_rag_a,
        metrics=[
            "question_answering_quality",
            relevance,
            helpfulness,
            "groundedness",
            "safety",
            "instruction_following",
        ],
        experiment=EXPERIMENT,
    )
    
    rag_eval_task_rag_b = EvalTask(
        dataset=eval_dataset_rag_b,
        metrics=[
            "question_answering_quality",
            relevance,
            helpfulness,
            "groundedness",
            "safety",
            "instruction_following",
        ],
        experiment=EXPERIMENT,
    )
    
    הגדרתם שני אובייקטים מסוג EvalTask, אחד לכל קבוצה של תשובות מודל. metrics הרשימה שסיפקתם מדגימה תכונה מרכזית של שירות ההערכה: מדדים מוגדרים מראש (למשל safety) ואובייקטים מותאמים אישית PointwiseMetric.
  2. אחרי שמגדירים את המשימות, מריצים אותן באמצעות הקריאה ל-method‏ .evaluate(). המשימות נשלחות לעיבוד בקצה העורפי של Vertex AI, והתהליך עשוי להימשך כמה דקות. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו:
    result_rag_a = rag_eval_task_rag_a.evaluate()
    result_rag_b = rag_eval_task_rag_b.evaluate()
    

אחרי שההערכה תושלם, התוצאות יישמרו באובייקטים result_rag_a ו-result_rag_b, ויהיו מוכנות לניתוח בקטע הבא.

10. ניתוח התוצאות

תוצאות הבדיקה זמינות עכשיו. האובייקטים result_rag_a ו-result_rag_b מכילים ציונים נצברים והסברים מפורטים לכל שורה. במשימה הזו תנתחו את התוצאות האלה באמצעות פונקציות עזר מ-notebook_utils.

צפייה בסיכומים מצטברים

  1. כדי לקבל סקירה כללית ברמה גבוהה, אפשר להשתמש בפונקציית העזר display_eval_result() כדי לראות את הציון הממוצע של כל מדד. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי לראות את הסיכום של מודל א':
    notebook_utils.display_eval_result(
        title="Model A Eval Result", eval_result=result_rag_a
    )
    
  2. חוזרים על הפעולה עם מודל ב'. מוסיפים את הקוד הזה לתא חדש ומריצים אותו:
    notebook_utils.display_eval_result(
        title="Model B Eval Result",
        eval_result=result_rag_b,
    )
    

הצגה חזותית של תוצאות ההערכה

תרשימים יכולים להקל על השוואת הביצועים של המודלים. תשתמשו בשני סוגים של תרשימים:

  • תרשים רדאר: מציג את 'הצורה' של הביצועים הכוללים של כל מודל. צורה גדולה יותר מציינת ביצועים טובים יותר באופן כללי.
  • תרשים עמודות: להשוואה ישירה של כל מדד.

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

  1. כדי להתכונן לשרטוט, משלבים את התוצאות לרשימה אחת של טאפלים. כל טופל צריך להכיל שם של מודל ואת אובייקט התוצאה המתאים. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו:
    eval_results = []
    eval_results.append(("Model A", result_rag_a))
    eval_results.append(("Model B", result_rag_b))
    
  2. עכשיו, יוצרים תרשים רדאר כדי להשוות בין המודלים בכל המדדים בבת אחת. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    notebook_utils.display_radar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    צורה גדולה יותר מציינת ביצועים טובים יותר באופן כללי.
  3. כדי לבצע השוואה ישירה יותר של כל מדד, יוצרים תרשים עמודות. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו:
    notebook_utils.display_bar_plot(
        eval_results,
        metrics=[
        "question_answering_quality",
        "safety",
        "groundedness",
        "instruction_following",
        "relevance",
        "helpfulness",
        ],
    )
    
    התצוגה החזותית הזו מאפשרת לראות בקלות את פער הביצועים בין שני המודלים.

מהתצוגות החזותיות אפשר לראות בבירור שהביצועים של מודל א' (הצורה הגדולה בתרשים הרדאר והעמודות הגבוהות בתרשים העמודות) טובים יותר מהביצועים של מודל ב'.

הצגת הסבר מפורט לגבי מכונה ספציפית

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

  1. הפונקציה display_explanations() helper מאפשרת לבדוק תוצאות ספציפיות. כדי לראות את הפירוט של הדוגמה השנייה (num=2) מתוצאות מודל א', מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    notebook_utils.display_explanations(result_rag_a, num=2)
    
  2. אפשר גם להשתמש בפונקציה הזו כדי לסנן מדד ספציפי בכל הדוגמאות. האפשרות הזו שימושית לניפוי באגים באזור ספציפי שבו הביצועים נמוכים. כדי להבין למה הביצועים של מודל ב' במדד groundedness היו כל כך נמוכים, מוסיפים את הקוד הזה לתא חדש ומריצים אותו:
    notebook_utils.display_explanations(result_rag_b, metrics=["groundedness"])
    
    המשוב הזה ספציפי ומצביע על נקודות החולשה של המודל, וזה קריטי לשיפור איטרטיבי.

11. הערכה בהתייחסות ל'תשובה מושלמת'

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

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

  • נכונות עובדתית: האם התשובה של המודל תואמת לעובדות בתשובה המושלמת?
  • דמיון סמנטי: האם התשובה של המודל זהה לתשובה המוזהבת?
  • שלמות: האם התשובה של המודל מכילה את כל המידע העיקרי מהתשובה המושלמת?

הכנת מערך הנתונים שאליו מתייחסים

כדי לבצע הערכה בהשוואה לתשובה, צריך להוסיף 'תשובה לדוגמה' לכל דוגמה במערך הנתונים.

נתחיל בהגדרה של golden_answers רשימה. השוואה בין התשובות המושלמות לבין התשובות של מודל א' ממחישה את הערך של השיטה הזו:

  • שאלה 1 (מוח): התשובה שנוצרה והתשובה הנכונה זהות. מודל א' נכון.
  • שאלה 2 (סנאט): התשובות דומות מבחינה סמנטית אבל מנוסחות בצורה שונה. מדד טוב צריך לזהות את זה.
  • שאלה 3 (Hasan-Jalalians): התשובה של מודל א' שגויה מבחינה עובדתית בהתאם להקשר. השגיאה הזו מוצגת בgolden_answer.
  1. בתא חדש, מגדירים את רשימת התשובות המדויקות (golden_answers).
    golden_answers = [
        "frontal lobe and the parietal lobe",
        "Due to successes against Catiline.",
        "The Hasan-Jalalians commanded the area of Artsakh and Utik.",
    ]
    
  2. כדי ליצור את מסגרות הנתונים של ההערכה שאליהן יש הפניה, מריצים את הקוד הזה בתא הבא:
    referenced_eval_dataset_rag_a = pd.DataFrame(
        {
            "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
            ],
            "response": generated_answers_by_rag_a,
            "reference": golden_answers,
        }
    )
    
    referenced_eval_dataset_rag_b = pd.DataFrame(
        {
            "prompt": [
                "Answer the question: " + question + " Context: " + item
                for question, item in zip(questions, retrieved_contexts)
            ],
            "response": generated_answers_by_rag_b,
            "reference": golden_answers,
        }
    )
    
    הקוד הזה משלב את התשובות המדויקות עם המשתנים הקיימים שיצרתם קודם.

מערכי הנתונים מוכנים עכשיו להערכה עם הפניה.

יצירת מדד מותאם אישית עם הפניה

אפשר גם ליצור מדדים מותאמים אישית להערכה בהשוואה. התהליך דומה, אבל תבנית הפרומפט כוללת עכשיו את ה-placeholder‏ {reference} לתשובה המוזהבת.

אם יש תשובה חד-משמעית שמוגדרת כ'נכונה', אפשר להשתמש בשיטת ניקוד בינארית מחמירה יותר (לדוגמה, ‫1 אם התשובה נכונה, 0 אם התשובה שגויה) כדי למדוד את הדיוק העובדתי. בואו ניצור מדד חדש question_answering_correctness שמיישם את הלוגיקה הזו.

  1. מגדירים את תבנית ה-prompt. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו:
    question_answering_correctness_prompt_template = """
    You are a professional writing evaluator. Your job is to score writing responses according to pre-defined evaluation criteria.
    
    You will be assessing question answering correctness, which measures the ability to correctly answer a question.
    
    You will assign the writing response a score from 1, 0, following the rating rubric and evaluation steps.
    
    ### Criteria:
    Reference claim alignment: The response should contain all claims from the reference and should not contain claims that are not present in the reference.
    
    ### Rating Rubric:
    1 (correct): The response contains all claims from the reference and does not contain claims that are not present in the reference.
    0 (incorrect): The response does not contain all claims from the reference, or the response contains claims that are not present in the reference.
    
    ### Evaluation Steps:
    STEP 1: Assess the response' correctness by comparing with the reference according to the criteria.
    STEP 2: Score based on the rubrics.
    
    Give step by step explanations for your scoring, and only choose scores from 1, 0.
    
    
    # User Inputs and AI-generated Response
    ## User Inputs
    ### Prompt
    {prompt}
    
    ## Reference
    {reference}
    
    ## AI-generated Response
    {response}
    
    """
    
    התבנית הזו מנחה את מודל ה-LLM של המעריך לבצע השוואה מדויקת בין {response} של המודל לבין התשובה המושלמת {reference}, ולתת לה ציון של נכונה (1) או שגויה (0).
  2. עוטפים את מחרוזת תבנית ההנחיה באובייקט PointwiseMetric. כך המדד מקבל שם רשמי והופך לרכיב שאפשר לעשות בו שימוש חוזר במשימת ההערכה. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    question_answering_correctness = PointwiseMetric(
        metric="question_answering_correctness",
        metric_prompt_template=question_answering_correctness_prompt_template,
    )
    

עכשיו יש לכם מדד מותאם אישית עם הפניה לבדיקה עובדתית קפדנית.

12. הרצת ההערכה של ההפניה

עכשיו מגדירים את משימת ההערכה עם מערכי הנתונים שצוינו והמדד החדש. תשתמשו שוב בכיתה EvalTask.

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

  • exact_match: הציון הוא 1 רק אם התשובה שנוצרה זהה לתשובת ההפניה, אחרת הציון הוא 0.
  • bleu: מדד של דיוק. המדד הזה מודד כמה מילים מהתשובה שנוצרה מופיעות גם בתשובה לדוגמה.
  • rouge: מדד של היזכרות. המדד הזה מודד כמה מילים מתשובת ההפניה נכללות בתשובה שנוצרה.
  1. מגדירים את משימת ההערכה עם מערכי הנתונים שמופיעים בהפניה והשילוב החדש של מדדים. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי ליצור את האובייקטים EvalTask:
    referenced_answer_eval_task_rag_a = EvalTask(
        dataset=referenced_eval_dataset_rag_a,
        metrics=[
        question_answering_correctness,
        "rouge",
        "bleu",
        "exact_match",
        ],
        experiment=EXPERIMENT,
    )
    
    referenced_answer_eval_task_rag_b = EvalTask(
        dataset=referenced_eval_dataset_rag_b,
        metrics=[
        question_answering_correctness,
        "rouge",
        "bleu",
        "exact_match",
        ],
        experiment=EXPERIMENT,
    )
    
  2. מפעילים את ההערכה שאליה יש הפניה על ידי קריאה לשיטה .evaluate(). מוסיפים את הקוד הזה לתא חדש ומריצים אותו:
    referenced_result_rag_a = referenced_answer_eval_task_rag_a.evaluate()
    referenced_result_rag_b = referenced_answer_eval_task_rag_b.evaluate()
    

13. ניתוח התוצאות שמופיעות בהפניות

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

צפייה בסיכום התוצאות

  • מנתחים את תוצאות הסיכום של הבדיקה שאליה מתייחסים. בתא חדש, מוסיפים את הקוד הבא ומריצים אותו כדי להציג את טבלאות הסיכום של שני המודלים:
    notebook_utils.display_eval_result(
        title="Model A Eval Result",
        eval_result=referenced_result_rag_a,
    )
    notebook_utils.display_eval_result(
        title="Model B Eval Result",
        eval_result=referenced_result_rag_b,
    )
    
    אפשר לראות שהמודל א' השיג ביצועים טובים במדד המותאם אישית question_answering_correctness, אבל קיבל ציון נמוך יותר במדד exact_match. הדבר מדגיש את הערך של מדדים מבוססי-מודל שיכולים לזהות דמיון סמנטי, ולא רק טקסט זהה.

הצגה חזותית של התוצאות לצורך השוואה

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

  1. שילוב של תוצאות ההערכה שאליהן יש הפניה לרשימה אחת לשרטוט. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    referenced_eval_results = []
    referenced_eval_results.append(("Model A", referenced_result_rag_a))
    referenced_eval_results.append(("Model B", referenced_result_rag_b))
    
  2. ליצור תרשים רדאר כדי להציג באופן חזותי את הביצועים של כל מודל לפי קבוצת המדדים החדשה. מוסיפים את הקוד הזה לתא חדש ומריצים אותו:
    notebook_utils.display_radar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    
  3. יוצרים תרשים עמודות להשוואה ישירה זו לצד זו. כך תוכלו לראות את הביצועים של כל מודל במדדים השונים. מוסיפים את הקוד הבא לתא חדש ומריצים אותו:
    notebook_utils.display_bar_plot(
        referenced_eval_results,
        metrics=[
            "question_answering_correctness",
            "rouge",
            "bleu",
            "exact_match",
        ],
    )
    

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

14. מתרגול לייצור

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

שיטות מומלצות להפקה

כדי ליישם את הכישורים שנרכשו ב-Lab הזה בסביבת ייצור אמיתית, מומלץ להשתמש בארבע השיטות המומלצות הבאות:

  • אוטומציה באמצעות CI/CD: שילוב חבילת ההערכה בצינור עיבוד נתונים של CI/CD (לדוגמה, ‫Cloud Build, פעולות GitHub). הפעלת הערכות באופן אוטומטי בשינויים בקוד כדי לזהות רגרסיות ולחסום פריסות אם ציוני האיכות יורדים מתחת לסטנדרטים שהגדרתם.
  • פיתוח קבוצות הנתונים: קבוצת נתונים סטטית מתיישנת. כדאי להשתמש ב-Git LFS או ב-Cloud Storage כדי לשמור את הגרסאות של מערכי הבדיקה ה'מושלמים', ולהוסיף באופן רציף דוגמאות חדשות ומאתגרות על ידי דגימה של שאילתות משתמשים אמיתיות (אנונימיות).
  • חשוב לבדוק את כלי האחזור, ולא רק את הגנרטור: אי אפשר לקבל תשובה טובה בלי ההקשר הנכון. מטמיעים שלב הערכה נפרד למערכת האחזור באמצעות מדדים כמו שיעור הפגיעה (האם נמצא המסמך הנכון?) ודירוג הדדי ממוצע (MRR) (מה היה הדירוג של המסמך הנכון?).
  • מעקב אחרי מדדים לאורך זמן: אפשר לייצא את ציוני הסיכום מהרצות ההערכה לשירות כמו Google Cloud Monitoring. ליצור לוחות בקרה כדי לעקוב אחרי מגמות האיכות ולהגדיר התראות אוטומטיות כדי לקבל הודעה על ירידות משמעותיות בביצועים.

מטריצה של מתודולוגיית הערכה מתקדמת

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

גישת ההערכה

תרחישים לדוגמה

יתרונות עיקריים

מגבלות

ללא הפניה

מעקב אחר הייצור, הערכה מתמשכת

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

יקר יותר, עלול להיות הטיה מצד המעריך

מבוסס על הפניה

השוואה בין מודלים, השוואה לשוק

מדידה אובייקטיבית, חישוב מהיר יותר

נדרשות תשובות מושלמות, יכול להיות שלא תהיה התאמה סמנטית

מדדים מותאמים אישית

הערכה ספציפית לדומיין

מותאם לצרכים העסקיים

נדרש אימות, תקורה של פיתוח

גישה היברידית

מערכות ייצור מקיפות

הגישה הטובה ביותר

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

תובנות טכניות חשובות

חשוב לזכור את העקרונות הבסיסיים האלה כשמפתחים ומעריכים מערכות RAG משלכם:

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

מסגרת לקבלת החלטות לגבי פריסה בסביבת הייצור

השתמשו במסגרת השלבים הזו כמדריך לפריסות עתידיות של מערכות RAG:

  • שלב 1 – פיתוח: משתמשים בהערכה מבוססת-הפניה עם מערכי בדיקה ידועים להשוואה ולבחירה של מודלים.
  • שלב 2 – לפני ההשקה: מריצים הערכה מקיפה שמשלבת את שתי הגישות כדי לוודא שהאפליקציה מוכנה להשקה.
  • שלב 3 – הפקה: הטמעה של מעקב ללא הפניה להערכת איכות רציפה ללא תשובות מושלמות.
  • שלב 4 – אופטימיזציה: משתמשים בתובנות מההערכה כדי לשפר את המודל ואת מערכת האחזור.

15. סיכום

מעולה! השלמתם את ה-Lab.

שיעור ה-Lab הזה הוא חלק מתוכנית הלימודים בנושא AI מוכן לייצור באמצעות Google Cloud.

Recap

למדתם איך:

  • ביצוע הערכה ללא הפניה כדי להעריך את איכות התשובה על סמך ההקשר שאוחזר.
  • כדי למדוד את נכונות העובדות, אפשר להוסיף 'תשובה מושלמת' ולבצע הערכה עם הפניה.
  • בשתי הגישות, כדאי להשתמש בשילוב של מדדים שהוגדרו מראש ומדדים מותאמים אישית.
  • משתמשים גם במדדים מבוססי-מודל (כמו question_answering_quality) וגם במדדים מבוססי-חישוב (rouge, ‏ bleu, ‏ exact_match).
  • מנתחים את התוצאות ומציגים אותן באופן חזותי כדי להבין את נקודות החוזק והחולשה של המודל.

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