ضبط نموذج Granite بسرعة في Python باستخدام watsonx

مؤلف

Anna Gutowska

AI Engineer, Developer Advocate

IBM

ما المقصود بضبط المطالبات؟

في هذا البرنامج التعليمي، سنضبط المطالبة لنموذج IBM Granite باستخدام مجموعة بيانات اصطناعية تحتوي على تقييمات العملاء لأعمال العناية بالكلاب.

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

نظرة عامة على تحسين النماذج اللغوية الكبيرة

تعتمد نماذج الأساس على النماذج اللغوية الكبيرة (LLMs) وتحصل على كميات هائلة من بيانات التدريب. من الاستخدامات الشائعة لنماذج الأساس: روبوتات المحادثة والمساعدون الافتراضيون.

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

  • هندسة المطالبات هي تحسين استجابات النموذج المدرَّب مسبقًا من خلال تقديم مطالبات مصممة بعناية. لا تُضاف بيانات جديدة عند استخدام هذه التقنية، ويظل النموذج كما هو. باستخدام هذه الطريقة، يتلقى النموذج مدخلات بالإضافة إلى مطالبة مصممة مسبقًا أمامه. على سبيل المثال، يمكنك استخدام التعليمات: "ترجِم من الإنجليزية إلى الإسبانية" مع الإدخال: "good morning". تتطلب هذه الطريقة جهدًا أكبر من المستخدم، إلا إن هذا الجهد البشري اليدوي لصياغة مطالبات فعَّالة يساعد نماذج الذكاء الاصطناعي التوليدي على إنتاج استجابات محددة للمهام دون إعادة تدريب نموذج الأساس بالكامل.
  • يتضمن الضبط الدقيق للنماذج اللغوية الكبيرة ضبط النموذج نفسه من خلال توفير أعداد كبيرة من مجموعات البيانات المصنّفة. يؤدي الضبط الدقيق إلى تغيير أوزان النموذج ويصبح من الصعب إدارته مع تنوع المهام. ويتطلب هذا قدرًا كبيرًا من الموارد الحسابية. ونتيجةً لذلك، تميل هذه الطريقة إلى تحقيق أعلى دقة، حيث يمكن تدريب النموذج على حالات استخدام محددة جدًا.
  • بخلاف الضبط الدقيق، لا يغيّر ضبط المطالبات أوزان النموذج المدرَّب مسبقًا. بدلًا من ذلك، تُعَد هذه التقنية فعَّالة من حيث المَعلمات، حيث يتم تعديل مَعلمات المطالبة لتوجيه استجابات النموذج في الاتجاه المطلوب. يتم تزويد النموذج بإدخالٍ ومطالب مرنة قابلة للضبط يتم توليدها بواسطة الذكاء الاصطناعي نفسه. يوجِّه هذا السياق الخاص بالمهمة النموذج الضخم لتكييف استجاباته لمهمة محددة حتى عند وجود بيانات محدودة.
  • على نحو مماثل لضبط المطالبات، يتضمن ضبط البادئة حصول النموذج على عدة أمثلة للمخرجات المرغوب فيها. الفرق هنا هو أنه يتم أيضًا تضمين بادئة، وهي سلسلة من المتجهات الخاصة بالمهمة. يتضمن ضبط البادئة كلًا من المطالبات المرنة والمطالبات التي يتم حقنها في طبقات من التعلم العميق. تُتيح هذه "الرموز الافتراضية" للنموذج المضبوط المرونة لدعم مجموعة متنوعة من المهام الجديدة في الوقت نفسه. تحقِّق هذه الطريقة أداءً مماثلًا لأداء الضبط الدقيق لجميع الطبقات وتدريبًا فقط لحوالي 0.1% من المَعلمات. يتفوق ضبط البادئة على الضبط الدقيق في إعدادات البيانات المنخفضة.

المطالبات المرنة مقابل المطالبات الثابتة

المطالبات الثابتة موجَّهة للمستخدم وتتطلب تفاعلًا منه. يمكن اعتبار المطالبة الثابتة كقالب أو تعليمات للنموذج اللغوي الكبير لإنشاء استجابات. سيتم تقديم مثال على المطالبة الثابتة في ما يلي. ننصحك بزيارة صفحة وثائق IBM للمزيد من المعلومات حول هذا النوع من المطالب وأنواع أخرى متعددة.

###For demonstration purposes only. It is not necessary to run this code block.
hard_prompt_template = """Generate a summary of the context that answers the question. Explain the answer in multiple steps if possible.
Answer style should match the context. Ideal Answer length is 2-3 sentences.\n\n{context}\nQuestion: {question}\nAnswer:
"""

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

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

سنتعامل في هذا البرنامج التعليمي مع المطالبات المرنة لضبط المطالبات.

المتطلبات الأساسية

تحتاج إلى حساب IBM Cloud لإنشاء مشروع watsonx.ai .

الخطوات

الخطوة 1. إعداد البيئة.

رغم توفُّر عدة أدوات للاختيار منها، يُرشدك هذا الدليل خلال خطوات إعداد حساب IBM لاستخدام Jupyter Notebook.

  1. سجِّل الدخول إلى watsonx.ai باستخدام حساب IBM Cloud الخاص بك.

  2. أنشئ مشروع watsonx.ai.

    يمكنك الحصول على معرِّف المشروع من داخل مشروعك. انقر على علامة التبويب الإدارة (Manage)، ثم انسخ معرِّف المشروع من قسم التفاصيل (Details) في صفحة عام (General). ستحتاج إلى هذا المعرِّف في هذا البرنامج التعليمي.

  3. أنشئ Jupyter Notebook.

    ستفتح هذه الخطوة بيئة Notebook حيث يمكنك نسخ الكود من هذا البرنامج التعليمي لتنفيذ ضبط المطالبات بنفسك. أو يمكنك تنزيل هذا الدفتر إلى نظامك المحلي وتحميله إلى مشروع watsonx.ai كأصل. يمكن العثور على Jupyter Notebook هذا مع مجموعات البيانات المستخدمة على GitHub.

الخطوة 2. إعداد مثيل watsonx.ai Runtime ومفتاح واجهة برمجة التطبيقات.

  1. أنشئ مثيل خدمة watsonx.ai Runtime (اختَر المنطقة المناسبة لك، واختَر خطة Lite، وهي مثيل مجاني).

  2. أنشئ مفتاح واجهة برمجة التطبيقات.

  3. اربط مثيل خدمة watsonx.ai Runtime بالمشروع الذي أنشأته في watsonx.ai.

الخطوة 3. تثبيت واستيراد المكتبات ذات الصلة وإعداد بيانات الاعتماد الخاصة بك.

سنحتاج إلى عدد قليل من المكتبات والوحدات لهذا البرنامج التعليمي. تأكَّد من استيراد الحزم التالية؛ وإذا لم تكن مثبَّتة، يمكنك تثبيتها بسرعة باستخدام أمر pip.

#installations
%pip install ibm-watsonx-ai | tail -n 1
%pip install pandas | tail -n 1
%pip install wget | tail -n 1
%pip install scikit-learn | tail -n 1
%pip install matplotlib | tail -n 1 #imports
import wget
import pandas as pd

from ibm_watsonx_ai import APIClient
from ibm_watsonx_ai.foundation_models.utils.enums import ModelTypes
from ibm_watsonx_ai.experiment import TuneExperiment
from ibm_watsonx_ai.helpers import DataConnection
from ibm_watsonx_ai.foundation_models import ModelInference
from sklearn.metrics import accuracy_score, f1_score
from datetime import datetime

إعداد بيانات الاعتماد الخاصة بك. أدخِل مفتاح واجهة برمجة التطبيقات ومعرِّف المشروع.

credentials = {
    "url": "https://us-south.ml.cloud.ibm.com",
    "apikey": "YOUR_API_KEY_HERE"
}

project_id = "YOUR_PROJECT_ID_HERE"

الخطوة 4. إنشاء البيئة واستيراد مجموعة البيانات.

كخطوة أولى لإعداد البيئة، أنشئ مثيلًا من APIClient باستخدام بيانات المصادقة الخاصة بك وعيِّن project_id.

client = APIClient(credentials)
client.set.default_project(project_id)

المخرجات

'SUCCESS'

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

لك الحرية في استخدام أي مجموعة بيانات من اختيارك. تتوفر العديد من مجموعات البيانات مفتوحة المصدر على منصات مثل HuggingFace.

train_filename = 'dog_grooming_reviews_train_data.json'

url = "https://raw.githubusercontent.com/AnnaGutowska/think/main/tutorials/prompt-tuning-tutorial/" + train_filename
wget.download(url)

asset_details = client.data_assets.create(name=train_filename, file_path=train_filename)
asset_id = client.data_assets.get_id(asset_details)

المخرجات:

جارٍ إنشاء أصول البيانات...

تم بنجاح

print(asset_id)

المخرجات

3b1db894-8d9e-428d-8fee-d96f328c7726

للحصول على بعض الرؤى عن تنسيق تقييمات العملاء هذه، دعونا نحمِّل البيانات في إطار بيانات Pandas وعرض بعض الصفوف التي تُظهر كلًا من التقييمات الإيجابية والسلبية. يُشير المُخرج "1" إلى التقييمات الإيجابية ويستخدم "0" للتقييمات السلبية.

pd.set_option('display.max_colwidth', None)
df = pd.read_json(train_filename)
df[5:10]

المخرجات:

الخطوة 5. ضبط النموذج.

يتم استخدام فئة TuneExperiment لإنشاء التجارب وجدولة عمليات الضبط. دعونا نستخدمها لتهيئة تجربتنا وتحديد نموذج الأساس وبيانات التدريب والمَعلمات الخاصة بنا. الهدف من تمرين ضبط المطالبات هذا هو تمكين النموذج اللغوي الكبير (LLM) من تخصيص ردوده بما يتوافق مع تقييمات رضا العملاء المستخرجة من مجموعة البيانات الخاصة بنا. هذه مهمة تصنيف، حيث يمكن تصنيف التقييمات على أنها إما إيجابية ("1") أو سلبية ("0").

في هذا البرنامج التعليمي، نقترح استخدام نموذج IBM Granite كنموذج لغوي كبير للحصول على نتائج مشابهة.

experiment = TuneExperiment(credentials,
    project_id=project_id
)

prompt_tuner = experiment.prompt_tuner(name="prompt tuning tutorial",
    task_id=experiment.Tasks.CLASSIFICATION,
    base_model="ibm/granite-3-8b-instruct",
    accumulate_steps=16,
    batch_size=8,
    learning_rate=0.001,
    max_input_tokens=128,
    max_output_tokens=2,
    num_epochs=12,
    tuning_type=experiment.PromptTuningTypes.PT,
    init_text="Extract the satisfaction from the comment. Return simple '1' for satisfied customer or '0' for unsatisfied. Comment:",
    init_method="text",
    verbalizer="classify {0, 1} {{input}}",
    auto_update_model=True
)

الآن بعد أن أعددنا تجربة الضبط، علينا ربطها بمجموعة البيانات الخاصة بنا. لهذا، دعونا نستخدم فئة DataConnection. يتطلب هذا الأمر asset_id الذي أنشأناه سابقًا عند تهيئة أصل البيانات باستخدام عميل واجهة برمجة التطبيقات الخاص بنا.

data_conn = DataConnection(data_asset_id=asset_id)

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

client.foundation_models.PromptTunableModels.show()

المخرجات:

{'FLAN_T5_XL': 'google/flan-t5-xl', 'GRANITE_13B_INSTRUCT_V2': 'ibm/granite-13b-instruct-v2', 'LLAMA_2_13B_CHAT': 'meta-llama/llama-2-13b-chat'}

tuning_details = prompt_tuner.run(
    training_data_references=[data_conn],
    background_mode=False)

المخرجات:

##############################################

Running '20671f17-ff53-470b-9bfe-04318ecb91d9'

##############################################


pending......
running....................................................................................................................................
completed
Training of '20671f17-ff53-470b-9bfe-04318ecb91d9' finished successfully.

الخطوة 6. تقييم نتائج الضبط.

للتأكد من اكتمال ضبط المطالبات، يمكننا التحقق من الحالة. إذا كانت الحالة التي تظهر أي شيء غير "completed"، يُرجى الانتظار حتى انتهاء عملية الضبط قبل المتابعة.

status = prompt_tuner.get_run_status()
print(status)

المخرجات

completed

يمكننا الآن استرجاع ملخص ضبط المطالبة. في هذا الملخص، سترى قيمة خسارة. لكل جولة تدريبية، تقيس دالة الخسارة الفرق بين النتائج المتوقعة والفعلية. وبالتالي، تُعَد القيم الأقل للخسارة أفضل.

prompt_tuner.summary()

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

prompt_tuner.plot_learning_curve()

المخرجات:

الخطوة 7. نشر النموذج المضبوط.

هذه الخطوة الخاصة بنشر النموذج المضبوط حاسمة لإتمام المرحلة التالية المتمثلة في مقارنة أداء النموذج المضبوط بالنموذج قبل الضبط.

ملاحظة: يتم تعيين SERVING_NAME على التاريخ والوقت الحاليين حيث يجب أن تكون قيمة فريدة.

model_id = prompt_tuner.get_model_id()

meta_props = {
    client.deployments.ConfigurationMetaNames.NAME: "PROMP TUNE DEPLOYMENT",
    client.deployments.ConfigurationMetaNames.ONLINE: {},
    client.deployments.ConfigurationMetaNames.SERVING_NAME : datetime.now().strftime('%Y_%m_%d_%H%M%S')
}

deployment_details = client.deployments.create(model_id, meta_props)

المخرجات

######################################################################################

Synchronous deployment creation for id: '6aa5dd5c-0cc4-44e0-9730-18303e88e14a' started

######################################################################################


initializing.......................
ready

-----------------------------------------------------------------------------------------------
Successfully finished deployment creation, deployment_id='24a97b84-47d0-4490-9f5f-21ed2376fdd6'
-----------------------------------------------------------------------------------------------

الخطوة 8. اختبار النموذج المضبوط.

الآن، دعنا نختبر أداء كلٍّ من النموذج المضبوط ونموذج الأساس الأصلي لنرى تأثيرات عملية الضبط التي أجريناها. أولًا، دعنا نحمِّل مجموعة البيانات الاختبارية. يجب أن تكون مجموعة البيانات هذه مجموعة فرعية من البيانات التي لم تكن موجودة أثناء الضبط. في كثير من الأحيان، تكون مجموعة الاختبار أصغر أيضًا من مجموعة التدريب. بالإضافة إلى ذلك، يحتوي كل إدخال في مجموعة بيانات الاختبار على المطالبة كبادئة لتعليق المستخدم.

test_filename = 'dog_grooming_reviews_test_data.json'
url = "https://raw.githubusercontent.com/AnnaGutowska/think/main/tutorials/prompt-tuning-tutorial/" + test_filename
wget.download(url)
data = pd.read_json(test_filename)

لنعرض جزءًا صغيرًا من مجموعة البيانات لفهم هيكلها بشكل أفضل.

data.head()

المخرجات:

عند تحميل مجموعة بيانات الاختبار، دعنا نستخرج المدخلات والمخرجات.

prompts = list(data.input)
satisfaction = list(data.output)
prompts_batch = ["\n".join([prompt]) for prompt in prompts]

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

prompts[0]

المخرجات:

'Extract the satisfaction from the comment. Return simple 1 for satisfied customer or 0 for unsatisfied.\nComment: Long wait times.\nSatisfaction:\n'

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

satisfaction[0]

المخرجات

0

الآن بعد أن أصبحت لدينا مجموعة بيانات الاختبار، دعنا نختبر الدقة ودرجة F1 لنموذجنا المضبوط. درجة F1 هي متوسط دقة النموذج واستدعائه. سنحتاج إلى deployment_id للقيام بذلك. لاحِظ أنه تم تعيين concurrency_limit على 2 لتجنب الوصول إلى حد معدل واجهة برمجة التطبيقات. هذا هو عدد الطلبات التي سيتم إرسالها بالتوازي.

deployment_id = deployment_details['metadata']['id']

tuned_model = ModelInference(
    deployment_id=deployment_id,
    api_client=client
)

tuned_model_results = tuned_model.generate_text(prompt=prompts_batch, concurrency_limit=2)
print(f'accuracy_score: {accuracy_score(satisfaction, [int(float(x)) for x in tuned_model_results])}, f1_score: {f1_score(satisfaction, [int(float(x)) for x in tuned_model_results])}')

المخرجات:

accuracy_score: 0.9827586206896551, f1_score: 0.9827586206896551

بالنظر إلى دقة النموذج العالية ودرجة F1 التي حصلنا عليها، دعنا نختبر أداء نموذج Granite نفسه دون أي ضبط.

base_model = ModelInference(
    model_id="ibm/granite-3-8b-instruct",
    api_client=client
)

base_model_results = base_model.generate_text(prompt=prompts_batch, concurrency_limit=2)

print(f'base model accuracy_score: {accuracy_score(satisfaction, [int(x) for x in base_model_results])}, base model f1_score: {f1_score(satisfaction, [int(x) for x in base_model_results])}')

المخرجات:

base model accuracy_score: 0.9310344827586207, base model f1_score: 0.9298245614035088

يتفوق نموذجنا المضبوط على نموذج الأساس المضبوط مسبقًا. ونظرًا لأن النموذج المضبوط متخصص في استخراج درجات الرضا، يمكن استخدامه لمهام أخرى تتعلق باستخراج الرضا. عمل رائع!

ملخص

في هذا البرنامج التعليمي، أجريت ضبطًا للمطالبة على نموذج IBM Granite باستخدام واجهة برمجة تطبيقات watsonx. لقد نجح النموذج الذي ضبطته ونشرته في التفوق على نموذج الأساس بدقة أكبر بنحو 5%.

حلول ذات صلة
®IBM® watsonx.ai

تدريب الذكاء الاصطناعي التوليدي والتحقق من صحته وضبطه ونشره، وكذلك قدرات نماذج الأساس والتعلم الآلي باستخدام IBM watsonx.ai، وهو استوديو الجيل التالي من المؤسسات لمنشئي الذكاء الاصطناعي. أنشئ تطبيقات الذكاء الاصطناعي في وقت قصير وباستخدام جزء بسيط من البيانات.

استكشف watsonx.ai
حلول الذكاء الاصطناعي

استفِد من الذكاء الاصطناعي في عملك بالاستعانة بخبرة IBM الرائدة في مجال الذكاء الاصطناعي ومحفظة حلولها التي ستكون بجانبك.

استكشف حلول الذكاء الاصطناعي
الاستشارات والخدمات في مجال الذكاء الاصطناعي

تساعد خدمات IBM Consulting AI في إعادة تصور طريقة عمل الشركات باستخدام حلول الذكاء الاصطناعي من أجل النهوض بأعمالها.

استكشف خدمات الذكاء الاصطناعي
اتخِذ الخطوة التالية

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

استكشف Concert® استكشف حلول أتمتة عمليات الأعمال