Phase 19: Capstone Projects

نموذج تقييم اللغة

نموذج يعمل بشكل جيد في مهمة لا يمكنك تعريفها هو نموذج يعمل بشكل جيد عن طريق الخطأ. الحزام هو تعريف المهمة، المقياس، الجاري، والجدول الدرجي، في شكل واحد قصير، قابل للتبادل.

Type: Build

Languages: Python

Prerequisites: Phase 19 lessons 42 to 45

Time: ~90 minutes

أهداف التعلم

  • تعريف المهمة كملف JSONL مع prompt،targets،metric، و اختياري extrasعلى سبيل المثال
  • تنفيذ خمس مقاييس: مطابقة دقيقة، Rue-l F1، التحقق القابل للتنفيذ، اختيار متعدد، ومحتويات السلك الفرعي.
  • قم ببناء جهاز ركن يجمع المثال لكل مهمة ويرسل إلى مُعدل نموذج قابل للتبادل.
  • إصدار جدول قياسي JSON مع درجات لكل مهمة ، والانخفاض ، ومتوسط عام يمكن إعادة التنظيم.

المشكلة

نموذج لغوي جديد يصل كل أسبوع. الادعاء التسويقي هو أنه يعمل بشكل جيد. السؤال الصادق هو: حسناً في ماذا؟ الجواب الصادق هو قائمة النسب التي كتبتها بنفسك، لأن قائمة البائعين هي التي يتناسبون عليها.

بدون حزمة في إعادة التأمين الخاص بك يمكنك مقارنة النماذج اثنين من خلال الاهتزازات. مع حزمة يمكنك مقارنةهم من خلال النتيجة على مجموعة مهمة ثابتة مع مقياس ثابت، على إنتاج JSON يمكنك التفريق. الحزمة هو العقد بين تشغيل أمس والتشغيل اليوم. بدونها، السفن التراجعات.

الفخة هي إعادة تكييف الحزام إلى نموذج واحد والإصلاح هو نفس الفخ العكسية: الحبل صغير بما فيه الكفاية للاكتتاب في خمسة عشر دقيقة، والمهام صغيرة بما فيه الكفاية للوصول إلى الاستعلام، والمقاييس مكتوبة من الصفر حتى يمكن لزميل مراجعتها، والإعداد هو المكان الوحيد الذي يعيش فيه رمز نموذج محدد. تغيير المعدل، تتحرك اللوحة التابعة؛ تغيير المهام، تتحرك اللوحة التابعة. لا شيء آخر يجب أن يتحرك.

المفهوم

flowchart TD
  tasks[task JSONLs: prompt, targets, metric, extras] --> loader[load_all_tasks]
  loader --> runner[run_leaderboard]
  runner --> adapter[ModelAdapter.generate batch]
  adapter --> metrics[METRIC_FNS dispatch by name]
  metrics --> scores[per example score]
  scores --> board[Leaderboard: per task + overall]
  board --> out[leaderboard.json]

تحديد المهام

كل مثال هو خط JSONL واحد:

json{"id": "arith-00", "prompt": "compute: 2 + 2", "targets": ["4"], "metric": "exact_match"}

بالنسبة للمقاييس التي تحتاج إلى مساعدة تسجيل النقاط،extrasيحمل الحمل المفيد الجانبي:

json{
  "id": "code-00",
  "prompt": "python: write a function f that doubles its input",
  "targets": ["ok"],
  "metric": "code_exec",
  "extras": {"io_pairs": [[1, 2], [3, 6]]}
}

المهمة هي مهمة.jsonlالملف تحت outputs/tasks/اسم الملف هو اسم المهمة. جميع الأمثلة في الملف يشترك في مقياس.

المهام الخمسة المثبتة

TaskMetricWhat it tests
arithmeticexact_matchToken-level correctness on a deterministic answer
summaryrouge_lLongest common subsequence F1 against a one-line reference summary
code-execcode_execExecutable test: the predicted function must satisfy a list of input-output pairs
multiple-choicemultiple_choiceFirst letter of the prediction must match an allowed letter
generationsubstring_containsFree-form text must contain at least one target substring

العقد المقياسي

كل مقياس هو وظيفة من(prediction, targets, extras) -> float in [0.0, 1.0]. الحزمة تتوسط النتائج لكل مثال للحصول على درجة المهمة ، ثم تتوسط درجات المهمة للحصول على إجمالي.

  • exact_match: الحروف الصغرى، الانهيار الفضاء، المساواة.
  • substring_contains: نفس التطبيع، اختبار السلسلة.
  • multiple_choice: الشخصية الأولى فوق
  • rouge_l: طول LCS مقسمة على طول التنبؤ والإشارة، F1 من الدقة والإستدعاء.
  • code_exec: تنفيذ التنبؤ في مساحة أسماء محدودة، دعوة f(x)على كل زوج من المدخلات والمخرجات، عد المقابلة.

يدير مقياس code_exec التنبؤ في مساحة أسماء المبنيات المزورة. يؤكد اختبار الدروس أن import osينفجر لأنosليس في مساحة الأسماء؛ لا يمكنك الوصول إلى نظام الملفات من تنبؤ رمز.

مُعدّل النموذج

pythonclass ModelAdapter(Protocol):
    def generate(self, prompts: Sequence[str]) -> List[str]: ...
    @property
    def name(self) -> str: ...

المعدل هو الخياطة، و السفينة الدروسToyAdapter، متطابقة نمط تحديدية تعيد الإجابة الصحيحة لكل طلب في المهام الخمسة المثبتة.

الجاري

run_taskاللحظاتbatch_sizeتطلبات في وقت واحد وترسل إلى وظيفة الميتر. run_leaderboardيمر بكل مهمة ومتوسطاتwrite_leaderboardيُصدر JSON مع سلسلة مخططات بحيث لا تُكسر أجهزة التحكم بصمت تغييرات في الشكل في المستقبل.

flowchart LR
  examples[N examples] --> batches[B-sized batches]
  batches --> adapter[adapter.generate]
  adapter --> per[per example score 0..1]
  per --> avg[task score]
  avg --> over[overall = mean of task scores]

بناءها

code/main.pyهو القطع الأثرية القابلة للعمل.

الخطوة الأولى: مهام إصلاح البذور

seed_fixture_tasks(target_dir)يكتب الخمسة.jsonlالملفات.main.pyيزرعها عندما يكون المجلة فارغة.

الخطوة الثانية: مهام الحمل

load_all_tasks(task_dir)يقرأ كل.jsonlو يعيد القول من اسم المهمة إلى قائمة Exampleالسجلات، خطوط التعليقات تبدأ بـ#و يتم تخطي خطوط فارغة حتى يمكن للمساهمين ملاحظة الملفات.

الخطوة الثالثة: تنفيذ المقاييس

كل مقياس هو وظيفة صغيرة مع اختبار وحدة. مجموعة اختبار الدروس تشمل 13 حالة تغطي التطبيع والترابط الجزئي وتنفيذ الرمز، ورفض الرمز غير الآمن.

الخطوة الرابعة: اكتب المركض

run_taskيتكرر اللحظات وينتجTaskResultمع النتيجة، العد الصحيح، العد الإجمالي، والبطء. run_leaderboardيمر كل المهام ويجعلLeaderboardمع المتوسط العام

الخطوة 5: إصدار JSON

write_leaderboardيسلسل اللوحة--include-per-exampleيرمي العلم سجلات كل مثال حتى تتمكن من التفريق التنبؤات ضد الجولة السابقة عندما تتحرك النتيجة.

إشغله

bashpython3 code/main.py

يزرع السيناريو الأجهزة في الركض الأول، ويجري درجة مع مكيّف الألعاب (الذي يحصل على كل أجهزة صحيحة) ، ويكتب outputs/leaderboard.json. النتيجة العامة هي 1.0 مع جهاز إعداد الألعاب . اختبار إعداد الألعاب في test_main.pyيظهر نفس الحزام ينتج 0.0 عندما لا يستطيع المعدل الإجابة.

استخدمها

لتشغيل نموذج حقيقي، اكتب مُعدّلًا.

pythonclass HttpAdapter:
    name = "vendor.v1"

    def __init__(self, endpoint, api_key):
        self.endpoint = endpoint
        self.api_key = api_key

    def generate(self, prompts):
        out = []
        for prompt in prompts:
            response = http_post(self.endpoint, prompt, self.api_key)
            out.append(response["text"])
        return out

التغييرToyAdapterلـHttpAdapterفي أعلىmain().السلسلة، المهام، المقاييس، والجدول الرائد يبقى نفسه.

ثلاثة أنماط يجب تنفيذها عند شحن الحزام في مشروع حقيقي:

  • Pin the task files.يحتوي قائمة المهام. json على محتوى مهمة محور من خلال الجهاز أو يحمل JSONLs إلى جانبها؛ وإلا تتحرك النتيجة عندما يقوم ملف المهمة بذلك، ولا يمكنك معرفة أي منها.
  • Diff predictions, not just scores.- نعم--include-per-exampleالدرج يسمح لك أن ترى ما قاله النموذج في اليوم الذي انخفضت فيه النتيجة.
  • Cap the batch size.المعدلات الحقيقية لديها حدود معدل، حجم اللحظة الصغير يبقي الحزام متوافق بين البائعين.

أرسله

outputs/skill-lm-eval-harness.mdيحمل الوصفة: JSONL تحديد المهام، خمسة مقاييس، المعدل قابل للتبادل، المدير المجموعة، جدول الرؤساء JSON مع سلسلة مخطط. الملفات المهام في outputs/tasks/هذه هي الأجهزة، نسخها في مشروع حقيقي كبدء.

التمارين

  1. أضف مهمة سادسة مع مقياس مخصصة تكتبها من الصفر (تداخل مثل BLEU، نقطة إشارة مثل BLEURT، أي شيء مع عقد واضح).
  2. التمديدcode_execلالتقاط المداهمة والقبول بقائمة من المداهمة المتوقعة كهدف.
  3. إضافة أمر فرق قائمة: أعطيت اثنين leaderboard.jsonالملفات، طباعة المهام التي تحركت وبكم.
  4. حد تأخير على سبيل المثال. لف مكالمة المعدل في وقت وقف؛ سطح منفصل timeoutsعمود في قائمة النتائج
  5. قم بتحديد محتوى المهمة مع sha256 في اللوحة الرتبية حتى يستطيع القارئ المستقبلي التحقق من أنهم حصلوا على نفس المهام.

الشروط الرئيسية

TermWhat people sayWhat it actually means
Task spec"The eval format"JSONL file with prompt, targets, metric, optional extras per example
Metric"How you score"Function from (prediction, targets, extras) to a float in [0, 1]
Adapter"The model client"Object with a generate(prompts) -> list[str] method; the only model-specific code
Leaderboard"The scoreboard"JSON with per-task scores, total counts, latency, and an overall average
Code exec metric"Run it and check"Execute the prediction in a restricted namespace, compare against input-output pairs

المزيد من القراءة

  • القنب الأصلي لقيام التقييم لـ"المرجع" الإنتاج، أكبر بكثير ولكن يشبه الشكل.
  • إشعار "هوجنج فيس" عن تنفيذ بديل لنفس العقد
  • المرحلة 19 دروس 46 تغطي أنماط تراكم التراجعية المستخدمة في كومة التدريب نقاط الحزام.
  • مرحلة 19 الدروس 47 تغطي شكل نقطة التفتيش التي تسجل ضدها؛ وضع علامة التفتيش في قائمة الدرجات.
  • المرحلة 19 الدروس 48 تغطي كومة التدريب الموزعة التي أنتجت النموذج قيد التجربة.

This free lesson is part of the AI Engineering from Scratch curriculum. Read the full explanation, run the lesson code, and verify the result in the interactive reader or from the repository source.

Browse the complete course catalog or open this lesson on GitHub.