Use ScyllaDB to perform semantic search across movie plot descriptions. Мы построили приложение для рекомендаций по образцам фильмов, чтобы показать Приложение выборки дает вам простой способ испытать создание семантических поисков с низкой задержкой и векторных приложений с помощью ScyllaDB. Новые возможности векторного поиска ScyllaDB Вход в программу раннего доступа Vector Search Вход в программу раннего доступа Vector Search В этой статье мы покажем, как выполнять семантический поиск по описаниям сюжета фильма, чтобы найти фильмы по смыслу, а не по ключевым словам. Прежде чем погрузиться в приложение, давайте проясним, что мы имеем в виду под семантическим поиском, и предоставим некоторый контекст о функциях сходства. Функции векторного сходства Сходство между двумя векторами можно вычислить несколькими способами. , (внутренний продукт) и ScyllaDB Vector Search поддерживает все эти функции. сходство косины Дот Продукт Л2 Для текстовых встраиваний косиновое сходство является наиболее часто используемой функцией сходства. Это потому, что при работе с текстом мы в основном фокусируемся на направлении вектора, а не на его величине. Например, короткий документ (1 страница) и более длинный документ (10 страниц) на одну и ту же тему все равно укажут в похожих направлениях в векторном пространстве, даже если они имеют разную длину. На практике многие модели встраивания (например, ) производят нормализованные векторы. Нормализованные векторы все имеют одинаковую длину (величина 1). Для нормализованных векторов косиновое сходство и продукт точки возвращают тот же результат. Это потому, что косиновое сходство разделяет продукт точки по величинам векторов, которые все 1 при нормализации векторов. Функция L2 производит различные значения расстояния по сравнению с продуктом точки или сходством косины, но порядок встраиваний остается прежним (предполагая нормализованные векторы). Открытые модели Теперь, когда у вас есть лучшее понимание функций семантического сходства, давайте объясним, как работает приложение рекомендаций. App обзор Приложение позволяет пользователям вводить, какой тип фильма они хотят посмотреть. Например, если вы вводите «Американский футбол», приложение сравнивает ваш ввод с хранится в базе данных. Первый результат является лучшим сопоставлением, за которым следуют другие аналогичные рекомендации. . plots of movies ScyllaDB Vector Search Вы можете найти тот Наряду с инструкциями и Для набора данных мы используем набор данных TMDB . Исходный код на GitHub Шаг за шагом Tutorial Доступно для Kaggle Требования проекта Чтобы запустить приложение, вам понадобится учетная запись ScyllaDB Cloud и кластер с возможностью векторного поиска. ! Следуйте инструкциям здесь, чтобы начать Приложение зависит от нескольких пакетов Python: ScyllaDB Python driver — для подключения и запроса ScyllaDB. Сенсационные трансформаторы — для создания локальных встраиваний без необходимости OpenAI или других платных API. Streamlit – для UI. Пидантика — для облегчения работы с результатами запросов. По умолчанию приложение использует модель, чтобы каждый мог запускать ее локально без больших вычислительных требований. Для выполнения примера не нужны коммерческие или платные услуги. все-MiniLM-L6 v2 Облако ScyllaDB Конфигурация и подключение базы данных А файлы хранят ScyllaDB Cloud credentials, включая адрес хоста и детали подключения. config.py Отдельный ScyllaDB Он обрабатывает следующее: Помощь модуля Создание соединения и сессии Ввод и запрос данных Предоставление вспомогательных функций для чистого взаимодействия баз данных Схема базы данных Эта схема определена в файл, выполненный при запуске сценария миграции проекта. Он включает в себя: schema.cql Создание ключевого пространства (с коэффициентом репликации 3) Определение таблицы для фильмов, хранение полей, таких как release_date, title, genre и plot Индекс поиска векторов CREATE KEYSPACE recommend WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': '3'}; CREATE TABLE recommend.movies ( id INT, release_date TIMESTAMP, title TEXT, tagline TEXT, genre TEXT, imdb_id TEXT, poster_url TEXT, plot TEXT, plot_embedding VECTOR<FLOAT, 384>, PRIMARY KEY (id) ) WITH cdc = {'enabled': 'true'}; CREATE INDEX IF NOT EXISTS ann_index ON recommend.movies(plot_embedding) USING 'vector_index' WITH OPTIONS = { 'similarity_function': 'DOT_PRODUCT' }; Приглашаем на ❤ By Схема.ккл GitHub Схема подчеркивает: «Площадь» — текст, хранит описание фильма, используемое для сравнения сходства. «plot_embedding» — вектор, встраивающий представление сюжета, определенный с использованием векторного типа данных с 384 измерениями (совместимый с моделью Sentence Transformers). «Первичный ключ» — id как ключ раздела для эффективных поисковых запросов по id CDC enabled — требуется для поиска векторов ScyllaDB. «Векторный индекс» — индекс приблизительного ближайшего соседа (ANN), созданный в столбце plot_embedding для обеспечения эффективных векторных запросов. Цель этой схемы состоит в том, чтобы позволить эффективный поиск на встраиваемых участках и хранить дополнительную информацию наряду с векторами. Embeddings Класс Embedding Creator обрабатывает встраивание текста с помощью трансформаторов предложений. Функция принимает любой ввод текста и возвращает список плавающих значений, которые вы можете вставить в «векторную» колонку ScyllaDB. Рекомендации, реализованные с помощью векторного поиска Основной функцией приложения является предоставление рекомендаций по фильмам. Эти рекомендации реализуются с помощью векторного поиска. Эти рукоятки recommender Используя вводный текст Превращение текста в встраиваемые Поиск векторов from db.scylladb import ScyllaClient from embedding_creator import EmbeddingCreator from models import Movie class MovieRecommender: def __init__(self): self.scylla_client = ScyllaClient() self.embedding_creator = EmbeddingCreator("all-MiniLM-L6-v2") def similar_movies(self, user_query: str, top_k=5) -> list[Movie]: db_client = ScyllaClient() user_query_embedding = self.embedding_creator.create_embedding(user_query) db_query = f""" SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF %s LIMIT %s; """ values = [user_query_embedding, top_k] results = db_client.query_data(db_query, values) return [Movie(**row) for row in results] Приглашаем на ❤ By Рекомендуем.Пи GitHub Давайте разделим векторный поисковый запрос: SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; Ввод пользователя сначала преобразуется в встраивание, гарантируя, что мы сравниваем встраивание с встраиванием. Ряды в таблице упорядочены по схожести с использованием оператора ANN (ANN OF). Результаты ограничены пятью похожими фильмами. Высказывание SELECT отображает все столбцы из таблицы. В поиске сходства мы рассчитываем расстояние между двумя векторами. Чем ближе векторы в векторном пространстве, тем больше похоже их основное содержание. или, другими словами, меньшее расстояние предполагает более высокое сходство. Streamlit UI УИ, определенный в Свяжите все вместе. app.py Он берет запрос пользователя, преобразует его в встраивание и выполняет векторный поиск. Пользовательский интерфейс отображает лучший матч и список других подобных рекомендаций к фильмам. Попробуйте это сами! Если вы хотите начать строительство с помощью ScyllaDB Vector Search, у вас есть несколько вариантов: Исследуйте исходный код на GitHub Используйте README, чтобы установить приложение на вашем компьютере Следуйте инструкции, чтобы создать приложение с нуля Если у вас есть вопросы, используйте И мы будем рады помочь. Форум О Атиле Тоте является сторонником разработчиков в ScyllaDB. Он пишет учебники и публикации в блогах, выступает на мероприятиях, создает демонстрации и выборки приложений, чтобы помочь разработчикам создавать высокопроизводительные приложения. АТИЛА ТОТ