إنشاء روبوت دردشة مع "جيما"

العرض على ai.google.dev التنفيذ في Google Colab الفتح في Vertex AI عرض المصدر على GitHub

تتفوّق النماذج اللغوية الكبيرة (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("gemma_1.1_instruct_2b_en")
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'task.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'config.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'config.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'config.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'model.weights.h5' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'metadata.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'preprocessor.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'tokenizer.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'tokenizer.json' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...
Attaching 'assets/tokenizer/vocabulary.spm' from model 'keras/gemma/keras/gemma_1.1_instruct_2b_en/3' to your Colab notebook...

تنشئ الدالة GemmaCausalLM.from_preset() مثيلاً للنموذج من بنية وأوزان مُعدّة مسبقًا. في الرمز أعلاه، تحدّد السلسلة "gemma_1.1_instruct_2b_en" الإعداد المُسبَق لنموذج Gemma 2B الذي يتضمّن مليارَي مَعلمة. وتتوفّر أيضًا نماذج Gemma ذات المَعلمات 7B و9B و27B. يمكنك العثور على سلاسل الرموز لنماذج Gemma في بيانات صيغة النموذج على Kaggle.

استخدِم الطريقة summary للحصول على مزيد من المعلومات عن النموذج:

gemma_lm.summary()

كما ترى من الملخص، يحتوي النموذج على 2.5 مليار معلَمة قابلة للتدريب.

تحديد دوال التنسيق المساعِد

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 المعدَّل gemma_1.1_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 + self.__END_TURN__)

  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=1024)
    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 prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True

message = "Thank you, it works! Can you explain the code in plain English?"
display_chat(message, chat.send_message(message))

🙋‍♂️

شكرًا لك، لقد نجح الأمر. هل يمكنك شرح الرمز باللغة الإنجليزية العادية؟
🤖.

يحدّد الرمز المقدّم دالة prime التي تتحقّق مما إذا كان رقم معيّن أوليًا أم لا.

طريقة عمل هذا المقياس:

  • تستخدم الدالة وسيطة واحدة، n، وهو الرقم الذي يجب التحقق منه.

  • تتحقّق أولاً مما إذا كانت n أقل من أو تساوي 1. وإذا كان الأمر كذلك، فإن العدد ليس أوليًا، ولذلك فإن الدالة تعرض False.

  • ثم يدخل في حلقة تكرارية يتكرر فيها الأعداد من 2 إلى الجذر التربيعي لـ n.

  • بالنسبة إلى كل رقم i، يتم التحقّق مما إذا كان n قابلاً للقسمة بالتساوي على i (أي n % i == 0).

  • إذا كانت n قابلة للقسمة على i، تعرض الدالة False لأنه لا يمكن أن يكون n عددًا أوّليًا إذا كانت تحتوي على القاسم.

  • إذا اكتمل التكرار الحلقي بدون العثور على أي قواسم لـ n، تعرض الدالة True، مما يشير إلى أن n هو عدد أولي.

مثال على الاستخدام:

>>> prime(2)
True
>>> prime(3)
True
>>> prime(4)
False
>>> prime(5)
True

مزايا هذا الرمز:

  • إنها خوارزمية بسيطة وفعالة لإيجاد الأعداد الأولية.
  • ويُستخدَم هذا المصطلح على نطاق واسع في العديد من التطبيقات الرياضية وعلوم الكمبيوتر.
message = "Great! Now add those explanations as comments in the code."
display_chat(message, chat.send_message(message))

🙋‍♂️

رائع. والآن، عليك إضافة هذه التفسيرات كتعليقات في الرمز.
🤖.

def prime(n):
    """
    Checks whether a given number is prime or not.

    Args:
        n: The number to check.

    Returns:
        True if n is prime, False otherwise.
    """

    # Check if n is less than or equal to 1.
    if n <= 1:
        return False

    # Iterate through numbers from 2 to the square root of n.
    for i in range(2, int(n**0.5) + 1):
        # Check if n is divisible by i.
        if n % i == 0:
            return False

    # If the loop completes without finding any divisors for n, then n is prime.
    return True

اختبار الاستجابة التي تم إنشاؤها عن طريق تشغيل الرمز الذي تم إنشاؤه:

def is_prime(n):
  """
  Checks if a number is prime.

  Args:
    n: The number to check.

  Returns:
    True if n is prime, False otherwise.
  """

  # If n is less than or equal to 1, it is not prime.
  if n <= 1:
    return False

  # Iterate through all the numbers from 2 to the square root of n.
  for i in range(2, int(n**0.5) + 1):
    # If n is divisible by any of the numbers in the range from 2 to the square root of n, it is not prime.
    if n % i == 0:
      return False

  # If no divisors are found, n is prime.
  return True


# Initialize an empty list to store prime numbers.
primes = []

# Iterate through all the numbers from 2 to 1000.
for i in range(2, 1001):
  # If the number is prime, add it to the list.
  if is_prime(i):
    primes.append(i)

# Print the prime numbers.
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
The Sieve of Eratosthenes is a widely used method to compute all prime numbers up to a given limit. It involves iteratively marking out multiples of each prime number.<end_of_turn>
<start_of_turn>user
Now in Python! No numpy, please!<end_of_turn>
<start_of_turn>model

```python
def prime(n):
    if n <= 1:
        return False
    for i in range(2, int(n**0.5) + 1):
        if n % i == 0:
            return False
    return True
```<end_of_turn>
<start_of_turn>user
Thank you, it works! Can you explain the code in plain English?<end_of_turn>
<start_of_turn>model
The provided code defines a function `prime` that checks whether a given number is prime or not.

**How it works:**

- The function takes a single argument, `n`, which is the number to check.


- It first checks if `n` is less than or equal to 1. If it is, the number is not prime, so the function returns `False`.


- It then enters a loop that iterates through numbers from 2 to the square root of `n`.


- For each number `i`, it checks if `n` is divisible evenly by `i` (i.e., `n % i == 0`).


- If `n` is divisible by `i`, the function returns `False` because `n` cannot be prime if it has a divisor.


- If the loop completes without finding any divisors for `n`, the function returns `True`, indicating that `n` is a prime number.


**Example Usage:**

```python
>>> prime(2)
True
>>> prime(3)
True
>>> prime(4)
False
>>> prime(5)
True
```

**Benefits of this Code:**

- It is a simple and efficient algorithm for finding prime numbers.
- It is widely used in various computer science and mathematical applications.<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 prime(n):
    """
    Checks whether a given number is prime or not.

    Args:
        n: The number to check.

    Returns:
        True if n is prime, False otherwise.
    """

    # Check if n is less than or equal to 1.
    if n <= 1:
        return False

    # Iterate through numbers from 2 to the square root of n.
    for i in range(2, int(n**0.5) + 1):
        # Check if n is divisible by i.
        if n % i == 0:
            return False

    # If the loop completes without finding any divisors for n, then n is prime.
    return True
```<end_of_turn>

ملخص وقراءة إضافية

في هذا البرنامج التعليمي، تعلمت طريقة الدردشة مع نموذج Gemma 2B الذي تم ضبطه باستخدام نظام Keras على JAX.

اطلع على هذه الأدلة والبرامج التعليمية لمعرفة المزيد حول Gemma: