| Version 1 (modified by , 2 weeks ago) ( diff ) |
|---|
Напредна тема – Векторско пребарување со pgvector
Векторизација на рецепти
За имплементација на семантичко пребарување беше искористена екстензијата pgvector во PostgreSQL. Секој рецепт се претвора во векторска репрезентација (embedding) која подоцна се користи за пребарување според значење наместо според точно совпаѓање на зборови.
Скрипта за векторизација
Скриптата ги зема името и описот на секој рецепт и генерира embedding со помош на моделот all-MiniLM-L6-v2 од Sentence Transformers.
Процесот се извршува во батчеви со цел да се намали мемориската потрошувачка и да се овозможи обработка на поголем број рецепти.
Чекори на извршување:
- Се воспоставува конекција кон PostgreSQL базата.
- Се вчитуваат рецепти кај кои колоната embedding е празна.
- Се комбинираат полето name и description.
- Со моделот all-MiniLM-L6-v2 се генерира embedding.
- Генерираниот embedding се зачувува во колоната embedding.
- Процесот продолжува додека не се обработат сите рецепти.
Моделот генерира вектор со 384 димензии кој ја претставува семантичката содржина на рецептот.
Предности
- Овозможува пребарување според значење наместо според точен текст.
- Корисникот може да пронајде релевантни рецепти дури и кога користи различни зборови.
- Значително се подобрува корисничкото искуство при пребарување.
Индексирање на embedding колоната
По генерирањето на embedding векторите беше креиран HNSW индекс со цел да се овозможи брзо пребарување над голем број записи.
CREATE INDEX recipe_embedding_idx ON recipe USING hnsw (embedding vector_cosine_ops);
Причина за користење на HNSW
HNSW (Hierarchical Navigable Small World) претставува алгоритам за приближно пребарување на најслични вектори.
Предности:
- Значително побрзо пребарување.
- Поддршка за големи количини податоци.
- Висока точност на резултатите.
- Одлична интеграција со pgvector.
Семантичко пребарување
За тестирање на векторското пребарување беше имплементирана посебна Python скрипта.
Корисникот внесува текстуално пребарување, по што:
- Внесениот текст се претвора во embedding.
- Се пресметува косинусна дистанца помеѓу внесениот embedding и embedding-ите на рецептите.
- Резултатите се сортираат според најмала дистанца.
- Се прикажуваат 10-те најрелевантни рецепти.
За споредба на векторите се користи операторот:
embedding <=> query_embedding
Колку вредноста е помала, толку рецептот е посличен на внесеното пребарување.
Пример
Доколку корисникот пребарува:
healthy chicken dinner
системот нема да бара само рецепти кои ги содржат токму тие зборови, туку ќе пронајде и рецепти со слично значење како:
- Grilled Chicken
- High Protein Chicken Bowl
- Healthy Chicken Salad
- Mediterranean Chicken Recipe
Пристап до PostgreSQL Docker контејнер
За работа со pgvector базата се користи Docker контејнер.
Стартување на контејнер:
docker start pgvector-db
Проверка дали контејнерот е активен:
docker ps
Пристап до PostgreSQL:
docker exec -it pgvector-db psql -U postgres -d recipesdb_local
Заклучок
Со користење на pgvector и Sentence Transformers беше имплементирано семантичко пребарување на рецепти.
Решението овозможува:
- Векторизација на сите рецепти.
- Брзо пребарување со HNSW индекс.
- Пронаоѓање на рецепти според значење.
- Подобро корисничко искуство во однос на класичното пребарување со SQL LIKE оператори.
Ова претставува напредна функционалност базирана на современи техники од областа на обработка на природен јазик (NLP) и векторски бази на податоци.
