Shikoni në ai.google.dev | Ekzekutoni në Google Colab | Hapni në Vertex AI | Shiko burimin në GitHub |
Modelet e mëdha të gjuhës (LLM) si Gemma shkëlqejnë në gjenerimin e përgjigjeve informative, duke i bërë ato ideale për ndërtimin e asistentëve virtualë dhe chatbot-eve.
Në mënyrë konvencionale, LLM-të funksionojnë në një mënyrë pa shtetësi, që do të thotë se atyre u mungon një memorie e natyrshme për të ruajtur bisedat e kaluara. Çdo kërkesë ose pyetje përpunohet në mënyrë të pavarur, duke mos marrë parasysh ndërveprimet e mëparshme. Megjithatë, një aspekt thelbësor i bisedës natyrore është aftësia për të mbajtur kontekstin nga ndërveprimet e mëparshme. Për të kapërcyer këtë kufizim dhe për t'u mundësuar LLM-ve të ruajnë kontekstin e bisedës, atyre duhet t'u sigurohet në mënyrë eksplicite informacioni përkatës si historia e bisedave (ose pjesët përkatëse) në çdo kërkesë të re të paraqitur në LLM.
Ky tutorial ju tregon se si të zhvilloni një chatbot duke përdorur variantin e modelit të Gemma të akorduar me udhëzime.
Konfigurimi
Konfigurimi i Gemma
Për të përfunduar këtë tutorial, së pari do t'ju duhet të plotësoni udhëzimet e konfigurimit në konfigurimin e Gemma . Udhëzimet e konfigurimit të Gemma ju tregojnë se si të bëni sa më poshtë:
- Merrni qasje në Gemma në kaggle.com.
- Zgjidhni një kohë ekzekutimi Colab me burime të mjaftueshme për të ekzekutuar modelin Gemma 2B.
- Gjeneroni dhe konfiguroni një emër përdoruesi dhe çelës API të Kaggle.
Pasi të keni përfunduar konfigurimin e Gemma, kaloni në seksionin tjetër, ku do të vendosni variablat e mjedisit për mjedisin tuaj Colab.
Vendosni variablat e mjedisit
Cakto variablat e mjedisit për KAGGLE_USERNAME
dhe 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')
Instaloni varësitë
Instaloni Keras dhe 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
Zgjidhni një backend
Keras është një API mësimi i thellë me shumë korniza të nivelit të lartë, i krijuar për thjeshtësi dhe lehtësi në përdorim. Keras 3 ju lejon të zgjidhni backend: TensorFlow, JAX ose PyTorch. Të tre do të punojnë për këtë tutorial.
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"
Paketat e importit
Importoni Keras dhe KerasNLP.
import keras
import keras_nlp
# for reproducibility
keras.utils.set_random_seed(42)
Instantoni modelin
KerasNLP ofron implementime të shumë arkitekturave të modeleve të njohura. Në këtë tutorial, ju do të krijoni modelin duke përdorur GemmaCausalLM
, një model Gemma nga fundi në fund për modelimin e gjuhës shkakësore. Një model gjuhësor kauzal parashikon shenjën tjetër bazuar në shenjat e mëparshme.
Instantoni modelin duke përdorur metodën from_preset
:
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma2_instruct_2b_en")
Funksioni GemmaCausalLM.from_preset()
instancon modelin nga një arkitekturë dhe pesha e paravendosur. Në kodin e mësipërm, vargu "gemma2_instruct_2b_en"
specifikon paravendosjen e modelit Gemma 2 2B me 2 miliardë parametra. Modelet Gemma me parametra 7B, 9B dhe 27B janë gjithashtu të disponueshme. Mund t'i gjeni vargjet e kodeve për modelet Gemma në listat e tyre të Variacionit të Modeleve në Kaggle .
Përdorni metodën summary
për të marrë më shumë informacion rreth modelit:
gemma_lm.summary()
Siç mund ta shihni nga përmbledhja, modeli ka 2.6 miliardë parametra të trajnueshëm.
Përcaktoni funksionet ndihmëse të formatimit
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))
Ndërtimi i chatbot-it
Modeli i akorduar me instruksione Gemma gemma2_instruct_2b_en
është rregulluar mirë për të kuptuar shenjat e mëposhtme të kthesës:
<start_of_turn>user\n ... <end_of_turn>\n
<start_of_turn>model\n ... <end_of_turn>\n
Ky tutorial përdor këto shenja për të ndërtuar chatbot. Referojuni udhëzimeve të formatimit dhe sistemit për më shumë informacion mbi shenjat e kontrollit Gemma.
Krijo një ndihmës bisede për të menaxhuar gjendjen e bisedës
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
Bisedoni me modelen
Filloni të bisedoni me modelen.
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))
🙋♂️ Më thuaj, me pak fjalë, si të llogarisim të gjithë numrat e thjeshtë deri në 1000?
🤖
Sita e Eratosthenes.
Vazhdoni bisedën.
message = "Now in Python! No numpy, please!"
display_chat(message, chat.send_message(message))
🙋♂️ Tani në Python! Jo numpy, ju lutem!
🤖
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)
Shpjegim:
Inicializimi:
primes = [True] * (n + 1)
: Krijon një listë tëprimes
të vlerave boolean, fillimisht duke supozuar që të gjithë numrat janë të thjeshtë.primes[0] = primes[1] = False
: Vendos 0 dhe 1 si jo të thjeshtë.Përsëritja:
for i in range(2, int(n**0.5) + 1):
: Përsëritet nga 2 në rrënjën katrore tën
. Duhet të kontrollojmë vetëm deri në rrënjën katrore sepse çdo numër i përbërë duhet të ketë një faktor kryesor më të vogël ose të barabartë me rrënjën e tij katrore.if primes[i]:
: Nësei
shënohet si i thjeshtë:
for j in range(i * i, n + 1, i):
: Shënon të gjitha shumëfishat ei
si jo të thjeshtë.Rezultati:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Krijon një listë indeksesh kuprimes[i]
është True, duke përfaqësuar numrat e thjeshtë.Më tregoni nëse dëshironi një shpjegim më të detajuar të ndonjë pjese!
message = "Thank you, it works! Can you explain the code in French?"
display_chat(message, chat.send_message(message))
🙋♂️ Faleminderit, funksionon! A mund ta shpjegoni kodin në frëngjisht?
🤖
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)
Shpjegim:
Inicializimi:
primes = [True] * (n + 1)
: Crée une listprimes
de valeurs booléennes, inicialet supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: Përcaktimi 0 dhe 1 comme non-premiers.Përsëritja:
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 carrée 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):
: Marquer tous les multiples dei
comme non-premiers.Rezultati:
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 requester si vous avez besoin d'une shpjegim plus détaillée de quelque chose!
message = "Great! Now add those explanations as comments in the code."
display_chat(message, chat.send_message(message))
🙋♂️ E shkëlqyeshme! Tani shtoni ato shpjegime si komente në kod.
🤖
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)
Shpjegim:
- Inicializimi:
primes = [True] * (n + 1)
: Crée une listprimes
de valeurs booléennes, inicialet supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: Përcaktimi 0 dhe 1 comme non-premiers.- Përsëritja:
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 carrée 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):
: Marquer tous les multiples dei
comme non-premiers.- Rezultati:
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.
Testoni përgjigjen e gjeneruar duke ekzekutuar kodin e krijuar:
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]
Përdorni metodën get_history
për të parë se si u ruajt i gjithë konteksti nga klasa 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>
Përmbledhje dhe lexim të mëtejshëm
Në këtë tutorial, ju mësuat se si të bisedoni me modelin e akorduar të Gemma 2B Instruction duke përdorur Keras në JAX.
Shikoni këto udhëzues dhe udhëzues për të mësuar më shumë rreth Gemma:
- Filloni me Keras Gemma .
- Rregulloni modelin Gemma në GPU .
- Mësoni rreth integrimit Gemma me Vertex AI
- Mësoni se si të përdorni modelet Gemma me Vertex AI .