Use ScyllaDB to perform semantic search across movie plot descriptions. Nós construímos um aplicativo de recomendação de filmes para mostrar O aplicativo de amostra oferece uma maneira simples de experimentar a construção de pesquisas semânticas de baixa latência e aplicações baseadas em vetores com o ScyllaDB. Novos recursos de pesquisa de vetores do ScyllaDB Conheça o programa de acesso antecipado Vector Search Conheça o programa de acesso antecipado Vector Search Neste post, mostraremos como realizar a pesquisa semântica entre descrições de trama de filmes para encontrar filmes por significado, não por palavras-chave. Antes de mergulhar no aplicativo, vamos esclarecer o que queremos dizer por pesquisa semântica e fornecer algum contexto sobre funções de semelhança. Funções de semelhança de vetores A semelhança entre dois vetores pode ser calculada de várias maneiras. , em (produto interno) e O ScyllaDB Vector Search suporta todas essas funções. A semelhança cosmológica Produto DOT L2 Para inserções de texto, a semelhança cosina é a função de semelhança mais frequentemente usada. Isto é porque, quando trabalhamos com texto, focamos principalmente na direção do vetor, em vez de sua magnitude. Por exemplo, um documento curto (1 página) e um documento mais longo (10 páginas) sobre o mesmo tópico ainda apontarão em direções semelhantes no espaço vetorial, mesmo que sejam de comprimentos diferentes. Na prática, muitos modelos embutidos (por exemplo, ) produzem vetores normalizados. vetores normalizados têm todos o mesmo comprimento (magnitude de 1). Para vetores normalizados, a semelhança cosina e o produto ponto retornam o mesmo resultado. Isto é porque a semelhança cosina divide o produto ponto pelas magnitudes dos vetores, que são todos 1 quando os vetores são normalizados. A função L2 produz valores de distância diferentes em comparação com o produto ponto ou semelhança cosina, mas a ordem das incorporações permanece a mesma (assumindo vetores normalizados). Modelos abertos Agora que você tem uma melhor compreensão das funções de semelhança semântica, vamos explicar como o aplicativo de recomendação funciona. App Visão Geral O aplicativo permite que os usuários digitem que tipo de filme eles querem assistir. Por exemplo, se você digitar "Futebol Americano", o aplicativo compara sua entrada com o armazenado no banco de dados. O primeiro resultado é o melhor encontro, seguido por outras recomendações semelhantes. . plots of movies ScyllaDB Vector Search Você pode encontrar o Juntamente com as instruções e a Para o conjunto de dados, estamos reutilizando um conjunto de dados TMDB . O código fonte no GitHub Tutoriais passo a passo Disponível em Kaggle Requisitos do projeto Para executar o aplicativo, você precisa de uma conta ScyllaDB Cloud e de um cluster habilitado para pesquisa por vetores. ! Siga as instruções aqui para começar A aplicação depende de alguns pacotes de Python: ScyllaDB Python driver – para conectar e consultar ScyllaDB. Sentence Transformers – para gerar embeddings localmente sem exigir OpenAI ou outras APIs pagas. Streamlit – para a UI. Pydantic – para facilitar o trabalho com os resultados da consulta. Por padrão, o aplicativo usa o modelo para que qualquer um possa executá-lo localmente sem exigências pesadas de computação. Não são necessários serviços comerciais ou pagos para executar o exemplo. todo-MiniLM-L6 v2 ScyllaDB em nuvem Configuração e conexão de banco de dados a Armazena as credenciais do ScyllaDB Cloud, incluindo o endereço do host e detalhes de conexão. config.py Um ScyllaDB separado Gerencie o seguinte: Módulo de Ajuda Criar a conexão e a sessão Introdução e consulta de dados Fornecer funções de auxílio para interações de banco de dados limpas Plano de banco de dados O esquema é definido em a arquivo, executado ao executar o script de migração do projeto. Ele inclui: schema.cql Criação de espaço-chave (com um fator de replicação de 3) Definição de tabela para filmes, armazenando campos como release_date, título, gênero e enredo Índice de Pesquisa Vector 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' }; hospedado com os Página inicial.cql GitHub O esquema destaca: 'plot' - texto, armazena a descrição do filme usada para a comparação de semelhanças. 'plot_embedding' – vetor, representação embutida da trama, definida usando o tipo de dados vetorial com 384 dimensões (correspondendo ao modelo de Transformadores de sentença). 'Chave primária' - id como a chave de partição para pesquisas eficientes que buscam por id CDC habilitado – necessário para a pesquisa do vetor ScyllaDB. 'Índice de vetor' – um índice aproximado de vizinho mais próximo (ANN) criado na coluna plot_embedding para permitir consultas de vetor eficientes. O objetivo deste esquema é permitir a pesquisa eficiente nas incorporações da trama e armazenar informações adicionais ao lado dos vetores. Embaixadores Uma classe Embedding Creator lida com a geração de incorporação de texto com Transformadores de sentença. A função aceita qualquer entrada de texto e retorna uma lista de valores flutuantes que você pode inserir na coluna 'vetor' do ScyllaDB. Recomendações implementadas com pesquisa de vetores A principal função do aplicativo é fornecer recomendações de filmes. Estas recomendações são implementadas usando a pesquisa por vetores. Essas mãos recommender Tomando o texto de entrada Transformando o texto em embeddings Pesquisa de vetores 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] hospedado com os Recomendações.Py GitHub Então, vamos quebrar a pesquisa de vetores: SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; A entrada do usuário é primeiro convertida em uma incorporação, garantindo que estamos comparando a incorporação com a incorporação. As linhas na tabela são ordenadas por semelhança usando o operador ANN (ANN OF). Os resultados são limitados a cinco filmes semelhantes. A declaração SELECT recupera todas as colunas da tabela. Na busca de semelhança, calculamos a distância entre dois vetores. Quanto mais próximos os vetores no espaço vetorial, mais semelhante é o seu conteúdo subjacente. Ou, em outras palavras, uma distância menor sugere maior semelhança. Portanto, uma ordem por ordem resulta em ordem ascendente, com distâncias menores aparecendo primeiro. StreamLite UI A UI, definida em Conecte tudo em conjunto. app.py Ele leva a consulta do usuário, converte-a em um embedding e executa uma pesquisa por vetores. A interface exibe a melhor correspondência e uma lista de outras recomendações de filmes semelhantes. Experimente você mesmo! Se você quiser começar a construir com o ScyllaDB Vector Search, você tem várias opções: Conheça o código-fonte no GitHub Use o README para configurar o aplicativo no seu computador Siga o tutorial para construir o aplicativo do zero Se tiver alguma dúvida, use o E seremos felizes em ajudar. Fórum Sobre Atila Tóth É advogado de desenvolvedores na ScyllaDB. Ele escreve tutoriais e postagens de blog, fala em eventos, cria demonstrações e amostras de aplicativos para ajudar os desenvolvedores a construir aplicativos de alto desempenho. Atila Tóth