Vektorové databázy umožňujú sémantické vyhľadávanie - nájdete podobné koncepty, nie len presné zhody.

Čo sú embeddings?

Embeddings sú numerické reprezentácie textu (alebo obrázkov) vo forme vektorov:

from openai import OpenAI

client = OpenAI()

response = client.embeddings.create(
    model="text-embedding-3-small",
    input="Ako funguje machine learning?"
)

# Výsledok: vektor s 1536 dimenziami
vector = response.data[0].embedding  # [0.023, -0.041, 0.067, ...]

Podobné koncepty majú podobné vektory.

Prečo nie SQL?

-- SQL: presná zhoda
SELECT * FROM products WHERE description LIKE '%laptop%'

-- Nenájde: "notebook", "počítač", "MacBook"

Vektorové vyhľadávanie nájde sémanticky podobné výsledky.

Populárne riešenia

Pinecone (Managed)

import pinecone

pinecone.init(api_key="xxx", environment="us-west1-gcp")

index = pinecone.Index("my-index")

# Uloženie
index.upsert(vectors=[
    {"id": "doc1", "values": embedding, "metadata": {"source": "faq"}}
])

# Vyhľadávanie
results = index.query(
    vector=query_embedding,
    top_k=5,
    include_metadata=True
)

Výhody: Fully managed, škálovateľný, rýchly Nevýhody: Cena pri veľkom volume

Weaviate (Open Source)

import weaviate

client = weaviate.Client("http://localhost:8080")

# Schema
client.schema.create_class({
    "class": "Document",
    "vectorizer": "text2vec-openai"
})

# Auto-vectorization pri uložení
client.data_object.create({
    "content": "Machine learning je...",
    "source": "wiki"
}, "Document")

Výhody: Open source, GraphQL API, hybrid search Nevýhody: Self-hosting komplexita

Chroma (Lightweight)

import chromadb

client = chromadb.Client()

collection = client.create_collection("docs")

collection.add(
    documents=["Text dokumentu 1", "Text dokumentu 2"],
    ids=["doc1", "doc2"]
)

results = collection.query(
    query_texts=["Hľadaný koncept"],
    n_results=5
)

Výhody: Jednoduchý, lokálny, ideálny pre prototyping Nevýhody: Nie pre produkciu s veľkými dátami

pgvector (PostgreSQL)

CREATE EXTENSION vector;

CREATE TABLE documents (
    id SERIAL PRIMARY KEY,
    content TEXT,
    embedding vector(1536)
);

-- Vytvorenie indexu
CREATE INDEX ON documents USING ivfflat (embedding vector_cosine_ops);

-- Vyhľadávanie
SELECT content
FROM documents
ORDER BY embedding <=> '[0.1, 0.2, ...]'::vector
LIMIT 5;

Výhody: Využitie existujúcej PostgreSQL infraštruktúry Nevýhody: Pomalšie ako špecializované riešenia

Porovnanie

Riešenie Hosting Cena Použitie
Pinecone Managed $$ Enterprise
Weaviate Self/Cloud $ Flexibilné
Chroma Local Free Prototyping
pgvector Self Free Existujúci Postgres

Best Practices

  1. Dimension - text-embedding-3-small (1536) vs large (3072)
  2. Indexing - HNSW pre rýchlosť, IVF pre pamäť
  3. Metadata filtering - kombinujte s tradičnými filtrami
  4. Batch operations - upsert vo väčších dávkach

Záver

Pre prototyp použite Chroma. Pre produkciu zvážte Pinecone (managed) alebo Weaviate (control). Ak už máte PostgreSQL, pgvector je najrýchlejší štart.