| Version 3 (modified by , 3 days ago) ( diff ) |
|---|
Петта фаза — Напредна тема: pgvector
pgvector е избран затоа што традиционалното пребарување на филмови со LIKE или точно совпаѓање на зборови не е доволно за modern апликации. Со pgvector се овозможува семантичко пребарување — наоѓање на слични филмови врз основа на значење, а не само точни зборови.
Системот за кино резервации има потреба од препорака на филмови на корисниците. Наместо да пребарува по жанр или наслов, системот може да препорача филмови кои се семантички слични на она што корисникот го гледал или пребарувал. Ова го подобрува корисничкото искуство и го зголемува бројот на резервации.
Го прошируваме модулот за пребарување и препорака на филмови со додавање на vector similarity search во PostgreSQL базата преку pgvector екстензијата.
Инсталација
Visual Studio Installer → Modify → Workloads → Desktop Development with C++
Отвори x64 Native Tools Command Prompt as Administrator и изврши:
set "PGROOT=C:\Program Files\PostgreSQL\16" cd %TEMP% git clone --branch v0.8.2 https://github.com/pgvector/pgvector.git cd pgvector nmake /F Makefile.win nmake /F Makefile.win install
Во pgAdmin изврши:
CREATE EXTENSION vector;
Креирање табели:
CREATE TABLE movie (
id BIGSERIAL PRIMARY KEY, title VARCHAR(200), genre VARCHAR(100), release_year INTEGER, description TEXT
);
CREATE TABLE movie_embedding (
movie_id BIGINT PRIMARY KEY, embedding vector(4)
);
Внесување податоци:
INSERT INTO movie(title, genre) VALUES ('Fast Racing', 'Action'),
('Formula Champions', 'Sport'), ('Space Adventure', 'Sci-Fi');
INSERT INTO movie_embedding(movie_id, embedding) VALUES (1, '[0.95, 0.87, 0.12, 0.33]'),
(2, '[0.91, 0.85, 0.15, 0.30]'), (3, '[0.10, 0.12, 0.95, 0.88]');
Similarity search (Euclidean):
SELECT movie.title,
embedding <-> '[0.90, 0.80, 0.10, 0.20]' AS distance
FROM movie_embedding JOIN movie ON movie.id = movie_embedding.movie_id ORDER BY distance;
SQL функција за similarity search:
CREATE OR REPLACE FUNCTION search_movies_by_embedding(query_embedding vector(4))
RETURNS TABLE(title TEXT, distance FLOAT) LANGUAGE SQL
AS $$ SELECT movie.title,
embedding <-> query_embedding AS distance
FROM movie_embedding JOIN movie ON movie.id = movie_embedding.movie_id ORDER BY distance; $$;
Top K search — враќа само најсличните N резултати: SELECT movie.title FROM movie_embedding JOIN movie ON movie.id = movie_embedding.movie_id ORDER BY embedding <-> '[0.90, 0.80, 0.10, 0.20]' LIMIT 2;
Hybrid search — комбинира филтер по жанр и similarity: SELECT movie.title FROM movie_embedding JOIN movie ON movie.id = movie_embedding.movie_id WHERE genre = 'Action' ORDER BY embedding <-> '[0.90, 0.80, 0.10, 0.20]' LIMIT 5;
HNSW индекс за брзо пребарување: CREATE INDEX ON movie_embedding
USING hnsw (embedding vector_cosine_ops);
Cosine similarity search:
SELECT movie.title,
embedding <=> '[0.90, 0.80, 0.10, 0.20]' AS cosine_distance
FROM movie_embedding JOIN movie ON movie.id = movie_embedding.movie_id ORDER BY cosine_distance;
Со pgvector го проширивме системот со можност за семантичко пребарување и препорака на филмови. Имплементирани се Euclidean и Cosine similarity search, Top K search, Hybrid search и HNSW индекс за оптимално пребарување при голем број на записи.
