heuristica / embeddings-playground Public
📐 Wektor 🔗 Similarity 🗺️ PCA 2D ⚗️ Sandbox 🛠️ Narzędzia

🧬 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).

Klucz wysyłany bezpośrednio do OpenAI.

📐 Wektor embeddingu

Wpisz dowolny tekst — zobaczysz jego reprezentację wektorową.

🔗 Cosine Similarity

Miara podobieństwa semantycznego między dwoma tekstami (0 = brak, 1 = identyczne).

Tekst A
Tekst B
0.0–0.3
Bardzo różne
0.3–0.6
Różne tematy
0.6–0.8
Podobne
0.8–1.0
Bardzo bliskie

🐍 Odpowiednik w Pythonie

python — wektor
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
python — cosine similarity
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.

Słowa / frazy (4–8)
🗺️
Wpisz słowa i kliknij Wizualizuj
python — wizualizacja PCA (matplotlib)
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()