TRL documentation

صيغ البيانات وأنواعها

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v1.17.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

صيغ البيانات وأنواعها

توفر هذه الدليل نظرة عامة على صيغ البيانات وأنواعها المدعومة بواسطة كل مُدرّب في TRL.

نظرة عامة على صيغ البيانات وأنواعها

  • يشير format إلى كيفية هيكلة البيانات في مجموعة البيانات، ويُصنَّف عادةً إما على أنه standard أو conversational.
  • يرتبط type بالمهمة المحددة التي صُمم لها مجموعة البيانات، مثل prompt-only أو preference. ويتميز كل نوع بأعمدته، التي تختلف حسب المهمة، كما هو موضح في الجدول.
النوع \ التنسيققياسيحواري
نمذجة اللغة
{"text": "The sky is blue."}
{"messages": [{"role": "user", "content": "What color is the sky?"},
              {"role": "assistant", "content": "It is blue."}]}
الموجّه فقط
{"prompt": "The sky is"}
{"prompt": [{"role": "user", "content": "What color is the sky?"}]}
إكمال الموجه
{"prompt": "The sky is",
 "completion": " blue."}
{"prompt": [{"role": "user", "content": "What color is the sky?"}],
 "completion": [{"role": "assistant", "content": "It is blue."}]}
التفضيل
{"prompt": "The sky is",
 "chosen": " blue.",
 "rejected": " green."}
أو، مع موجه ضمني:
{"chosen": "The sky is blue.",
 "rejected": "The sky is green."}
{"prompt": [{"role": "user", "content": "What color is the sky?"}],
 "chosen": [{"role": "assistant", "content": "It is blue."}],
 "rejected": [{"role": "assistant", "content": "It is green."}]}
أو، مع موجه ضمني:
{"chosen": [{"role": "user", "content": "What color is the sky?"},
              {"role": "assistant", "content": "It is blue."}],
 "rejected": [{"role": "user", "content": "What color is the sky?"},
                {"role": "assistant", "content": "It is green."}]}
تفضيلات غير متطابقة
{"prompt": "The sky is",
 "completion": " blue.",
 "label": True}
{"prompt": [{"role": "user", "content": "What color is the sky?"}],
 "completion": [{"role": "assistant", "content": "It is green."}],
 "label": False}

الصيغ

قياسي

يتألف تنسيق مجموعة البيانات القياسي عادةً من نصوص نصية بسيطة. تختلف أعمدة مجموعة البيانات اعتمادًا على المهمة. هذا هو التنسيق الذي تتوقعه مدرِّبو TRL. فيما يلي أمثلة على تنسيقات مجموعات البيانات القياسية لمهام مختلفة:

# Language modeling
language_modeling_example = {"text": "The sky is blue."}
# Preference
preference_example = {"prompt": "The sky is", "chosen": " blue.", "rejected": " green."}
# Unpaired preference
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}

حواري

تُستخدم مجموعات البيانات الحوارية للمهام التي تتضمن حوارات أو تفاعلات دردشة بين المستخدمين والمساعدين. وعلى عكس صيغ مجموعات البيانات القياسية، تحتوي هذه المجموعات على تسلسلات من الرسائل حيث تحمل كل رسالة role (مثل "user" أو "assistant") وcontent (نص الرسالة).

messages = [
    {"role": "user", "content": "Hello, how are you?"},
    {"role": "assistant", "content": "I'm doing great. How can I help you today?"},
    {"role": "user", "content": "I'd like to show off how chat templating works!"},
]

كما هو الحال مع مجموعات البيانات القياسية، تتنوع أعمدة مجموعات البيانات الحوارية تبعًا للمهمة. فيما يلي أمثلة على صيغ مجموعات البيانات الحوارية لمهام مختلفة:

# Prompt-completion
prompt_completion_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                             "completion": [{"role": "assistant", "content": "It is blue."}]}
# Preference
preference_example = {
    "prompt": [{"role": "user", "content": "What color is the sky?"}],
    "chosen": [{"role": "assistant", "content": "It is blue."}],
    "rejected": [{"role": "assistant", "content": "It is green."}],
}

استدعاء الأدوات

تدعم بعض قوالب المحادثة استدعاء الأدوات، مما يتيح للنموذج التفاعل مع دوال خارجية—يُشار إليها باسم أدوات—أثناء التوليد. يوسّع هذا القدرات الحوارية للنموذج من خلال تمكينه من إخراج حقل "tool_calls" بدلاً من رسالة "content" القياسية كلما قرر استدعاء أداة.

بعد أن يبدأ المساعد استدعاء أداة، تُنفَّذ الأداة وتُرجع مخرجاتها. يمكن للمساعد بعد ذلك معالجة هذه المخرجات ومتابعة المحادثة وفقًا لذلك.

إليك مثالًا بسيطًا على تفاعل استدعاء أداة:

messages = [
    {"role": "user", "content": "Turn on the living room lights."},
    {"role": "assistant", "tool_calls": [
        {"type": "function", "function": {
            "name": "control_light",
            "arguments": {"room": "living room", "state": "on"}
        }}]
    },
    {"role": "tool", "name": "control_light", "content": "The lights in the living room are now on."},
    {"role": "assistant", "content": "Done!"}
]

عند إعداد مجموعات البيانات للتدريب الدقيق الإشرافي (SFT) مع استدعاء الأدوات، من المهم أن تتضمن مجموعة البيانات عمودًا إضافيًا باسم tools. يحتوي هذا العمود على قائمة الأدوات المتاحة للنموذج، والتي تُستخدم عادةً بواسطة قالب المحادثة لبناء موجه النظام.

يجب تحديد الأدوات بتنسيق مخطط JSON مُرمّز. يمكنك توليد هذا المخطط تلقائيًا من توقيعات دوال بايثون باستخدام أداة get_json_schema:

import json
from transformers.utils import get_json_schema

def control_light(room: str, state: str) -> str:
    """
    Controls the lights in a room.

    Args:
        room: The name of the room.
        state: The desired state of the light ("on" or "off").

    Returns:
        str: A message indicating the new state of the lights.
    """
    return f"The lights in {room} are now {state}."

# Generate JSON schema
json_schema = get_json_schema(control_light)

سيبدو المخطط المولّد على النحو التالي:

{"type": "function", "function": {"name": "control_light", "description": "Controls the lights in a room.", "parameters": {"type": "object", "properties": {"room": {"type": "string", "description": "The name of the room."}, "state": {"type": "string", "description": "The desired state of the light (\"on\" or \"off\")."}}, "required": ["room", "state"]}, "return": {"type": "string", "description": "str: A message indicating the new state of the lights."}}}

قد يبدو إدخال كامل لمجموعة بيانات SFT على النحو التالي:

{"messages": messages, "tools": [json_schema]}

للحصول على Dataset، يجب عليك استخدام النوع Json() لحجج الأدوات، لأنها كائنات JSON عشوائية وليست قواميس ذات حقول وأنواع ثابتة:

from datasets import Dataset

data = [
    {"messages": messages1, "tools": [json_schema1]},
    {"messages": messages2, "tools": [json_schema2]},
]
# auto-apply the Json() type
dataset = Dataset.from_list(data, on_mixed_types="use_json")

# or specify the features manually
from datasets import Features, Json, List, Value

features = Features(
    {
        "messages": List({"role": Value("string"), "content": Value("string"), "tool_calls": List(Json())}),
        "tools": List(Json()),
    }
)
dataset = Dataset.from_list(data, features=features)

في الإصدارات الأقدم من datasets (<4.7.0) التي لا تحتوي على النوع Json()، يجب عليك تخزين tools كنص str بصيغة JSON (باستخدام json.dumps([...])):

dataset = Dataset.from_list(
    [{"messages": messages1, "tools": json.dumps([json_schema1])},
     {"messages": messages2, "tools": json.dumps([json_schema2])}]
)

لمزيد من المعلومات التفصيلية حول استدعاء الأدوات، راجع قسم استدعاء الأدوات في وثائق transformers والمقال Tool Use, Unified.

الانسجام

تم تقديم تنسيق استجابة Harmony مع نماذج OpenAI GPT OSS. يوسّع هذا التنسيق التنسيق المحادثي من خلال إضافة بنية أغنى للاستدلال، واستدعاء الدوال، والبيانات الوصفية المتعلقة بسلوك النموذج. وتشمل الميزات الرئيسية:

  • دور المطوّر – يوفّر تعليمات على مستوى عالٍ (مشابهة لموجّه النظام) ويحوي قائمة بالأدوات المتاحة.

  • القنوات – فصل أنواع مخرجات المساعد إلى تدفقات منفصلة:

    • analysis – للاستدلال الداخلي، من المفتاح "thinking"
    • final – للإجابة الموجهة للمستخدم، من المفتاح "content"
    • commentary – لاستدعاءات الأدوات أو الملاحظات الوصفية
  • جهد الاستدلال – يُشير إلى مقدار التفكير الذي ينبغي أن يُظهره النموذج (مثلًا، "low"، "medium"، "high").

  • هوية النموذج – يحدد بشكل صريح شخصية المساعد.

from transformers import AutoTokenizer

tokenizer = AutoTokenizer.from_pretrained("openai/gpt-oss-20b")

messages = [
    {"role": "developer", "content": "Use a friendly tone."},
    {"role": "user", "content": "What is the meaning of life?"},
    {"role": "assistant", "thinking": "Deep reflection...", "content": "The final answer is..."},
]

print(
    tokenizer.apply_chat_template(
        messages,
        tokenize=False,
        reasoning_effort="low",
        model_identity="You are HuggingGPT, a large language model trained by Hugging Face.",
    )
)

ينتج عن ذلك:

<|start|>system<|message|>You are HuggingGPT, a large language model trained by Hugging Face.
Knowledge cutoff: 2024-06
Current date: 2025-08-03

Reasoning: low

# Valid channels: analysis, commentary, final. Channel must be included for every message.<|end|><|start|>developer<|message|># Instructions

Use a friendly tone.<|end|><|start|>user<|message|>What is the meaning of life?<|end|><|start|>assistant<|channel|>analysis<|message|>Deep reflection...<|end|><|start|>assistant<|channel|>final<|message|>The final answer is...<|return|>

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

أنواع

نمذجة اللغة

يتألف مجموعة بيانات نمذجة اللغة من عمود "text" (أو "messages" لمجموعات البيانات الحوارية) يحتوي على تسلسل نصي كامل.

# Standard format
language_modeling_example = {"text": "The sky is blue."}
# Conversational format
language_modeling_example = {"messages": [
    {"role": "user", "content": "What color is the sky?"},
    {"role": "assistant", "content": "It is blue."}
]}

الموجّه فقط

في مجموعة بيانات تعتمد على الاستعلام فقط، يُقدَّم الاستعلام الأولي (السؤال أو الجملة الجزئية) فقط تحت المفتاح "prompt". تتضمن عملية التدريب عادةً توليد إكمال بناءً على هذا الاستعلام، حيث يتعلم النموذج مواصلة أو إكمال المدخل المعطى.

# Standard format
prompt_only_example = {"prompt": "The sky is"}
# Conversational format
prompt_only_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}]}

لمعرفة أمثلة على مجموعات البيانات التي تحتوي على الأوامر فقط، راجع مجموعة مجموعات البيانات التي تحتوي على الأوامر فقط.

على الرغم من تشابه نوعي الموجّه فقط ونمذجة اللغة، إلا أنهما يختلفان في طريقة معالجة المدخلات. ففي نوع الموجّه فقط، يمثل الموجّه مدخلاً جزئياً يتوقع منه النموذج إكمال النص أو الاستمرار فيه، بينما في نوع نمذجة اللغة، يُعامل المدخل على أنه جملة أو تسلسل كامل. وتعالج TRL هذين النوعين بطرق مختلفة. وفيما يلي مثال يوضح الفرق في مخرجات دالة apply_chat_template لكل نوع:

from transformers import AutoTokenizer
from trl import apply_chat_template

tokenizer = AutoTokenizer.from_pretrained("microsoft/Phi-3-mini-128k-instruct")

# Example for prompt-only type
prompt_only_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}]}
apply_chat_template(prompt_only_example, tokenizer)
# Output: {'prompt': '<|user|>\nWhat color is the sky?<|end|>\n<|assistant|>\n'}

# Example for language modeling type
lm_example = {"messages": [{"role": "user", "content": "What color is the sky?"}]}
apply_chat_template(lm_example, tokenizer)
# Output: {'text': '<|user|>\nWhat color is the sky?<|end|>\n<|endoftext|>'}
  • يشمل المخرج الذي يحتوي على الاستعلام فقط '<|assistant|>\n'، مما يشير إلى بداية دور المساعد ويتوقع من النموذج توليد إكمال.
  • على النقيض من ذلك، يعامل ناتج نمذجة اللغة المدخلات كتسلسل كامل وينهيها بـ '<|endoftext|>'، مما يشير إلى نهاية النص ولا يتوقع أي محتوى إضافي.

إكمال الموجه

يتضمن مجموعة بيانات الإكمال من الموجه "prompt" و"completion".

# Standard format
prompt_completion_example = {"prompt": "The sky is", "completion": " blue."}
# Conversational format
prompt_completion_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                             "completion": [{"role": "assistant", "content": "It is blue."}]}

لمعرفة أمثلة على مجموعات بيانات الإكمال من الموجهات، راجع مجموعة بيانات الإكمال من الموجهات.

التفضيل

يُستخدم مجموعة بيانات التفضيل للمهام التي يُدرَّب فيها النموذج على الاختيار بين إكمالين أو أكثر محتملين لنفس الاستدعاء. تتضمن هذه المجموعة بيانات عمود "prompt"، وإكمالًا "chosen"، وإكمالًا "rejected". يُدرَّب النموذج على اختيار الاستجابة "chosen" على حساب الاستجابة "rejected". قد لا تتضمن بعض مجموعات البيانات عمود "prompt"، وفي هذه الحالة يكون الاستدعاء ضمنياً ومضمّناً مباشرةً في إكمالي "chosen" و"rejected". ننصح باستخدام استدعاءات صريحة كلما أمكن ذلك.

# Standard format
## Explicit prompt (recommended)
preference_example = {"prompt": "The sky is", "chosen": " blue.", "rejected": " green."}
# Implicit prompt
preference_example = {"chosen": "The sky is blue.", "rejected": "The sky is green."}

# Conversational format
## Explicit prompt (recommended)
preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                      "chosen": [{"role": "assistant", "content": "It is blue."}],
                      "rejected": [{"role": "assistant", "content": "It is green."}]}
## Implicit prompt
preference_example = {"chosen": [{"role": "user", "content": "What color is the sky?"},
                                 {"role": "assistant", "content": "It is blue."}],
                      "rejected": [{"role": "user", "content": "What color is the sky?"},
                                   {"role": "assistant", "content": "It is green."}]}

لمعرفة أمثلة على مجموعات بيانات التفضيلات، راجع مجموعة بيانات التفضيلات.

يمكن العثور على بعض مجموعات بيانات التفضيلات عبر الوسم dpo على Hugging Face Hub. كما يمكنك استكشاف مجموعات DPO الخاصة بروبوتات المكتبة لتحديد مجموعات بيانات التفضيلات.

تفضيلات غير متطابقة

تشبه مجموعة بيانات التفضيلات غير المزدوجة مجموعة بيانات التفضيلات، لكن بدلاً من وجود إكمالات "chosen" و"rejected" لنفس الموجه، فهي تتضمن إكمالًا واحدًا "completion" و"label" يشير إلى ما إذا كان الإكمال مفضلًا أم لا.

# Standard format
unpaired_preference_example = {"prompt": "The sky is", "completion": " blue.", "label": True}
# Conversational format
unpaired_preference_example = {"prompt": [{"role": "user", "content": "What color is the sky?"}],
                               "completion": [{"role": "assistant", "content": "It is blue."}],
                               "label": True}

لمعرفة أمثلة على مجموعات بيانات التفضيلات غير المزدوجة، راجع مجموعة بيانات التفضيلات غير المزدوجة.

ما نوع مجموعة البيانات الذي يجب استخدامه؟

يعتمد اختيار النوع الصحيح من مجموعة البيانات على المهمة التي تعمل عليها والمتطلبات المحددة لمدرّب TRL الذي تستخدمه. أدناه نظرة عامة موجزة على أنواع مجموعات البيانات المدعومة من قبل كل مدرّب TRL.

Trainerنوع مجموعة البيانات المتوقع
DPOTrainerالتفضيل (يُوصى باستخدام موجه صريح)
GRPOTrainerالموجّه فقط
KTOTrainerتفضيل غير مُزاوج أو تفضيل (يُوصى بـ prompt صريح)
RewardTrainerالتفضيل (يُوصى باستخدام موجه ضمني)
RLOOTrainerالموجّه فقط
SFTTrainerنمذجة اللغة أو إكمال الموجه
experimental.cpo.CPOTrainerالتفضيل (يُوصى باستخدام موجه صريح)
experimental.gkd.GKDTrainerإكمال الموجه
experimental.online_dpo.OnlineDPOTrainerالموجّه فقط
experimental.orpo.ORPOTrainerالتفضيل (يُوصى باستخدام موجه صريح)

استخدام أي مجموعة بيانات مع TRL: المعالجة المسبقة والتحويل

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

لتسهيل ذلك، نوفر مجموعة من النصوص البرمجية النموذجية التي تغطي تحويلات مجموعات البيانات الشائعة.

مثال: مجموعة بيانات UltraFeedback

لنأخذ مجموعة بيانات UltraFeedback كمثال. إليك معاينة للمجموعة:

كما هو موضح أعلاه، لا يتطابق تنسيق مجموعة البيانات مع البنية المتوقعة. فهي ليست بتنسيق محادثة، وتختلف أسماء الأعمدة، كما أن النتائج تتعلق بنماذج مختلفة (مثل Bard وGPT-4) وجوانب مختلفة (مثل "helpfulness" و"honesty").

باستخدام سكربت التحويل المُقدَّم examples/datasets/ultrafeedback.py، يمكنك تحويل هذا المجموعة البيانات إلى نوع تفضيلات غير مُقابلة، ودفعها إلى Hub:

python examples/datasets/ultrafeedback.py --push_to_hub --repo_id trl-lib/ultrafeedback-gpt-3.5-turbo-helpfulness

بعد التحويل، سيبدو مجموعة البيانات على النحو التالي:

الآن، يمكنك استخدام هذا مجموعة البيانات مع TRL!

من خلال تكييف السكربتات المُقدَّمة أو إنشاء سكربتاتك الخاصة، يمكنك تحويل أي مجموعة بيانات إلى صيغة متوافقة مع TRL.

أدوات لتحويل أنواع مجموعات البيانات

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

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

من \ إلىنمذجة اللغةإكمال الموجهالموجّه فقطالتفضيل مع موجه ضمنيالتفضيلتفضيلات غير متطابقة
نمذجة اللغةN/AN/AN/AN/AN/AN/A
إكمال الموجه🔗N/A🔗N/AN/AN/A
الموجّه فقطN/AN/AN/AN/AN/AN/A
التفضيل مع موجه ضمني🔗🔗🔗N/A🔗🔗
التفضيل🔗🔗🔗🔗N/A🔗
تفضيلات غير متطابقة🔗🔗🔗N/AN/AN/A

من إكمال الموجه إلى مجموعة بيانات لنمذجة اللغة

لتحويل مجموعة بيانات من نوع "الموجّه-الإكمال" إلى مجموعة بيانات لنمذجة اللغة، قم بدمج الموجّه مع الإكمال.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is"],
    "completion": [" blue.", " in the sky."],
})

def concat_prompt_completion(example):
    return {"text": example["prompt"] + example["completion"]}

dataset = dataset.map(concat_prompt_completion, remove_columns=["prompt", "completion"])
>>> dataset[0]
{'text': 'The sky is blue.'}

من مجموعة بيانات الإكمال من الموجه إلى مجموعة بيانات الموجه فقط

لتحويل مجموعة بيانات من نوع "موجّه-إكمال" إلى مجموعة بيانات من نوع "موجّه فقط"، احذف الإكمال.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is"],
    "completion": [" blue.", " in the sky."],
})

dataset = dataset.remove_columns("completion")
>>> dataset[0]
{'prompt': 'The sky is'}

من تفضيل مع موجه ضمني إلى مجموعة بيانات لنمذجة اللغة

لتحويل مجموعة بيانات تفضيلات ذات موجه ضمني إلى مجموعة بيانات لنمذجة اللغة، احذف الأعمدة المرفوضة، وأعد تسمية العمود "chosen" إلى "text".

from datasets import Dataset

dataset = Dataset.from_dict({
    "chosen": ["The sky is blue.", "The sun is in the sky."],
    "rejected": ["The sky is green.", "The sun is in the sea."],
})

dataset = dataset.rename_column("chosen", "text").remove_columns("rejected")
>>> dataset[0]
{'text': 'The sky is blue.'}

من تفضيل مع موجه ضمني إلى مجموعة بيانات موجه-إكمال

لتحويل مجموعة بيانات تفضيلات تحتوي على موجه ضمني إلى مجموعة بيانات موجه-إكمال، استخرج الموجه باستخدام extract_prompt()، واحذف المرفوض، وأعد تسمية العمود "chosen" إلى "completion".

from datasets import Dataset
from trl import extract_prompt

dataset = Dataset.from_dict({
    "chosen": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is blue."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is green."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sea."}],
    ],
})
dataset = dataset.map(extract_prompt).remove_columns("rejected").rename_column("chosen", "completion")
>>> dataset[0]
{'prompt': [{'role': 'user', 'content': 'What color is the sky?'}], 'completion': [{'role': 'assistant', 'content': 'It is blue.'}]}

من مجموعة بيانات التفضيل ذات الموجه الضمني إلى مجموعة بيانات الموجه فقط

لتحويل مجموعة بيانات تفضيلات تحتوي على موجه ضمني إلى مجموعة بيانات تحتوي على الموجه فقط، استخرج الموجه باستخدام extract_prompt()، وأزل المرفوض والمختار.

from datasets import Dataset
from trl import extract_prompt

dataset = Dataset.from_dict({
    "chosen": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is blue."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is green."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sea."}],
    ],
})
dataset = dataset.map(extract_prompt).remove_columns(["chosen", "rejected"])
>>> dataset[0]
{'prompt': [{'role': 'user', 'content': 'What color is the sky?'}]}

من مجموعة بيانات تفضيلات الأوامر الضمنية إلى مجموعة بيانات تفضيلات الأوامر الصريحة

لتحويل مجموعة بيانات تفضيلات تحتوي على موجه ضمني إلى مجموعة بيانات تفضيلات تحتوي على موجه صريح، استخرج الموجه باستخدام extract_prompt().

from datasets import Dataset
from trl import extract_prompt

dataset = Dataset.from_dict({
    "chosen": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is blue."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is green."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sea."}],
    ],
})

dataset = dataset.map(extract_prompt)
>>> dataset[0]
{'prompt': [{'role': 'user', 'content': 'What color is the sky?'}],
 'chosen': [{'role': 'assistant', 'content': 'It is blue.'}],
 'rejected': [{'role': 'assistant', 'content': 'It is green.'}]}

من التفضيل مع الموجه الضمني إلى مجموعة بيانات التفضيل غير المزدوجة

لتحويل مجموعة بيانات تفضيلات تحتوي على موجه ضمني إلى مجموعة بيانات تفضيلات غير مقترنة، استخرج الموجه باستخدام extract_prompt()، ثم افصل مجموعة البيانات باستخدام unpair_preference_dataset().

from datasets import Dataset
from trl import extract_prompt, unpair_preference_dataset

dataset = Dataset.from_dict({
    "chosen": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is blue."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "user", "content": "What color is the sky?"}, {"role": "assistant", "content": "It is green."}],
        [{"role": "user", "content": "Where is the sun?"}, {"role": "assistant", "content": "In the sea."}],
    ],
})

dataset = dataset.map(extract_prompt)
dataset = unpair_preference_dataset(dataset)
>>> dataset[0]
{'prompt': [{'role': 'user', 'content': 'What color is the sky?'}],
 'completion': [{'role': 'assistant', 'content': 'It is blue.'}],
 'label': True}

تذكر أن الإكمالات "chosen" و"rejected" في مجموعة بيانات التفضيلات قد تكون جيدة أو سيئة على حد سواء. قبل تطبيق unpair_preference_dataset()، تأكد من أن جميع إكمالات "chosen" يمكن تصنيفها على أنها جيدة، وأن جميع إكمالات "rejected" يمكن تصنيفها على أنها سيئة. يمكن ضمان ذلك من خلال التحقق من التقييم المطلق لكل إكمال، على سبيل المثال من نموذج المكافآت.

من مجموعة بيانات التفضيلات إلى مجموعة بيانات نمذجة اللغة

لتحويل مجموعة بيانات التفضيلات إلى مجموعة بيانات لنمذجة اللغة، احذف المرفوض، وادمج الموجه والمختار في عمود "text".

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is"],
    "chosen": [" blue.", " in the sky."],
    "rejected": [" green.", " in the sea."],
})

def concat_prompt_chosen(example):
    return {"text": example["prompt"] + example["chosen"]}

dataset = dataset.map(concat_prompt_chosen, remove_columns=["prompt", "chosen", "rejected"])
>>> dataset[0]
{'text': 'The sky is blue.'}

من مجموعة بيانات التفضيلات إلى مجموعة بيانات الإكمال

لتحويل مجموعة بيانات التفضيلات إلى مجموعة بيانات من نوع "الموجّه-الإكمال"، احذف الأعمدة المرفوضة، وأعد تسمية العمود "chosen" إلى "completion".

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is"],
    "chosen": [" blue.", " in the sky."],
    "rejected": [" green.", " in the sea."],
})

dataset = dataset.remove_columns("rejected").rename_column("chosen", "completion")
>>> dataset[0]
{'prompt': 'The sky is', 'completion': ' blue.'}

من مجموعة بيانات التفضيلات إلى مجموعة بيانات تعتمد على الأوامر فقط

لتحويل مجموعة بيانات التفضيلات إلى مجموعة بيانات تحتوي على الاستعلامات فقط، احذف المرفوض والمختار.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is"],
    "chosen": [" blue.", " in the sky."],
    "rejected": [" green.", " in the sea."],
})

dataset = dataset.remove_columns(["chosen", "rejected"])
>>> dataset[0]
{'prompt': 'The sky is'}

من مجموعة بيانات تفضيلات التلميح الصريحة إلى الضمنية

لتحويل مجموعة بيانات تفضيلات تحتوي على موجه صريح إلى مجموعة بيانات تفضيلات تحتوي على موجه ضمني، ادمج الموجه مع كلٍّ من الخيار المفضل والخيار المرفوض، ثم احذف الموجه.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": [
        [{"role": "user", "content": "What color is the sky?"}],
        [{"role": "user", "content": "Where is the sun?"}],
    ],
    "chosen": [
        [{"role": "assistant", "content": "It is blue."}],
        [{"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "assistant", "content": "It is green."}],
        [{"role": "assistant", "content": "In the sea."}],
    ],
})

def concat_prompt_to_completions(example):
    return {"chosen": example["prompt"] + example["chosen"], "rejected": example["prompt"] + example["rejected"]}

dataset = dataset.map(concat_prompt_to_completions, remove_columns="prompt")
>>> dataset[0]
{'chosen': [{'role': 'user', 'content': 'What color is the sky?'}, {'role': 'assistant', 'content': 'It is blue.'}],
 'rejected': [{'role': 'user', 'content': 'What color is the sky?'}, {'role': 'assistant', 'content': 'It is green.'}]}

من مجموعة بيانات التفضيلات إلى مجموعة بيانات التفضيلات غير المزدوجة

لتحويل مجموعة البيانات إلى مجموعة بيانات تفضيلات غير مُزاوجة، قم بإزالة التزاوج من مجموعة البيانات باستخدام unpair_preference_dataset().

from datasets import Dataset
from trl import unpair_preference_dataset

dataset = Dataset.from_dict({
    "prompt": [
        [{"role": "user", "content": "What color is the sky?"}],
        [{"role": "user", "content": "Where is the sun?"}],
    ],
    "chosen": [
        [{"role": "assistant", "content": "It is blue."}],
        [{"role": "assistant", "content": "In the sky."}],
    ],
    "rejected": [
        [{"role": "assistant", "content": "It is green."}],
        [{"role": "assistant", "content": "In the sea."}],
    ],
})

dataset = unpair_preference_dataset(dataset)
>>> dataset[0]
{'prompt': [{'role': 'user', 'content': 'What color is the sky?'}],
 'completion': [{'role': 'assistant', 'content': 'It is blue.'}],
 'label': True}

تذكر أن الإكمالات "chosen" و"rejected" في مجموعة بيانات التفضيلات قد تكون جيدة أو سيئة على حد سواء. قبل تطبيق unpair_preference_dataset()، تأكد من أن جميع إكمالات "chosen" يمكن تصنيفها على أنها جيدة، وأن جميع إكمالات "rejected" يمكن تصنيفها على أنها سيئة. يمكن ضمان ذلك من خلال التحقق من التقييم المطلق لكل إكمال، على سبيل المثال من نموذج المكافآت.

من مجموعة بيانات التفضيلات غير المزدوجة إلى مجموعة بيانات نمذجة اللغة

لتحويل مجموعة بيانات تفضيلات غير مُزاوجة إلى مجموعة بيانات لنمذجة اللغة، ادمج الأوامر مع الإكمالات الجيدة في عمود "text"، واحذف أعمدة الأمر والإكمال والوسم.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is", "The sky is", "The sun is"],
    "completion": [" blue.", " in the sky.", " green.", " in the sea."],
    "label": [True, True, False, False],
})

def concatenate_prompt_completion(example):
    return {"text": example["prompt"] + example["completion"]}

dataset = dataset.filter(lambda x: x["label"]).map(concatenate_prompt_completion).remove_columns(["prompt", "completion", "label"])
>>> dataset[0]
{'text': 'The sky is blue.'}

من مجموعة بيانات التفضيلات غير المزدوجة إلى مجموعة بيانات الموجه-الإكمال

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

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is", "The sky is", "The sun is"],
    "completion": [" blue.", " in the sky.", " green.", " in the sea."],
    "label": [True, True, False, False],
})

dataset = dataset.filter(lambda x: x["label"]).remove_columns(["label"])
>>> dataset[0]
{'prompt': 'The sky is', 'completion': ' blue.'}

من مجموعة بيانات تفضيلات غير مُقابلة إلى مجموعة بيانات تعتمد على الأوامر فقط

لتحويل مجموعة بيانات تفضيلات غير مُزاوجة إلى مجموعة بيانات تحتوي على الأوامر فقط، احذف عمودَي الإكمال والوسم.

from datasets import Dataset

dataset = Dataset.from_dict({
    "prompt": ["The sky is", "The sun is", "The sky is", "The sun is"],
    "completion": [" blue.", " in the sky.", " green.", " in the sea."],
    "label": [True, True, False, False],
})

dataset = dataset.remove_columns(["completion", "label"])
>>> dataset[0]
{'prompt': 'The sky is'}

مجموعات بيانات الرؤية

تدعم بعض أدوات التدريب أيضًا ضبط نماذج الرؤية واللغة (VLMs) باستخدام أزواج من الصور والنصوص. في هذا السيناريو، يُوصى باستخدام صيغة محادثة، حيث يتعامل كل نموذج مع محارف النصوص المخصصة للصور بشكل مختلف.

تختلف مجموعة بيانات الرؤية الحوارية عن مجموعة البيانات الحوارية القياسية بطريقتين رئيسيتين:

  1. يجب أن يحتوي مجموعة البيانات على المفتاح images مع بيانات الصور (كقوائم من صور PIL) أو image مع صورة PIL واحدة.
  2. يجب أن يكون حقل "content" في الرسائل قائمة من القواميس، حيث يحدد كل قاموس نوع البيانات: "image" أو "text".

مثال:

# Textual dataset:
"content": "What color is the sky?"

# Vision dataset:
"content": [
    {"type": "image"},
    {"type": "text", "text": "What color is the sky in the image?"}
]

مثال على مجموعة بيانات الرؤية المحادثة هو openbmb/RLAIF-V-Dataset. أدناه عرض مدمج لبيانات التدريب الخاصة بالمجموعة، مما يتيح لك استكشافها مباشرة:

من الممكن خلط بيانات النص فقط وبيانات الرؤية واللغة في مجموعة البيانات، لكن ذلك يتطلب إصدار transformers 4.57.0 أو أحدث. مثال:

dataset = Dataset.from_dict({
    "prompt": [
        [{"role": "user", "content": [{"type": "image"}, {"type": "text", "text": "What color is the sky in the image?"}]}],
        [{"role": "user", "content": [{"type": "text", "text": "What is the capital of France?"}]}],
    ],
    "completion": [
        [{"role": "assistant", "content": [{"type": "text", "text": "It is blue."}]}],
        [{"role": "assistant", "content": [{"type": "text", "text": "Paris."}]}],
    ],
    "images": [
        [PIL.Image.open("path/to/sky_image1.png")],
        [],
    ],
})
Update on GitHub