שימוש ב-textembedding-gecko@003 להטמעות וקטוריות

1. מבוא

העדכון האחרון: 8 באפריל 2024

הטמעת טקסט

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

טקסט הוא כמו שפה מורכבת, מלאה בניואנסים ובמשמעויות לא ברורות.

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

היתרונות של הטמעת טקסט

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

תרחישי שימוש להטמעת טקסט

הטמעת טקסט (text embedding) מאפשרת להמיר טקסט לייצוגים מספריים, וכך לפתוח מגוון יישומים בעיבוד שפה טבעית (NLP). הנה כמה תרחישים לדוגמה:

1. מנועי חיפוש ואחזור מידע:

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

על ידי השוואה בין הטמעות של שאילתת חיפוש לבין הטמעות של מסמכים, מנועי חיפוש יכולים לזהות מסמכים שעוסקים בנושאים או במושגים דומים.

2. מערכות המלצות:

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

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

3. זיהוי העתקות:

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

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

textembedding-gecko@003

Textembedding-gecko@003 היא גרסה ספציפית של מודל הטמעת טקסט (text embedding) שהוכשרו מראש, שמוצעים על ידי Google Cloud Platform ‏(GCP) דרך Vertex AI וחבילה של כלי AI ושירותים.

מה תפַתחו

בסדנת הקוד הזו תלמדו ליצור סקריפט ב-Python. הסקריפט הזה יבצע את הפעולות הבאות:

  • שימוש ב-Vertex API כדי לקרוא ל-textembedding-gecko@003 ולהמיר טקסט להטמעות טקסט (ווקטורים).
  • יצירת מסד נתונים מדומה שמורכב מטקסט ומהמקדמים שלו
  • מבצעים שאילתה במסד הנתונים הווירטואלי של הווקטורים על ידי השוואת הווקטורים ומקבלים את התשובה הסבירה ביותר.

מה תלמדו

  • איך משתמשים בהטמעת טקסט ב-GCP
  • איך קוראים ל-textembedding-gecko@003
  • איך מריצים את זה ב-Workbench
  • איך משתמשים ב-Vertex AI – Workbench כדי להריץ סקריפטים

מה צריך להכין

  • גרסה עדכנית של Chrome
  • ידע ב-Python
  • פרויקט ב-Google Cloud
  • גישה ל-Vertex AI – Workbench

2. תהליך ההגדרה

יצירת מכונה של Vertex AI Workbench

  1. במסוף Google Cloud, בדף לבחירת הפרויקט, בוחרים פרויקט קיים ב-Google Cloud או יוצרים פרויקט חדש.
  1. מעבר לדף לבחירת הפרויקט
  2. מוודאים שהחיוב מופעל בפרויקט שלכם ב-Google Cloud.
  3. מפעילים את Notebooks API.

אפשר ליצור מכונה של Vertex AI Workbench באמצעות מסוף Google Cloud, ה-CLI של gcloud או Terraform. במדריך הזה נשתמש במסוף Google Cloud כדי ליצור את החשבון. כאן אפשר למצוא מידע נוסף על השיטות האחרות.

  1. נכנסים לדף Instances במסוף Google Cloud. אפשר לגשת לדף הזה דרך התפריט של Vertex AI, בקטע Notebooks, ולוחצים על Workbench. 56c087d619c464dd.png
  2. עוברים אל Instances.
  3. לוחצים על 'יצירת חדש'. 381ff9b895e77641.png
  4. בתיבת הדו-שיח Create instance (יצירת מכונה), בקטע Details (פרטים), מספקים את הפרטים הבאים לגבי המכונה החדשה:

Name: נותנים שם למכונה החדשה. השם חייב להתחיל באות ולאחר מכן עד 62 אותיות קטנות, מספרים או מקפים (-), ואי אפשר לסיים אותו במקף.

Region and Zone (אזור ותחום): בוחרים אזור ותחום למכונה החדשה. כדי ליהנות מביצועי הרשת הטובים ביותר, כדאי לבחור את האזור הקרוב אליכם ביותר מבחינה גיאוגרפית.

אין צורך להתקין GPU

בקטע Networking (רשתות), מציינים את הפרטים הבאים:

Networking: משנים את אפשרויות הרשת כך שישתמשו ברשת בפרויקט הנוכחי או ברשת VPC משותפת מפרויקט מארח, אם הגדרתם רשת כזו. אם אתם משתמשים ב-VPC משותף בפרויקט המארח, עליכם להקצות גם את התפקיד Compute Network User ‏ (roles/compute.networkUser) ל-Notebooks Service Agent מפרויקט השירות.

בשדה Network: בוחרים את הרשת הרצויה. אפשר לבחור רשת VPC, כל עוד מופעלת בה הגישה הפרטית ל-Google או שיש לה גישה לאינטרנט.

בשדה Subnetwork (רשת משנה): בוחרים את רשת המשנה הרצויה. אפשר לבחור את ברירת המחדל.

בנכסי המכונה אפשר להשאיר את ברירת המחדל, כלומר e2-standard-4.

d47bdc2d7f516c46.png

  1. לוחצים על 'יצירה'.

מערכת Vertex AI Workbench יוצרת מכונה ומפעילה אותה באופן אוטומטי. כשהמכונה מוכנה לשימוש, מערכת Vertex AI Workbench מפעילה קישור ל-Open JupyterLab. לוחצים עליו.

יצירת מסמך Notebook ב-Python 3

  1. ב-Jupyterlab, מתוך מרכז האפליקציות, בקטע Notebook, לוחצים על הסמל עם הלוגו של Python שכתוב בו Python3. e16bb118cd28256f.png
  2. נוצר קובץ notebook של Jupyter בשם Untitled עם הסיומת ipynb. da9bd34cf307156c.png
  3. אפשר לשנות את השם שלו בקטע של דפדפן הקבצים בצד ימין, או להשאיר אותו כמו שהוא.

עכשיו אפשר להתחיל להוסיף את הקוד שלנו למסמך.

3. ייבוא הספריות הנדרשות

אחרי שיוצרים את המכונה ופותחים את Jupyterlab, צריך להתקין את כל הספריות הנדרשות לקודלאב.

נצטרך:

  1. numpy
  2. פנדות
  3. TextEmbeddingInput, ‏ TextEmbeddingModel מ-vertexai.language_models

מעתיקים ומדביקים את הקוד הבא בתא:

from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel

import numpy as np
import pandas as pd

כתוב האתר שלך תיראה כך:

6852d323eedcac93.png

4. יצירת מסד נתונים וקטורי מדומה

כדי לבדוק את הקוד שלנו, נוצר מסד נתונים שמכיל טקסטים והווקטורים המתאימים שלהם, שתורגמו באמצעות מודל הטמעת הטקסט gecko@003.

המטרה היא שהמשתמשים יחפשו טקסט, יתרגמו אותו לוקטור, יחפשו אותו במסד הנתונים שלנו ויקבלו את התוצאה הקרובה ביותר.

מסד הנתונים של הווקטורים יכלול 3 רשומות, וזו הדרך שבה ניצור אותו:

מעתיקים את הקוד הבא ומדביקים אותו בתא חדש.

DOCUMENT1 = {
    "title": "Operating the Climate Control System",
    "content": "Your Googlecar has a climate control system that allows you to adjust the temperature and airflow in the car. To operate the climate control system, use the buttons and knobs located on the center console.  Temperature: The temperature knob controls the temperature inside the car. Turn the knob clockwise to increase the temperature or counterclockwise to decrease the temperature. Airflow: The airflow knob controls the amount of airflow inside the car. Turn the knob clockwise to increase the airflow or counterclockwise to decrease the airflow. Fan speed: The fan speed knob controls the speed of the fan. Turn the knob clockwise to increase the fan speed or counterclockwise to decrease the fan speed. Mode: The mode button allows you to select the desired mode. The available modes are: Auto: The car will automatically adjust the temperature and airflow to maintain a comfortable level. Cool: The car will blow cool air into the car. Heat: The car will blow warm air into the car. Defrost: The car will blow warm air onto the windshield to defrost it."}

DOCUMENT2 = {
    "title": "Touchscreen",
    "content": "Your Googlecar has a large touchscreen display that provides access to a variety of features, including navigation, entertainment, and climate control. To use the touchscreen display, simply touch the desired icon.  For example, you can touch the \"Navigation\" icon to get directions to your destination or touch the \"Music\" icon to play your favorite songs."}

DOCUMENT3 = {
    "title": "Shifting Gears",
    "content": "Your Googlecar has an automatic transmission. To shift gears, simply move the shift lever to the desired position.  Park: This position is used when you are parked. The wheels are locked and the car cannot move. Reverse: This position is used to back up. Neutral: This position is used when you are stopped at a light or in traffic. The car is not in gear and will not move unless you press the gas pedal. Drive: This position is used to drive forward. Low: This position is used for driving in snow or other slippery conditions."}

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

זה ייראה כך:

26baa3b876c0605d.png

ניתוח הקוד

במשתנים DOCUMENT1, ‏ DOCUMENT2 ו-DOCUMENT3 אנחנו שומרים מילון שיחקה מסמכים עם השמות והתוכן שלהם. "המסמכים" האלה מפנים למדריך מדומה של רכב מתוצרת Google.

בשורה הבאה יוצרים רשימה מ-3 המסמכים האלה (מילונים).

documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]

לבסוף, בעזרת pandas, יוצרים dataframe מהרשימה הזו, שייקרא df_initial_db.

df_initial_db = pd.DataFrame(documents)
df_initial_db.columns = ['Title', 'Text']
df_initial_db

5. יצירת הטמעות טקסט

עכשיו נקבל הטמעת טקסט באמצעות המודל gecko@003 לכל רשומה במסד הנתונים המדומה של המסמכים.

מעתיקים ומדביקים את הקוד הבא בתא חדש:

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input        
                                           
df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

זה ייראה כך:

4c4af091c7a82861.png

ניתוח הקוד

הגדרנו פונקציה בשם embed_fn שתקבל כקלט dataframe של pandas שמכיל את הטקסט לביצוע ההטמעה. לאחר מכן, הפונקציה מחזירה את הטקסט המקודד כוקטור.

def embed_fn(df_input):
    list_embedded_values = []
    for index, row in df_input.iterrows():        
        model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
        embeddings = model.get_embeddings([(row['Text'])])        
        list_embedded_values.append(embeddings[0].values)
    df_input['Embedded text'] = list_embedded_values
    return df_input             

ברשימה שנקראת list_embedded_values נאחסן את הטקסט המקודד של כל שורה ונצרף אותו.

באמצעות השיטה iterrows מ-pandas, אנחנו יכולים להריץ את כל השורות במערך הנתונים, ולקבל את הערכים מהעמודה Text (שמכילה את המידע הידני ממסד הנתונים המדומה שלנו).

כדי לשלוח טקסט רגיל ולהחזיר את הווקטור שלו באמצעות המודל gecko@003, מפעילים את הפונקציה TextEmbeddingModel.from_pretrained כדי להגדיר את המודל שבו רוצים להשתמש, ומפעילים את המשתנה model.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(row['Text'])])                     

לאחר מכן, במשתנה embeddings, אנחנו מתעדים את הווקטור של הטקסט שאנחנו שולחים באמצעות הפונקציה model.get_embeddings.

בסוף הפונקציה, יוצרים עמודה חדשה ב-dataframe שנקראת Embedded text (טקסט מוטמע), שתכלול את רשימת הווקטורים שנוצרו על סמך המודל gecko@003.

df_input['Embedded text'] = list_embedded_values
return df_input             

לבסוף, במשתנה df_embedded_values_db אנחנו מתעדים את dataframe שמכיל את הנתונים המקוריים שלנו ממסד הנתונים המדומה, וגם עמודה חדשה שמכילה את רשימת הווקטורים של כל שורה.

df_embedded_values_db = embed_fn(df_initial_db)
df_embedded_values_db      

6. שליחת שאלה למסד הנתונים של הווקטורים

עכשיו, מאחר שמסד הנתונים שלנו מכיל טקסט וכן את הווקטורים שלו, אנחנו יכולים להמשיך לשאול שאלה ולשלוח שאילתה למסד הנתונים כדי למצוא תשובה.

לשם כך, מעתיקים את הקוד הבא ומדביקים אותו בתא חדש:

question='How do you shift gears in the Google car?'
model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")
embeddings = model.get_embeddings([(question)])        
text_to_search=embeddings[0].values
len(text_to_search)

התוצאה תיראה בערך כך:

6b7cf9b08e3b4573.png

ניתוח הקוד

בדומה לפונקציה מהשלב הקודם, קודם כול מאתחלים את משתנה השאלה עם מה שאנחנו מתכוונים לשאול את מסד הנתונים.

question='How do you shift gears in the Google car?'

לאחר מכן, במשתנה model מגדירים את המודל שבו רוצים להשתמש באמצעות הפונקציה TextEmbeddingModel.from_pretrained, שבמקרה הזה הוא המודל gecko@003.

model = TextEmbeddingModel.from_pretrained("textembedding-gecko@003")

במשתנה embeddings, אנחנו קוראים לפונקציה model.get_embeddings ומעבירים את הטקסט שרוצים להמיר לווקטור. במקרה הזה, אנחנו מעבירים את השאלה שרוצים לשאול.

embeddings = model.get_embeddings([(question)])        

לבסוף, המשתנה text_to_search מכיל את רשימת הווקטורים שתורגמו מהשאלה.

אנחנו מדפיסים את אורך הווקטור רק לצורך עזר.

text_to_search=embeddings[0].values
len(text_to_search)

7. השוואת וקטורים

עכשיו יש לנו רשימה של וקטורים במסד הנתונים המדומה, ושאלה שהומרה לווקטור. כלומר, עכשיו אנחנו יכולים להשוות את הווקטור של השאלה לכל הווקטורים במסד הנתונים שלנו כדי למצוא את הווקטור הקרוב ביותר לתשובה המדויקת ביותר לשאלה שלנו.

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

73ea8635c4570bea.png

ב-Python, אפשר להשתמש בפונקציה numpy כדי לעשות זאת.

מעתיקים ומדביקים את הקוד הבא בתא חדש:

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position
        
print(f'The shortest distance is {shortest_distance} and the position of that value is {shortest_position}')

התוצאה אמורה להיראות כך:

b70563b50ea86668.png

ניתוח הקוד

מתחילים בהמרת העמודה שמכילה את הטקסט המוטמע או את הווקטורים של מסד הנתונים שלנו לרשימה, ושומרים אותה ב-list_embedded_text_from_db.

כמו כן, הגדירו את המשתנה shortest_distance לערך 1 כדי להמשיך לעדכן אותו עד שנמצא את המרחק הקצר ביותר בפועל.

list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1

לאחר מכן, באמצעות לולאת for, אנחנו מבצעים איטרציה ומקבלים את המרחק בין הווקטור מהשאלה לכל ווקטור במסד הנתונים.

אנחנו מחשבים את המרחק ביניהם באמצעות הפונקציה numpy linalg.norm.

אם המרחק המחושב קטן מהמרחק במשתנה shortest_distance, המרחק המחושב יוגדר במשתנה הזה

לאחר מכן אנחנו מתעדים את המרחק הקצר ביותר ואת המיקום ברשימה שבו הוא נמצא. במשתנים shortest_distance ו-shortest_position.

for position, embedded_value in enumerate(list_embedded_text_from_db):
    distance=np.linalg.norm((np.array(embedded_value) - np.array(text_to_search)), ord = 2)
    print(distance)
    if distance<shortest_distance:
        shortest_distance=distance
        shortest_position=position

8. תוצאות

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

מעתיקים ומדביקים את הקוד הבא בתא חדש:

print("Your question was:\n "+question+ " \nAnd our answer is:\n "+
      df_embedded_values_db.at[shortest_position, 'Title']+": "+
      df_embedded_values_db.at[shortest_position, 'Text'])

לאחר ההרצה, תופיע תוצאה שדומה לזו:

7a0e429171a19afe.png

9. מזל טוב

מזל טוב, יצרתם את האפליקציה הראשונה שלכם באמצעות המודל textembedding-gecko@003 בתרחיש לדוגמה.

למדתם את העקרונות הבסיסיים של הטמעת טקסט ואת האופן שבו משתמשים במודל gecko003 ב-GCP Workbench.

עכשיו אתם יודעים מהם השלבים העיקריים שצריך לבצע כדי להמשיך להשתמש בידע שלכם בתרחישי שימוש נוספים.

מה השלב הבא?

כדאי לעיין בחלק מהקורסים האלה ב-Codelab…

מסמכי עזרה