Основи баз даних
VTFK • 2025
Лекція 2: Типи та моделі БД
Фокус: пошук по ембеддингах та інтеграція з ML
СУБД, оптимізована для зберігання та швидкого пошуку ембеддингів (векторів ознак) за метриками схожості.
Аналогія: Як бібліотека, де книги відсортовані не за назвою, а за змістовною близькістю.
Від сирих даних до відповіді
SELECT id, distance(vector, :query_vec) AS score
FROM vectors
ORDER BY score ASC
LIMIT k;
Граф наближеного пошуку
Створюємо індекс і робимо пошук
import faiss, numpy as np
# 3 вектори по 4 ознаки
xb = np.array([[0.1, 0.2, 0.0, 0.3],
[0.9, 0.1, 0.2, 0.0],
[0.0, 0.3, 0.4, 0.2]], dtype='float32')
index = faiss.IndexFlatL2(4) # L2-метрика
index.add(xb)
query = np.array([[0.05, 0.25, 0.05, 0.35]], dtype='float32')
score, ids = index.search(query, k=2)
print(ids, score) # два найближчих вектори
Примітка: Для продакшн використовують HNSW/IVF для швидкості
| Операція | Призначення |
|---|---|
| INSERT | Додати вектор + метадані |
| UPDATE | Перезаписати вектор або payload |
| DELETE | Видалити вектор з індексу |
| SEARCH kNN | Top-K найближчих |
| FILTER + SEARCH | Пошук з фільтрами по метаданих |
Векторизація → індексація → пошук
Отримуємо сирі документи
Обчислюємо вектори
Додаємо у HNSW/IVF
kNN з фільтрами
Ребілд/реплікація за потреби
Вектори різної довжини спотворюють cosine
index.add(raw_vectors) # без нормалізації
Довгі вектори домінують у відстані
norm = raw_vectors / np.linalg.norm(raw_vectors, axis=1, keepdims=True)
index.add(norm)
Нормалізація робить cosine коректним
HNSW будує багаторівневий граф для швидкого наближеного kNN.
Кроки для ТЗ
Встановлення FAISS та sentence-transformers
pip install faiss-cpu sentence-transformers
python - <<'PY'
from sentence_transformers import SentenceTransformer
model = SentenceTransformer('all-MiniLM-L6-v2')
print(model.encode(['hi']).shape)
PY
Примітка: На mac M1/M2 можна ставити faiss-cpu; для GPU потрібен інший пакет
Показати: ембеддинг → індекс → запит
Готові? Почали кодити!
| Крок | Очікування | Перевірка |
|---|---|---|
| Ембеддинг | Форма (N, d) | print(shape) |
| Індекс | Розмір = N | index.ntotal |
| Запит | Top-3 релевантні | ручна валідація |
| Latency | < 100 мс | time search |
from sentence_transformers import SentenceTransformer
import faiss, numpy as np
docs = ['Що таке SQL?', 'Як працює JOIN?', 'Що таке векторна БД?']
model = SentenceTransformer('all-MiniLM-L6-v2')
vecs = model.encode(docs, normalize_embeddings=True).astype('float32')
index = faiss.IndexFlatIP(vecs.shape[1])
index.add(vecs)
query = model.encode(['поясни векторні бази'], normalize_embeddings=True).astype('float32')
scores, ids = index.search(query, k=2)
print([docs[i] for i in ids[0]])
Далі — реляційна модель та ключі
Лекція 4: Реляційна модель
Дякую за увагу! 💾