مشاهده در ai.google.dev | در Google Colab اجرا شود | در Vertex AI باز کنید | مشاهده منبع در GitHub |
مدلهای زبان بزرگ (LLM) مانند Gemma در ایجاد پاسخهای آموزنده برتری دارند و آنها را برای ساخت دستیارهای مجازی و رباتهای گفتگو ایدهآل میسازند.
به طور معمول، LLM ها به شیوه ای بدون حالت عمل می کنند، به این معنی که فاقد حافظه ذاتی برای ذخیره مکالمات گذشته هستند. هر درخواست یا سؤال به طور مستقل پردازش می شود، بدون توجه به تعاملات قبلی. با این حال، یکی از جنبه های مهم گفتگوی طبیعی، توانایی حفظ زمینه از تعاملات قبلی است. برای غلبه بر این محدودیت و فعال کردن LLMها برای حفظ زمینه گفتگو، باید به طور صریح اطلاعات مربوطه مانند تاریخچه مکالمه (یا بخشهای مربوطه) را در هر درخواست جدید ارائه شده به LLM به آنها ارائه شود.
این آموزش به شما نشان می دهد که چگونه یک ربات چت با استفاده از نوع مدل تنظیم شده Gemma توسعه دهید.
راه اندازی
راه اندازی جما
برای تکمیل این آموزش، ابتدا باید دستورالعملهای راهاندازی را در Gemma setup تکمیل کنید. دستورالعمل های تنظیم Gemma به شما نشان می دهد که چگونه کارهای زیر را انجام دهید:
- در kaggle.com به Gemma دسترسی پیدا کنید.
- یک زمان اجرا Colab با منابع کافی برای اجرای مدل Gemma 2B انتخاب کنید.
- نام کاربری و کلید API 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 یک API یادگیری عمیق چند چارچوبی و سطح بالا است که برای سادگی و سهولت استفاده طراحی شده است. 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 را از پیش تعیین شده با 2 میلیارد پارامتر مشخص می کند. مدل های جما با پارامترهای 7B، 9B و 27B نیز موجود است. میتوانید رشتههای کد مدلهای Gemma را در لیستهای Model Variation در 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-instruction-tuned 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))
🙋♂️ اکنون در پایتون! بدون ناتوانی، لطفا!
🤖
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))
🙋♂️ ممنون، کار می کند! میشه کد رو به فرانسه توضیح بدید؟
🤖
بین سور ! 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 listprimes
de valeurs booléennes، مقدمات اولیه que tous les nombres sont premiers.primes[0] = primes[1] = False
: تعریف 0 و 1 comme non-premiers.تکرار:
for i in range(2, int(n**0.5) + 1):
: Itère de 2 jusqu'à la racine carrée den
. 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]:
: Sii
est considéré comme premier:
for j in range(i * i, n + 1, i):
: نشانگر توس مضرب ازi
غیر برتر.نتیجه:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Crée une list 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 listprimes
de valeurs booléennes، مقدمات اولیه que tous les nombres sont premiers.primes[0] = primes[1] = False
: تعریف 0 و 1 comme non-premiers.- تکرار:
for i in range(2, int(n**0.5) + 1):
: Itère de 2 jusqu'à la racine carrée den
. 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]:
: Sii
est considéré comme premier:
for j in range(i * i, n + 1, i):
: نشانگر توس مضرب ازi
غیر برتر.- نتیجه:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Crée une list 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 Instruction با استفاده از Keras در JAX را یاد گرفتید.
برای کسب اطلاعات بیشتر در مورد Gemma، این راهنماها و آموزش ها را بررسی کنید:
- با Keras Gemma شروع کنید .
- مدل Gemma را روی GPU بهینه کنید .
- درباره ادغام Gemma با Vertex AI بیاموزید
- نحوه استفاده از مدل های Gemma با Vertex AI را بیاموزید.