База данных векторов

CRUD с сосновой шишкой

Простое руководство по началу работы с векторной базой данных с точки зрения традиционной базы данных.

Быстрый рост приложений машинного обучения и достижения в области искусственного интеллекта стимулировали спрос на специализированные решения для хранения данных.

Векторные базы данных стали популярным выбором для обработки крупномасштабных многомерных данных благодаря их способности выполнять эффективный поиск по сходству и поддерживать сложные структуры данных. В последнее время Pinecone становится все более популярным среди разработчиков и специалистов по данным как масштабируемое и эффективное решение для векторных баз данных.

Я обнаружил, что есть много людей, обучающих использованию Pinecone, но никто не описывает его с точки зрения традиционной базы данных, например, в сравнении с традиционной базой данных SQL.

В этой статье мы дадим четкое представление об операциях CRUD (создание, чтение, обновление и удаление) в Pinecone с точки зрения традиционной базы данных. Мы углубимся в различия между векторными и традиционными базами данных, изучая, как можно использовать векторные базы данных для оптимизации управления данными в современных приложениях.

Код этой статьи доступен здесь

Что такое векторная база данных?

База данных векторов — это специализированная база данных, предназначенная для хранения, управления и запросов к многомерным данным, представленным в виде векторов. Эти базы данных удобны в приложениях, требующих эффективного поиска по сходству, таких как системы рекомендаций, механизмы поиска изображений и текста и задачи обработки естественного языка.

В векторной базе данных точки данных представлены в виде векторов в многомерном пространстве, а отношения между ними измеряются с использованием метрик расстояния, таких как евклидово расстояние, косинусное сходство или манхэттенское расстояние. Индексируя эти векторы и оптимизируя алгоритмы поиска, векторные базы данных могут быстро выполнять поиск сходства даже с огромными наборами данных.

В отличие от традиционных баз данных, ориентированных на реляционное или документное хранилище, векторные базы данных подчеркивают важность пространственных отношений между точками данных. Этот уникальный подход позволяет векторным базам данных предоставлять высокопроизводительные и точные результаты поиска в приложениях, требующих быстрой идентификации похожих элементов в наборе данных.

Для начала вот иллюстрация того, как мы взаимодействуем с векторной базой данных:

Начало работы с сосновой шишкой

После того, как вы получили доступ к Pinecone, создайте новые индексы со следующими настройками:

Укажите имя вашего индекса и необходимые измерения. В моем случае я буду использовать «manfye-тест» и размерность 300 в своих индексах. Нажмите «Создать индекс», и индекс будет создан, как показано ниже:

Индексы похожи на таблицу в SQL, где вы можете выполнять операции CRUD в индексах так же, как в SQL.

Прежде чем мы начнем нашу операцию CRUD, давайте соберем все необходимые ингредиенты:

Установка необходимых пакетов, таких как pinecone-client, который позволяет вам взаимодействовать с pinecone и Offering_transformers, которые помогают вам векторизовать ваши данные:

!pip install pinecone-client
!pip install sentence_transformers

Вы можете получить API-ключ и имя среды от Pinecone на вкладке «API-KEY» на панели управления Pinecone.

Работа с индексами шишек

Есть несколько функций по обработке, которые вам нужно знать, прежде чем продолжить, как и при настройке соединения SQL:

а) Подключение к серверу Pinecone и индексам

import itertools
import pinecone

#Connecting to Pinecone Server
api_key = "YOUR_API_KEY"

pinecone.init(api_key=api_key, environment='YOUR_ENV_IN_DASHBOARD')

#Connect to your indexes
index_name = "manfye-test"

index = pinecone.Index(index_name=index_name)

б) Изучение ваших индексов

# Getting Index Details
pinecone.describe_index(index_name)

# Return:
# IndexDescription(name='manfye-test', metric='cosine', replicas=1, dimension=300.0, shards=1, pods=1, pod_type='s1.x1', status={'ready': True, 'state': 'Ready'}, metadata_config=None, source_collection='')

index.describe_index_stats()

# Return:
# {'dimension': 300,
# 'index_fullness': 0.0,
# 'namespaces': {},
# 'total_vector_count': 0}

describe_index_stats чрезвычайно полезен, особенно если вы хотите знать, сколько данных содержится в ваших индексах.

Подготовка набора данных

Во-первых, мы создадим набор данных жалоб, как показано ниже, это будут наши основные данные для игры:

import pandas as pd

data = {
    'ticketno': [1001, 1002, 1003, 1004, 1005, 1006, 1007, 1008, 1009, 1010],
    'complains': [
        'Broken navigation button on the website',
        'Incorrect pricing displayed for a product',
        'Unable to reset password',
        'App crashes on the latest iOS update',
        'Payment processing error during checkout',
        'Wrong product delivered',
        'Delayed response from customer support',
        'Excessive delivery time for an order',
        'Difficulty in finding a specific product',
        'Error in applying a discount coupon'
    ]
}

df = pd.DataFrame(data)

C — Создание данных в индексах

Чтобы создать данные в векторной базе данных, нам сначала нужно преобразовать наши данные в вектор с помощью метода, называемого векторным встраиванием. Существует несколько способов встраивания векторов, один из известных способов — использование API встраивания OpenAI.

Однако, чтобы не усложнять эту статью, мы будем использовать пакеты SentenceTransformer для встраивания. Пакет автоматически загрузит необходимые модели «average_word_embeddings_glove.6B.300d».

from sentence_transformers import SentenceTransformer

model = SentenceTransformer("average_word_embeddings_glove.6B.300d")

df["question_vector"] = df.complains.apply(lambda x: model.encode(str(x)).tolist())

Код создаст столбец «question_vector» со встроенными векторами. Не то чтобы все слова в жалобах превращались в числа.

Наконец, загрузите данные (upsert) в индексы через куски:

def chunks(iterable, batch_size=100):
    it = iter(iterable)
    chunk = tuple(itertools.islice(it, batch_size))
    while chunk:
        yield chunk
        chunk = tuple(itertools.islice(it, batch_size))

for batch in chunks([(str(t), v) for t, v in zip(df.ticketno, df.question_vector)]):
    index.upsert(vectors=batch)
    

Теперь проверьте свои индексы с помощью index.describe_index_stats():

index.describe_index_stats()

# Return:
# {'dimension': 300,
# 'index_fullness': 0.0,
# 'namespaces': {'': {'vector_count': 10}},
# 'total_vector_count': 10}

Обратите внимание, что количество векторов уже увеличилось до 10, поздравляем с загрузкой набора данных в базу данных векторов.

R — Получение векторов

Чтение в векторном контексте относится к двум функциям, первая из которых — это функция чтения, где вы передаете идентификатор своих данных, и Pinecone вернет вам сохраненный вектор:

index.fetch(["1010","1009"])

Получить данные легко, просто используйте index.fetch([‹Список идентификаторов›]), просто введите список идентификаторов, которые вы хотите получить, и Pinecone вернет вам векторы.

Второй заключается в возврате похожих данных, соответствующих вашим запросам:

query_questions = [
    "navigation button",
]

query_vectors = [model.encode(str(question)).tolist() for question in query_questions]

query_results = index.query(queries=query_vectors, top_k=5, include_values=False)

В приведенном выше коде я попросил Pinecone найти похожие результаты по «кнопке навигации» и вернуть мне 5 наиболее похожих результатов (top_k = 5), как показано ниже:

Обратите внимание, что по умолчанию Pinecone не возвращает значения, если это не указано в параметре index.query() include_values=True. Из приведенного выше результата показана оценка сходства и идентификатор первых 5 похожих результатов.

Следующее, что нужно преобразовать результат в таблицу и объединить ее обратно в нашу основную базу данных. Код выглядит следующим образом:

# Extract matches and scores from the results
matches = []
scores = []
for match in query_results['results'][0]['matches']:
    matches.append(match['id'])
    scores.append(match['score'])

# Create DataFrame with only matches and scores
matches_df = pd.DataFrame({'id': matches, 'score': scores})

# Match the result dataframe to main dataframe
df["ticketno"] = df["ticketno"].astype(str)
matches_df.merge(df,left_on="id",right_on="ticketno")

Результирующая совпадающая таблица выглядит следующим образом: очевидно, что жалоба 1001 касается кнопки навигации с оценкой сходства 0,81, а остальные имеют более низкие оценки сходства, это может быть связано с размером нашего набора данных:

U — Обновление векторов

Для обновления существующего вектора просто повторите шаг создания с предполагаемыми векторами обновления. Перезапишите данные с тем же идентификатором с помощью функции upsert:

    index.upsert(vectors=batch)

D — Удаление векторов

Чтобы удалить по ID:

index.delete(ids=["id-1", "id-2"], namespace='')

Чтобы удалить все и снова повеселиться:

index.delete(deleteAll='true', namespace="")

Ограничение и альтернатива сосновой шишке

Хотя Pinecone предлагает простую в использовании векторную базу данных, подходящую для начинающих, важно помнить о ее ограничениях. Уровень бесплатного пользования, в котором используется модуль p1, позволяет хранить только около 1 000 000 строк данных в 768-мерном векторе. Для крупномасштабных приложений или более требовательных вариантов использования этого может быть недостаточно.

Более того, платные уровни Pinecone могут быть довольно дорогими, что может быть недоступно для всех пользователей. В результате вы можете захотеть изучить другие альтернативы, такие как локальное размещение chroma или Weaviate, прежде чем переходить на платный план или расширять свое приложение.

Слова автора

В заключение, эта статья предоставила исчерпывающее руководство по пониманию и выполнению операций CRUD с помощью Pinecone с точки зрения традиционной базы данных.

Моя цель как автора состояла в том, чтобы демистифицировать процесс работы с векторными базами данных и показать, как уникальные функции векторных баз данных делают их мощным и эффективным решением для управления многомерными данными в приложениях машинного обучения и искусственного интеллекта.

Познакомив вас с процессом создания, чтения, обновления и удаления данных в индексе Pinecone, я надеюсь дать ценную информацию о том, как эффективно управлять данными и запрашивать данные в векторной базе данных. Я надеюсь, что, получив эти знания, вы теперь готовы использовать возможности векторных баз данных в своих проектах и ​​приложениях.

Наконец, спасибо, что читаете мои статьи. Если вы хотите подписаться на членство в Medium, рассмотрите возможность использования моей ссылки ниже. Это окажет мне большую поддержку в написании большего количества статей.



Если вам понравилась моя статья, вот еще статьи от меня:



Рекомендации

  1. Документация по шишкам