Changes between Version 7 and Version 8 of АdvancedPhase


Ignore:
Timestamp:
06/14/26 18:16:05 (20 hours ago)
Author:
231077
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • АdvancedPhase

    v7 v8  
    77Целта е за даден член да се препорачаат книги што сè уште ги нема позајмено, но кои се семантички слични со книгите што претходно ги има позајмено.
    88
    9 Секоја книга добива векторска репрезентација (embedding) генерирана од:
     9Секоја книга добива векторска репрезентација, односно embedding, генерирана од:
    1010
    1111{{{
     
    2121}}}
    2222
    23 За секој член системот ги зема книгите од loan_history, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity.
     23За секој член системот ги зема книгите од `loan_history`, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity.
    2424
    2525== Чекор 1 - PostgreSQL со pgvector во Docker ==
    2626
    27 Бидејќи локалниот PostgreSQL немаше достапна vector екстензија, беше креиран Docker PostgreSQL container со веќе инсталиран pgvector.
    28 
    29 {{{
    30 docker run --name booknest-postgres
    31 -e POSTGRES_PASSWORD=postgres
    32 -e POSTGRES_DB=booknest
    33 -p 5433:5432
     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 ^
    3434-d pgvector/pgvector:pg16
    3535}}}
     
    4949== Чекор 2 - Префрлање на постоечката база ==
    5050
    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
     51Постоечката BookNest база беше извезена со `pg_dump`:
     52
     53{{{
     54"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
    6055}}}
    6156
     
    6358
    6459{{{
    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
     60"C:\Program Files\PostgreSQL\18\bin\psql.exe" -h localhost -p 5433 -U postgres -d booknest -f C:\Users\Ivana\Desktop\booknest_backup.sql
    7161}}}
    7262
     
    7565== Чекор 3 - Активирање на pgvector ==
    7666
    77 Во PostgreSQL беше активирана vector екстензијата:
     67Во PostgreSQL беше активирана `vector` екстензијата:
    7868
    7969{{{
     
    8676SELECT *
    8777FROM pg_available_extensions
    88 WHERE name='vector';
     78WHERE name = 'vector';
    8979}}}
    9080
    9181Резултатот потврдува дека pgvector е успешно инсталиран и активен.
    9282
    93 [[Image(pgvector_extension.png,800px)]]
    94 
    9583== Чекор 4 - Додавање embedding колона ==
    9684
    97 Во табелата book беше додадена нова колона од тип vector(384):
     85Во табелата `book` беше додадена нова колона од тип `vector(384)`:
    9886
    9987{{{
     
    10290}}}
    10391
    104 Димензијата 384 одговара на AI моделот all-MiniLM-L6-v2 кој се користи за генерирање embeddings.
     92Димензијата `384` одговара на AI моделот `all-MiniLM-L6-v2`, кој се користи за генерирање embeddings.
    10593
    10694Секој запис во оваа колона содржи векторска репрезентација на една книга.
     
    114102}}}
    115103
    116 Креирана беше Python скрипта generate_embeddings.py.
     104Креирана беше Python скрипта `generate_embeddings.py`.
    117105
    118106Скриптата ги чита:
     
    124112* авторите
    125113
    126 и од нив генерира embedding користејќи го моделот:
    127 
    128 {{{
    129 all-MiniLM-L6-v2
    130 }}}
    131 
    132 Генерираниот embedding се зачувува во колоната:
    133 
    134 {{{
    135 book.embedding
    136 }}}
     114Од овие податоци се прави еден текстуален запис за секоја книга. Потоа тој текст се испраќа до моделот `all-MiniLM-L6-v2`, кој генерира embedding vector. Генерираниот vector се зачувува во колоната `book.embedding`.
    137115
    138116Целата Python скрипта:
     
    154132print("Connected!")
    155133
    156 cursor.execute(
     134cursor.execute("""
    157135SELECT
    158136b.barcode,
     
    171149GROUP BY b.barcode, b.title, b.description
    172150LIMIT 10000
    173 )
     151""")
    174152
    175153books = cursor.fetchall()
     
    188166)
    189167
     168```
    190169embedding = model.encode(text).tolist()
    191170
    192171cursor.execute(
    193    
     172    """
    194173    UPDATE book
    195174    SET embedding = %s
     
    202181    conn.commit()
    203182    print(f"Updated {i}/{len(books)} books")
    204 
     183```
    205184
    206185conn.commit()
     
    222201}}}
    223202
    224 [[Image(count_books.png,800px)]]
    225 
    226 Резултатот покажува дека embeddings се успешно генерирани.
     203Резултат:
     204
     205{{{
     20610000
     207}}}
     208
     209Ова покажува дека embeddings се успешно генерирани и зачувани во табелата `book`.
    227210
    228211== Чекор 6 - Индекс за побрзо пребарување ==
    229212
    230 За побрзо пребарување по cosine similarity беше креиран ivfflat индекс:
     213За побрзо пребарување по cosine similarity беше креиран `ivfflat` индекс:
    231214
    232215{{{
     
    316299Колку вредноста е поблиску до 1, толку книгата е послична на читачкиот профил на членот.
    317300
    318 == Чекор 8 - Тестирање на препораките ==
    319 
    320 Пример повик:
     301== Чекор 8 - Валидација на препораките ==
     302
     303За да се провери дали препораките имаат смисла, прво беа анализирани книгите што членот претходно ги има позајмено, а потоа беа споредени со препораките генерирани од системот.
     304
     305=== 8.1 Loan History за членот ===
     306
     307Користен е следниот SQL query:
     308
     309{{{
     310SELECT DISTINCT
     311b.title
     312FROM loan_history lh
     313JOIN book_copy bc ON bc.copy_id = lh.copy_id
     314JOIN book b ON b.barcode = bc.barcode
     315WHERE lh.member_user_id = 10835
     316LIMIT 20;
     317}}}
     318
     319Резултат:
     320
     321|| Title ||
     322|| Frommer's Ottawa ||
     323|| The Iraq Study Group Report: The Way Forward ||
     324|| Sex and Subterfuge: Women Writers to 1850 ||
     325|| Imperfect Birds: A Novel ||
     326|| Improving the Quality of Long-Term Care ||
     327|| The Unsinkable Charlie Brown ||
     328|| Twelve ||
     329|| Women of Faith: New Testament With Psalms & Proverbs ||
     330|| Professional ASP XML ||
     331|| Duct Tape Marketing: The World's Most Practical Small Business Marketing Guide ||
     332|| The Dig ||
     333|| Under the Big Sky: Love Spans Three Generations ||
     334|| The Joy of Signing: Second Edition ||
     335|| The Indwelling: The Beast Takes Possession ||
     336|| Annuals: How to Select, Grow and Enjoy ||
     337|| Steadfast Tin Soldier ||
     338|| Best of Friends ||
     339|| How to Get Out of Debt, Stay Out of Debt and Live Prosperously ||
     340|| Hugs for Friends: Stories, Sayings and Scriptures ||
     341|| Picnic, Lightning ||
     342
     343=== 8.2 Препораки генерирани од системот ===
     344
     345Користен е следниот SQL query:
    321346
    322347{{{
     
    325350}}}
    326351
    327 Функцијата успешно враќа листа од препорачани книги за членот, сортирани според cosine similarity.
    328 
    329 [[Image(recommend_books_for_member_pgvector.png,800px)]]
    330 
    331 === Recommended Books Generated by the System ===
    332 
    333 || Similarity || Recommended Book || Genres || Categories || Authors ||
    334 || 0.751 || Confirmation || Fantasy, Philosophy || Creative, Home 2, Garden, Art, Science, Health 1, Urban, Music || James Thomas ||
    335 || 0.748 || My First Book: My First Steps to Reading || Physics || Art, Creative 1, Creative, Digital 1, Kids, Garden 2 || Samantha Mason ||
    336 || 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 ||
    337 || 0.735 || Publication Manual of the American Psychological Association || Mystery, Philosophy, Travel || Art, Sports, Digital, Classic 1, Garden, Home 2 || Michael Cardenas, Stephen Hill ||
    338 || 0.731 || The Everyday Writer || Romance, Young Adult || History, Advanced 1 || Melissa Allen, Melissa Boone ||
    339 || 0.731 || American Literary Criticism From the Thirties to the Eighties || Biography, Physics || Books, Science, Global || Gabriel García Márquez, Nikola White ||
    340 || 0.730 || The Art and Craft of Handmade Paper || Children, Horror || Garden, Tech 1, Global, Food || Donald Jackson, Sierra Thomas ||
    341 || 0.730 || Ethics & National Defense: The Timeless Issues || Computer Science, Crime || Fashion, Nature || Anna Anderson ||
    342 || 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 ||
    343 || 0.727 || Achieving Authentic Success || Cooking, Romance || Books, Nature 2 || Jason Reed ||
    344 
    345 == Чекор 9 - Доказ дека не се препорачуваат веќе позајмени книги ==
    346 
    347 Беше извршена дополнителна проверка за да се потврди дека системот не препорачува книги кои членот веќе ги има позајмено.
     352Резултат:
     353
     354|| Barcode || Title || Similarity ||
     355|| 1508595120619 || Confirmation || 0.751 ||
     356|| 7068091724530 || My First Book: My First Steps to Reading || 0.748 ||
     357|| 5353409214655 || Write Source 2000: A Guide to Writing, Thinking & Learning || 0.739 ||
     358|| 3991697075354 || Publication Manual of the American Psychological Association || 0.735 ||
     359|| 2052048066367 || The Everyday Writer || 0.731 ||
     360|| 8847817354941 || American Literary Criticism From the Thirties to the Eighties || 0.731 ||
     361|| 8861556346531 || The Art and Craft of Handmade Paper || 0.730 ||
     362|| 0959535611626 || Ethics & National Defense: The Timeless Issues || 0.730 ||
     363|| 3014017184207 || Encyclopedia of Discovery: Science and History || 0.729 ||
     364|| 0390749084413 || Achieving Authentic Success || 0.727 ||
     365
     366=== 8.3 Проверка дека не се препорачуваат веќе позајмени книги ===
     367
     368Користен е следниот SQL query:
    348369
    349370{{{
     
    364385}}}
    365386
    366 Ова докажува дека ниту една од препорачаните книги не се појавува во претходната историја на позајмувања на членот.
    367 
    368 == Чекор 10 - Валидација на препораките ==
    369 
    370 За да се покаже дека препораките не се случајни, беа анализирани книгите што членот претходно ги има позајмено и препораките што ги генерира системот.
    371 
    372 Прво беа прикажани книгите од loan history за членот:
    373 
    374 {{{
    375 SELECT DISTINCT
    376 b.title,
    377 string_agg(DISTINCT g.name, ', ') AS genres,
    378 string_agg(DISTINCT c.name, ', ') AS categories,
    379 string_agg(DISTINCT a.first_name || ' ' || a.last_name, ', ') AS authors
    380 FROM loan_history lh
    381 JOIN book_copy bc ON bc.copy_id = lh.copy_id
    382 JOIN book b ON b.barcode = bc.barcode
    383 LEFT JOIN book_genre bg ON bg.barcode = b.barcode
    384 LEFT JOIN genre g ON g.genre_id = bg.genre_id
    385 LEFT JOIN category_book cb ON cb.barcode = b.barcode
    386 LEFT JOIN category c ON c.category_id = cb.category_id
    387 LEFT JOIN book_author ba ON ba.barcode = b.barcode
    388 LEFT JOIN author a ON a.author_id = ba.author_id
    389 WHERE lh.member_user_id = 10835
    390 GROUP BY b.barcode, b.title
    391 LIMIT 10;
    392 }}}
    393 
    394 [[Image(member_loan_history.png,800px)]]
    395 
    396 Потоа беа прикажани препорачаните книги со нивните жанрови, категории и автори.
    397 
    398 {{{
    399 SELECT
    400 r.barcode,
    401 r.title,
    402 r.similarity,
    403 string_agg(DISTINCT g.name, ', ') AS genres,
    404 string_agg(DISTINCT c.name, ', ') AS categories,
    405 string_agg(DISTINCT a.first_name || ' ' || a.last_name, ', ') AS authors
    406 FROM recommend_books_for_member_pgvector(10835, 10) r
    407 LEFT JOIN book_genre bg ON bg.barcode = r.barcode
    408 LEFT JOIN genre g ON g.genre_id = bg.genre_id
    409 LEFT JOIN category_book cb ON cb.barcode = r.barcode
    410 LEFT JOIN category c ON c.category_id = cb.category_id
    411 LEFT JOIN book_author ba ON ba.barcode = r.barcode
    412 LEFT JOIN author a ON a.author_id = ba.author_id
    413 GROUP BY r.barcode, r.title, r.similarity
    414 ORDER BY r.similarity DESC;
    415 }}}
    416 
    417 [[Image(recommendations_with_metadata.png,800px)]]
    418 
    419 === Конкретни примери ===
     387Ова покажува дека ниту една од препорачаните книги не се појавува во претходната историја на позајмувања на членот.
     388
     389=== 8.4 Конкретни примери ===
    420390
    421391Пример 1
    422392
    423393{{{
    424 Loan history:
    425 A Wizard Alone: The Sixth Book in the Young Wizards
     394Loan History:
     395Sex and Subterfuge: Women Writers to 1850
    426396
    427397Recommended:
    428 My First Book: My First Steps to Reading
    429 }}}
    430 
    431 Иако не се исти книги, двете се поврзани со литература наменета за помлади читатели и содржини поврзани со читање и едукација.
     398American Literary Criticism From the Thirties to the Eighties
     399}}}
     400
     401Објаснување:
     402
     403И двете книги се поврзани со литература и анализа на книжевни дела. Иако не станува збор за исти автори или ист временски период, системот препознава поврзаност во областа на книжевноста и литературната критика.
    432404
    433405Пример 2
    434406
    435407{{{
    436 Loan history:
    437 Sharing the Pie: A Citizen's Guide to Wealth
     408Loan History:
     409Professional ASP XML
     410
     411Recommended:
     412Write Source 2000: A Guide to Writing, Thinking & Learning
     413}}}
     414
     415Објаснување:
     416
     417Двете книги имаат образовен и професионален карактер. Системот препознава интерес за книги кои служат за учење, развој на вештини и работа со специјализирани знаења.
     418
     419Пример 3
     420
     421{{{
     422Loan History:
     423Improving the Quality of Long-Term Care
    438424
    439425Recommended:
    440426Publication Manual of the American Psychological Association
    441 The Everyday Writer
    442 }}}
    443 
    444 Во овој случај системот препознава интерес за едукативни, академски и информативни книги. Иако жанровите не се идентични, содржината и намената на книгите се слични.
    445 
    446 Пример 3
    447 
    448 {{{
    449 Loan history:
    450 The Oxford Dictionary of Popes
    451 
    452 Recommended:
    453 Encyclopedia of Discovery: Science and History
    454 }}}
    455 
    456 Двете книги припаѓаат на групата reference-oriented книги, односно книги кои служат за информирање, истражување и стекнување знаење.
    457 
    458 === Recommendation Analysis ===
     427}}}
     428
     429Објаснување:
     430
     431И двете книги припаѓаат на стручна и академска литература. Едната е насочена кон здравствена грижа, а другата кон академско истражување и научно пишување, што укажува на интерес кон професионална и образовна содржина.
     432
     433=== 8.5 Анализа на резултатите ===
    459434
    460435Системот генерираше препораки со similarity вредности помеѓу 0.72 и 0.75.
    461436
    462 При споредба на loan history и препорачаните книги беше забележано преклопување во повеќе жанрови и категории, како што се:
    463 
    464 {{{
    465 Young Adult
    466 Classic Literature
    467 Children
    468 Physics
    469 Horror
    470 Nature
    471 Books
    472 Global
    473 Food
    474 Art
    475 Kids
    476 Health
    477 Creative
    478 Smart
    479 }}}
    480 
    481 Ова покажува дека препораките не се случајни, туку се базирани на семантичка сличност помеѓу книгите.
    482 
     437Резултатите покажуваат дека препораките се базираат на семантичка сличност помеѓу книгите, а не само на точно совпаѓање на жанрови, категории или автори.
     438
     439Дополнително, проверката врати резултат 0, што потврдува дека системот успешно ги исклучува книгите кои членот веќе ги има позајмено и препорачува само нови книги.
     440