Квадрант: Занурення у Світ Векторних Баз Даних з Python (На основі Відео-інструкції)
Привіт, друзі! Сьогодні я збираюсь провести вас через захоплюючу подорож у світ векторних баз даних, використовуючи Python та чудовий інструмент під назвою Quadrant. Ця стаття базується на чудовому відео-підручнику, який детально пояснює, як почати працювати з Quadrant, розібрати його основи та, звичайно ж, відчути його неймовірну потужність. Отож, приготуйтеся до занурення у векторний світ!
Що таке Векторні Бази Даних? Час Розминки
Перш ніж ми пірнемо в код, давайте трохи розімнемось. Знання векторних баз даних є ключем до розуміння того, що ми будемо робити. Уявіть собі світ, де інформація представлена не у вигляді таблиць з рядками та стовпцями, а у вигляді векторів – точок у багатовимірному просторі. Кожен вектор являє собою певну сутність: зображення, аудіозапис, фрагмент тексту.
Головна перевага векторних баз даних – їхня здатність знаходити семантичну схожість. Замість того, щоб шукати точне співпадіння, ми можемо знаходити об’єкти, які “схожі” за своїм змістом. Це відкриває двері до неймовірних можливостей:
- Пошук за схожістю: Знайти зображення, схожі на те, що ви завантажили.
- Рекомендаційні системи: Запропонувати пісні, які вам сподобаються, на основі ваших вподобань.
- Аналіз тексту: Зрозуміти контекст та значення слів у документах.
Quadrant: Ваш Ключ до Векторного Раю
Quadrant – векторна база даних нового покоління, яка дозволяє розкрити потенціал штучного інтелекту. Завдяки передовій технології пошуку векторів, основаній на подібності, Quadrant дає змогу не лише шукати об’єкти на основі їхньої семантичної схожості, але й створювати потужні рекомендаційні системи.
З чого Почати: Від Підготовки до Запуску
Отже, переходимо до практичної частини. Щоб почати роботу з Quadrant, нам знадобиться:
- Підготовка середовища: У відео автор використовує Mamba, але ви можете вибрати будь-який інструмент для створення віртуального середовища, який вам подобається. Це важливо для ізоляції залежностей вашого проєкту.
- Встановлення необхідних пакетів: Нам знадобляться Python та декілька корисних бібліотек.
- Запуск Quadrant через Docker: Найпростіший спосіб запуску Quadrant – використання Docker контейнера.
Крок 1: Створення та Активація Віртуального Середовища
Для початку, створимо віртуальне середовище. Я, як і автор відео, буду використовувати Mamba:
bash
mamba create -n Q_tutorial python=3.10 numpy jupyterlab faker
mamba activate Q_tutorial
Ця команда створить середовище з назвою Q_tutorial
з необхідними пакетами: numpy
, jupyterlab
та faker
. Після створення активуємо його командою mamba activate Q_tutorial
.
Крок 2: Запуск Quadrant в Docker
Далі, нам потрібно завантажити образ Quadrant та запустити його в Docker. Ось кроки, які нам знадобляться:
- Стягнути docker образ:
bash
docker pull [назва образу] # (наприклад, quadrant/quadrant:latest)
- Запустити контейнер:
bash
docker run -p 6333:6333 [назва образу]
Ця команда запускає контейнер, відображаючи порт 6333 (який використовується Quadrant) на вашому комп’ютері. - Запустити JupyterLab:
bash
jupyter lab
Після запуску JupyterLab ви отримаєте URL-адресу для доступу до вашого блокноту. Тепер все готове для роботи з Quadrant з вашого Python-середовища.
Крок 3: Встановлення Клієнта Quadrant
Для взаємодії з Quadrant з Python, нам знадобиться клієнтська бібліотека. Встановлюємо її за допомогою pip:
bash
pip install quadrant-client
Крок 4: Створення вашого першого Jupyter Notebook
Давайте створимо новий Jupyter Notebook, у якому ми будемо працювати з Quadrant. Назвемо його quadrant_tutorial
.
Пишемо Код: Від Імпорту до Експериментів
Тепер, коли все налаштовано, давайте зануримось у код! Відкриваємо наш Jupyter Notebook і починаємо:
“`python
Імпортуємо необхідні бібліотеки
from quadrant_client import Client, models
import numpy as np
from faker import Faker
“`
Створення Клієнта та Підключення до Quadrant
Наступним кроком буде створення клієнта для підключення до нашої бази даних Quadrant. На щастя, це просто:
“`python
Створюємо клієнта для підключення до Quadrant
client = Client(host=”localhost”, port=6333)
“`
Тут ми вказуємо localhost
(оскільки Quadrant працює на нашому комп’ютері) та порт, який ми використовуємо.
Створення Колекції
У векторних базах даних дані організовуються у колекції. Створимо нашу першу колекцію:
“`python
Створюємо колекцію
collection_name = “my_collection”
client.create_collection(
collection_name=collection_name,
vectors_config=models.VectorParams(
size=100, # Розмірність векторів
distance_metric=models.DistanceMetric.COSINE
)
)
“`
У цьому коді ми:
- Визначаємо ім’я колекції (
my_collection
). - Використовуємо
client.create_collection()
для створення колекції. - Вказуємо параметри векторів: їх розмір (100 вимірів) та метрику відстані (косинусова схожість,
COSINE
). Косинусова схожість чудово підходить для порівняння векторів, оскільки вона враховує кут між ними. Чим менший кут, тим більша схожість.
Заповнюємо Колекцію Даними: Генерація Фейкових Пісень
Наступний крок – заповнення колекції даними. Створимо фейкові дані, що представляють пісні, використовуючи numpy
. Уявимо, що кожна пісня має вектор розмірністю 100.
“`python
Генеруємо фейкові дані для пісень
num_songs = 1000
vector_size = 100
data = np.random.uniform(-1.0, 1.0, size=(num_songs, vector_size))
index = list(range(num_songs))
“`
Тут ми:
- Визначаємо кількість пісень (
num_songs
= 1000). - Визначаємо розмірність векторів (
vector_size
= 100). - Використовуємо
np.random.uniform()
для генерації випадкових чисел від -1.0 до 1.0. Ці числа представляють значення в кожній з 100 вимірювань, які представляють характеристики пісні. - Створюємо
index
, який буде списком унікальних ідентифікаторів для кожної пісні.
Завантаження Даних в Quadrant
Тепер, завантажимо наші дані в колекцію my_collection
:
“`python
Завантажуємо дані в колекцію
client.upsert(
collection_name=collection_name,
points=models.Batch(
ids=index,
vectors=data.tolist() # Важливо: перетворюємо numpy array в list
)
)
“`
У цьому коді ми викликаємо метод client.upsert()
зі:
collection_name
: Ім’ям колекції.points
: Об’єктомBatch
(пакет). Пакет містить:ids
: Список ідентифікаторів наших пісень.vectors
: Наші згенеровані вектори даних. Зверніть увагу на.tolist()
, щоб перетворитиnumpy array
вlist
.
Перевірка Даних: Отримання та Візуалізація
Щоб перевірити, чи все пройшло успішно, отримаємо декілька елементів з колекції:
“`python
Отримаємо кілька елементів з колекції
retrieved_records = client.retrieve(
collection_name=collection_name,
ids=index[:10], # Отримуємо перші 10 ID
with_vectors=True # Отримати також і вектори
)
print(retrieved_records)
“`
Цей код покаже інформацію про перші 10 пісень, включаючи їхні вектори.
Доповнення Даних: Додавання Метаданих (Payload)
Тепер додамо до наших пісень метадані, використовуючи бібліотеку faker
. Метадані (payload) – це додаткова інформація про кожну пісню, наприклад, назва, виконавець, рік випуску тощо.
“`python
Створюємо об’єкт Faker
fake = Faker()
Створюємо метадані (payload) для кожної пісні
payload = []
for _ in range(num_songs):
payload.append({
“artist”: fake.name(),
“song_name”: ” “.join(fake.words(nb=3)),
“url”: fake.url(),
“year”: fake.year(),
“country”: fake.country()
})
“`
У цьому коді:
- Ми створюємо об’єкт
Faker()
. - Ми проходимо циклом по кількості пісень (
num_songs
) і генеруємо для кожної пісні випадкові дані за допомогою методівfake.name()
,fake.words()
,fake.url()
,fake.year()
,fake.country()
.fake.words()
генерує випадкові слова для назви пісні. - Ми зберігаємо метадані в список
payload
.
Тепер, завантажимо створені метадані в Quadrant:
“`python
Додаємо payload до існуючих точок
client.upsert(
collection_name=collection_name,
points=models.Batch(
ids=index,
payload=payload
)
)
“`
Створюємо Семантичний Пошук
Створимо семантичний пошук, щоб знаходити пісні, схожі на заданий запит. Наприклад, давайте знайдемо пісні, схожі на “Living la Vida Loca”.
“`python
Семантичний пошук
query_vector = np.random.uniform(-1.0, 1.0, size=(1, vector_size)).tolist() # Генеруємо випадковий вектор, як приклад
search_results = client.search(
collection_name=collection_name,
query_vector=query_vector,
limit=10
)
print(search_results)
“`
Тут ми:
- Генеруємо випадковий
query_vector
розмірністю 100. В реальному сценарії, цей вектор буде згенеровано з тексту, наприклад, назви пісні. - Використовуємо
client.search()
для пошуку схожих пісень.query_vector
: Наш вектор-запит.limit
: Обмеження кількості результатів (10).- Метод
.search()
поверне список результатів, відсортованих від найбільшої до найменшої подібності. Кожен результат міститиме ID пісні та оцінку схожості (score).
Фільтрація Результатів: Фокус На Країні
Щоб покращити пошук, ми можемо використовувати фільтри. Наприклад, давайте знайдемо пісні, схожі на “Living la Vida Loca” і з Австралії:
“`python
Фільтрація результатів
from quadrant_client.models import Filter, FieldCondition, Match
Створюємо фільтр для Австралії
australia_filter = Filter(
must=[
FieldCondition(
key=”country”,
match=Match(value=”Australia”)
)
]
)
Пошук із фільтром
search_results_filtered = client.search(
collection_name=collection_name,
query_vector=query_vector,
query_filter=australia_filter,
limit=3
)
print(search_results_filtered)
“`
У цьому коді ми:
- Імпортуємо необхідні класи для створення фільтру.
- Створюємо фільтр
australia_filter
, який вимагаєcountry
зі значенням “Australia”. - Використовуємо
client.search()
разом зquery_filter
щоб обмежити результати піснями з Австралії.
Рекомендації: Відкриваємо Нові Пісні
Quadrant також дозволяє створювати рекомендаційні системи. Розглянемо приклад: якщо користувач лайкнув пісню з ID 17, система може порекомендувати схожі пісні.
“`python
Рекомендації пісень
recommendation_results = client.recommend(
collection_name=collection_name,
query_vector=query_vector,
positive=[17], # ID пісні, яка сподобалася користувачу
limit=5
)
print(recommendation_results)
“`
У цьому коді:
- Ми використовуємо
client.recommend()
для отримання рекомендацій.positive
: Список ID пісень, які сподобалися користувачу.limit
: Кількість рекомендованих пісень (5).
Комбінуємо Позитивні, Негативні Фільтри та Запити
Quadrant дає змогу комбінувати рекомендації з позитивними та негативними сигналами, а також фільтрами. Ось приклад розширеної рекомендаційної системи:
“`python
Комбінування позитивних, негативних та фільтрів
from quadrant_client.models import Filter, FieldCondition, Match
Створюємо фільтр для Домініканської Республіки
dominican_republic_filter = Filter(
must=[
FieldCondition(
key=”country”,
match=Match(value=”Dominican Republic”)
)
]
)
complex_recommendations = client.recommend(
collection_name=collection_name,
query_vector=query_vector,
positive=[17, 777], # ID пісень, які сподобались
negative=[100, 444], # ID пісень, які не сподобались
query_filter=dominican_republic_filter, # Фільтр за країною
limit=5
)
print(complex_recommendations)
“`
У цьому прикладі ми:
- Використовуємо
client.recommend()
.positive
: ID пісень, які користувачу сподобались.negative
: ID пісень, які користувачу не сподобались.query_filter
: Фільтр, щоб рекомендувати лише пісні з Домініканської Республіки.
Завершення: Ваш Перший Крок у Майбутнє
Вітаю! Ви зробили перший крок у світ векторних баз даних з Quadrant. Сподіваюсь, що цей підручник був корисним та зрозумілим.
Ключові моменти, які варто запам’ятати:
- Основна концепція: Векторні бази даних використовують вектори для представлення даних та знаходження семантичної схожості.
- Quadrant: Потужний інструмент для зберігання, пошуку та рекомендацій у векторному просторі.
- Кроки до успіху: Створення віртуального середовища, встановлення клієнта Quadrant, запуск через Docker, створення колекції, заповнення даними та, звичайно, експерименти з пошуком та фільтрацією.
Тепер ви можете самостійно експериментувати, змінюючи та розширюючи код. Ви можете спробувати інші метрики відстаней, змінити розмір вектора, експериментувати з різними фільтрами і, найголовніше, застосувати ці знання у ваших власних проєктах!
Не забудьте, що дослідження та експерименти – це ключ до успіху. Удачі у ваших майбутніх проєктах! До зустрічі в наступних статтях та туторіалах!