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

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

במדריך הזה נסביר איך מתחילים להשתמש ב-Gemma וב-LangChain, שפועלים ב-Google Cloud או בסביבת Colab. Gemma היא משפחה של מודלים פתוחים, קלים ומתקדמים, שנוצרו על סמך אותם מחקר וטכנולוגיה ששימשו ליצירת המודלים של 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 ל-Vertex AI ומבצעים את השלבים הבאים:

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

המאמרים הבאים