Czym są embeddingi wektorowe?
Uczestnicy poznają sposób, w jaki sieci neuronowe odwzorowują tekst na gęste wektory w wielowymiarowej przestrzeni, dowiedzą się, dlaczego teksty o podobnym znaczeniu tworzą sąsiadujące wektory, oraz sprawdzą, co mierzy podobieństwo cosinusowe.
Czym są embeddingi wektorowe? to bezpłatna lekcja AI Engineering Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej AI Engineering Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Znaczenie kryjące się za liczbami
Embedding wektorowy to lista liczb (wektor) reprezentująca znaczenie fragmentu tekstu. Zamiast przechowywać słowa jako surowe ciągi znaków, sieci neuronowe uczą się kodować znaczenie semantyczne w postaci gęstych tablic liczbowych. Dwa teksty o podobnym znaczeniu wygenerują wektory znajdujące się blisko siebie w tej wielowymiarowej przestrzeni.
Wielowymiarowa przestrzeń wektorowa
Współczesne embeddingi mają zazwyczaj od 768 do 3072 wymiarów. Każdy wymiar przechwytuje pewną ukrytą cechę znaczenia — temat, sentyment, styl lub relacje — bez konieczności jawnego programowania. W rezultacie powstaje bogata przestrzeń geometryczna, w której relacje semantyczne można mierzyć za pomocą odległości.
Na przykład text-embedding-3-small generuje wektory o 1536 wymiarach, a text-embedding-3-large — wektory o 3072 wymiarach.
Jak sieci neuronowe uczą się embeddingów
Modele embeddingów są trenowane na ogromnych korpusach tekstów, aby przewidywać brakujące słowa (modelowanie języka z maskowaniem) lub rozróżniać pary podobne i niepodobne semantycznie. Podczas trenowania sieć dostosowuje miliony wag, aż podobne teksty zaczną naturalnie grupować się w wyuczonej przestrzeni wektorowej.
Dlatego embeddingi nazywa się reprezentacjami gęstymi — każdy wymiar niesie informację, w przeciwieństwie do rzadkich kodowań one-hot, w których większość wartości wynosi zero.
Podobieństwo cosinusowe: pomiar bliskości
Podobieństwo cosinusowe mierzy kąt między dwoma wektorami, zwracając wartość od -1 do 1. Wynik równy 1 oznacza, że wektory wskazują dokładnie ten sam kierunek (identyczne znaczenie), 0 oznacza wektory ortogonalne (niepowiązane), a -1 — kierunki przeciwne.
W przypadku tekstu jest ono preferowane względem odległości euklidesowej, ponieważ ignoruje długość wektora i skupia się wyłącznie na kierunku, dzięki czemu jest odporne na różnice w długości tekstu.
import numpy as np
def cosine_similarity(vec_a, vec_b):
dot_product = np.dot(vec_a, vec_b)
norm_a = np.linalg.norm(vec_a)
norm_b = np.linalg.norm(vec_b)
return dot_product / (norm_a * norm_b)
# Example with tiny 3D vectors
v1 = np.array([0.8, 0.2, 0.5])
v2 = np.array([0.9, 0.1, 0.4])
print(cosine_similarity(v1, v2)) # Close to 1.0Dlaczego podobieństwo semantyczne ma znaczenie
Tradycyjne wyszukiwanie słów kluczowych zawodzi, gdy użytkownicy stosują parafrazy: wyszukanie hasła automobile pomija dokumenty dotyczące cars. Embeddingi wektorowe rozwiązują ten problem, ponieważ teksty o równoważnym znaczeniu są mapowane na blisko położone wektory, niezależnie od użytych dokładnie słów.
Umożliwia to wyszukiwanie semantyczne, w którym znajduje się najbardziej trafny wynik na podstawie znaczenia, a nie nakładania się słów — jest to podstawowa funkcja potrzebna systemom RAG.
Wizualizacja wektora embeddingu
Proszę wyobrazić sobie nanoszenie zdań na mapę 2D (to uproszczona analogia). Zdania dotyczące uczenia maszynowego grupują się w jednym obszarze, zdania o gotowaniu — w innym, a zdania o sporcie tworzą trzecią grupę. Embeddingi wektorowe tworzą taką mapę w przestrzeni o tysiącach wymiarów.
Słynne zależności, takie jak king - man + woman ≈ queen, są rzeczywistymi działaniami arytmetycznymi w tej przestrzeni — operacje na wektorach kodują analogie semantyczne.
Generowanie prostego embeddingu
Interfejs API embeddingów OpenAI przyjmuje tekst i zwraca listę liczb zmiennoprzecinkowych. Pojedyncze wywołanie API może utworzyć embedding dla jednego zdania lub całego akapitu. Zwrócony wektor ma stały wymiar niezależnie od długości danych wejściowych.
Ważne: dłuższe dane wejściowe nie generują większych wektorów — nadal powstaje wektor o tym samym stałym rozmiarze, jednak bardzo długie teksty mogą utracić szczegółowe informacje, ponieważ model kompresuje całość do tej stałej przestrzeni.
from openai import OpenAI
client = OpenAI() # uses OPENAI_API_KEY from environment
response = client.embeddings.create(
model='text-embedding-3-small',
input='Vector embeddings capture semantic meaning.'
)
embedding = response.data[0].embedding
print(f'Dimensions: {len(embedding)}') # 1536
print(f'First 5 values: {embedding[:5]}')Generowanie embeddingów dla wielu tekstów jednocześnie
Można utworzyć embeddingi dla wielu ciągów znaków w jednym wywołaniu API, przekazując listę do parametru input. Jest to znacznie wydajniejsze niż wysyłanie osobnego żądania dla każdego tekstu, ponieważ ogranicza liczbę podróży w obie strony przez sieć i pozwala API grupować obliczenia.
Odpowiedź zawiera po jednym obiekcie embeddingu dla każdego elementu wejściowego, w tej samej kolejności, dzięki czemu można połączyć je z oryginalnymi tekstami za pomocą funkcji zip.
from openai import OpenAI
client = OpenAI()
texts = [
'Python is a programming language.',
'Snakes are reptiles.',
'Machine learning requires data.'
]
response = client.embeddings.create(
model='text-embedding-3-small',
input=texts
)
for text, result in zip(texts, response.data):
print(f'{text[:30]}... -> {len(result.embedding)}D vector')Iloczyn skalarny a podobieństwo cosinusowe
Jeśli embeddingi są znormalizowane L2 (są wektorami jednostkowymi o długości 1), iloczyn skalarny jest równy podobieństwu cosinusowemu. Modele embeddingów OpenAI zwracają znormalizowane wektory, więc można używać dowolnej z tych metryk — iloczyn skalarny jest nieco szybszy w obliczaniu.
Jednak przy łączeniu embeddingów z różnych modeli lub źródeł, które mogą nie być znormalizowane, należy zawsze jawnie obliczać podobieństwo cosinusowe, aby uniknąć mylących wyników.
import numpy as np
def normalize(vec):
return vec / np.linalg.norm(vec)
v1 = normalize(np.array([3.0, 4.0, 0.0]))
v2 = normalize(np.array([4.0, 3.0, 0.0]))
# For unit vectors: dot product == cosine similarity
dot = np.dot(v1, v2)
print(f'Dot product: {dot:.4f}') # same as cosine simEmbeddingi a kodowanie one-hot
Kodowanie one-hot reprezentuje każde słowo jako wektor zawierający dokładnie jedną wartość 1, a wszystkie pozostałe wartości 0. Słownik liczący 50 000 słów generuje wektory o 50 000 wymiarach, niemal całkowicie wypełnione zerami — jest to bardzo nieefektywne.
Gęste embeddingi mają od 768 do 3072 wymiarów, ale każdy wymiar niesie rzeczywistą informację. Przestrzeń jest 10–20 razy mniejsza, a jednocześnie odwzorowuje znacznie więcej niuansów, w tym synonimy, analogie i znaczenie kompozycyjne, których kodowanie one-hot zupełnie nie rejestruje.
Typowe zastosowania embeddingów
Poza wyszukiwaniem semantycznym embeddingi znajdują zastosowanie w wielu praktycznych rozwiązaniach:
- Wyszukiwanie semantyczne — znajdowanie dokumentów na podstawie znaczenia, a nie słów kluczowych
- Systemy rekomendacji — proponowanie elementów podobnych do tych, które spodobały się użytkownikowi
- Grupowanie — automatyczne grupowanie dokumentów według tematów
- Klasyfikacja — przekazywanie embeddingów do klasyfikatora liniowego
- Usuwanie duplikatów — wykrywanie niemal zduplikowanych treści
Wszystkie systemy RAG zależą od embeddingów, które dopasowują zapytania użytkowników do odpowiednich fragmentów dokumentów.
Szybkie sprawdzenie
Sprawdź swoją wiedzę na temat koncepcji inżynierii AI z tej lekcji.
Podsumowanie lekcji
W tej lekcji poznali Państwo: embeddingi wektorowe kodują znaczenie semantyczne jako gęste tablice liczbowe, podobieństwo cosinusowe mierzy bliskość semantyczną, porównując kierunki wektorów oraz interfejs API embeddingów OpenAI przekształca tekst w wektory o stałym rozmiarze w ramach jednego wywołania. Następnie omówimy praktyczne generowanie i porównywanie embeddingów za pomocą modeli OpenAI.
Często zadawane pytania
Czy lekcja „Czym są embeddingi wektorowe?” jest bezpłatna?
Tak — pełny tekst „Czym są embeddingi wektorowe?” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu AI Engineering Academy, przejdź na CoddyKit PRO. Kurs AI Engineering Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Czym są embeddingi wektorowe?”?
Uczestnicy poznają sposób, w jaki sieci neuronowe odwzorowują tekst na gęste wektory w wielowymiarowej przestrzeni, dowiedzą się, dlaczego teksty o podobnym znaczeniu tworzą sąsiadujące wektory, oraz… Ćwiczysz AI Engineering Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć AI Engineering Academy?
Nie wymagamy żadnego doświadczenia. AI Engineering Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Czym są embeddingi wektorowe?”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji AI Engineering Academy?
Tak. Każda lekcja AI Engineering Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Czym są embeddingi wektorowe?
- Generowanie embeddingów za pomocą OpenAI
- Wyszukiwanie semantyczne z NumPy
- Grupowanie i wizualizacja embeddingów