Use ScyllaDB to perform semantic search across movie plot descriptions. Chúng tôi đã xây dựng một ứng dụng đề xuất phim mẫu để giới thiệu Ứng dụng mẫu cung cấp cho bạn một cách đơn giản để trải nghiệm xây dựng tìm kiếm ngữ nghĩa chậm trễ thấp và các ứng dụng dựa trên vector với ScyllaDB. Khả năng tìm kiếm vector mới của ScyllaDB Tham gia chương trình Vector Search Early Access Tham gia chương trình Vector Search Early Access Trong bài viết này, chúng tôi sẽ chỉ ra cách thực hiện tìm kiếm ngữ nghĩa trên các mô tả cốt truyện phim để tìm phim theo ý nghĩa, không phải từ khóa. ví dụ này cũng cho thấy cách bạn có thể thêm ScyllaDB Vector Search vào các ứng dụng hiện có của bạn. Trước khi đi sâu vào ứng dụng, chúng ta hãy làm rõ những gì chúng ta có nghĩa là tìm kiếm ngữ nghĩa và cung cấp một số ngữ cảnh về các hàm tương đồng. Các hàm tương tự vector Tương tự giữa hai vector có thể được tính theo nhiều cách. , (Sản phẩm nội bộ) và ScyllaDB Vector Search hỗ trợ tất cả các chức năng này. Cosine tương tự Sản phẩm Dot L2 Đối với các nhúng văn bản, điểm tương đồng cosine là hàm tương đồng được sử dụng thường xuyên nhất. Đó là bởi vì, khi làm việc với văn bản, chúng ta chủ yếu tập trung vào hướng của vector, chứ không phải kích thước của nó. điểm tương đồng cosine chỉ xem xét góc giữa các vector (tức là sự khác biệt về hướng) và bỏ qua kích thước (dài của vector). Ví dụ, một tài liệu ngắn (1 trang) và một tài liệu dài (10 trang) về cùng một chủ đề sẽ vẫn chỉ vào các hướng tương tự trong không gian vector mặc dù chúng có độ dài khác nhau. Trong thực tế, nhiều mô hình nhúng (ví dụ, ) sản xuất các vector bình thường hóa. các vector bình thường hóa đều có cùng chiều dài (kích thước của 1). Đối với các vector bình thường hóa, sự giống nhau của cosine và sản phẩm điểm trả về cùng một kết quả. Điều này là bởi vì sự giống nhau của cosine chia sản phẩm điểm bằng kích thước của các vector, tất cả đều là 1 khi các vector được bình thường hóa. hàm L2 tạo ra các giá trị khoảng cách khác nhau so với sản phẩm điểm hoặc sự giống nhau của cosine, nhưng thứ tự của các nhúng vẫn như nhau (giả định các vector bình thường hóa). Mẫu mở Bây giờ bạn đã hiểu rõ hơn về các chức năng tương đồng ngữ nghĩa, hãy giải thích cách ứng dụng giới thiệu hoạt động. App tổng quan Ứng dụng cho phép người dùng nhập loại phim mà họ muốn xem. Ví dụ, nếu bạn gõ “Bóng đá Mỹ”, ứng dụng sẽ so sánh đầu vào của bạn với được lưu trữ trong cơ sở dữ liệu. Kết quả đầu tiên là phù hợp tốt nhất, sau đó là các khuyến nghị tương tự khác. so sánh này sử dụng . plots of movies ScyllaDB Vector Search Bạn có thể tìm thấy các , cùng với các hướng dẫn cài đặt và a trong tài liệu. Đối với tập dữ liệu, chúng tôi đang tái sử dụng một tập dữ liệu TMDB . Mã nguồn trên GitHub Hướng dẫn step-by-step Có sẵn trên Kaggle Yêu cầu dự án Để chạy ứng dụng, bạn cần một tài khoản ScyllaDB Cloud và một cụm có khả năng tìm kiếm vector. Right now, bạn cần sử dụng API để tạo một cụm có khả năng tìm kiếm vector. ! Thực hiện theo các hướng dẫn ở đây để bắt đầu Ứng dụng phụ thuộc vào một vài gói Python: ScyllaDB Python driver – để kết nối và truy vấn ScyllaDB. Sentence Transformers – để tạo nhúng cục bộ mà không cần OpenAI hoặc các API trả phí khác. Streamlit – cho UI. Pydantic – để làm cho làm việc với kết quả truy vấn dễ dàng hơn. Theo mặc định, ứng dụng sử dụng mô hình để bất cứ ai cũng có thể chạy nó tại địa phương mà không cần yêu cầu tính toán nặng nề. , không có dịch vụ thương mại hoặc trả tiền là cần thiết để chạy ví dụ. Tất cả-MiniLM-L6-v2 Đám mây ScyllaDB Cấu hình và kết nối cơ sở dữ liệu a là File lưu trữ ScyllaDB Cloud credentials, bao gồm địa chỉ máy chủ và chi tiết kết nối. config.py Một ScyllaDB riêng biệt xử lý những điều sau: Hỗ trợ Module Tạo kết nối và phiên Nhập và truy vấn dữ liệu Cung cấp các chức năng trợ giúp cho tương tác cơ sở dữ liệu sạch Cơ sở dữ liệu Schema Chương trình được định nghĩa trong a file, được thực hiện khi chạy kịch bản di chuyển của dự án. Nó bao gồm: schema.cql Tạo Keyspace (với một yếu tố sao chép là 3) Định nghĩa bảng cho phim, lưu trữ các trường như release_date, tiêu đề, thể loại và cốt truyện Index tìm kiếm 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' }; Hosted với ❤ by Lời bài hát: Cql GitHub Chương trình nhấn mạnh: 'plot' - văn bản, lưu trữ mô tả phim được sử dụng để so sánh sự tương đồng. 'plot_embedding' – vector, đại diện nhúng của cốt truyện, được xác định bằng cách sử dụng kiểu dữ liệu vector với 384 chiều (tương ứng với mô hình Sentence Transformers). 'Primary key' - id là phím phân vùng cho tìm kiếm hiệu quả truy vấn bởi id CDC kích hoạt – yêu cầu cho tìm kiếm vector ScyllaDB. 'Index vector' - một chỉ số Approximate Nearest Neighbor (ANN) được tạo trên cột plot_embedding để cho phép truy vấn vector hiệu quả. Mục tiêu của sơ đồ này là cho phép tìm kiếm hiệu quả trên các nhúng cốt truyện và lưu trữ thông tin bổ sung cùng với các vector. Embeddings Một lớp Embedding Creator xử lý việc tạo văn bản nhúng với Transformers phông chữ. hàm này chấp nhận bất kỳ đầu vào văn bản nào và trả về một danh sách các giá trị nổi mà bạn có thể chèn vào cột 'vector' của ScyllaDB. Hướng dẫn sử dụng vector search Chức năng chính của ứng dụng là cung cấp đề xuất phim. những đề xuất này được thực hiện bằng cách sử dụng tìm kiếm vector. Handles này recommender Lấy Input Text Chuyển đổi văn bản thành embeddings Tìm kiếm vector 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] Hosted với ❤ by Lời khuyên.py GitHub Hãy chia tách các truy vấn tìm kiếm vector: SELECT * FROM recommend.movies ORDER BY plot_embedding ANN OF [0.1, 0.2, 0.3, …] LIMIT 5; Đầu tiên, đầu vào người dùng được chuyển đổi thành nhúng, đảm bảo rằng chúng tôi đang so sánh nhúng với nhúng. Các hàng trong bảng được sắp xếp theo giống nhau bằng cách sử dụng toán tử ANN (ANN OF). Kết quả được giới hạn trong năm bộ phim tương tự. Câu lệnh SELECT thu thập tất cả các cột từ bảng. Trong tìm kiếm sự tương đồng, chúng tôi tính toán khoảng cách giữa hai vector. Càng gần các vector trong không gian vector, nội dung cơ bản của chúng càng giống nhau. Hoặc, nói cách khác, khoảng cách nhỏ hơn cho thấy sự tương đồng cao hơn. do đó, một thứ tự theo thứ tự dẫn đến thứ tự tăng lên, với khoảng cách nhỏ hơn xuất hiện trước. Streamlitt UI UI, được định nghĩa trong Kết nối mọi thứ với nhau. app.py Nó lấy truy vấn của người dùng, chuyển đổi nó thành nhúng và thực hiện tìm kiếm vector. UI hiển thị phù hợp nhất và danh sách các đề xuất phim tương tự khác. Tự mình thử đi! Nếu bạn muốn bắt đầu xây dựng với ScyllaDB Vector Search, bạn có một số tùy chọn: Khám phá mã nguồn trên GitHub Sử dụng README để thiết lập ứng dụng trên máy tính của bạn Theo hướng dẫn để xây dựng ứng dụng từ đầu Nếu bạn có câu hỏi, hãy sử dụng Và chúng tôi sẽ rất vui khi giúp đỡ. Diễn đàn Về Attila Tóth là một nhà phát triển ủng hộ tại ScyllaDB. ông viết hướng dẫn và bài đăng blog, nói chuyện tại các sự kiện, tạo bản demo và ứng dụng mẫu để giúp các nhà phát triển xây dựng các ứng dụng hiệu suất cao. Attila Tôth