![]() |
![]() |
|
![]() |
تتفوّق النماذج اللغوية الكبيرة (LLM)، مثل "جيما"، في إنشاء الردود الإعلامية، ما يجعلها مثالية لإنشاء مساعدين افتراضيين وبرامج دردشة مبرمجة.
عادةً، تعمل النماذج اللغوية الكبيرة بدون حالة، ما يعني أنّها تفتقر إلى ذاكرة متأصلة لتخزين المحادثات السابقة. تتم معالجة كل طلب أو سؤال بشكل مستقل، وتجاهل التفاعلات السابقة. ومع ذلك، فإن أحد الجوانب المهمة للمحادثة الطبيعية هو القدرة على الاحتفاظ بالسياق من التفاعلات السابقة. للتغلّب على هذه القيود والسماح للنماذج اللغوية الكبيرة بالحفاظ على سياق المحادثة، يجب تزويدها بشكل صريح بالمعلومات ذات الصلة، مثل سجلّ المحادثات (أو الأجزاء ذات الصلة) في كل طلب جديد يتم تقديمه إلى النموذج اللغوي الكبير.
يشرح لك هذا البرنامج التعليمي كيفية تطوير روبوت دردشة باستخدام صيغة نموذج Gemma المضبوطة وفقًا للتعليمات.
ضبط إعدادات الجهاز
إعداد Gemma
لإكمال هذا الدليل التعليمي، عليك أولاً إكمال تعليمات الإعداد في صفحة إعداد Gemma. توضح لك تعليمات إعداد Gemma كيفية إجراء ما يلي:
- يمكنك الوصول إلى Gemma على kaggle.com.
- يجب اختيار بيئة تشغيل Colab بها موارد كافية للتشغيل. نموذج Gemma 2B.
- إنشاء وتكوين اسم مستخدم ومفتاح واجهة برمجة تطبيقات Kaggle.
بعد الانتهاء من إعداد Gemma، انتقِل إلى القسم التالي، حيث يمكنك ضبط متغيّرات البيئة لبيئة Colab.
ضبط متغيرات البيئة
ضبط متغيّرات البيئة لكل من KAGGLE_USERNAME
وKAGGLE_KEY
import os
from google.colab import userdata
# Note: `userdata.get` is a Colab API. If you're not using Colab, set the env
# vars as appropriate for your system.
os.environ["KAGGLE_USERNAME"] = userdata.get('KAGGLE_USERNAME')
os.environ["KAGGLE_KEY"] = userdata.get('KAGGLE_KEY')
تثبيت الملحقات
تثبيت Keras وKerasNLP.
# Install Keras 3 last. See https://keras.io/getting_started/ for more details.
pip install -q tensorflow-cpu
pip install -q -U keras-nlp tensorflow-hub
pip install -q -U "keras>=3"
pip install -q -U tensorflow-text
تحديد واجهة خلفية
Keras هي واجهة برمجة تطبيقات عالية المستوى ومتعددة الإطارات للتعلُّم المعمّق تم تصميمها لتبسيط عملية استخدامها وتسهيل استخدامها. يتيح لك Keras 3 اختيار الخلفية: TensorFlow أو JAX أو PyTorch. سيعمل الثلاثة في هذا البرنامج التعليمي.
import os
# Select JAX as the backend
os.environ["KERAS_BACKEND"] = "jax"
# Pre-allocate 100% of TPU memory to minimize memory fragmentation
os.environ["XLA_PYTHON_CLIENT_MEM_FRACTION"] = "1.0"
استيراد الطرود
استيراد Keras وKerasNLP.
import keras
import keras_nlp
# for reproducibility
keras.utils.set_random_seed(42)
إنشاء مثيل النموذج
يوفّر KerasNLP عمليات تنفيذ للعديد من بُنى النماذج الشائعة. في هذا البرنامج التعليمي، ستُنشئ مثيلاً للنموذج باستخدام GemmaCausalLM
، وهو نموذج Gemma المتكامل للنمذجة اللغوية السببية. يتنبأ النموذج اللغوي السببي بالرمز المميز التالي بناءً على الرموز المميزة السابقة.
إنشاء مثيل النموذج باستخدام الطريقة from_preset
:
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma2_instruct_2b_en")
تنشئ الدالة GemmaCausalLM.from_preset()
مثيلاً للنموذج من بنية وأوزان مُعدّة مسبقًا. في الرمز أعلاه، تحدّد السلسلة "gemma2_instruct_2b_en"
الإعداد المُسبَق لنموذج Gemma 2 2B مع مليارَي مَعلمة. وتتوفّر أيضًا نماذج Gemma ذات المَعلمات 7B و9B و27B. يمكنك العثور على سلاسل الرموز لنماذج Gemma في بيانات صيغة النموذج على Kaggle.
استخدِم الطريقة summary
للحصول على مزيد من المعلومات عن النموذج:
gemma_lm.summary()
كما ترى من الملخص، يحتوي النموذج على 2.6 مليار معلَمة قابلة للتدريب.
تحديد دوال التنسيق المساعِد
from IPython.display import Markdown
import textwrap
def display_chat(prompt, text):
formatted_prompt = "<font size='+1' color='brown'>🙋♂️<blockquote>" + prompt + "</blockquote></font>"
text = text.replace('•', ' *')
text = textwrap.indent(text, '> ', predicate=lambda _: True)
formatted_text = "<font size='+1' color='teal'>🤖\n\n" + text + "\n</font>"
return Markdown(formatted_prompt+formatted_text)
def to_markdown(text):
text = text.replace('•', ' *')
return Markdown(textwrap.indent(text, '> ', predicate=lambda _: True))
إنشاء روبوت الدردشة
تم تحسين نموذج Gemma المعدَّل gemma2_instruct_2b_en
لفهم رموز الانعطاف التالية:
<start_of_turn>user\n ... <end_of_turn>\n
<start_of_turn>model\n ... <end_of_turn>\n
يستخدم هذا البرنامج التعليمي هذه الرموز المميّزة لإنشاء روبوت الدردشة. يُرجى الرجوع إلى تعليمات التنسيق والنظام للحصول على مزيد من المعلومات عن الرموز المميّزة للتحكّم في Gemma.
إنشاء مساعد دردشة لإدارة حالة المحادثة
class ChatState():
"""
Manages the conversation history for a turn-based chatbot
Follows the turn-based conversation guidelines for the Gemma family of models
documented at https://ai.google.dev/gemma/docs/formatting
"""
__START_TURN_USER__ = "<start_of_turn>user\n"
__START_TURN_MODEL__ = "<start_of_turn>model\n"
__END_TURN__ = "<end_of_turn>\n"
def __init__(self, model, system=""):
"""
Initializes the chat state.
Args:
model: The language model to use for generating responses.
system: (Optional) System instructions or bot description.
"""
self.model = model
self.system = system
self.history = []
def add_to_history_as_user(self, message):
"""
Adds a user message to the history with start/end turn markers.
"""
self.history.append(self.__START_TURN_USER__ + message + self.__END_TURN__)
def add_to_history_as_model(self, message):
"""
Adds a model response to the history with start/end turn markers.
"""
self.history.append(self.__START_TURN_MODEL__ + message)
def get_history(self):
"""
Returns the entire chat history as a single string.
"""
return "".join([*self.history])
def get_full_prompt(self):
"""
Builds the prompt for the language model, including history and system description.
"""
prompt = self.get_history() + self.__START_TURN_MODEL__
if len(self.system)>0:
prompt = self.system + "\n" + prompt
return prompt
def send_message(self, message):
"""
Handles sending a user message and getting a model response.
Args:
message: The user's message.
Returns:
The model's response.
"""
self.add_to_history_as_user(message)
prompt = self.get_full_prompt()
response = self.model.generate(prompt, max_length=2048)
result = response.replace(prompt, "") # Extract only the new response
self.add_to_history_as_model(result)
return result
الدردشة مع النموذج
ابدأ الدردشة مع النموذج.
chat = ChatState(gemma_lm)
message = "Tell me, in a few words, how to compute all prime numbers up to 1000?"
display_chat(message, chat.send_message(message))
🙋♂️
أخبرني، بكلمات قليلة، كيف يمكنني حساب جميع الأعداد الأولية حتى 1000؟🤖.
منخل "إراتوستين"
تابع المحادثة.
message = "Now in Python! No numpy, please!"
display_chat(message, chat.send_message(message))
🙋♂️
الآن في Python! لا أريد numpy!🤖.
def sieve_of_eratosthenes(n): """Returns a list of prime numbers up to n.""" primes = [True] * (n + 1) primes[0] = primes[1] = False for i in range(2, int(n**0.5) + 1): if primes[i]: for j in range(i * i, n + 1, i): primes[j] = False return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes)
الشرح:
الإعداد:
primes = [True] * (n + 1)
: يتم إنشاء قائمةprimes
بالقيم المنطقية، على افتراض أنّ جميع الأرقام أعداد أولية.primes[0] = primes[1] = False
: لضبط 0 و1 على أنّه غير أوليالتكرار:
for i in range(2, int(n**0.5) + 1):
: يتكرر من 2 إلى الجذر التربيعي لـn
. نحتاج فقط إلى التحقق من الجذر التربيعي لأنّ أي عدد مركب يجب أن يكون له عامل أولي أصغر من جذره التربيعي أو مساويًا له.if primes[i]:
: إذا تم وضع علامة على السمةi
كعنصر أساسي:
for j in range(i * i, n + 1, i):
: يضع علامة على كل مضاعفاتi
على أنها غير أولية.النتيجة:
return [i for i, is_prime in enumerate(primes) if is_prime]
: تنشئ قائمة بالفهارس حيث تكونprimes[i]
هي True، وتمثل الأعداد الأولية.يُرجى إعلامي إذا أردت الحصول على شرح أكثر تفصيلاً لأي جزء.
message = "Thank you, it works! Can you explain the code in French?"
display_chat(message, chat.send_message(message))
🙋♂️
شكرًا لك، لقد نجح الأمر. هل يمكنك شرح الرمز باللغة الفرنسية؟🤖.
مسلسل Bien sèr ! Voici une explication du code en français :
def sieve_of_eratosthenes(n): """Retourne une liste de nombres premiers jusqu'à n.""" primes = [True] * (n + 1) primes[0] = primes[1] = False for i in range(2, int(n**0.5) + 1): if primes[i]: for j in range(i * i, n + 1, i): primes[j] = False return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes)
التفسير:
الإعداد:
primes = [True] * (n + 1)
: Crée une listeprimes
de valeurs booléennes, setupement supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: تتوفر فيه كل المزايا المقدَّمة لغير المشتركين في Premium.التكرار:
for i in range(2, int(n**0.5) + 1):
: Itère de 2 jusqu'à la racine carrée den
. لنif primes[i]:
: Sii
est Conidéré comme premier:
for j in range(i * i, n + 1, i):
: مسلسل Marquer tous les Multis dei
comme non- Premiers.النتيجة:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Crée une liste des indices o عصريprimes[i]
est vrai, représentant les nombres premiers.اخترت قناة N'hésitez pas à me Demander si vous avez besoin d'une explication plus détaillée de quelque!
message = "Great! Now add those explanations as comments in the code."
display_chat(message, chat.send_message(message))
🙋♂️
رائع. والآن، عليك إضافة هذه التفسيرات كتعليقات في الرمز.🤖.
def sieve_of_eratosthenes(n): """Retourne une liste de nombres premiers jusqu'à n.""" # Initialise une liste de boolean avec True pour tous les nombres de 0 à n primes = [True] * (n + 1) # Définit 0 et 1 comme non-premiers primes[0] = primes[1] = False # Itère de 2 à la racine carrée de n for i in range(2, int(n**0.5) + 1): # Si i est considéré comme premier if primes[i]: # Itère sur tous les multiples de i for j in range(i * i, n + 1, i): # Définit les multiples de i comme non-premiers primes[j] = False # Retourne la liste des indices des nombres premiers return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes)
التفسير:
- الإعداد:
primes = [True] * (n + 1)
: Crée une listeprimes
de valeurs booléennes, setupement supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: تتوفر فيه كل المزايا المقدَّمة لغير المشتركين في Premium.- التكرار:
for i in range(2, int(n**0.5) + 1):
: Itère de 2 jusqu'à la racine carrée den
. لنif primes[i]:
: Sii
est Conidéré comme premier:
for j in range(i * i, n + 1, i):
: شركة Marquer tous les Multis dei
comme non- Premiers.- النتيجة:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Crée une liste des indices o عصريprimes[i]
est vrai, représentant les nombres premiers.
اختبار الاستجابة التي تم إنشاؤها عن طريق تشغيل الرمز الذي تم إنشاؤه:
def sieve_of_eratosthenes(n):
"""Retourne une liste de nombres premiers jusqu'à n."""
# Initialise une liste de boolean avec True pour tous les nombres de 0 à n
primes = [True] * (n + 1)
# Définit 0 et 1 comme non-premiers
primes[0] = primes[1] = False
# Itère de 2 à la racine carrée de n
for i in range(2, int(n**0.5) + 1):
# Si i est considéré comme premier
if primes[i]:
# Itère sur tous les multiples de i
for j in range(i * i, n + 1, i):
# Définit les multiples de i comme non-premiers
primes[j] = False
# Retourne la liste des indices des nombres premiers
return [i for i, is_prime in enumerate(primes) if is_prime]
primes = sieve_of_eratosthenes(1000)
print(primes)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97, 101, 103, 107, 109, 113, 127, 131, 137, 139, 149, 151, 157, 163, 167, 173, 179, 181, 191, 193, 197, 199, 211, 223, 227, 229, 233, 239, 241, 251, 257, 263, 269, 271, 277, 281, 283, 293, 307, 311, 313, 317, 331, 337, 347, 349, 353, 359, 367, 373, 379, 383, 389, 397, 401, 409, 419, 421, 431, 433, 439, 443, 449, 457, 461, 463, 467, 479, 487, 491, 499, 503, 509, 521, 523, 541, 547, 557, 563, 569, 571, 577, 587, 593, 599, 601, 607, 613, 617, 619, 631, 641, 643, 647, 653, 659, 661, 673, 677, 683, 691, 701, 709, 719, 727, 733, 739, 743, 751, 757, 761, 769, 773, 787, 797, 809, 811, 821, 823, 827, 829, 839, 853, 857, 859, 863, 877, 881, 883, 887, 907, 911, 919, 929, 937, 941, 947, 953, 967, 971, 977, 983, 991, 997]
استخدِم طريقة get_history
لمعرفة كيف احتفظت الفئة Chat
بكل السياق.
print(chat.get_history())
<start_of_turn>user Tell me, in a few words, how to compute all prime numbers up to 1000?<end_of_turn> <start_of_turn>model **Sieve of Eratosthenes.** <end_of_turn><start_of_turn>user Now in Python! No numpy, please!<end_of_turn> <start_of_turn>model ```python def sieve_of_eratosthenes(n): """Returns a list of prime numbers up to n.""" primes = [True] * (n + 1) primes[0] = primes[1] = False for i in range(2, int(n**0.5) + 1): if primes[i]: for j in range(i * i, n + 1, i): primes[j] = False return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes) ``` **Explanation:** 1. **Initialization:** - `primes = [True] * (n + 1)`: Creates a list `primes` of boolean values, initially assuming all numbers are prime. - `primes[0] = primes[1] = False`: Sets 0 and 1 as non-prime. 2. **Iteration:** - `for i in range(2, int(n**0.5) + 1):`: Iterates from 2 to the square root of `n`. We only need to check up to the square root because any composite number must have a prime factor less than or equal to its square root. - `if primes[i]:`: If `i` is marked as prime: - `for j in range(i * i, n + 1, i):`: Marks all multiples of `i` as non-prime. 3. **Result:** - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Creates a list of indices where `primes[i]` is True, representing the prime numbers. Let me know if you'd like a more detailed explanation of any part! <end_of_turn><start_of_turn>user Thank you, it works! Can you explain the code in French?<end_of_turn> <start_of_turn>model Bien sûr ! Voici une explication du code en français : ```python def sieve_of_eratosthenes(n): """Retourne une liste de nombres premiers jusqu'à n.""" primes = [True] * (n + 1) primes[0] = primes[1] = False for i in range(2, int(n**0.5) + 1): if primes[i]: for j in range(i * i, n + 1, i): primes[j] = False return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes) ``` **Explication:** 1. **Initialisation:** - `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers. - `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers. 2. **Itération:** - `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée. - `if primes[i]:`: Si `i` est considéré comme premier: - `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers. 3. **Resultat:** - `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers. N'hésitez pas à me demander si vous avez besoin d'une explication plus détaillée de quelque chose! <end_of_turn><start_of_turn>user Great! Now add those explanations as comments in the code.<end_of_turn> <start_of_turn>model ```python def sieve_of_eratosthenes(n): """Retourne une liste de nombres premiers jusqu'à n.""" # Initialise une liste de boolean avec True pour tous les nombres de 0 à n primes = [True] * (n + 1) # Définit 0 et 1 comme non-premiers primes[0] = primes[1] = False # Itère de 2 à la racine carrée de n for i in range(2, int(n**0.5) + 1): # Si i est considéré comme premier if primes[i]: # Itère sur tous les multiples de i for j in range(i * i, n + 1, i): # Définit les multiples de i comme non-premiers primes[j] = False # Retourne la liste des indices des nombres premiers return [i for i, is_prime in enumerate(primes) if is_prime] primes = sieve_of_eratosthenes(1000) print(primes) ``` **Explication:** * **Initialisation:** * `primes = [True] * (n + 1)`: Crée une liste `primes` de valeurs booléennes, initialement supposant que tous les nombres sont premiers. * `primes[0] = primes[1] = False`: Définit 0 et 1 comme non-premiers. * **Itération:** * `for i in range(2, int(n**0.5) + 1):`: Itère de 2 jusqu'à la racine carrée de `n`. Nous ne devons vérifier que jusqu'à la racine carrée car tout nombre composite doit avoir un facteur premier inférieur ou égal à sa racine carrée. * `if primes[i]:`: Si `i` est considéré comme premier: * `for j in range(i * i, n + 1, i):`: Marquer tous les multiples de `i` comme non-premiers. * **Resultat:** * `return [i for i, is_prime in enumerate(primes) if is_prime]`: Crée une liste des indices où `primes[i]` est vrai, représentant les nombres premiers. <end_of_turn>
ملخص وقراءة إضافية
في هذا البرنامج التعليمي، تعلمت طريقة الدردشة مع نموذج Gemma 2B الذي تم ضبطه باستخدام نظام Keras على JAX.
اطلع على هذه الأدلة والبرامج التعليمية لمعرفة المزيد حول Gemma: