Changes between Version 4 and Version 5 of АdvancedPhase


Ignore:
Timestamp:
06/14/26 16:45:50 (40 hours ago)
Author:
231077
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • АdvancedPhase

    v4 v5  
     1= Advanced Phase - AI Book Recommendation System with pgvector =
     2
     3== Опис ==
     4
     5Во оваа фаза е имплементиран систем за персонализирани препораки на книги со користење на AI embeddings и pgvector екстензијата за PostgreSQL.
     6
     7Целта е за даден член да се препорачаат книги што сè уште ги нема позајмено, но кои се семантички слични со книгите што претходно ги има позајмено.
     8
     9Секоја книга добива векторска репрезентација (embedding) генерирана од:
     10
     11{{{
     12book title + description + genres + categories + authors
     13}}}
     14
     15== Како функционира? ==
     16
     17Основната идеја е:
     18
     19{{{
     20Book metadata -> AI model -> Vector embedding -> Cosine similarity -> Recommended books
     21}}}
     22
     23За секој член системот ги зема книгите од loan_history, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity.
     24
     25== Чекор 1 - PostgreSQL со pgvector во Docker ==
     26
     27Бидејќи локалниот PostgreSQL немаше достапна vector екстензија, беше креиран Docker PostgreSQL container со веќе инсталиран pgvector.
     28
     29{{{
     30docker run --name booknest-postgres \
     31-e POSTGRES_PASSWORD=postgres \
     32-e POSTGRES_DB=booknest \
     33-p 5433:5432 \
     34-d pgvector/pgvector:pg16
     35}}}
     36
     37Потоа во DataGrip беше креирана нова конекција:
     38
     39{{{
     40Host: localhost
     41Port: 5433
     42Database: booknest
     43User: postgres
     44Password: postgres
     45}}}
     46
     47Со ова беше овозможено користење на pgvector екстензијата во проектот.
     48
     49== Чекор 2 - Префрлање на постоечката база ==
     50
     51Постоечката BookNest база беше извезена со pg_dump:
     52
     53{{{
     54"C:\Program Files\PostgreSQL\18\bin\pg_dump.exe"
     55-h localhost
     56-p 5432
     57-U postgres
     58-d postgres
     59-f C:\Users\Ivana\Desktop\booknest_backup.sql
     60}}}
     61
     62Потоа backup фајлот беше внесен во Docker PostgreSQL базата:
     63
     64{{{
     65"C:\Program Files\PostgreSQL\18\bin\psql.exe"
     66-h localhost
     67-p 5433
     68-U postgres
     69-d booknest
     70-f C:\Users\Ivana\Desktop\booknest_backup.sql
     71}}}
     72
     73На овој начин сите постоечки податоци беа успешно префрлени во новата pgvector база.
     74
     75== Чекор 3 - Активирање на pgvector ==
     76
     77Во PostgreSQL беше активирана vector екстензијата:
     78
     79{{{
     80CREATE EXTENSION IF NOT EXISTS vector;
     81}}}
     82
     83Проверка:
     84
     85{{{
     86SELECT *
     87FROM pg_available_extensions
     88WHERE name='vector';
     89}}}
     90
     91[[Image(vector_extension.png,700px)]]
     92
     93Резултатот потврдува дека pgvector е успешно инсталиран и активен.
     94
     95== Чекор 4 - Додавање embedding колона ==
     96
     97Во табелата book беше додадена нова колона од тип vector(384):
     98
     99{{{
     100ALTER TABLE book
     101ADD COLUMN IF NOT EXISTS embedding vector(384);
     102}}}
     103
     104Димензијата 384 одговара на AI моделот all-MiniLM-L6-v2 кој се користи за генерирање embeddings.
     105
     106Секој запис во оваа колона содржи векторска репрезентација на една книга.
     107
     108== Чекор 5 - Генерирање embeddings ==
     109
     110Беа инсталирани потребните Python библиотеки:
     111
     112{{{
     113pip install sentence-transformers psycopg2-binary
     114}}}
     115
     116Креирана беше Python скрипта generate_embeddings.py.
     117
     118Скриптата ги чита:
     119
     120 * насловот на книгата
     121 * описот
     122 * жанровите
     123 * категориите
     124 * авторите
     125
     126и од нив генерира embedding користејќи го моделот:
     127
     128{{{
     129all-MiniLM-L6-v2
     130}}}
     131
     132Генерираниот embedding се зачувува во колоната:
     133
     134{{{
     135book.embedding
     136}}}
     137
     138По извршувањето на скриптата беа генерирани embeddings за 10000 книги.
     139
     140Проверка:
     141
     142{{{
     143SELECT COUNT(*)
     144FROM book
     145WHERE embedding IS NOT NULL;
     146}}}
     147
     148[[Image(embeddings_generated.png,700px)]]
     149
     150Резултатот покажува дека embeddings се успешно генерирани.
     151
     152== Чекор 6 - Индекс за побрзо пребарување ==
     153
     154За побрзо пребарување по cosine similarity беше креиран ivfflat индекс:
     155
     156{{{
     157CREATE INDEX IF NOT EXISTS idx_book_embedding
     158ON book
     159USING ivfflat (embedding vector_cosine_ops)
     160WITH (lists = 100);
     161
     162ANALYZE book;
     163}}}
     164
     165Овој индекс овозможува значително побрзо пребарување на најслични вектори без да се споредуваат сите книги во табелата.
     166
     167== Чекор 7 - Функција за препораки ==
     168
     169Беше креирана PostgreSQL функција:
     170
     171{{{
     172recommend_books_for_member_pgvector(
     173    p_member_id,
     174    p_limit
     175)
     176}}}
     177
     178Функцијата работи во неколку чекори:
     179
     180 1. Ги наоѓа книгите што членот претходно ги има позајмено.
     181 2. Го пресметува просечниот embedding профил на членот.
     182 3. Ги разгледува сите останати книги.
     183 4. Ги исклучува книгите што членот веќе ги има позајмено.
     184 5. Ги рангира книгите според cosine similarity.
     185 6. Ги враќа најдобрите N препораки.
     186
     187Клучниот pgvector дел е:
     188
     189{{{
     190b.embedding <=> mp.profile_embedding
     191}}}
     192
     193Операторот `<=>` пресметува cosine distance помеѓу два embeddings.
     194
     195Similarity се пресметува како:
     196
     197{{{
     1981 - (b.embedding <=> mp.profile_embedding)
     199}}}
     200
     201Колку вредноста е поблиску до 1, толку книгата е послична на читачкиот профил на членот.
    1202== Чекор 8 - Тестирање на препораките ==
    2203