🧬 Czym są embeddingi?
Embedding to zamiana tekstu na wektor liczb — długą listę wartości (np. 1536 liczb dla modelu text-embedding-3-small). Model OpenAI "rozumie" znaczenie słowa i koduje je jako punkt w przestrzeni wielowymiarowej.
Kluczowa właściwość: semantycznie podobne teksty mają podobne wektory. "Kot" i "kotek" będą blisko siebie. "Król" i "królowa" też — a różnica między nimi będzie podobna do różnicy między "mężczyzna" i "kobieta".
Embeddingi służą do: wyszukiwania semantycznego, klastrowania dokumentów, wykrywania plagiatów, systemów rekomendacji i RAG (Retrieval-Augmented Generation).
📐 Wektor embeddingu
Wpisz dowolny tekst — zobaczysz jego reprezentację wektorową.
🔗 Cosine Similarity
Miara podobieństwa semantycznego między dwoma tekstami (0 = brak, 1 = identyczne).
🐍 Odpowiednik w Pythonie
from openai import OpenAI client = OpenAI(api_key="sk-...") def get_embedding(text, model="text-embedding-3-small"): res = client.embeddings.create(input=text, model=model) return res.data[0].embedding emb = get_embedding("cat") print(emb[:10], "...") print(len(emb)) # 1536
import numpy as np def cosine_similarity(a, b): a, b = np.array(a), np.array(b) return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) emb_a = get_embedding("cat") emb_b = get_embedding("dog") sim = cosine_similarity(emb_a, emb_b) print(f"Similarity: {sim:.3f}")
🗺️ Wizualizacja PCA 2D
Embeddingi mają 1536 wymiarów — nie da się ich narysować bezpośrednio. PCA redukuje je do 2D zachowując relacje między słowami. Przerywane linie = odległości semantyczne.
from sklearn.decomposition import PCA import matplotlib.pyplot as plt words = ["king", "queen", "man", "woman"] embeddings = [get_embedding(w) for w in words] pca = PCA(n_components=2) pts = pca.fit_transform(embeddings) for i in range(len(words)): for j in range(i+1, len(words)): plt.plot([pts[i,0], pts[j,0]], [pts[i,1], pts[j,1]], linestyle='--', alpha=0.5, color='gray') for i, word in enumerate(words): plt.scatter(pts[i,0], pts[i,1], s=150) plt.text(pts[i,0]+0.01, pts[i,1]+0.01, word, fontsize=12) plt.title("Relacje między embeddingami (PCA)") plt.show()