Transformers documentation
هندسة الأوامر
هندسة الأوامر
تستخدم هندسة الأوامر (Prompt Engineering) أو صياغة الأوامر (Prompting) اللغة الطبيعية لتحسين أداء نماذج اللغة الكبيرة (LLM) في مجموعة متنوعة من المهام. يمكن للأمر (Prompt) توجيه النموذج نحو توليد المخرجات المطلوبة. في كثير من الحالات، لا تحتاج حتى إلى نموذج مُحسَّن (Fine-tuned) للمهمة. كل ما تحتاجه هو أمر جيد.
جرّب توجيه نموذج لغوي كبير لتصنيف بعض النصوص. عند إنشاء موجه، من المهم تقديم تعليمات محددة للغاية حول المهمة والمظهر الذي يجب أن يكون عليه الناتج.
from transformers import pipeline
import torch
pipeline = pipeline(task="text-generation", model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Classify the text into neutral, negative or positive.
Text: This movie is definitely one of my favorite movies of its kind. The interaction between respectable and morally strong characters is an ode to chivalry and the honor code amongst thieves and policemen.
Sentiment:
"""
outputs = pipeline(prompt, max_new_tokens=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Classify the text into neutral, negative or positive.
Text: This movie is definitely one of my favorite movies of its kind. The interaction between respectable and morally strong characters is an ode to chivalry and the honor code amongst thieves and policemen.
Sentiment:
Positiveتكمن الصعوبة في تصميم الأوامر التي تُنتج النتائج التي تتوقعها، لأن اللغة دقيقة ومعبرة للغاية.
يتناول هذا الدليل أفضل الممارسات والتقنيات والأمثلة في هندسة الأوامر (Prompt Engineering) حول كيفية حل مهام اللغة والاستدلال.
أفضل الممارسات
حاول اختيار أحدث النماذج للحصول على أفضل أداء. ضع في اعتبارك أن نماذج اللغة الكبيرة (LLMs) قد تأتي بنوعين، أساسي ومُحسَّن للتعليمات (أو للدردشة).
تتميّز النماذج الأساسية بامتيازها في إكمال النص بناءً على موجه أولي، لكنها أقل كفاءة في اتباع التعليمات. أما النماذج المُعدَّلة بالتعليمات فهي إصدارات مُدرَّبة خصيصًا من النماذج الأساسية على بيانات تعليمية أو محادثة. وهذا يجعل النماذج المُعدَّلة بالتعليمات أكثر ملاءمة لاستخدام الموجهات.
عادةً ما تكون نماذج LLM الحديثة نماذج فكّ ترميز فقط، لكن هناك بعض نماذج LLM من نوع المُرمِّز-فكّ الترميز مثل Flan-T5 أو BART يمكن استخدامها للتوجيه. حمّل هذه النماذج مباشرةً باستخدام فئة AutoModelForSeq2SeqLM (بدلًا من استخدام Pipeline) وولّد المخرجات من النموذج نفسه.
ابدأ بموجز قصير وبسيط، ثم قم بتكرار تحسينه للحصول على نتائج أفضل.
ضع التعليمات في بداية الموجه أو نهايته. ففي الموجهات الأطول، قد تطبّق النماذج تحسينات لمنع الانتباه من التوسع بشكل تربيعي، مما يضع تركيزًا أكبر على بداية الموجه ونهايته.
افصل بوضوح بين التعليمات ونص الاهتمام.
كن محدداً ووصفياً بشأن المهمة والمخرجات المطلوبة، بما في ذلك على سبيل المثال، صيغتها وطولها وأسلوبها ولغتها. تجنّب الأوصاف والتعليمات الغامضة.
يجب أن تركز التعليمات على «ما يجب فعله» بدلاً من «ما يجب عدم فعله».
قُد النموذج لتوليد المخرج الصحيح من خلال كتابة الكلمة الأولى أو حتى الجملة الأولى.
جرّب تقنيات أخرى مثل few-shot وchain-of-thought لتحسين النتائج.
اختبر أوامر الإدخال الخاصة بك مع نماذج مختلفة لتقييم متانتها.
نسخة وأداء موجهاتك وتتبعها.
تقنيات
قد لا يكون صياغة موجه جيدة بحد ذاتها، وهو ما يُعرف أيضاً بالتوجيه بلا أمثلة (zero-shot prompting)، كافياً للحصول على النتائج التي ترغب فيها. قد تحتاج إلى تجربة تقنيات توجيه مختلفة لتحقيق أفضل أداء.
يتناول هذا القسم بعض تقنيات صياغة الأوامر.
التلميح بعدد قليل من الأمثلة
يحسّن التلميح بعدد قليل من الأمثلة (Few-shot prompting) الدقة والأداء من خلال تضمين أمثلة محددة لما ينبغي للنموذج توليده عند تقديم مدخل معين. تمنح هذه الأمثلة الصريحة النموذج فهماً أفضل للمهمة ولصيغة المخرجات التي تبحث عنها. جرّب تجربة أعداد مختلفة من الأمثلة (2، 4، 8، إلخ) لمعرفة تأثيرها على الأداء. يوفر المثال أدناه للنموذج مثالاً واحداً (1-shot) على صيغة المخرجات (تاريخ بصيغة MM/DD/YYYY) التي ينبغي أن يعيدها.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Text: The first human went into space and orbited the Earth on April 12, 1961.
Date: 04/12/1961
Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon.
Date:"""
outputs = pipeline(prompt, max_new_tokens=12, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
# Result: Text: The first human went into space and orbited the Earth on April 12, 1961.
# Date: 04/12/1961
# Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon.
# Date: 09/28/1960العيوب الكامنة في التلميح بعدد قليل من الأمثلة هي أنك بحاجة إلى إنشاء تلميحات أطول، مما يزيد من حجم الحسابات وزمن الاستجابة. كما أن هناك حدًا أقصى لطول التلميحات. وأخيرًا، قد يتعلم النموذج أنماطًا غير مقصودة من أمثلتك، وقد لا يعمل بشكل جيد في مهام الاستدلال المعقدة.
لتحسين التلميح بعدد قليل من الأمثلة (few-shot prompting) في نماذج اللغة الكبيرة الحديثة المُدرَّبة على التعليمات، استخدم قالب المحادثة الخاص بالنموذج. تُدرَّب هذه النماذج على مجموعات بيانات تحتوي على محادثات قائمة على الأدوار بين «المستخدم» و«المساعد». إن هيكلة التلميح بما يتوافق مع هذا النمط يمكن أن يحسّن الأداء.
قم ببناء موجهك كمحادثة قائمة على الأدوار، واستخدم طريقة apply_chat_template لتجزئته وتنسيقه.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
messages = [
{"role": "user", "content": "Text: The first human went into space and orbited the Earth on April 12, 1961."},
{"role": "assistant", "content": "Date: 04/12/1961"},
{"role": "user", "content": "Text: The first-ever televised presidential debate in the United States took place on September 28, 1960, between presidential candidates John F. Kennedy and Richard Nixon."}
]
prompt = pipeline.tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True)
outputs = pipeline(prompt, max_new_tokens=12, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")في حين أن نهج التلميح بعدد قليل من الأمثلة (few-shot) الأساسي كان يُضمّن الأمثلة ضمن نص واحد، فإن قالب المحادثة (chat template) يوفر المزايا التالية.
- قد يكون لدى النموذج فهم محسّن بشكل محتمل، إذ يمكنه التعرف بشكل أفضل على النمط والأدوار المتوقعة لإدخال المستخدم ومخرجات المساعد.
- قد يُخرج النموذج تنسيق المخرجات المطلوب بشكل أكثر اتساقاً، وذلك لأن بنيته تشبه مدخلاته أثناء التدريب.
استشر دائمًا توثيق نموذج مُهيّأ بأوامر محددة لمعرفة المزيد حول قالب المحادثة الخاص به، حتى تتمكن من هيكلة استعلاماتك القليلة الأمثلة (few-shot) وفقًا لذلك.
سلسلة الأفكار
تُعدّ سلسلة الأفكار (CoT) فعّالة في توليد مخرجات أكثر تماسكاً وقوةً في الاستدلال، وذلك من خلال تقديم سلسلة من الأوامر التي تساعد النموذج على "التفكير" بشكل أكثر شمولاً في موضوع معيّن.
يوفر المثال أدناه للنموذج عدة موجهات للعمل عبر خطوات الاستدلال الوسيطة.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Let's go through this step-by-step:
1. You start with 15 muffins.
2. You eat 2 muffins, leaving you with 13 muffins.
3. You give 5 muffins to your neighbor, leaving you with 8 muffins.
4. Your partner buys 6 more muffins, bringing the total number of muffins to 14.
5. Your partner eats 2 muffins, leaving you with 12 muffins.
If you eat 6 muffins, how many are left?"""
outputs = pipeline(prompt, max_new_tokens=20, do_sample=True, top_k=10)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Let's go through this step-by-step:
1. You start with 15 muffins.
2. You eat 2 muffins, leaving you with 13 muffins.
3. You give 5 muffins to your neighbor, leaving you with 8 muffins.
4. Your partner buys 6 more muffins, bringing the total number of muffins to 14.
5. Your partner eats 2 muffins, leaving you with 12 muffins.
If you eat 6 muffins, how many are left?
Answer: 6كما هو الحال مع تلميح few-shot، فإن العيب في CoT هو أنه يتطلب جهداً أكبر لتصميم سلسلة من التلميحات تساعد النموذج على الاستدلال عبر مهمة معقدة، كما أن طول التلميح يزيد من زمن الاستجابة.
الضبط الدقيق
على الرغم من أن التوجيه (Prompting) هو طريقة قوية للتعامل مع نماذج اللغة الكبيرة (LLMs)، إلا أن هناك سيناريوهات يكون فيها النموذج المُحسَّن (Fine-tuned) أو حتى عملية تحسين النموذج (Fine-tuning) أكثر فعالية.
فيما يلي بعض الأمثلة على السيناريوهات التي يكون فيها ضبط النموذج الدقيق مناسبًا.
- منطقتك المعرفية مختلفة للغاية عن البيانات التي تم تدريب نموذج اللغة الكبير عليها مسبقاً، ولم تُنتج المحفزات المكثفة النتائج التي ترغب فيها.
- يجب أن يعمل نموذجك بشكل جيد في لغة محدودة الموارد.
- يتعيّن تدريب نموذجك على بيانات حسّاسة تخضع لمتطلبات تنظيمية صارمة.
- أنت تستخدم نموذجًا صغيرًا بسبب التكلفة أو الخصوصية أو البنية التحتية أو قيود أخرى.
في جميع هذه السيناريوهات، تأكد من أنك تمتلك مجموعة بيانات كافية الحجم ومخصصة للمجال لتدريب نموذجك، وأن لديك الوقت والموارد الكافية، وأن تكلفة الضبط الدقيق تستحق العناء. وإلا، فقد يكون من الأفضل لك محاولة تحسين موجهك.
أمثلة
تُوضِّح الأمثلة أدناه كيفية توجيه نموذج لغة كبير (LLM) لأداء مهام مختلفة.
from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Return a list of named entities in the text.
Text: The company was founded in 2016 by French entrepreneurs Clément Delangue, Julien Chaumond, and Thomas Wolf in New York City, originally as a company that developed a chatbot app targeted at teenagers.
Named entities:
"""
outputs = pipeline(prompt, max_new_tokens=50, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: [Clément Delangue, Julien Chaumond, Thomas Wolf, company, New York City, chatbot app, teenagers]from transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Translate the English text to French.
Text: Sometimes, I've believed as many as six impossible things before breakfast.
Translation:
"""
outputs = pipeline(prompt, max_new_tokens=20, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: À l'occasion, j'ai croyu plus de six choses impossiblesfrom transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Permaculture is a design process mimicking the diversity, functionality and resilience of natural ecosystems. The principles and practices are drawn from traditional ecological knowledge of indigenous cultures combined with modern scientific understanding and technological innovations. Permaculture design provides a framework helping individuals and communities develop innovative, creative and effective strategies for meeting basic needs while preparing for and mitigating the projected impacts of climate change.
Write a summary of the above text.
Summary:
"""
outputs = pipeline(prompt, max_new_tokens=30, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: Permaculture is the design process that involves mimicking natural ecosystems to provide sustainable solutions to basic needs. It is a holistic approach that combfrom transformers import pipeline
import torch
pipeline = pipeline(model="mistralai/Mistral-7B-Instruct-v0.1", dtype=torch.bfloat16, device_map="auto")
prompt = """Answer the question using the context below.
Context: Gazpacho is a cold soup and drink made of raw, blended vegetables. Most gazpacho includes stale bread, tomato, cucumbers, onion, bell peppers, garlic, olive oil, wine vinegar, water, and salt. Northern recipes often include cumin and/or pimentón (smoked sweet paprika). Traditionally, gazpacho was made by pounding the vegetables in a mortar with a pestle; this more laborious method is still sometimes used as it helps keep the gazpacho cool and avoids the foam and silky consistency of smoothie versions made in blenders or food processors.
Question: What modern tool is used to make gazpacho?
Answer:
"""
outputs = pipeline(prompt, max_new_tokens=10, do_sample=True, top_k=10, return_full_text=False)
for output in outputs:
print(f"Result: {output['generated_text']}")
Result: A blender or food processor is the modern tool