| Version 5 (modified by , 2 days ago) ( diff ) |
|---|
Advanced Phase - AI Book Recommendation System with pgvector
Опис
Во оваа фаза е имплементиран систем за персонализирани препораки на книги со користење на AI embeddings и pgvector екстензијата за PostgreSQL.
Целта е за даден член да се препорачаат книги што сè уште ги нема позајмено, но кои се семантички слични со книгите што претходно ги има позајмено.
Секоја книга добива векторска репрезентација (embedding) генерирана од:
book title + description + genres + categories + authors
Како функционира?
Основната идеја е:
Book metadata -> AI model -> Vector embedding -> Cosine similarity -> Recommended books
За секој член системот ги зема книгите од loan_history, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity.
Чекор 1 - PostgreSQL со pgvector во Docker
Бидејќи локалниот PostgreSQL немаше достапна vector екстензија, беше креиран Docker PostgreSQL container со веќе инсталиран pgvector.
docker run --name booknest-postgres \ -e POSTGRES_PASSWORD=postgres \ -e POSTGRES_DB=booknest \ -p 5433:5432 \ -d pgvector/pgvector:pg16
Потоа во DataGrip беше креирана нова конекција:
Host: localhost Port: 5433 Database: booknest User: postgres Password: postgres
Со ова беше овозможено користење на pgvector екстензијата во проектот.
Чекор 2 - Префрлање на постоечката база
Постоечката BookNest база беше извезена со pg_dump:
"C:\Program Files\PostgreSQL\18\bin\pg_dump.exe" -h localhost -p 5432 -U postgres -d postgres -f C:\Users\Ivana\Desktop\booknest_backup.sql
Потоа backup фајлот беше внесен во Docker PostgreSQL базата:
"C:\Program Files\PostgreSQL\18\bin\psql.exe" -h localhost -p 5433 -U postgres -d booknest -f C:\Users\Ivana\Desktop\booknest_backup.sql
На овој начин сите постоечки податоци беа успешно префрлени во новата pgvector база.
Чекор 3 - Активирање на pgvector
Во PostgreSQL беше активирана vector екстензијата:
CREATE EXTENSION IF NOT EXISTS vector;
Проверка:
SELECT * FROM pg_available_extensions WHERE name='vector';
Резултатот потврдува дека pgvector е успешно инсталиран и активен.
Чекор 4 - Додавање embedding колона
Во табелата book беше додадена нова колона од тип vector(384):
ALTER TABLE book ADD COLUMN IF NOT EXISTS embedding vector(384);
Димензијата 384 одговара на AI моделот all-MiniLM-L6-v2 кој се користи за генерирање embeddings.
Секој запис во оваа колона содржи векторска репрезентација на една книга.
Чекор 5 - Генерирање embeddings
Беа инсталирани потребните Python библиотеки:
pip install sentence-transformers psycopg2-binary
Креирана беше Python скрипта generate_embeddings.py.
Скриптата ги чита:
- насловот на книгата
- описот
- жанровите
- категориите
- авторите
и од нив генерира embedding користејќи го моделот:
all-MiniLM-L6-v2
Генерираниот embedding се зачувува во колоната:
book.embedding
По извршувањето на скриптата беа генерирани embeddings за 10000 книги.
Проверка:
SELECT COUNT(*) FROM book WHERE embedding IS NOT NULL;
Резултатот покажува дека embeddings се успешно генерирани.
Чекор 6 - Индекс за побрзо пребарување
За побрзо пребарување по cosine similarity беше креиран ivfflat индекс:
CREATE INDEX IF NOT EXISTS idx_book_embedding ON book USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100); ANALYZE book;
Овој индекс овозможува значително побрзо пребарување на најслични вектори без да се споредуваат сите книги во табелата.
Чекор 7 - Функција за препораки
Беше креирана PostgreSQL функција:
recommend_books_for_member_pgvector(
p_member_id,
p_limit
)
Функцијата работи во неколку чекори:
- Ги наоѓа книгите што членот претходно ги има позајмено.
- Го пресметува просечниот embedding профил на членот.
- Ги разгледува сите останати книги.
- Ги исклучува книгите што членот веќе ги има позајмено.
- Ги рангира книгите според cosine similarity.
- Ги враќа најдобрите N препораки.
Клучниот pgvector дел е:
b.embedding <=> mp.profile_embedding
Операторот <=> пресметува cosine distance помеѓу два embeddings.
Similarity се пресметува како:
1 - (b.embedding <=> mp.profile_embedding)
Колку вредноста е поблиску до 1, толку книгата е послична на читачкиот профил на членот.
Чекор 8 - Тестирање на препораките
Пример повик:
SELECT * FROM recommend_books_for_member_pgvector(10835, 10);
Функцијата успешно враќа листа од препорачани книги за членот, сортирани според cosine similarity.
Recommended Books Generated by the System
| Similarity | Recommended Book | Genres | Categories | Authors |
| 0.751 | Confirmation | Fantasy, Philosophy | Creative, Home 2, Garden, Art, Science, Health 1, Urban, Music | James Thomas |
| 0.748 | My First Book: My First Steps to Reading | Physics | Art, Creative 1, Creative, Digital 1, Kids, Garden 2 | Samantha Mason |
| 0.739 | Write Source 2000: A Guide to Writing, Thinking & Learning | Classic Literature | Fashion, Health 1, Premium, Health, Urban, Global 2 | Eric Stevens, James Foster |
| 0.735 | Publication Manual of the American Psychological Association | Mystery, Philosophy, Travel | Art, Sports, Digital, Classic 1, Garden, Home 2 | Michael Cardenas, Stephen Hill |
| 0.731 | The Everyday Writer | Romance, Young Adult | History, Advanced 1 | Melissa Allen, Melissa Boone |
| 0.731 | American Literary Criticism From the Thirties to the Eighties | Biography, Physics | Books, Science, Global | Gabriel García Márquez, Nikola White |
| 0.730 | The Art and Craft of Handmade Paper | Children, Horror | Garden, Tech 1, Global, Food | Donald Jackson, Sierra Thomas |
| 0.730 | Ethics & National Defense: The Timeless Issues | Computer Science, Crime | Fashion, Nature | Anna Anderson |
| 0.729 | Encyclopedia of Discovery: Science and History | Autobiography, Children | Digital, Art 1, Music, Premium 1, Smart, Health 3, Sports, Classic 2 | Olivia Shaw, Peter Anderson |
| 0.727 | Achieving Authentic Success | Cooking, Romance | Books, Nature 2 | Jason Reed |
Чекор 9 - Доказ дека не се препорачуваат веќе позајмени книги
Беше извршена дополнителна проверка за да се потврди дека системот не препорачува книги кои членот веќе ги има позајмено.
SELECT COUNT(*) FROM loan_history lh JOIN book_copy bc ON bc.copy_id = lh.copy_id WHERE lh.member_user_id = 10835 AND bc.barcode IN ( SELECT barcode FROM recommend_books_for_member_pgvector(10835, 10) );
Резултат:
0
Ова докажува дека ниту една од препорачаните книги не се појавува во претходната историја на позајмувања на членот.
[PLACEHOLDER: Screenshot од COUNT = 0]
Чекор 10 - Валидација на препораките
За да се покаже дека препораките не се случајни, беа анализирани книгите што членот претходно ги има позајмено и препораките што ги генерира системот.
Прво беа прикажани книгите од loan history за членот:
SELECT DISTINCT b.title, string_agg(DISTINCT g.name, ', ') AS genres, string_agg(DISTINCT c.name, ', ') AS categories, string_agg(DISTINCT a.first_name || ' ' || a.last_name, ', ') AS authors FROM loan_history lh JOIN book_copy bc ON bc.copy_id = lh.copy_id JOIN book b ON b.barcode = bc.barcode LEFT JOIN book_genre bg ON bg.barcode = b.barcode LEFT JOIN genre g ON g.genre_id = bg.genre_id LEFT JOIN category_book cb ON cb.barcode = b.barcode LEFT JOIN category c ON c.category_id = cb.category_id LEFT JOIN book_author ba ON ba.barcode = b.barcode LEFT JOIN author a ON a.author_id = ba.author_id WHERE lh.member_user_id = 10835 GROUP BY b.barcode, b.title LIMIT 10;
[PLACEHOLDER: Screenshot од loan history книги]
Потоа беа прикажани препорачаните книги со нивните жанрови, категории и автори.
[PLACEHOLDER: Screenshot од препораки со genre/category/author]
Конкретни примери
Пример 1
Loan history: A Wizard Alone: The Sixth Book in the Young Wizards Recommended: My First Book: My First Steps to Reading
Иако не се исти книги, двете се поврзани со литература наменета за помлади читатели и содржини поврзани со читање и едукација.
Пример 2
Loan history: Sharing the Pie: A Citizen's Guide to Wealth Recommended: Publication Manual of the American Psychological Association The Everyday Writer
Во овој случај системот препознава интерес за едукативни, академски и информативни книги. Иако жанровите не се идентични, содржината и намената на книгите се слични.
Пример 3
Loan history: The Oxford Dictionary of Popes Recommended: Encyclopedia of Discovery: Science and History
Двете книги припаѓаат на групата reference-oriented книги, односно книги кои служат за информирање, истражување и стекнување знаење.
Recommendation Analysis
Системот генерираше препораки со similarity вредности помеѓу 0.72 и 0.75.
При споредба на loan history и препорачаните книги беше забележано преклопување во повеќе жанрови и категории, како што се:
Young Adult Classic Literature Children Physics Horror Nature Books Global Food Art Kids Health Creative Smart
Ова покажува дека препораките не се случајни, туку се базирани на семантичка сличност помеѓу книгите.
Screenshots / Proof of Work
Проверка дека pgvector екстензијата е успешно инсталирана.
Потврда дека се генерирани embeddings за 10000 книги.
Резултат од функцијата recommend_books_for_member_pgvector.
Проверка дека не се препорачуваат веќе позајмени книги.
Пример книги од претходната историја на позајмувања.
