רמה: מתקדם עודכן: אוגוסט 2026

Embeddings — וקטורים סמנטיים

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

מה זה embedding

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

לדוגמה, "כלב" ו"גור" יהיו קרובים; "כלב" ו"מכונית" יהיו רחוקים. החוכמה: הקִרבה נמדדת לפי משמעות, לא לפי מילים זהות. לכן חיפוש מבוסס-embeddings מוצא תוצאות רלוונטיות גם כשלא השתמשת באותן מילים בדיוק — זה מה שנקרא חיפוש סמנטי.

lightbulb
בקצרה

Embedding = "טביעת אצבע מספרית" של משמעות. קרוב במרחב = דומה במשמעות. זה הבסיס ל-RAG, חיפוש סמנטי, המלצות וסיווג.

איך מודדים דמיון — Cosine Similarity

כדי לדעת כמה שני וקטורים קרובים, משתמשים לרוב ב-cosine similarity — מדד שבוחן את הזווית בין הווקטורים (לא המרחק). התוצאה נעה בין 1- ל-1:

בפועל, מנוע חיפוש סמנטי מחשב את ה-embedding של השאילתה, ומחזיר את הקטעים עם ה-cosine similarity הגבוה ביותר. חישוב זה נעשה במהירות על ידי Vector Database גם על מיליוני וקטורים.

מודלים ומימדים

לא מייצרים embeddings לבד — משתמשים במודל embedding ייעודי. הבחירה משפיעה על איכות, מהירות ועלות:

מספר המימדים הוא אורך הווקטור. יותר מימדים = יותר "רזולוציה" אבל יותר אחסון וחישוב. חשוב: אסור לערבב embeddings ממודלים שונים באותו אינדקס — הם לא באותו מרחב.

שימושים עיקריים

  1. RAG — הבסיס לאחזור מידע לפני שהמודל עונה. השימוש הנפוץ ביותר.
  2. חיפוש סמנטי — חיפוש באתר/מוצר לפי משמעות, לא רק מילות מפתח.
  3. סיווג (classification) — לקבץ טקסטים לקטגוריות לפי דמיון.
  4. Clustering — לגלות נושאים/קבוצות בתוך אוסף טקסטים.
  5. המלצות — "מאמרים דומים", "מוצרים קשורים".
  6. Deduplication — לזהות תוכן כפול או דומה מאוד.

Chunking — חלוקה נכונה של מסמכים

לא מטמיעים מסמך שלם כווקטור אחד — מחלקים אותו ל-chunks (קטעים) ומטמיעים כל אחד. זה קריטי לאיכות RAG: chunk גדול מדי מדלל את המשמעות; קטן מדי מאבד הקשר.

דוגמת קוד — חיפוש סמנטי בסיסי

from openai import OpenAI
import numpy as np
client = OpenAI()

def embed(texts):
    r = client.embeddings.create(model="text-embedding-3-small", input=texts)
    return [d.embedding for d in r.data]

def cosine(a, b):
    a, b = np.array(a), np.array(b)
    return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))

docs = ["איך מאפסים סיסמה", "שעות פעילות התמיכה", "מדיניות החזרים"]
doc_vecs = embed(docs)

query = "שכחתי את הסיסמה שלי"
q_vec = embed([query])[0]

scores = [(cosine(q_vec, dv), d) for dv, d in zip(doc_vecs, docs)]
scores.sort(reverse=True)
print(scores[0])   # ('...0.86...', 'איך מאפסים סיסמה')

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

טעויות נפוצות

rocket_launch

הצעד הבא

הבנת embeddings? עכשיו חבר אותם לאחסון ולאחזור עם Vector DB ו-RAG.