| | 1 | = Напредна тема – Векторско пребарување со pgvector = |
| | 2 | |
| | 3 | == Векторизација на рецепти == |
| | 4 | |
| | 5 | За имплементација на семантичко пребарување беше искористена екстензијата pgvector во PostgreSQL. Секој рецепт се претвора во векторска репрезентација (embedding) која подоцна се користи за пребарување според значење наместо според точно совпаѓање на зборови. |
| | 6 | |
| | 7 | === Скрипта за векторизација === |
| | 8 | |
| | 9 | Скриптата ги зема името и описот на секој рецепт и генерира embedding со помош на моделот ''all-MiniLM-L6-v2'' од Sentence Transformers. |
| | 10 | |
| | 11 | Процесот се извршува во батчеви со цел да се намали мемориската потрошувачка и да се овозможи обработка на поголем број рецепти. |
| | 12 | |
| | 13 | Чекори на извршување: |
| | 14 | |
| | 15 | 1. Се воспоставува конекција кон PostgreSQL базата. |
| | 16 | 2. Се вчитуваат рецепти кај кои колоната ''embedding'' е празна. |
| | 17 | 3. Се комбинираат полето ''name'' и ''description''. |
| | 18 | 4. Со моделот ''all-MiniLM-L6-v2'' се генерира embedding. |
| | 19 | 5. Генерираниот embedding се зачувува во колоната ''embedding''. |
| | 20 | 6. Процесот продолжува додека не се обработат сите рецепти. |
| | 21 | |
| | 22 | Моделот генерира вектор со 384 димензии кој ја претставува семантичката содржина на рецептот. |
| | 23 | |
| | 24 | === Предности === |
| | 25 | |
| | 26 | * Овозможува пребарување според значење наместо според точен текст. |
| | 27 | * Корисникот може да пронајде релевантни рецепти дури и кога користи различни зборови. |
| | 28 | * Значително се подобрува корисничкото искуство при пребарување. |
| | 29 | |
| | 30 | == Индексирање на embedding колоната == |
| | 31 | |
| | 32 | По генерирањето на embedding векторите беше креиран HNSW индекс со цел да се овозможи брзо пребарување над голем број записи. |
| | 33 | |
| | 34 | {{{ |
| | 35 | CREATE INDEX recipe_embedding_idx |
| | 36 | ON recipe |
| | 37 | USING hnsw (embedding vector_cosine_ops); |
| | 38 | }}} |
| | 39 | |
| | 40 | === Причина за користење на HNSW === |
| | 41 | |
| | 42 | HNSW (Hierarchical Navigable Small World) претставува алгоритам за приближно пребарување на најслични вектори. |
| | 43 | |
| | 44 | Предности: |
| | 45 | |
| | 46 | * Значително побрзо пребарување. |
| | 47 | * Поддршка за големи количини податоци. |
| | 48 | * Висока точност на резултатите. |
| | 49 | * Одлична интеграција со pgvector. |
| | 50 | |
| | 51 | == Семантичко пребарување == |
| | 52 | |
| | 53 | За тестирање на векторското пребарување беше имплементирана посебна Python скрипта. |
| | 54 | |
| | 55 | Корисникот внесува текстуално пребарување, по што: |
| | 56 | |
| | 57 | 1. Внесениот текст се претвора во embedding. |
| | 58 | 2. Се пресметува косинусна дистанца помеѓу внесениот embedding и embedding-ите на рецептите. |
| | 59 | 3. Резултатите се сортираат според најмала дистанца. |
| | 60 | 4. Се прикажуваат 10-те најрелевантни рецепти. |
| | 61 | |
| | 62 | За споредба на векторите се користи операторот: |
| | 63 | |
| | 64 | {{{ |
| | 65 | embedding <=> query_embedding |
| | 66 | }}} |
| | 67 | |
| | 68 | Колку вредноста е помала, толку рецептот е посличен на внесеното пребарување. |
| | 69 | |
| | 70 | === Пример === |
| | 71 | |
| | 72 | Доколку корисникот пребарува: |
| | 73 | |
| | 74 | {{{ |
| | 75 | healthy chicken dinner |
| | 76 | }}} |
| | 77 | |
| | 78 | системот нема да бара само рецепти кои ги содржат токму тие зборови, туку ќе пронајде и рецепти со слично значење како: |
| | 79 | |
| | 80 | * Grilled Chicken |
| | 81 | * High Protein Chicken Bowl |
| | 82 | * Healthy Chicken Salad |
| | 83 | * Mediterranean Chicken Recipe |
| | 84 | |
| | 85 | == Пристап до PostgreSQL Docker контејнер == |
| | 86 | |
| | 87 | За работа со pgvector базата се користи Docker контејнер. |
| | 88 | |
| | 89 | Стартување на контејнер: |
| | 90 | |
| | 91 | {{{ |
| | 92 | docker start pgvector-db |
| | 93 | }}} |
| | 94 | |
| | 95 | Проверка дали контејнерот е активен: |
| | 96 | |
| | 97 | {{{ |
| | 98 | docker ps |
| | 99 | }}} |
| | 100 | |
| | 101 | Пристап до PostgreSQL: |
| | 102 | |
| | 103 | {{{ |
| | 104 | docker exec -it pgvector-db psql -U postgres -d recipesdb_local |
| | 105 | }}} |
| | 106 | |
| | 107 | == Заклучок == |
| | 108 | |
| | 109 | Со користење на pgvector и Sentence Transformers беше имплементирано семантичко пребарување на рецепти. |
| | 110 | |
| | 111 | Решението овозможува: |
| | 112 | |
| | 113 | * Векторизација на сите рецепти. |
| | 114 | * Брзо пребарување со HNSW индекс. |
| | 115 | * Пронаоѓање на рецепти според значење. |
| | 116 | * Подобро корисничко искуство во однос на класичното пребарување со SQL LIKE оператори. |
| | 117 | |
| | 118 | Ова претставува напредна функционалност базирана на современи техники од областа на обработка на природен јазик (NLP) и векторски бази на податоци. |