כאשר אתה מפתח יישומי AI גנרטיביים, בדרך כלל אתה מכניס שלושה רכיבים נוספים לתשתית שלך: ממקם, LLM, ומסד נתונים וקטורי.
עם זאת, אם אתה משתמש ב-MariaDB, אינך צריך להכניס מסד נתונים נוסף עם הדיאלקט SQL שלו — או גרוע מכך — עם ה-API הקנייני שלו. מאז גרסה 11.7 של MariaDB (וגם MariaDB Enterprise Server 11.4), אתה פשוט יכול לאחסן את ההטמעות (או הווקטורים) בכל עמודה של כל טבלה — אין צורך לגרום ליישומים שלך להיות פוליגלוטים במסדי נתונים.
"לאחר שבה הוכרזה הגרסה המקדימה של חיפוש וקטורים ב-MariaDB Server, יכולת חיפוש הווקטורים נוספה עכשיו לגרסה 11.7 של MariaDB Community Server," כותב רלף גבהרדט, מנהל מוצר עבור MariaDB Server ב-MariaDB. זה כולל סוג נתונים חדש (VECTOR
), אינדקס וקטור, ומערך של פונקציות למניפולציה של וקטורים.
למה דרושים וקטורים ביישומי AI גנרטיביים?
וקטורים נחוצים ביישומי AI גנרטיביים מכיוון שהם מקנים משמעויות מורכבות במערך קבוע באורך קומפקטי של מספרים (וקטור). זה ברור יותר בהקשר של יצירה מואצת באמצעות חיפוש (או RAG). טכניקה זו מאפשרת לך למשוך נתונים רלוונטיים מהמקורות שלך (API, קבצים, מסדי נתונים) כדי לשפר את קלט המודל של AI עם הנתונים שנמשכו, לעיתים קרובות פרטיים לעסק.
מאחר שהמקורות שלך יכולים להיות עצומים, אתה צריך דרך למצוא את החלקים הרלוונטיים, בהתחשב בכך שמודלים של AI הנוכחיים יש להם חלון הקשר סופי — אינך יכול פשוט להוסיף את כל הנתונים שלך להנחיה. על ידי יצירת קטעי נתונים והרצת קטעי נתונים אלה דרך מודל AI מיוחד הנקרא מַשׁמֵד, תוכל לייצר וקטורים ולהשתמש בטכניקות חיפוש קרבה כדי למצוא מידע רלוונטי שיתווסף להנחיה.
למשל, קח את הקלט הבא ממשתמש בצ'אט בוט המלצות:
I need a good case for my iPhone 15 pro.
מאחר שמודל ה-AI שלך לא אומן עם הנתונים המדויקים המכילים את מידע המוצר בחנות המקוונת שלך, אתה צריך למשוך את המוצרים הרלוונטיים ביותר ואת המידע שלהם לפני שליחת ההנחיה למודל.
לכך, אתה שולח את הקלט המקורי מהמשתמש למַשׁמֵד ומקבל וקטור שניתן להשתמש בו מאוחר יותר כדי לקבל את 10 המוצרים הקרובים ביותר לקלט של המשתמש. ברגע שתקבל את המידע הזה (ונראה איך לעשות את זה עם MariaDB מאוחר יותר), תוכל לשלוח את ההנחיה המשופרת למודל ה-AI שלך:
I need a good case for my iPhone 15 pro. Which of the following products better suit my needs?
1. ProShield Ultra Case for iPhone 15 Pro - $29.99: A slim, shock-absorbing case with raised edges for screen protection and a sleek matte finish.
2. EcoGuard Bio-Friendly Case for iPhone 15 Pro - $24.99: Made from 100% recycled materials, offering moderate drop protection with an eco-conscious design.
3. ArmorFlex Max Case for iPhone 15 Pro - $39.99: Heavy-duty protection with military-grade durability, including a built-in kickstand for hands-free use.
4. CrystalClear Slim Case for iPhone 15 Pro - $19.99: Ultra-thin and transparent, showcasing the phone's design while providing basic scratch protection.
5. LeatherTouch Luxe Case for iPhone 15 Pro - $49.99: Premium genuine leather construction with a soft-touch feel and an integrated cardholder for convenience.
זה מוביל לניבויים של AI שמשתמשים בנתונים שלך.
יצירת טבלאות לאחסון וקטורים
לאחסן וקטורים ב-MariaDB, יש להשתמש בסוג הנתונים החדש VECTOR
. לדוגמה:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048)
);
בדוגמה זו, עמודת ה-embedding
יכולה להחזיק וקטור ב-2048 ממדים. עליך להתאים את מספר הממדים שהמשולב שלך יוצר.
יצירת אינדקסים לוקטורים
לביצועי קריאה, חשוב להוסיף אינדקס לעמודת הוקטור שלך. זה מאיץ את החיפושים בדמיון. ניתן להגדיר את האינדקס בעת יצירת הטבלה כדלגם:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding)
);
לשליטה גדולה יותר, ניתן לציין את פונקציית המרחק שהשרת בסיסי ישתמש בה לבניית האינדקס, כמו גם את M ערך של Hierarchical Navigable Small Worlds (HNSW) אלגוריתם המשמש ב-MariaDB. לדוגמה:
CREATE TABLE products (
id INT PRIMARY KEY,
name VARCHAR(100),
description TEXT,
embedding VECTOR(2048) NOT NULL,
VECTOR INDEX (embedding) M=8 DISTANCE=cosine
);
ניתן לבדוק את ה-תיעוד למידע נוסף על ההגדרות הללו.
הכנסת וקטורים
כאשר אתה מעביר נתונים (טקסט, תמונה, שמע) דרך משולב, אתה מקבל וקטור. לרוב, זהו סדרה של מספרים במערך בתבנית JSON. כדי להכניס את הוקטור הזה בטבלת MariaDB, ניתן להשתמש בפונקציית VEC_FromText
. לדוגמה:
INSERT INTO products (name, embedding)
VALUES
("Alarm clock", VEC_FromText("[0.001, 0, ...]")),
("Cow figure", VEC_FromText("[1.0, 0.05, ...]")),
("Bicycle", VEC_FromText("[0.2, 0.156, ...]"));
חשוב לזכור כי הוקטורים שהוכנסו חייבים להכיל את מספר הממדים הנכון כפי שהוגדר בהצהרת CREATE TABLE
.
חיפוש בדמיון (השוואת וקטורים)
ביישומי RAG, אתה שולח את הקלט של המשתמש ליישום הטמעה כדי לקבל וקטור. לאחר מכן, תוכל לחפש את הרשומות בבסיס הנתונים שלך הקרובות לווקטור הזה. וקטורים קרובים מייצגים נתונים שהם סמנטית דומים. בעת כתיבת שורות אלו, למריהDB יש שתי פונקציות מרחק שניתן להשתמש בהן לחיפוש דמיון או קרבה:
VEC_DISTANCE_EUCLIDEAN
: מחשבת את המרחק בקו ישר בין שני וקטורים. זה הכי מתאים לווקטורים הנובעים מנתונים גולמיים ולא מנורמליים או תרחישים שבהם ההפרדה המרחבית מתואמת ישירות עם הדמיון, כמו השוואת תכונות מיקום או מספריות. עם זאת, זה פחות יעיל עבור הטמעות גבוהות ממד או מנורמלות מכיוון שזה רגיש להבדלים במגוון הווקטור.VEC_DISTANCE_COSINE
: מודדת את ההבדל הזוויתי בין וקטורים. טוב להשוואת הטמעות מנורמלות, במיוחד ביישומים סמנטיים כמו חיפוש טקסט או מסמכים. זה מצטיין בלכידת דמיון במשמעות או בהקשר.
זכור כי חיפוש דמיון באמצעות הפונקציות הקודמות הוא רק בקירוב ותלוי מאוד באיכות הווקטורים שחושבו ולכן, באיכות המיישם ששומש.
הדוגמה הבאה מוצאת את 10 המוצרים הדומים ביותר לווקטור נתון ($user_input_vector
צריך להיות מוחלף בווקטור האמיתי המוחזר על ידי המיישם על בסיס הקלט של המשתמש):
SELECT id, name, description
FROM products
ORDER BY VEC_DISTANCE_COSINE(
VEC_FromText($user_input_vector),
embedding
)
LIMIT 10;
הפונקציות VEC_DISTANCE_COSINE
ו־VEC_DISTANCE_EUCLIDEAN
מקבלות שני וקטורים. בדוגמה הקודמת, אחד הווקטורים הוא הווקטור שחושב על פי קלט המשתמש, והשני הוא הווקטור התואם לכל רשומה בטבלת products
.
דוגמה מעשית
הכנתי דוגמה מעשית באמצעות Java וללא מסגרות AI כדי שתבינו באמת את התהליך של יצירת אפליקציות AI מחולקות באמצעות יכולות החיפוש בוקטורים של MariaDB. תוכלו למצוא את הקוד ב־GitHub.
Source:
https://dzone.com/articles/vector-storage-indexing-and-search-with-mariadb