מידע על Codelab זה
1. מבוא
עדכון אחרון: 8 באפריל 2024
הטמעת טקסט
הטמעת טקסט מתייחסת לתהליך של טרנספורמציה של נתונים טקסטואליים לייצוגים מספריים. הייצוגים המספריים האלה, לרוב וקטורים, מתעדים את המשמעות הסמנטית ואת היחסים בין המילים בטקסט. דמיינו את התרחיש הבא:
הטקסט הוא כמו שפה מורכבת, מלאה בדחיות ובאי בהירות.
הטמעת טקסט מתרגמת את השפה הזו לפורמט מתמטי פשוט יותר שמחשבים יכולים להבין ולבצע בו פעולות.
היתרונות של הטמעת טקסט
- מאפשר עיבוד יעיל: העיבוד של ייצוגים מספריים מהיר יותר במחשבים בהשוואה לטקסט גולמי. היכולת הזו חיונית למשימות כמו מנועי חיפוש, מערכות המלצות ותרגום אוטומטי.
- תיעוד משמעות סמנטית: הטמעות הן לא רק המשמעות המילולית של מילים. הן לוכדות את ההקשר ואת הקשרים בין מילים, וכך מאפשרות ניתוח מעמיק יותר.
- שיפור הביצועים של למידת המכונה: הטמעות טקסט יכולות לשמש כתכונות במודלים של למידת מכונה לשיפור הביצועים במשימות כמו ניתוח סנטימנטים, סיווג טקסט ובניית מודלים של נושאים.
תרחישים לדוגמה של הטמעת טקסט
הטמעת טקסט (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
- במסוף Google Cloud, בדף בורר הפרויקטים, בוחרים או יוצרים פרויקט ב-Google Cloud.
- מעבר אל בורר הפרויקטים
- חשוב לוודא שהחיוב מופעל בפרויקט שלכם ב-Cloud.
- מפעילים את Notebooks API.
אפשר ליצור מכונה של Vertex AI Workbench באמצעות מסוף Google Cloud, ה-CLI של gcloud או Terraform. במדריך הזה נשתמש במסוף Google Cloud כדי ליצור אותו. כאן אפשר למצוא מידע נוסף על השיטות האחרות.
- נכנסים לדף Instances במסוף Google Cloud. אפשר לגשת לדף הזה דרך התפריט של Vertex AI, בקטע Notebooks, ולוחצים על Workbench.
- עוברים אל Instances.
- לוחצים על 'יצירת חדש'.
- בתיבת הדו-שיח 'יצירת מכונה', בקטע Details (פרטים), מזינים את המידע הבא לגבי המכונה החדשה:
Name: נותנים שם למכונה החדשה. השם חייב להתחיל באות ולאחר מכן עד 62 אותיות קטנות, מספרים או מקפים (-), ואי אפשר לסיים אותו במקף.
Region and Zone: בוחרים אזור ואזור למכונה החדשה. כדי ליהנות מביצועי הרשת הכי טובים, מומלץ לבחור את האזור הקרוב ביותר למיקום הגאוגרפי שלכם.
אין צורך בהתקנת GPU
בקטע Networking, מציינים את הפרטים הבאים:
Networking: משנים את אפשרויות הרשת כך שישתמשו ברשת בפרויקט הנוכחי או ברשת VPC משותפת מפרויקט מארח, אם הגדרתם רשת כזו. אם אתם משתמשים ב-VPC משותף בפרויקט המארח, עליכם להקצות לסוכן השירות של Notebooks מפרויקט השירות גם את התפקיד Compute Network User (roles/compute.networkUser).
בשדה Network: בוחרים את הרשת הרצויה. אפשר לבחור רשת VPC, כל עוד ברשת מופעלת גישה פרטית ל-Google או שיש לה גישה לאינטרנט.
בשדה 'רשת משנה': בוחרים את רשת המשנה הרצויה. אפשר לבחור את ברירת המחדל.
במאפיינים של מכונה אפשר להשאיר את ברירת המחדל, שהיא e2-standard-4.
- לוחצים על 'יצירה'.
מערכת Vertex AI Workbench יוצרת מכונה ומפעילה אותה באופן אוטומטי. כשהמכונה מוכנה לשימוש, Vertex AI Workbench מפעיל קישור Open JupyterLab. לוחצים עליו.
יצירת notebook ב-Python 3
- בתוך Jupyterlab, במרכז האפליקציות, בקטע Notebook, לוחצים על הסמל עם הלוגו של Python שכתוב בו Python3.
- נוצרת notebook של Jupyter בשם Untitled ועם התוסף ipynb.
- אפשר לשנות את השם שלו בקטע של דפדפן הקבצים בצד ימין, או להשאיר אותו כמו שהוא.
עכשיו אנחנו יכולים להתחיל להכניס את הקוד שלנו ל-notebook.
3. ייבוא הספריות הנדרשות
אחרי שיוצרים את המכונה ופותחים את Jupyterlab, צריך להתקין את כל הספריות הנדרשות לקודלאב.
נצטרך:
- נומפי
- פנדות
- TextEmbeddingInput, TextEmbeddingModel מ-vertexai.language_models
מעתיקים ומדביקים את הקוד הבא בתא:
from vertexai.language_models import TextEmbeddingInput, TextEmbeddingModel
import numpy as np
import pandas as pd
כתוב האתר שלך תיראה כך:
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
זה ייראה כך:
ניתוח הקוד
במשתנים DOCUMENT1, DOCUMENT2 ו-DOCUMENT3 אנחנו מאחסנים מילון שמבצע אמולציה של מסמכים עם הכותרות והתוכן שלהם. "המסמכים" האלה מפנים למדריך מדומה של רכב מתוצרת Google.
בשורה הבאה, אנחנו יוצרים רשימה מתוך שלושת המסמכים (מילונים).
documents = [DOCUMENT1, DOCUMENT2, DOCUMENT3]
לבסוף, תוך שימוש בפנדות, אנחנו יוצרים 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
זה ייראה כך:
ניתוח הקוד
הגדרנו פונקציה בשם 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 נאחסן ונצרף את הטקסט המקודד של כל שורה.
באמצעות שיטת האיטרדורות של פנדות, אנחנו יכולים לחזור על כל שורה ב-dataframe ולקבל את הערכים מהעמודה Text (שמכילה את המידע הידני ממסד הנתונים הסימולציה שלנו).
כדי לשלוח טקסט רגיל ולהחזיר את הווקטור שלו באמצעות מודל gecko@003, אנחנו מאתחלים את מודל המשתנה, ושם מגדירים את המודל באמצעות קריאה לפונקציה TextEmbeddingModel.from_pretrained.
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)
התוצאה תיראה בערך כך:
עכשיו ננתח את הקוד
בדומה לפונקציה מהשלב הקודם, תחילה אנחנו מאתחלים את משתנה השאלה עם מה שאנחנו מתכוונים לשאול את מסד הנתונים.
question='How do you shift gears in the Google car?'
לאחר מכן, במשתנה המודל מגדירים את המודל שבו רוצים להשתמש דרך הפונקציה 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. השוואת וקטורים
עכשיו יש לנו רשימה של וקטורים במסד הנתונים המדומה שלנו ושאלה שהומרה לווקטור. כלומר, עכשיו אנחנו יכולים להשוות את הווקטור של השאלה לכל הווקטורים במסד הנתונים שלנו כדי למצוא את הווקטור הקרוב ביותר לתשובה המדויקת ביותר לשאלה שלנו.
כדי לעשות זאת, נמדוד את המרחק בין הווקטור של השאלה לבין כל אחד מהוקטורים של מסד הנתונים. יש מספר שיטות למדידת מרחקים בין וקטורים. ב-Codelab הספציפי הזה נשתמש במרחק אוקלדיה או בנורמה L2.
ב-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}')
התוצאה אמורה להיראות כך:
עכשיו ננתח את הקוד
מתחילים בהמרת העמודה שמכילה את הטקסט המוטמע או את הווקטורים של מסד הנתונים שלנו לרשימה, ושומרים אותה ב-list_embedded_text_from_db.
כמו כן, הגדירו את המשתנה shortest_distance לערך 1 כדי להמשיך לעדכן אותו עד שמוצאים את המרחק הקצר ביותר בפועל.
list_embedded_text_from_db = df_embedded_values_db['Embedded text']
shortest_distance=1
לאחר מכן, באמצעות לולאת for, אנחנו מבצעים איטרציה ומקבלים את המרחק בין הווקטור מהשאלה לכל ווקטור במסד הנתונים.
אנחנו מחשבים את המרחק שלהם באמצעות הפונקציה הנומרית 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'])
לאחר ההרצה, תקבלו משהו כזה:
9. מזל טוב
מזל טוב, יצרתם את האפליקציה הראשונה שלכם באמצעות המודל textembedding-gecko@003 בתרחיש לדוגמה.
למדתם את היסודות של הטמעות טקסט ואיך להשתמש במודל gecko003 ב-GCP Workbench.
עכשיו אתם יודעים מהם השלבים העיקריים שצריך לבצע כדי להמשיך להחיל את הידע שלכם על תרחישים נוספים לדוגמה.
מה השלב הבא?
כדאי לעיין בחלק מהקורסים האלה ב-Codelab…