Use ScyllaDB to perform semantic search across movie plot descriptions. Showcase için örnek bir film önerme uygulaması oluşturduk Örnek uygulaması, ScyllaDB ile düşük latensiyel semantik arama ve vektör tabanlı uygulamalar oluşturmanın basit bir yolunu sunar. ScyllaDB’nin yeni vektor arama özellikleri Vector Search Early Access Programına Katılın Vector Search Early Access Programına Katılın Bu yazıda, anahtar kelimeler değil, anlamlara göre filmler bulmak için film sahne açıklamaları arasında semantik arama yapmanın nasıl yapıldığını göstereceğiz. Uygulama içine dalmadan önce, semantik aramaya ne demek istediğimizi açıklayalım ve benzerlik fonksiyonları hakkında bazı bağlamları sağlayalım. Vektör Benzerliği Fonksiyonları İki vektor arasındaki benzerlik birkaç şekilde hesaplanabilir.En yaygın yöntemler ve (Yerel ürünler ve ScyllaDB Vector Search tüm bu işlevleri destekler. Coşkun Benzeri Dot Ürünleri l2 Metin yerleştirmelerinde, cosine benzerliği en sık kullanılan benzerlik fonksiyonudur. Bu, metinle çalıştığımızda, çoğunlukla vektörün yönüne değil büyüklüğüne odaklanıyoruz. Cosine benzerliği sadece vektörler arasındaki açıyı (yani yön farkı) dikkate alır ve büyüklüğünü (vectorun uzunluğu) göz ardı eder. Örneğin, aynı konuyla ilgili kısa bir belge (1 sayfa) ve daha uzun bir belge (10 sayfa) farklı uzunluklara sahip olsa bile vektör alanında hala benzer yönlere işaret eder. Uygulamada pek çok model (örneğin, Normalized vectors all have the same length (magnitude of 1). for normalized vectors, cosine similarity and the dot product return the same result. This is because cosine similarity divides the dot product by the magnitudes of the vectors, which are all 1 when vectors are normalized. The L2 function produces different distance values compared to the dot product or cosine similarity, but the ordering of the embeddings remains the same (normalized vectors varsayarak). Açık Modeller Şimdi semantik benzerlik fonksiyonlarını daha iyi anladığınızda, önerme uygulamasının nasıl çalıştığını açıklayalım. App genel bakış Uygulama, kullanıcıların ne tür bir film izlemek istediğini girmelerini sağlar. örneğin, “Amerikan futbolu” yazarsanız, uygulama girişinizi veritabanında depolanır. ilk sonuç en iyi karşılaştırma, diğer benzer öneriler ile takip edilir. bu karşılaştırma . plots of movies ScyllaDB Vector Search Sen bulabilirsin o Ayrıca, kurulum talimatları ve a Belgelendirme: Veritabanı için TMDB veritabanını yeniden kullanıyoruz. . Github'da Kaynak Kodu Adım Adım Tutorial Kaggle Hakkında Proje gereksinimleri Uygulamayı çalıştırmak için ScyllaDB Cloud hesabına ve vektor arama etkinleştirilmiş bir kümesine ihtiyacınız var. ! Başlamak için buradaki talimatları izleyin Uygulama birkaç Python paketine bağlıdır: ScyllaDB Python sürücüsü - ScyllaDB'yi bağlamak ve sorgulamak için. Sentence Transformers - OpenAI veya diğer ücretli API'leri gerektirmeden yerel olarak eklentileri oluşturmak. Streamlit – UI için. Pydantik - sorgu sonuçları ile çalışmayı kolaylaştırmak için. Uygulama, uygulamanın kullanımı Herkes yerel olarak çalıştırılabilir, ağır bilgisayar gereksinimleri olmadan. Örnek çalıştırmak için herhangi bir ticari veya ücretli hizmet gerekmez. Tüm MiniLM-L6-v2 ScyllaDB Bulut Konfigurasyon ve Database Bağlantısı A için dosya ScyllaDB bulut kimliklerini, barındırma adresi ve bağlantı bilgileri de dahil olmak üzere depolar. config.py Ayrı bir ScyllaDB Aşağıdaki işlemi yapın: Modül Yardımcısı Bağlantı ve oturum oluşturma Verileri girin ve sorgulayın Temiz veritabanı etkileşimleri için yardımcı fonksiyonları sağlama Database Programı Program A’da tanımlanmıştır dosya, projenin göç senaryosunu çalıştırırken gerçekleştirilir.Bu içerir: schema.cql Keyspace oluşturma (bir replika faktörü ile 3) Filmler için tablo tanımlama, release_date, title, genre ve plot gibi alanları depolamak Vektor Arama Endeksi 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' }; Eşyaları ile evlenmek Çözüm. cql GitHub için Program şunları vurguluyor: 'Plot' - metin, benzerlik karşılaştırması için kullanılan film açıklamalarını depolamaktadır. 'plot_embedding' - 384 boyutlu vektör veri türü kullanılarak tanımlanan vektör (Sentence Transformers modeli ile eşleşen). 'Primer anahtar' - id ile sorgulanan verimli arama için bölünme anahtarı olarak id CDC etkinleştirilmiş - ScyllaDB vektor arama için gereklidir. 'Vector index' - etkili vektor sorgularına izin vermek için plot_embedding sütununda oluşturulan Yaklaşık En Yakın Komşu (ANN) indeksidir. Bu şemanın amacı, sahne yerleştirmeleri üzerinde verimli bir arama sağlamanın ve vektorların yanında ek bilgi depolamanın sağlanmasıdır. Embeddedler Embedding Creator sınıfı, Sentence Transformers ile metin yerleştirme üretimi ile ilgilenir. fonksiyon herhangi bir metin girişini kabul eder ve ScyllaDB'nin 'vektor' sütununa yerleştirebileceğiniz bir float değerlerinin listesini döndürür. Vektor arama ile uygulanan öneriler Uygulamanın ana işlevi film önerileri sağlamaktır. Bu öneriler vektor arama kullanılarak uygulanır. Bu elemanlar recommender Giriş Metni Almak Yazıyı eklentilere dönüştürmek Vektör Araması 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] Eşyaları ile evlenmek Yorumlar.py GitHub için Vektör arama sorgusunu bölelim: SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; Kullanıcı girişi önce bir eklemeye dönüştürülür, böylece eklemeyi eklemeye kıyasladığımızdan emin olursunuz. Tablodaki satırlar ANN operatörü (ANN OF) kullanılarak benzerliğe göre sıralanır. Sonuçlar beş benzer filmle sınırlıdır. SELECT ifadesi, tablodaki tüm sütunları alır. Benzerlik aramasında, iki vektör arasındaki mesafeyi hesaplıyoruz. Vektör alanında vektörler ne kadar yakınsa, temel içeriği o kadar benzerdir. Ya da, başka bir deyişle, daha küçük bir mesafe daha yüksek benzerlik gösterir. Çıkış UI UI, tanımlanmıştır Her şeyi bir araya getirin. app.py Kullanıcının sorgusunu alır, bir eklemeye dönüştürür ve bir vektor aramasını gerçekleştirir. UI, en iyi eşleşmeyi ve diğer benzer film önerilerinin bir listesini gösterir. Bunu kendiniz deneyin! ScyllaDB Vector Search ile oluşturmaya başlamak istiyorsanız, birkaç seçeneğiniz var: GitHub'da kaynak kodunu keşfedin README uygulamasını bilgisayarınızda kurmak için kullanın Uygulamayı sıfırdan oluşturmak için öğreticiyi izleyin Sorularınız varsa, kullanın Ve yardım etmekten mutluluk duyarız. Forum Hakkında Attila Tóth Hakkında ScyllaDB'de bir geliştiricinin savunucusu, öğretici yazar ve blog yazar, etkinliklerde konuşur, demo ve örnek uygulamaları oluşturur ve geliştiricilerin yüksek performanslı uygulamaları oluşturmalarına yardımcı olur. Atilla Çakır