تقييم نماذج اللغات الكبيرة باستخدام MLflow: دليل عملي

يُعدّ MLflow منصة قوية مفتوحة المصدر لإدارة دورة حياة تعلم الآلة. بينما يُستخدم تقليديًا لتتبع تجارب النماذج، وتسجيل المعلمات، وإدارة عمليات النشر، فقد أضاف MLflow مؤخرًا دعمًا لتقييم نماذج اللغات الكبيرة (LLMs). في هذا البرنامج التعليمي، سنستكشف كيفية استخدام MLflow لتقييم أداء نموذج لغة كبير – في حالتنا، نموذج Gemini من جوجل – على مجموعة من الأسئلة القائمة على الحقائق.

1. إعداد بيئة العمل:

  • المكتبات اللازمة: سنستخدم واجهات برمجة التطبيقات (APIs) الخاصة بـ OpenAI و Gemini. تعتمد مقاييس تقييم الذكاء الاصطناعي التوليدي المُدمجة في MLflow حاليًا على نماذج OpenAI (مثل GPT-4) للقيام بدور الحكم في مقاييس مثل تشابه الإجابات أو الدقة، لذلك يلزم وجود مفتاح API لـ OpenAI.
  • تركيب المكتبات: استخدم الأمر التالي لتركيب المكتبات اللازمة:
    pip install mlflow openai pandas google-genai
  • تعيين مفاتيح API: قم بتعيين مفاتيح API الخاصة بـ OpenAI و Google كمتغيرات بيئية:
    import os
    from getpass import getpass
    os.environ["OPENAI_API_KEY"] = getpass('أدخل مفتاح API الخاص بـ OpenAI:')
    os.environ["GOOGLE_API_KEY"] = getpass('أدخل مفتاح API الخاص بـ Google:')

2. إعداد بيانات التقييم والحصول على النتائج من Gemini:

  • إنشاء بيانات التقييم: سنُحدد مجموعة بيانات تقييم صغيرة تحتوي على أسئلة قائمة على الحقائق بالإضافة إلى إجاباتها الصحيحة. تغطي هذه الأسئلة مواضيع مثل العلوم، والصحة، وتطوير الويب، والبرمجة. يسمح لنا هذا التنسيق المُنسّق بمقارنة إجابات Gemini المُولدة بشكل موضوعي مع الإجابات الصحيحة المعروفة باستخدام مقاييس تقييم متنوعة في MLflow.
import mlflow
import openai
import os
import pandas as pd
from google import genai

eval_data = pd.DataFrame({
    "inputs": [
        "من الذي طور نظرية النسبية العامة؟",
        "ما هي الوظائف الرئيسية للكبد في جسم الإنسان؟",
        "اشرح ماذا تعني حالة HTTP 404.",
        "ما هي درجة غليان الماء عند مستوى سطح البحر بالدرجات المئوية؟",
        "أذكر أكبر كوكب في نظامنا الشمسي.",
        "ما هي لغة البرمجة المستخدمة بشكل أساسي في تطوير تطبيقات iOS؟",
    ],
    "ground_truth": [
        "ألبرت أينشتاين هو من طور نظرية النسبية العامة.",
        "يساعد الكبد في إزالة السموم، وتخليق البروتينات، وإنتاج المواد الكيميائية الحيوية اللازمة للهضم.",
        "HTTP 404 تعني 'غير موجود' - الخادم لا يستطيع العثور على المورد المطلوب.",
        "درجة غليان الماء عند مستوى سطح البحر هي 100 درجة مئوية.",
        "المشتري هو أكبر كوكب في نظامنا الشمسي.",
        "Swift هي لغة البرمجة الرئيسية المستخدمة لتطوير تطبيقات iOS."
    ]
})
  • الحصول على إجابات Gemini: تُعرّف هذه القطعة من التعليمات البرمجي دالة مساعدة gemini_completion() ترسل سؤالاً إلى نموذج Gemini 1.5 Flash باستخدام مجموعة أدوات Google Generative AI وتعيد الإجابة المُولدة كنص عادي. ثم نطبق هذه الدالة على كل سؤال في مجموعة بيانات التقييم لدينا لتوليد تنبؤات النموذج، ونخزنها في عمود جديد “predictions”. سيتم تقييم هذه التنبؤات لاحقًا مقابل الإجابات الصحيحة.
client = genai.Client()

def gemini_completion(prompt: str) -> str:
    response = client.models.generate_content(model="gemini-1.5-flash", contents=prompt)
    return response.text.strip()

eval_data["predictions"] = eval_data["inputs"].apply(gemini_completion)

3. تقييم نتائج Gemini باستخدام MLflow:

  • بدء عملية التقييم: في هذه الخطوة، نبدأ تشغيل MLflow لتقييم الإجابات التي تم توليدها بواسطة نموذج Gemini مقابل مجموعة من الإجابات الصحيحة. نستخدم طريقة mlflow.evaluate() مع أربعة مقاييس خفيفة الوزن: answer_similarity (قياس التشابه الدلالي بين مخرجات النموذج والحقيقة الأرضية)، و exact_match (التحقق من تطابق الكلمات حرفيًا)، و latency (تتبع وقت توليد الإجابة)، و token_count (تسجيل عدد الرموز الصادرة). من المهم ملاحظة أن مقياس answer_similarity يستخدم داخليًا نموذج GPT من OpenAI للحكم على القرب الدلالي بين الإجابات، وهذا هو السبب في الحاجة إلى الوصول إلى واجهة برمجة تطبيقات OpenAI. يوفر هذا الإعداد طريقة فعالة لتقييم مخرجات نماذج اللغات الكبيرة دون الاعتماد على منطق تقييم مخصص. يتم طباعة نتائج التقييم النهائية، كما يتم حفظها في ملف CSV للفحص أو التصور لاحقًا.
mlflow.set_tracking_uri("mlruns")
mlflow.set_experiment("Gemini Simple Metrics Eval")
with mlflow.start_run():
    results = mlflow.evaluate(
        model_type="question-answering",
        data=eval_data,
        predictions="predictions",
        targets="ground_truth",
        extra_metrics=[
            mlflow.metrics.genai.answer_similarity(),
            mlflow.metrics.exact_match(),
            mlflow.metrics.latency(),
            mlflow.metrics.token_count()
        ]
    )
    print("المقاييس المجمعة:")
    print(results.metrics)
    results.tables["eval_results_table"].to_csv("gemini_eval_results.csv", index=False)
  • عرض النتائج التفصيلية: لقراءة النتائج التفصيلية لتقييمنا، نقوم بتحميل ملف CSV المحفوظ إلى DataFrame ونعدل إعدادات العرض لضمان الرؤية الكاملة لكل إجابة. يسمح لنا هذا بفحص الأسئلة الفردية، والتنبؤات التي تم توليدها بواسطة Gemini، والإجابات الصحيحة، والدرجات المرتبطة بالمقياس دون اقتطاع، وهو أمر مفيد بشكل خاص في بيئات دفتر الملاحظات مثل Colab أو Jupyter.
results = pd.read_csv('gemini_eval_results.csv')
pd.set_option('display.max_colwidth', None)
print(results)

ملاحظة: جميع حقوق هذا البحث تعود إلى باحثي هذا المشروع. يرجى مراجعة الرمز الكامل في [رابط الرمز هنا].

المصدر: MarkTechPost