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

1. מבוא

עדכון אחרון: 2024-04-08

הטמעת טקסט

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

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

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

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

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

תרחישי שימוש ב-Text Embedding

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

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

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

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

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

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

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

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

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

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

textembedding-gecko@003

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

מה תפַתחו

ב-Codelab הזה, תיצרו סקריפט 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, בדף לבחירת הפרויקט בענן, בוחרים פרויקט בענן או יוצרים פרויקט בענן חדש.
  1. מעבר לדף לבחירת הפרויקט
  2. הקפידו לוודא שהחיוב מופעל בפרויקט בענן שלכם ב-Google Cloud.
  3. מפעילים את Notebooks API.

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

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

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

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

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

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

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

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

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

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

d47bdc2d7f516c46.png

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

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

יצירת מחברת Python 3

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

עכשיו אפשר להתחיל להזין את הקוד ב-Notebook.

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

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

נצטרך את הפרטים הבאים:

  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 שתקבל כקלט מסגרת נתונים של 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, אפשר לבצע איטרציה על כל שורה ב-dataframe ולקבל את הערכים מהעמודה Text (שמכילה את המידע הידני ממסד הנתונים המדומה שלנו).

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

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

לאחר מכן, בהטמעות המשתנים, אנחנו לוכדים את הווקטור של הטקסט שאנחנו שולחים באמצעות הפונקציה 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")

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

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

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

אנחנו מדפיסים את אורך הווקטור רק כהפניה.

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

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

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

לשם כך, נמדוד את המרחק בין הווקטור של השאלה לבין כל וקטור במסד הנתונים. יש כמה טכניקות למדידת המרחקים בין וקטורים. ב-codelab הספציפי הזה נשתמש במרחק אוקלידי או בנורמת 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.

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

מה השלב הבא?

כדאי לעיין ב-Codelabs הבאים…

מאמרי עזרה