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

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

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

הרצת 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. בוחרים באפשרות Deploy (פריסה).
  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 מהורדה של חיבוק פנים

הגדרה

כמו Kaggle, גם התכונה 'חיבוק פנים' מחייבת אתכם לאשר את התנאים וההגבלות של Gemma כדי לגשת למודל. כדי לקבל גישה ל-Gemma באמצעות התכונה 'חיבוק פנים', עוברים אל כרטיס המודל של 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'

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