غالبًا ما يتضمن إنشاء نص باستخدام نماذج اللغة تحديد الرمز المميز التالي بناءً على توزيع الاحتمالات. نهج مباشر مثل البحث الجشع يحدد الرمز المميز الأكثر احتمالا، ولكن هذا يمكن أن يؤدي إلى مخرجات عامة أو متكررة. لإضافة التنوع والتحكم، أكثر تقدمًا استراتيجيات فك التشفير، مثل البحث عن الشعاع، وأخذ عينات النواة، وأخذ العينات من أعلى K، يتم استخدامها على نطاق واسع. هذه الاستراتيجيات، المدعومة بمكتبة 🤗المحولات، تمنحنا المرونة في تشكيل مخرجات النموذج.
ولكن ماذا لو أردنا أن نخطو خطوة أبعد و التحكم في عملية إنشاء النص نفسها عن طريق تعديل التوزيع الاحتمالي مباشرة؟ هذا هو المكان معالجة لوجيت يدخل حيز التنفيذ. تتيح لك واجهة برمجة التطبيقات LogitsProcessor API الخاصة بـ Hugging Face تخصيص درجات التنبؤ لرأس نموذج اللغة، مما يوفر تحكمًا دقيقًا في سلوك النموذج. لا تقدم مكتبة 🤗 Transformers مجموعة غنية من معالجات اللوجيستات المضمنة فحسب، بل تعمل أيضًا على تمكين المجتمع من إنشاء ومشاركة معالجات مخصصة مصممة خصيصًا لحالات الاستخدام الفريدة.
أدخل LogitsProcessorZoo من NVIDIA – وهي عبارة عن مجموعة من معالجات السجل المعيارية القوية المصممة لمهام محددة مثل التحكم في أطوال التسلسل أو فرض العبارات الرئيسية أو توجيه الإجابات متعددة الاختيارات. متوافق تمامًا مع الوجه المعانق generate
بهذه الطريقة، تعد مكتبة NVIDIA بمثابة مثال ممتاز للابتكار الذي يقوده المجتمع في معالجة السجلات.
في هذا المنشور، سنستكشف كيف يعمل LogitsProcessorZoo من NVIDIA على تحسين القدرات الحالية وتوسيعها، والتعمق في ميزاتها وإظهار كيف يمكنها تحسين سير عمل الذكاء الاصطناعي لديك.
ما هي السجلات في نماذج اللغة؟

مأخوذ من: https://jalammar.github.io/illustrated-gpt2/
اللوجيستات هي الدرجات الأولية غير الطبيعية التي تولدها نماذج اللغة لكل رمز مميز في مفرداتهم. يتم تحويل هذه النتائج إلى احتمالات عبر com.softmax وظيفة، وتوجيه النموذج في اختيار الرمز المميز التالي.
فيما يلي مثال لكيفية تناسب السجلات مع عملية الإنشاء:
from transformers import AutoTokenizer, AutoModelForCausalLM
import torch
model_name = "meta-llama/Llama-3.2-1B"
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(model_name, torch_dtype=torch.bfloat16, device_map="auto")
prompt = "The capital of France is"
inputs = tokenizer(prompt, return_tensors="pt").to(model.device)
with torch.inference_mode():
outputs = model(**inputs)
logits = outputs.logits
last_token_logits = logits[:, -1, :]
تمثل هذه السجلات ثقة النموذج لكل كلمة تالية محتملة. باستخدام softmax، يمكننا تحويلها إلى احتمالات وفك تشفيرها إلى النص الناتج:
next_token_probs = torch.nn.functional.softmax(last_token_logits, dim=-1)
predicted_token_ids = torch.argmax(next_token_probs, dim=-1)
generated_text = tokenizer.batch_decode(predicted_token_ids, skip_special_tokens=True)
print("Generated Text:", generated_text[0])
>>> Generated Text: Paris
بينما يوضح خط الأنابيب هذا كيف يمكن تحويل السجلات الأولية إلى نص، تجدر الإشارة إلى أن 🤗 المحولات تعمل على تبسيط هذه العملية. على سبيل المثال، generate() تتعامل الطريقة تلقائيًا مع هذه التحويلات، بما في ذلك تطبيق وظيفة softmax وأخذ العينات من التوزيع الاحتمالي.
ومع ذلك، قد تكون السجلات الأولية غير مرغوب فيها للمهام الشائعة مثل أخذ العينات أو فرض قيود خاصة بالمهمة. لمزيد من التفاصيل حول التعامل مع السجلات بشكل فعال أثناء الإنشاء، راجع منشور مدونة الجيل الخاص بـ Hugging Face. هذا هو المكان معالجة لوجيت يصبح لا غنى عنه لتكييف المخرجات مع الاحتياجات المحددة.
لماذا سجلات العمليات؟
غالبًا ما تفشل السجلات الأولية عند التحكم في سلوك الإخراج. على سبيل المثال:
- عدم وجود قيود: وقد لا يلتزمون بالتنسيقات المطلوبة أو القواعد النحوية أو الهياكل المحددة مسبقًا.
- الإفراط في التعميم: يمكن للنموذج أن يعطي الأولوية للاستجابات العامة بدلاً من النواتج المحددة عالية الجودة.
- اختلال المهمة: قد تنتهي التسلسلات في وقت مبكر جدًا، أو تكون مطولة بشكل مفرط، أو تفوت تفاصيل مهمة.
تمكننا معالجة السجل من تعديل سلوك النموذج عن طريق تعديل هذه النتائج الأولية قبل إنشائها.
NVIDIA’s LogitsProcessorZoo
تعمل تقنية LogitsProcessorZoo من NVIDIA على تبسيط المعالجة اللاحقة للسجلات باستخدام مكونات معيارية مصممة لمهام محددة. دعونا نستكشف ميزاته ونرى كيفية استخدامها. للمتابعة، توجه إلى دفتر الملاحظات وقم بتجربة معالجات السجل.
تثبيت المكتبة باستخدام:
pip install logits-processor-zoo
لتوضيح المعالجات، سنقوم بإنشاء نموذج بسيط LLMRunner فئة تقوم بتهيئة النموذج والرمز المميز، وكشف ملف generate_response طريقة. سنقوم بعد ذلك بتوفير معالجات مختلفة لـ generate_response طريقة ورؤيتهم في العمل.
class LLMRunner:
def __init__(self, model_name="meta-llama/Llama-3.2-1B-Instruct"):
self.tokenizer = AutoTokenizer.from_pretrained(model_name)
self.model = AutoModelForCausalLM.from_pretrained(
model_name,
torch_dtype=torch.bfloat16,
device_map="auto",
)
def generate_response(self, prompts, logits_processor_list=None, max_tokens=1000):
if logits_processor_list is None:
logits_processor_list = []
for prompt in prompts:
conversation = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": prompt},
]
inputs = self.tokenizer.apply_chat_template(
conversation,
tokenize=True,
add_generation_prompt=True,
return_tensors="pt",
return_dict=True,
).to(self.model.device)
outputs = self.model.generate(
**inputs,
max_new_tokens=max_tokens,
min_new_tokens=1,
logits_processor=LogitsProcessorList(logits_processor_list),
)
gen_output = self.tokenizer.batch_decode(
outputs, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
generated_text = gen_output[0][
len(
self.tokenizer.decode(
inputs["input_ids"][0], skip_special_tokens=True
)
) :
].strip()
print(f"Prompt: {prompt}")
print()
print(f"LLM response:\n{generated_text}")
runner = LLMRunner()
1. معالج GenLengthLogits
تحكم في طول التسلسلات التي تم إنشاؤها عن طريق ضبط احتمالية رمز نهاية التسلسل (EOS).
يعد هذا المعالج مفيدًا بشكل خاص في السيناريوهات التي يلعب فيها الطول المطلوب للنص الذي تم إنشاؤه دورًا حاسمًا، مثل إنشاء ملخصات موجزة، أو تقييد المخرجات المطولة، أو تخصيص الاستجابات لحالات استخدام محددة. على سبيل المثال، يمكن أن يساعد في التأكد من أن برنامج الدردشة الآلي يقدم استجابات قصيرة وذات معنى مع الحفاظ على السلامة النحوية من خلال استكمال الجمل عند الحاجة.
example_prompts =[
"Tell me a story about a kid lost in forest."
]
print(runner.generate_response(
example_prompts,
[GenLengthLogitsProcessor(runner.tokenizer, boost_factor=0.1, p=2, complete_sentences=True)]
))
رد LLM: ذات مرة، في غابة كثيفة، عاش هناك صبي صغير اسمه تيمي. كان تيمي في رحلة تخييم عائلية مع والديه وأخته الصغيرة إيما. لقد كانوا يسيرون لساعات، وبدا أن الأشجار الكثيفة تقترب من حولهم. عندما بدأت الشمس بالغروب، أدرك تيمي أنه ابتعد عن عائلته. في البداية، لم يشعر تيمي بالذعر. لقد فكر في مناداة والديه وإيما، لكن صوته كان أجشًا من غناء أغاني نار المخيم. نظر حوله، ولكن يبدو أن الأشجار تمتد إلى الأبد، مما يجعل من المستحيل رؤية أي معالم مألوفة. ومع تزايد الظلام، بدأ الخوف يتسلل إلى تيمي.
print(runner.generate_response(
example_prompts,
[GenLengthLogitsProcessor(runner.tokenizer, boost_factor=-10.0, p=0, complete_sentences=False)]
))
رد LLM: ذات مرة، في غابة كثيفة ونابضة بالحياة، عاش هناك صبي صغير اسمه ماكس. كان ماكس طفلاً مغامرًا وفضوليًا يبلغ من العمر 8 سنوات وكان يحب استكشاف الهواء الطلق. بعد ظهر أحد الأيام المشمسة، بينما كان يتجول في الغابة، عثر على طريق ضيق لم يسبق له رؤيته من قبل. متحمسًا لهذا الاكتشاف، قرر ماكس أن يتبع المسار ويرى إلى أين سيؤدي. كانت الغابة تعج بالحياة، وأدى ضوء الشمس المتسلل عبر الأشجار إلى خلق جو سحري. مشى ماكس لمدة 20 دقيقة تقريبًا، وعيناه تفحصان المناطق المحيطة بحثًا عن أي علامات للحضارة. عندما بدأت الشمس بالغروب، وألقت وهجًا برتقاليًا دافئًا فوق الغابة، أدرك ماكس أنه ضائع. لم يكن لديه هاتف ولا محفظة ولا وسيلة للتواصل مع عائلته. بدأ الذعر في الظهور، وبدأ ماكس يشعر بالخوف والوحدة. مذعورًا، بدأ ماكس بالركض عبر الغابة، وكان قلبه يتسارع وساقاه ترتجفان. عثر على منطقة خالية ورأى ضوءًا خافتًا من بعيد. وعندما اقترب، رأى كوخًا صغيرًا في وسط الفسحة. كان الدخان يتصاعد من المدخنة، وكان ماكس يسمع صوت شخص يغني لحنًا لطيفًا. …
في الأمثلة أعلاه، استخدمنا GenLengthLogitsProcessor لتقصير وإطالة الاستجابة الناتجة عن النموذج.
2.CiteFromPromptLogitsProcessor
قم بتعزيز أو تقليل الرموز المميزة من الموجه لتشجيع المخرجات المماثلة.
يعد هذا مفيدًا بشكل خاص في المهام التي تتطلب الاحتفاظ بالسياق، مثل الإجابة على الأسئلة بناءً على مقطع ما، أو إنشاء ملخصات بتفاصيل محددة، أو إنتاج مخرجات متسقة في أنظمة الحوار. على سبيل المثال، في مقتطف الكود المحدد حيث يتم تحليل مراجعة المستخدم، يضمن هذا المعالج أن النموذج يولد استجابة مرتبطة بشكل وثيق بمحتوى المراجعة، مثل التأكيد على الآراء حول سعر المنتج.
example_prompts =[
"""
A user review: very soft, colorful, expensive but deserves its price, stylish.
What is the user's opinion about the product's price?
""",
]
print(runner.generate_response(
example_prompts,
[CiteFromPromptLogitsProcessor(runner.tokenizer, example_prompts, boost_factor=5.0)],
max_tokens=50,
))
رد LLM: بناءً على مراجعة المستخدم، رأي المستخدم حول سعر المنتج هو: المستخدم راضٍ جدًا، ولكن السعر باهظ الثمن، ولكن المنتج أنيق وناعم وملون، وهو السعر الذي يرغب المستخدم في دفعه
لاحظ كيف يستشهد الجيل بموجه الإدخال.
3. معالج ForceLastPhraseLogits
إجبار النموذج على تضمين عبارة محددة قبل إنهاء مخرجاته.
يعد هذا المعالج مفيدًا بشكل خاص في سيناريوهات إنشاء المحتوى المنظم حيث يكون الاتساق أو الالتزام بتنسيق معين أمرًا بالغ الأهمية. إنه مثالي لمهام مثل إنشاء الاستشهادات أو التقارير الرسمية أو المخرجات التي تتطلب صياغة محددة للحفاظ على عرض تقديمي احترافي أو منظم.
example_prompts = [
"""
Retrieved information from: https://en.wikipedia.org/wiki/Bulbasaur
Bulbasaur is a fictional Pokémon species in Nintendo and Game Freak's Pokémon franchise.
Designed by Atsuko Nishida, Bulbasaur is a Grass and Poison-type, first appearing in Pocket Monsters: Red and Green (Pokémon Red and Blue outside Japan) as a starter Pokémon.
Since then, it has reappeared in sequels, spin-off games, related merchandise, and animated and printed adaptations of the franchise.
It is a central character in the Pokémon anime, being one of Ash Ketchum's main Pokémon for the first season, with a different one later being obtained by supporting character May.
It is featured in various manga and is owned by protagonist Red in Pokémon Adventures.
What is Bulbasaur?
""",
]
phrase = "\n\nReferences:"
batch_size = len(example_prompts)
print(runner.generate_response(
example_prompts,
[ForceLastPhraseLogitsProcessor(phrase, runner.tokenizer, batch_size)]
))
رد LLM: وفقًا للمعلومات المستردة من مقالة ويكيبيديا، فإن Bulbasaur هو نوع بوكيمون خيالي في امتياز Pokémon. إنه بوكيمون من نوع العشب والسم، وقد ظهر في أشكال مختلفة من الوسائط، بما في ذلك: – باعتباره بوكيمون مبتدئًا في الجيل الأول من ألعاب البوكيمون، بما في ذلك البوكيمون الأحمر والأزرق. – كشخصية رئيسية في أنيمي البوكيمون، حيث يعد أحد البوكيمونات الأولى لآش كيتشوم. – كشخصية في بوكيمون مانغا، حيث يملكها بطل الرواية ريد. – كشخصية في العديد من وسائط البوكيمون الأخرى، مثل الألعاب العرضية والبضائع ذات الصلة. يعد Bulbasaur أيضًا شخصية مركزية في سلسلة Pokémon، وغالبًا ما يظهر جنبًا إلى جنب مع Pokémon الآخرين ويكون جزءًا أساسيًا من عالم Pokémon. المراجع: – https://en.wikipedia.org/wiki/Bulbasaur
phrase = "\n\nThanks for trying our RAG application! If you have more questions about"
print(runner.generate_response(example_prompts,
[ForceLastPhraseLogitsProcessor(phrase, runner.tokenizer, batch_size)]
))
استجابة LLM: Bulbasaur هو نوع بوكيمون خيالي في امتياز Pokémon. وهو بوكيمون من نوع العشب والسم، ويتميز بمظهره المميز. شكرًا لك على تجربة تطبيق RAG الخاص بنا! إذا كان لديك المزيد من الأسئلة حول بلباسور، فلا تتردد في طرحها.
مع كل جيل تمكنا من إضافة phrase السلسلة مباشرة قبل نهاية الجيل.
4. معالج سجلات الاختيار المتعدد
قم بتوجيه النموذج للإجابة على أسئلة الاختيار من متعدد عن طريق تحديد أحد الخيارات المحددة.
يعد هذا المعالج مفيدًا بشكل خاص في المهام التي تتطلب التزامًا صارمًا بتنسيق إجابة منظم، مثل الاختبارات أو الاستطلاعات أو أنظمة دعم اتخاذ القرار.
example_prompts = [
"""
I am getting a lot of calls during the day. What is more important for me to consider when I buy a new phone?
0. Camera
1. Battery
2. Operating System
3. Screen Resolution
Answer:
""",
]
mclp = MultipleChoiceLogitsProcessor(
runner.tokenizer,
choices=["0", "1", "2", "3"],
delimiter="."
)
print(runner.generate_response(example_prompts, [mclp], max_tokens=1))
رد LLM: 1
هنا نموذجنا لا يولد أي شيء آخر غير الاختيار. وهذه سمة مفيدة للغاية أثناء العمل مع الوكلاء أو استخدام النماذج لأسئلة الاختيار من متعدد.
التفاف
سواء كنت تقوم بإنشاء ملخصات موجزة، أو صياغة استجابات لروبوتات الدردشة، أو حل مهام منظمة مثل أسئلة الاختيار من متعدد، توفر معالجات logit المرونة للتحكم في المخرجات بشكل فعال. وهذا يجعلها لا تقدر بثمن بالنسبة للسيناريوهات التي تكون فيها الدقة أو الالتزام بالقيود أو السلوك الخاص بالمهمة أمرًا بالغ الأهمية.
إذا كنت مهتمًا باستكشاف المزيد حول كيفية التحكم في الإنشاء باستخدام معالجات السجل، فإليك بعض الموارد للبدء:
باستخدام أدوات LogitsProcessorZoo وHugging Face من NVIDIA، لديك نظام بيئي قوي ينقل تطبيقات نماذج اللغة الخاصة بك إلى المستوى التالي. قم بتجربة هذه المكتبات، وقم ببناء حلول مخصصة، وشارك إبداعاتك مع المجتمع لدفع حدود ما هو ممكن باستخدام الذكاء الاصطناعي التوليدي.