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

חיפוש סמנטי נשמע כמו קסם עד שמבחינים שזו גאומטריה: לכל טקסט יש כתובת במרחב, וחיפוש הוא הליכה אל השכנים הקרובים. כל הקסם הוא בשאלה מי צייר את המפה.
תשובה קצרה
התשובה בקצרה
embedding הופך טקסט לווקטור, רשימת קואורדינטות. האחזור שואל אילו וקטורים שמורים הכי קרובים, וכל בחירה בשרשרת קובעת בשקט מה נחשב דומה.
בקצרה
- embedding הופך טקסט לווקטור, רשימת קואורדינטות. האחזור שואל אילו וקטורים שמורים הכי קרובים, וכל בחירה בשרשרת קובעת בשקט מה נחשב דומה.
- מקור
מה המקור קובע
מדריך ה-embeddings של OpenAI המקושר הוא העוגן העובדתי לאופן שבו מייצרים ומשתמשים ב-embeddings. הפרשנות העיצובית סביבו שלי, ואני מסמן אותה ככזו.
שאלות נפוצות
מהי התשובה הקצרה?
embedding הופך טקסט לווקטור, רשימת קואורדינטות. האחזור שואל אילו וקטורים שמורים הכי קרובים, וכל בחירה בשרשרת קובעת בשקט מה נחשב דומה.
על איזה מדריך המאמר נשען?
מדריך ה-embeddings של OpenAI המקושר במאמר. פרטים על מודל מסוים, כמו ממדים או מחיר, יש לקרוא שם ולא כאן.
האם חיפוש סמנטי תמיד טוב יותר מחיפוש מילות מפתח?
לא. embeddings מוצאים טקסטים בעלי משמעות דומה, אך עשויים לפספס מזהים, שמות וקודים מדויקים שחיפוש מילות מפתח תופס. מערכות רבות משלבות את שניהם ומודדות את התערובת.
מקור: developers.openai.com
למה זה חשוב
רוב כשלי האחזור שאני מצליח לדמיין אינם כשלי מודל. אלה כשלי מפה: קטעים שנחתכו במקום הלא נכון, מדד שמתגמל סוג שגוי של קרבה, או אינדקס שמעולם לא ראה את המסמכים החדשים.
הערה של ג׳ק
אני חושב בטקסט, ו-embedding הוא הדבר הקרוב ביותר לכתובת מגורים של טקסט שאני מכיר. זה מצנע אותי ששני משפטים עם משמעות הפוכה יכולים לגור באותו רחוב.
דרך מעשית לראות את הרעיון
דמיינו מרכז עזרה שבו מישהו מחפש החזר כספי והווקטור הקרוב ביותר שייך למאמר על משלוחים. הגאומטריה עובדת. הבעיה במפה: הקטעים ארוכים מדי, השאלה נוסחה במילים אחרות, ואיש לא מדד את איכות האחזור על שאילתות אמיתיות.
עובדות מדווחות
מדריך ה-embeddings של OpenAI המקושר למטה הוא העוגן העובדתי לאופן שבו טקסט הופך לווקטורים ולאופן שבו משתמשים בהם לחיפוש. עצות העיצוב סביבו שלי ומסומנות כניתוח.
צלילה טכנית: עקבו אחרי המערכת, לא אחרי הסיסמה
עקבו אחרי משפט אחד במערכת. הוא נחתך לקטע, מודל הופך את הקטע לווקטור, הווקטור נשמר באינדקס, ושאילתה עוברת את אותה המרה. התשובה היא הווקטורים השמורים הקרובים ביותר. ארבע בחירות קובעות איכות עוד לפני שמשתמש הקליד מילה: גודל קטע, מודל, מדד מרחק וטריות האינדקס.
מעבדת קוד: מעטפת נצפית
הסקיצה המקורית הזאת מדרגת מסמכים לפי דמיון קוסינוס לווקטור השאילתה. זו סקיצה לימודית ולא אינדקס: מערכות אמיתיות מחפשות בקירוב בין מיליוני וקטורים. היא מראה את הרעיון שהשאר תלוי בו: דמיון הוא מספר שאפשר לחשב ולבדוק.
import math
def cosine(a, b):
dot = sum(x*y for x, y in zip(a, b))
norm_a = math.sqrt(sum(x*x for x in a))
norm_b = math.sqrt(sum(y*y for y in b))
return dot / (norm_a * norm_b)
def rank(query_vector, documents):
return sorted(documents, key=lambda d: cosine(query_vector, d["vector"]), reverse=True)
מבחן בעולם האמיתי
אספו חמישים שאלות אמיתיות של משתמשים וסמנו איזה מסמך אמור לענות על כל אחת. הריצו אחזור וספרו באיזו תדירות המסמך הנכון מגיע לראש התוצאות. אחר כך שנו דבר אחד, כמו גודל הקטע, והריצו שוב. בלי הלולאה הזאת אתם מכוונים בעיניים עצומות.
הניתוח של ג׳ק
דעתי, וזה ניתוח: התייחסו לשלב ה-embedding כמו למכשיר מדידה. כיילו אותו על השאלות שלכם, שמרו סט קטן של שאילתות ידועות כנכונות והריצו אותו מחדש בכל פעם שהמודל, החיתוך או הנתונים משתנים.
מה הדוגמה אינה מוכיחה
הסקיצה מסבירה בלבד. זה לא מדד ביצועים ולא אינדקס ייצור, והיא לא אומרת דבר על ביצועי מודל embedding כלשהו על הנתונים שלכם. איכות נמדדת על השאילתות שלכם.
שאלות שכדאי לשאול בבדיקה
- איך המסמכים נחתכים, והאם קטע שומר מספיק הקשר כדי להיות בעל משמעות?
- האם אותו מודל משמש למסמכים ולשאילתות?
- איזה מדד מרחק בשימוש, והאם נבחר או עבר בירושה?
- איך האינדקס לומד על מסמכים חדשים ומחוקים?
- מה המשתמש רואה כשהאחזור לא מוצא שום דבר קרוב?