Xem trên ai.google.dev | Chạy trong Google Colab | Mở trong Vertex AI | Xem nguồn trên GitHub |
Các Mô hình ngôn ngữ lớn (LLM) như Gemma xuất sắc trong việc tạo ra các câu trả lời chứa thông tin hữu ích, khiến các mô hình này trở nên lý tưởng để xây dựng trợ lý ảo và bot trò chuyện.
Thông thường, các LLM hoạt động ở dạng phi trạng thái, tức là chúng thiếu bộ nhớ vốn có để lưu trữ các cuộc trò chuyện trước đây. Mỗi câu lệnh hoặc câu hỏi được xử lý độc lập, bỏ qua những hoạt động tương tác trước đó. Tuy nhiên, một khía cạnh quan trọng của cuộc trò chuyện tự nhiên là khả năng giữ lại ngữ cảnh từ các tương tác trước đó. Để khắc phục hạn chế này và cho phép các LLM duy trì ngữ cảnh trò chuyện, các LLM phải được cung cấp rõ ràng thông tin liên quan như lịch sử cuộc trò chuyện (hoặc các phần thích hợp) vào mỗi câu lệnh mới được trình bày cho LLM.
Phần hướng dẫn này chỉ cho bạn cách phát triển một bot trò chuyện bằng cách sử dụng biến thể mô hình đã điều chỉnh theo hướng dẫn của Gemma.
Thiết lập
Thiết lập Gemma
Để hoàn tất hướng dẫn này, trước tiên, bạn cần phải hoàn thành hướng dẫn thiết lập trong phần thiết lập Gemma. Hướng dẫn thiết lập Gemma chỉ cho bạn cách thực hiện những việc sau:
- Truy cập vào Gemma trên kaggle.com.
- Chọn một môi trường thời gian chạy Colab có đủ tài nguyên để chạy mô hình Gemma 2B.
- Tạo và định cấu hình tên người dùng Kaggle và khoá API.
Sau khi thiết lập xong Gemma, hãy chuyển sang phần tiếp theo. Tại đây, bạn sẽ thiết lập các biến môi trường cho môi trường Colab của mình.
Đặt các biến môi trường
Thiết lập các biến môi trường cho KAGGLE_USERNAME
và 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')
Cài đặt phần phụ thuộc
Cài đặt Keras và 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
Chọn một phần phụ trợ
Keras là một API học sâu cấp cao, đa khung, được thiết kế để mang lại trải nghiệm đơn giản và dễ sử dụng. Keras 3 cho phép bạn chọn phần phụ trợ: TensorFlow, JAX hoặc PyTorch. Cả ba đều phù hợp với hướng dẫn này.
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"
Nhập gói
Nhập Keras và KerasNLP.
import keras
import keras_nlp
# for reproducibility
keras.utils.set_random_seed(42)
Tạo thực thể cho mô hình
KerasNLP cung cấp cách triển khai nhiều kiến trúc mô hình phổ biến. Trong hướng dẫn này, bạn sẽ tạo thực thể cho mô hình này bằng GemmaCausalLM
, một mô hình Gemma toàn diện để lập mô hình ngôn ngữ quan hệ nhân quả. Mô hình ngôn ngữ nhân quả dự đoán mã thông báo tiếp theo dựa trên mã thông báo trước đó.
Tạo thực thể cho mô hình này bằng phương thức from_preset
:
gemma_lm = keras_nlp.models.GemmaCausalLM.from_preset("gemma2_instruct_2b_en")
Hàm GemmaCausalLM.from_preset()
tạo thực thể cho mô hình từ một cấu trúc và trọng số đặt trước. Trong mã trên, chuỗi "gemma2_instruct_2b_en"
chỉ định giá trị đặt trước cho mô hình Gemma 2 2B với 2 tỷ tham số. Bạn cũng có thể sử dụng các mô hình Gemma với thông số 7B, 9B và 27B. Bạn có thể tìm thấy các chuỗi mã cho mô hình Gemma trong trang thông tin Biến thể mô hình trên Kaggle.
Sử dụng phương thức summary
để biết thêm thông tin về mô hình:
gemma_lm.summary()
Như bạn có thể thấy trong bản tóm tắt, mô hình này có 2,6 tỷ tham số có thể huấn luyện.
Xác định các hàm trợ giúp định dạng
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))
Xây dựng bot trò chuyện
Mô hình tinh chỉnh hướng dẫn của Gemma gemma2_instruct_2b_en
được tinh chỉnh để có thể hiểu các mã thông báo rẽ sau:
<start_of_turn>user\n ... <end_of_turn>\n
<start_of_turn>model\n ... <end_of_turn>\n
Hướng dẫn này sử dụng các mã thông báo này để tạo chatbot. Hãy tham khảo phần Định dạng và hướng dẫn hệ thống để biết thêm thông tin về mã thông báo điều khiển Gemma.
Tạo một trình trợ giúp trò chuyện để quản lý trạng thái cuộc trò chuyện
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
Trò chuyện với người mẫu
Bắt đầu trò chuyện với mô hình đó.
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))
🙋♂️
Nói một cách ngắn gọn, làm thế nào để tính tất cả các số nguyên tố có độ lớn đến 1000?🤖
Sàng Eratosthenes.
Tiếp tục cuộc trò chuyện.
message = "Now in Python! No numpy, please!"
display_chat(message, chat.send_message(message))
🙋♂️
Nay đã có trên Python! Không sao cả!🤖
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)
Giải thích:
Khởi chạy:
primes = [True] * (n + 1)
: Tạo một danh sáchprimes
gồm các giá trị boolean, ban đầu giả định tất cả các số đều là số nguyên tố.primes[0] = primes[1] = False
: Đặt 0 và 1 là không phải số nguyên tố.Lặp lại:
for i in range(2, int(n**0.5) + 1):
: Lặp từ 2 đến căn bậc hai củan
. Chúng ta chỉ cần tính đến căn bậc hai vì mọi hợp số đều phải có thừa số nguyên tố nhỏ hơn hoặc bằng căn bậc hai của nó.if primes[i]:
: Nếui
được đánh dấu là số nguyên tố:
for j in range(i * i, n + 1, i):
: Đánh dấu mọi bội số củai
là không phải số nguyên tố.Kết quả:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Tạo danh sách chỉ mục, trong đóprimes[i]
là True, biểu thị các số nguyên tố.Đừng ngại cho tôi biết nếu bạn muốn nội dung giải thích chi tiết hơn về bất kỳ phần nào nhé!
message = "Thank you, it works! Can you explain the code in French?"
display_chat(message, chat.send_message(message))
🙋♂️
Cảm ơn bạn, ứng dụng đã hoạt động! Bạn có thể giải thích đoạn mã này bằng tiếng Pháp không?🤖
Hãy cứ thế ! 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)
Giải thích:
Khởi chạy:
primes = [True] * (n + 1)
: Cree une listeprimes
de valeurs booléennes, khởi đầu supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: Définit 0 et 1 dành cho những người không phải là những người không phải hàng đầu.Lặp lại:
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 px 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
chào đón những người không phải là những người không phải hàng đầu.Kết quả:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Cree une liste des chỉ 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 mua de quelque đã chọn!
message = "Great! Now add those explanations as comments in the code."
display_chat(message, chat.send_message(message))
🙋♂️
Vậy thì tuyệt quá! Bây giờ, hãy thêm những nội dung giải thích đó dưới dạng nhận xét vào mã.🤖
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)
Giải thích:
- Khởi chạy:
primes = [True] * (n + 1)
: Cree une listeprimes
de valeurs booléennes, khởi đầu supposant que tous les nombres sont premiers.primes[0] = primes[1] = False
: Définit 0 et 1 dành cho những người không phải là những người không phải hàng đầu.- Lặp lại:
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 px 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
chào đón những người không phải là những người không phải hàng đầu.- Kết quả:
return [i for i, is_prime in enumerate(primes) if is_prime]
: Cree une liste des chỉ oùprimes[i]
est vrai, représentant les nombres premiers.
Kiểm thử phản hồi được tạo bằng cách chạy mã đã tạo:
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]
Sử dụng phương thức get_history
để xem cách lớp Chat
giữ lại tất cả ngữ cảnh.
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>
Tóm tắt và đọc thêm
Trong hướng dẫn này, bạn đã tìm hiểu cách trò chuyện với mô hình được điều chỉnh theo Hướng dẫn của Gemma 2B bằng cách sử dụng Keras trên JAX.
Hãy xem các hướng dẫn sau để tìm hiểu thêm về Gemma: