wiki:АdvancedPhase

Version 5 (modified by 231077, 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';

No image "vector_extension.png" attached to АdvancedPhase

Резултатот потврдува дека 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;

No image "embeddings_generated.png" attached to АdvancedPhase

Резултатот покажува дека 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
)

Функцијата работи во неколку чекори:

  1. Ги наоѓа книгите што членот претходно ги има позајмено.
  2. Го пресметува просечниот embedding профил на членот.
  3. Ги разгледува сите останати книги.
  4. Ги исклучува книгите што членот веќе ги има позајмено.
  5. Ги рангира книгите според cosine similarity.
  6. Ги враќа најдобрите 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.

No image "recommend_books_for_member_pgvector.png" attached to АdvancedPhase

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

No image "vector_extension.png" attached to АdvancedPhase

Проверка дека pgvector екстензијата е успешно инсталирана.

No image "embeddings_generated.png" attached to АdvancedPhase

Потврда дека се генерирани embeddings за 10000 книги.

No image "recommendation_results.png" attached to АdvancedPhase

Резултат од функцијата recommend_books_for_member_pgvector.

No image "validation_result.png" attached to АdvancedPhase

Проверка дека не се препорачуваат веќе позајмени книги.

No image "loan_history.png" attached to АdvancedPhase

Пример книги од претходната историја на позајмувања.

Note: See TracWiki for help on using the wiki.