Пошук уроків, статей та іншого контенту
Як текст перетворюється на список чисел, що вміє «розуміти» сенс — основа семантичного пошуку та RAG.
Звичайний повнотекстовий пошук шукає збіги рядків: запит «як заробити гроші» не знайде документ зі словами «як збільшити дохід», хоча сенс майже ідентичний — жодне слово буквально не збігається. Людині очевидно, що це схожі фрази; для алгоритму, що порівнює символи, вони не мають нічого спільного.
Embedding-модель перетворює текст (слово, речення, цілий документ) у вектор — упорядкований список чисел фіксованої довжини (типово від кількох сотень до кількох тисяч чисел), який намагається відобразити сенс тексту в багатовимірному просторі. Тексти зі схожим змістом отримують вектори, розташовані близько одне до одного в цьому просторі — навіть якщо в них немає жодного спільного слова.
"як заробити гроші" → [0.12, -0.45, 0.88, ...] (наприклад, 1536 чисел)
"як збільшити дохід" → [0.14, -0.41, 0.85, ...] (вектор дуже БЛИЗЬКО до першого)
"рецепт борщу" → [-0.77, 0.22, -0.10, ...] (вектор ДАЛЕКО від обох попередніх)Найпоширеніша метрика — косинусна подібність (cosine similarity): кут між двома векторами в багатовимірному просторі. Значення від -1 до 1 — чим ближче до 1, тим схожіший сенс текстів; вектори тексту й самого себе завжди дають подібність рівно 1.
Замість порівняння рядків символів семантичний пошук порівнює embedding-вектор запиту користувача з embedding-векторами заздалегідь проіндексованих документів і повертає найближчі за косинусною подібністю — саме так знаходиться «як збільшити дохід» на запит «як заробити гроші». Це той самий принцип, на якому побудований RAG (стаття «RAG: як це працює»): пошук релевантного контексту для LLM відбувається саме через порівняння embeddings, а не ключових слів.
Порівнювати запит із мільйонами векторів «в лоб» (перебором) для кожного пошуку — надто повільно. Векторні бази даних (Pinecone, Weaviate, розширення pgvector для PostgreSQL) будують спеціальні індекси для наближеного пошуку найближчих сусідів (Approximate Nearest Neighbor), що знаходять достатньо близькі вектори за мілісекунди навіть серед мільйонів записів — той самий компроміс «трохи менше точності заради значно більшої швидкості», що й у наближених алгоритмах узагалі.
Порівнювати embeddings, згенеровані різними моделями, — вектори різних моделей живуть у різних, несумісних просторах; «близькість» має сенс лише між векторами однієї й тієї самої embedding-моделі.
Очікувати, що embeddings ідеально розуміють нюанси — вони вловлюють загальну семантичну близькість, але можуть плутати тонкі відмінності (наприклад, «хороший фільм» і «поганий фільм» можуть опинитись відносно близько одне до одного, бо обидва — про оцінку фільму загалом).
Індексувати надто довгі шматки тексту одним embedding-вектором — один вектор на цілу статтю усереднює сенс усіх її частин; для точного пошуку документи зазвичай розбивають на менші фрагменти (chunking) перед генерацією embeddings.
Embedding — це вектор чисел, що представляє сенс тексту так, що семантично схожі тексти отримують близькі вектори, навіть без спільних слів. Косинусна подібність вимірює цю близькість, а векторні бази даних роблять пошук найближчих векторів швидким навіть на великих обсягах даних. Це фундамент семантичного пошуку та RAG-систем.