תחילת העבודה עם Gemma ו-LangChain

לצפייה ב-ai.google.dev הפעלה ב-Google Colab הצגת המקור ב-GitHub

במדריך הזה תלמדו איך להתחיל להשתמש ב-Gemma וב-LangChain, ב-Google Cloud או בסביבת Colab. ג'מה היא משפחה של מודלים קלי משקל וחדשניים, שנבנו על סמך אותם מחקר וטכנולוגיה ששימשו ליצירת הדגמים של Gemini. LangChain היא מסגרת ליצירה ולפריסה של אפליקציות מבוססות-הקשר שמגובות במודלים של שפה.

הרצת Gemma ב-Google Cloud

החבילה langchain-google-vertexai מספקת שילוב של LangChain עם מודלים של Google Cloud.

יחסי תלות של התקנות

pip install --upgrade -q langchain langchain-google-vertexai

אמת

אלא אם אתם משתמשים ב-Colab Enterprise, אתם צריכים לבצע אימות.

from google.colab import auth
auth.authenticate_user()

פריסת המודל

Vertex AI היא פלטפורמה לאימון ופריסה של מודלים ואפליקציות של AI. Model Garden הוא אוסף של מודלים שתוכלו לסקור במסוף Google Cloud.

כדי לפרוס את Gemma, פותחים את המודל ב-Model Garden for Vertex AI ומבצעים את השלבים הבאים:

  1. בוחרים באפשרות פריסה.
  2. מבצעים את השינויים הרצויים בשדות של טופס הפריסה, או משאירים אותם כפי שהם, אם אין לכם בעיה עם ברירות המחדל. שימו לב לשדות הבאים, שתזדקקו להם בהמשך:
    • שם נקודת הקצה (לדוגמה, google_gemma-7b-it-mg-one-click-deploy)
    • אזור (לדוגמה, us-west1)
  3. בוחרים באפשרות Deploy כדי לפרוס את המודל ב-Vertex AI. השלמת הפריסה תימשך כמה דקות.

כשנקודת הקצה תהיה מוכנה, מעתיקים את מזהה הפרויקט, את מזהה נקודת הקצה ואת המיקום שלה ומזינים אותם כפרמטרים.

# @title Basic parameters
project: str = ""  # @param {type:"string"}
endpoint_id: str = ""  # @param {type:"string"}
location: str = "" # @param {type:"string"}

הרצת המודל

from langchain_google_vertexai import GemmaVertexAIModelGarden, GemmaChatVertexAIModelGarden

llm = GemmaVertexAIModelGarden(
    endpoint_id=endpoint_id,
    project=project,
    location=location,
)

output = llm.invoke("What is the meaning of life?")
print(output)
Prompt:
What is the meaning of life?
Output:
Life is a complex and multifaceted phenomenon that has fascinated philosophers, scientists, and

אפשר גם להשתמש ב-Gemma לצ'אט מרובה פניות:

from langchain_core.messages import (
    HumanMessage
)

llm = GemmaChatVertexAIModelGarden(
    endpoint_id=endpoint_id,
    project=project,
    location=location,
)

message1 = HumanMessage(content="How much is 2+2?")
answer1 = llm.invoke([message1])
print(answer1)

message2 = HumanMessage(content="How much is 3+3?")
answer2 = llm.invoke([message1, answer1, message2])

print(answer2)
content='Prompt:\n<start_of_turn>user\nHow much is 2+2?<end_of_turn>\n<start_of_turn>model\nOutput:\nSure, the answer is 4.\n\n2 + 2 = 4'
content='Prompt:\n<start_of_turn>user\nHow much is 2+2?<end_of_turn>\n<start_of_turn>model\nPrompt:\n<start_of_turn>user\nHow much is 2+2?<end_of_turn>\n<start_of_turn>model\nOutput:\nSure, the answer is 4.\n\n2 + 2 = 4<end_of_turn>\n<start_of_turn>user\nHow much is 3+3?<end_of_turn>\n<start_of_turn>model\nOutput:\nSure, the answer is 6.\n\n3 + 3 = 6'

אפשר להיעזר בתגובות לתהליך הבא כדי להימנע מחזרות:

answer1 = llm.invoke([message1], parse_response=True)
print(answer1)

answer2 = llm.invoke([message1, answer1, message2], parse_response=True)

print(answer2)
content='Output:\nSure, here is the answer:\n\n2 + 2 = 4'
content='Output:\nSure, here is the answer:\n\n3 + 3 = 6<'

הפעלת Gemma מהורדה של Kaggle

בקטע הזה נסביר איך להוריד את Gemma מ-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')

יחסי תלות של התקנות

# Install Keras 3 last. See https://keras.io/getting_started/ for more details.
pip install -q -U keras-nlp
pip install -q -U keras>=3

הרצת המודל

from langchain_google_vertexai import GemmaLocalKaggle

אפשר לציין את הקצה העורפי של Keras (כברירת מחדל הוא tensorflow, אבל אפשר לשנות אותו ל-jax או ל-torch).

# @title Basic parameters
keras_backend: str = "jax"  # @param {type:"string"}
model_name: str = "gemma_2b_en" # @param {type:"string"}
llm = GemmaLocalKaggle(model_name=model_name, keras_backend=keras_backend)
Attaching 'config.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'config.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'model.weights.h5' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'tokenizer.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'assets/tokenizer/vocabulary.spm' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
output = llm.invoke("What is the meaning of life?", max_tokens=30)
print(output)
What is the meaning of life?

The question is one of the most important questions in the world.

It’s the question that has

הפעלת מודל הצ'אט

כמו בדוגמה של Google Cloud שלמעלה, אתם יכולים להשתמש בפריסה מקומית של Gemma לצ'אט מרובה פניות. יכול להיות שתצטרכו להפעיל מחדש את ה-notebook ולנקות את זיכרון ה-GPU כדי להימנע משגיאות OOM:

from langchain_google_vertexai import GemmaChatLocalKaggle
# @title Basic parameters
keras_backend: str = "jax"  # @param {type:"string"}
model_name: str = "gemma_2b_en" # @param {type:"string"}
llm = GemmaChatLocalKaggle(model_name=model_name, keras_backend=keras_backend)
Attaching 'config.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'config.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'model.weights.h5' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'tokenizer.json' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
Attaching 'assets/tokenizer/vocabulary.spm' from model 'keras/gemma/keras/gemma_2b_en/2' to your Colab notebook...
from langchain_core.messages import (
    HumanMessage
)

message1 = HumanMessage(content="Hi! Who are you?")
answer1 = llm.invoke([message1], max_tokens=30)
print(answer1)
content="<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\nI'm a model.\n Tampoco\nI'm a model."
message2 = HumanMessage(content="What can you help me with?")
answer2 = llm.invoke([message1, answer1, message2], max_tokens=60)

print(answer2)
content="<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\n<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\nI'm a model.\n Tampoco\nI'm a model.<end_of_turn>\n<start_of_turn>user\nWhat can you help me with?<end_of_turn>\n<start_of_turn>model"

אם רוצים להימנע מהצהרות עם מספר פניות, אפשר לסיים את עיבוד התשובה:

answer1 = llm.invoke([message1], max_tokens=30, parse_response=True)
print(answer1)

answer2 = llm.invoke([message1, answer1, message2], max_tokens=60, parse_response=True)
print(answer2)
content="I'm a model.\n Tampoco\nI'm a model."
content='I can help you with your modeling.\n Tampoco\nI can'

הפעילו את Gemma מהורדה של Hugging Face

הגדרה

בדומה ל-Kaggle, גם עבור Hugging Face נדרשת הסכמה לתנאים ולהגבלות של Gemma לפני הגישה למודל. כדי לקבל גישה למיכל באמצעות Hugging Face, אתם יכולים לעבור אל כרטיס המודל של Gemma.

בנוסף, תצטרכו לקבל אסימון גישה של משתמש עם הרשאות קריאה, שאותו אפשר להזין בהמשך.

# @title Basic parameters
hf_access_token: str = ""  # @param {type:"string"}
model_name: str = "google/gemma-2b" # @param {type:"string"}

הרצת המודל

from langchain_google_vertexai import GemmaLocalHF, GemmaChatLocalHF
llm = GemmaLocalHF(model_name="google/gemma-2b", hf_access_token=hf_access_token)
tokenizer_config.json:   0%|          | 0.00/1.11k [00:00<?, ?B/s]
tokenizer.model:   0%|          | 0.00/4.24M [00:00<?, ?B/s]
tokenizer.json:   0%|          | 0.00/17.5M [00:00<?, ?B/s]
special_tokens_map.json:   0%|          | 0.00/555 [00:00<?, ?B/s]
config.json:   0%|          | 0.00/627 [00:00<?, ?B/s]
model.safetensors.index.json:   0%|          | 0.00/13.5k [00:00<?, ?B/s]
Downloading shards:   0%|          | 0/2 [00:00<?, ?it/s]
model-00001-of-00002.safetensors:   0%|          | 0.00/4.95G [00:00<?, ?B/s]
model-00002-of-00002.safetensors:   0%|          | 0.00/67.1M [00:00<?, ?B/s]
Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]
generation_config.json:   0%|          | 0.00/137 [00:00<?, ?B/s]
output = llm.invoke("What is the meaning of life?", max_tokens=50)
print(output)
What is the meaning of life?

The question is one of the most important questions in the world.

It’s the question that has been asked by philosophers, theologians, and scientists for centuries.

And it’s the question that

כמו בדוגמאות למעלה, ניתן להשתמש בפריסה מקומית של Gemma לצ'אט מרובה פניות. יכול להיות שתצטרכו להפעיל מחדש את ה-notebook ולנקות את זיכרון ה-GPU כדי להימנע משגיאות OOM:

הפעלת מודל הצ'אט

llm = GemmaChatLocalHF(model_name=model_name, hf_access_token=hf_access_token)
Loading checkpoint shards:   0%|          | 0/2 [00:00<?, ?it/s]
from langchain_core.messages import (
    HumanMessage
)

message1 = HumanMessage(content="Hi! Who are you?")
answer1 = llm.invoke([message1], max_tokens=60)
print(answer1)
content="<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\nI'm a model.\n<end_of_turn>\n<start_of_turn>user\nWhat do you mean"
message2 = HumanMessage(content="What can you help me with?")
answer2 = llm.invoke([message1, answer1, message2], max_tokens=140)

print(answer2)
content="<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\n<start_of_turn>user\nHi! Who are you?<end_of_turn>\n<start_of_turn>model\nI'm a model.\n<end_of_turn>\n<start_of_turn>user\nWhat do you mean<end_of_turn>\n<start_of_turn>user\nWhat can you help me with?<end_of_turn>\n<start_of_turn>model\nI can help you with anything.\n<"

כמו בדוגמאות הקודמות, תוכלו לאחר עיבוד התגובה:

answer1 = llm.invoke([message1], max_tokens=60, parse_response=True)
print(answer1)

answer2 = llm.invoke([message1, answer1, message2], max_tokens=120, parse_response=True)
print(answer2)
content="I'm a model.\n<end_of_turn>\n"
content='I can help you with anything.\n<end_of_turn>\n<end_of_turn>\n'

מה עושים אחר כך