Changes between Version 7 and Version 8 of АdvancedPhase
- Timestamp:
- 06/14/26 18:16:05 (20 hours ago)
Legend:
- Unmodified
- Added
- Removed
- Modified
-
АdvancedPhase
v7 v8 7 7 Целта е за даден член да се препорачаат книги што сè уште ги нема позајмено, но кои се семантички слични со книгите што претходно ги има позајмено. 8 8 9 Секоја книга добива векторска репрезентација (embedding)генерирана од:9 Секоја книга добива векторска репрезентација, односно embedding, генерирана од: 10 10 11 11 {{{ … … 21 21 }}} 22 22 23 За секој член системот ги зема книгите од loan_history, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity.23 За секој член системот ги зема книгите од `loan_history`, го пресметува просечниот embedding профил на членот и потоа ги споредува сите останати книги со тој профил преку cosine similarity. 24 24 25 25 == Чекор 1 - PostgreSQL со pgvector во Docker == 26 26 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 {{{ 30 docker run --name booknest-postgres ^ 31 -e POSTGRES_PASSWORD=postgres ^ 32 -e POSTGRES_DB=booknest ^ 33 -p 5433:5432 ^ 34 34 -d pgvector/pgvector:pg16 35 35 }}} … … 49 49 == Чекор 2 - Префрлање на постоечката база == 50 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 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 60 55 }}} 61 56 … … 63 58 64 59 {{{ 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 71 61 }}} 72 62 … … 75 65 == Чекор 3 - Активирање на pgvector == 76 66 77 Во PostgreSQL беше активирана vectorекстензијата:67 Во PostgreSQL беше активирана `vector` екстензијата: 78 68 79 69 {{{ … … 86 76 SELECT * 87 77 FROM pg_available_extensions 88 WHERE name ='vector';78 WHERE name = 'vector'; 89 79 }}} 90 80 91 81 Резултатот потврдува дека pgvector е успешно инсталиран и активен. 92 82 93 [[Image(pgvector_extension.png,800px)]]94 95 83 == Чекор 4 - Додавање embedding колона == 96 84 97 Во табелата book беше додадена нова колона од тип vector(384):85 Во табелата `book` беше додадена нова колона од тип `vector(384)`: 98 86 99 87 {{{ … … 102 90 }}} 103 91 104 Димензијата 384 одговара на AI моделот all-MiniLM-L6-v2кој се користи за генерирање embeddings.92 Димензијата `384` одговара на AI моделот `all-MiniLM-L6-v2`, кој се користи за генерирање embeddings. 105 93 106 94 Секој запис во оваа колона содржи векторска репрезентација на една книга. … … 114 102 }}} 115 103 116 Креирана беше Python скрипта generate_embeddings.py.104 Креирана беше Python скрипта `generate_embeddings.py`. 117 105 118 106 Скриптата ги чита: … … 124 112 * авторите 125 113 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`. 137 115 138 116 Целата Python скрипта: … … 154 132 print("Connected!") 155 133 156 cursor.execute( 134 cursor.execute(""" 157 135 SELECT 158 136 b.barcode, … … 171 149 GROUP BY b.barcode, b.title, b.description 172 150 LIMIT 10000 173 )151 """) 174 152 175 153 books = cursor.fetchall() … … 188 166 ) 189 167 168 ``` 190 169 embedding = model.encode(text).tolist() 191 170 192 171 cursor.execute( 193 172 """ 194 173 UPDATE book 195 174 SET embedding = %s … … 202 181 conn.commit() 203 182 print(f"Updated {i}/{len(books)} books") 204 183 ``` 205 184 206 185 conn.commit() … … 222 201 }}} 223 202 224 [[Image(count_books.png,800px)]] 225 226 Резултатот покажува дека embeddings се успешно генерирани. 203 Резултат: 204 205 {{{ 206 10000 207 }}} 208 209 Ова покажува дека embeddings се успешно генерирани и зачувани во табелата `book`. 227 210 228 211 == Чекор 6 - Индекс за побрзо пребарување == 229 212 230 За побрзо пребарување по cosine similarity беше креиран ivfflatиндекс:213 За побрзо пребарување по cosine similarity беше креиран `ivfflat` индекс: 231 214 232 215 {{{ … … 316 299 Колку вредноста е поблиску до 1, толку книгата е послична на читачкиот профил на членот. 317 300 318 == Чекор 8 - Тестирање на препораките == 319 320 Пример повик: 301 == Чекор 8 - Валидација на препораките == 302 303 За да се провери дали препораките имаат смисла, прво беа анализирани книгите што членот претходно ги има позајмено, а потоа беа споредени со препораките генерирани од системот. 304 305 === 8.1 Loan History за членот === 306 307 Користен е следниот SQL query: 308 309 {{{ 310 SELECT DISTINCT 311 b.title 312 FROM loan_history lh 313 JOIN book_copy bc ON bc.copy_id = lh.copy_id 314 JOIN book b ON b.barcode = bc.barcode 315 WHERE lh.member_user_id = 10835 316 LIMIT 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: 321 346 322 347 {{{ … … 325 350 }}} 326 351 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: 348 369 349 370 {{{ … … 364 385 }}} 365 386 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 Конкретни примери === 420 390 421 391 Пример 1 422 392 423 393 {{{ 424 Loan history:425 A Wizard Alone: The Sixth Book in the Young Wizards 394 Loan History: 395 Sex and Subterfuge: Women Writers to 1850 426 396 427 397 Recommended: 428 My First Book: My First Steps to Reading 429 }}} 430 431 Иако не се исти книги, двете се поврзани со литература наменета за помлади читатели и содржини поврзани со читање и едукација. 398 American Literary Criticism From the Thirties to the Eighties 399 }}} 400 401 Објаснување: 402 403 И двете книги се поврзани со литература и анализа на книжевни дела. Иако не станува збор за исти автори или ист временски период, системот препознава поврзаност во областа на книжевноста и литературната критика. 432 404 433 405 Пример 2 434 406 435 407 {{{ 436 Loan history: 437 Sharing the Pie: A Citizen's Guide to Wealth 408 Loan History: 409 Professional ASP XML 410 411 Recommended: 412 Write Source 2000: A Guide to Writing, Thinking & Learning 413 }}} 414 415 Објаснување: 416 417 Двете книги имаат образовен и професионален карактер. Системот препознава интерес за книги кои служат за учење, развој на вештини и работа со специјализирани знаења. 418 419 Пример 3 420 421 {{{ 422 Loan History: 423 Improving the Quality of Long-Term Care 438 424 439 425 Recommended: 440 426 Publication 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 Анализа на резултатите === 459 434 460 435 Системот генерираше препораки со similarity вредности помеѓу 0.72 и 0.75. 461 436 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
