אחסון ושאילתות עם pgvector
הטמעות וקטוריות ממירות טקסט, תמונות ותוכן אחר לייצוגים מספריים שתופסים משמעות סמנטית. Azure Database for PostgreSQL תומך באחסון ושאילתות של ההטמעות הללו דרך תוסף pgvector, ומאפשר להוסיף יכולות חיפוש וקטורי למסד הנתונים הקיים של PostgreSQL מבלי לנהל מאגר וקטורי נפרד.
יחידה זו כוללת הפעלת ההרחבה pgvector, עיצוב סכמות לאחסון וקטורים, הוספת ועדכון הטבעות, וביצוע שאילתות דמיון בסיסיות. הפעולות הבסיסיות הללו מהוות את הבסיס לבניית תכונות חיפוש ושליפה סמנטיות ביישומי הבינה המלאכותית שלך.
הפעל את הרחבת pgvector
ההרחבה pgvector מוסיפה סוגי נתונים וקטוריים ואפרטורי חיפוש דמיון ל-PostgreSQL. לפני שתוכל לאחסן הטמעות, עליך להפעיל את התוסף במסד הנתונים שלך. Azure Database עבור PostgreSQL כולל את pgvector כאחת מההרחבות הנתמכות, מה שהופך אותו לזמין ללא התקנה נוספת.
כדי להפעיל pgvector, התחבר למסד הנתונים שלך והפעיל את הפקודה CREATE EXTENSION . אתה צריך את ההרשאות המתאימות ליצירת הרחבות, בדרך כלל ניתנות למנהל שרת או למשתמשים עם התפקיד azure_pg_admin .
CREATE EXTENSION IF NOT EXISTS vector;
לאחר הפעלת התוסף, תוכל לוודא שהיא זמינה על ידי שאילתה לתוספים המותקנים:
SELECT * FROM pg_extension WHERE extname = 'vector';
הרחבת pgvector מציגה את סוג vector הנתונים, אשר מאחסן הטבעות כמערכים של מספרים בנקודה צפה בדיוק יחיד. לכל וקטור יש מספר קבוע של ממדים שאתה מגדיר בעת יצירת עמודה. ההרחבה מספקת גם אופרטורים לחישוב מרחקים בין וקטורים וסוגי אינדקסים לחיפוש דמיון מהיר.
סכמות עיצוב לאחסון וקטורי
עיצוב סכימה יעיל לאחסון וקטורי משלב הטמעות עם המטא-דאטה שהאפליקציה שלך צריכה לסינון והצגה. כשאתה מגדיר עמודה וקטורית, אתה מציין את מספר הממדים באמצעות התחביר vector(n) , כאשר n חייב להתאים לממד הפלט של מודל ההטמעה שלך.
מידות ההטמעה הנפוצות משתנות לפי המודל. מודלים של טרנספורמר משפטים בדרך כלל מייצרים וקטורים ב-384 ממדים. מודל text-embedding-ada-002 של OpenAI מספק 1,536 ממדים, בעוד שמודל טקסט-embedding-3-large יכול להפיק עד 3,072 ממדים. שימוש במספר מימדים שגוי גורם לשגיאות הכנסה, לכן בדוק את מימד הפלט של המודל לפני יצירת טבלאות.
הדוגמה הבאה יוצרת טבלה המאחסנת מסמכים משפטיים עם הטמעות לצד מטא-דאטה שימושיים לסינון והצגה:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
category TEXT,
practice_area TEXT,
created_at TIMESTAMPTZ DEFAULT NOW(),
updated_at TIMESTAMPTZ DEFAULT NOW(),
embedding vector(1536)
);
סכימה זו מאחסנת את הטמעת המסמך באותה שורה כמו המטא-דאטה שלה. גישה זו מפשטת את השאילתות כי אין צורך בהצטרפות כדי לאסוף גם את המסמכים הדומים וגם את פרטים. לשדות תוכן גדולים, שקול לאחסן את הטקסט המלא בטבלה נפרדת ולשמור רק סיכומים או כותרות בטבלה הראשית כדי להפחית את כמות הנתונים המועברת במהלך חיפושי דמיון.
בעת עיצוב למספר מודלים של הטמעה או הטמעת סוגי תוכן שונים (כמו כותרות לעומת תוכן מלא), ניתן להוסיף עמודות וקטוריות מרובות:
CREATE TABLE documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
content TEXT,
title_embedding vector(384),
content_embedding vector(1536)
);
הכנסת ועדכון הטמעות
לאחר יצירת הסכימה שלך, אתה מכניס הטמעות באמצעות פקודות SQL INSERT סטנדרטיות. וקטורים מיוצגים כליטרלים של מחרוזות בפורמט מערך ונשלחים לטיפוס vector . קוד היישום שלך מייצר את ההטמעה באמצעות API להטמעה (כמו Azure OpenAI) ומעביר אותו למסד הנתונים כפרמטר.
INSERT INTO documents (title, content, category, practice_area, embedding)
VALUES (
'Corporate Merger Agreement Template',
'This agreement outlines the terms and conditions for the merger of...',
'contracts',
'corporate',
'[0.0123, -0.0456, 0.0789, -0.0321, ...]'::vector
);
להכנסות אצווה בעת טעינת מערכי נתונים גדולים, השתמש בפקודות מרובות שורות INSERT או בפקודה COPY לשיפור ביצועים:
INSERT INTO documents (title, content, category, embedding)
VALUES
('Document 1', 'Content...', 'legal', '[...]'::vector),
('Document 2', 'Content...', 'legal', '[...]'::vector),
('Document 3', 'Content...', 'legal', '[...]'::vector);
כאשר תוכן המסמך משתנה, עדכן את ההטמעה כך שתשקף את המשמעות הסמנטית החדשה:
UPDATE documents
SET content = 'Updated document content...',
embedding = '[0.0234, -0.0567, ...]'::vector,
updated_at = NOW()
WHERE id = 42;
ליישומים עם עדכונים תכופים, שקלו לשלב באצוות והטמעה מחדש בשעות שאינן שיא, במקום לעדכן את ההטמעות, באופן סינכרוני עם שינויים בתוכן. גישה זו מפחיתה את ההשהיה בעדכוני תוכן ומאחדת קריאות ל-API המוטמע.
וקטורי שאילתה עם אופרטורי מרחק
הרחבת pgvector מספקת שלושה אופרטורי מרחק למדידת דמיון בין וקטורים. כל אופרטור מחשב סוג שונה של מרחק, והבחירה הנכונה תלויה במודל ההטמעה והמקרה השימושי שלך.
מרחק L2 (מרחק אוקלידי) מודד את המרחק בקו ישר בין שני וקטורים במרחב ההטמעה. השתמש במפעיל <-> למרחק L2. ערכים קטנים יותר מצביעים על וקטורים דומים יותר. מדד זה עובד היטב כאשר גודל הווקטורים נושא משמעות.
SELECT id, title, embedding <-> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
מרחק הקוסינוס מודד את הזווית בין שני וקטורים, תוך התעלמות מהגדלים שלהם. השתמש באופרטור <=> למרחק קוסינוס. הערכים נעים בין 0 (אותו כיוון) ל-2 (כיוונים מנוגדים). מרחק קוסינוס הוא הבחירה הנפוצה ביותר להטמעות טקסט כי הוא מתמקד בכיוון המשמעות ולא באורך הווקטור.
SELECT id, title, embedding <=> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
מכפלה פנימית שלילית מחשבת את מכפלת הנקודות של שני וקטורים ומבטלת אותה. השתמש במפעיל.<#> מדד זה שימושי לחיפוש מכפלה פנימית מקסימלית, כאשר מכפלות נקודתיות גדולות יותר מצביעות על וקטורים דומים יותר. השלילה ממירה אותו למרחק שבו ערכים קטנים יותר טובים יותר, בהתאם להתנהגות האופרטורים האחרים.
SELECT id, title, embedding <#> '[0.0123, -0.0456, ...]'::vector AS distance
FROM documents
ORDER BY distance
LIMIT 10;
רוב מודלי ההטמעה, כולל ההטמעות של OpenAI, מותאמים לדמיון קוסינוס. בדוק את התיעוד של מודל ההטמעה שלך כדי לאשר איזה מדד מרחק הוא ממליץ.
סוגי נתונים וקטוריים ודיוק
הרחבת pgvector מציעה שלושה סוגי נתונים לאחסון וקטורים, כל אחד עם מאפייני אחסון וביצועים שונים.
סוג הווקטור מאחסן אלמנטים כמספרים בנקודה צפה בדיוק יחיד (32 ביט). זהו הסוג הסטנדרטי לרוב מקרים ומספק איזון טוב בין דיוק ליעילות אחסון. וקטור בעל 1536 ממד משתמש בכ-6 KB של אחסון.
סוג ה-halfvec שומר אלמנטים כמספרי נקודה צפה חצי-מדויקים (16 ביט). סוג זה מפחית את האחסון בחצי לעומת vector זאת, תוך שמירה על דיוק מספק לרוב משימות חיפוש הדמיון. שימוש halfvec כשאחסון הוא בעיה ווידאת שהדיוק המופחת לא משפיע משמעותית על איכות החיפוש שלך.
CREATE TABLE documents_compact (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
embedding halfvec(1536)
);
סוג הספארסבק שומר וקטורים דלילים כאשר רוב האיברים הם אפס. במקום לאחסן את כל הממדים, הוא מאחסן רק את הערכים הלא-אפסיים ואת מיקומם. סוג זה שימושי למודלים שמייצרים הטבעות דלילות, כמו ייצוגים מסוימים של מסמכים. ציין את מספר הממדים המקסימלי בעת יצירת העמודה.
CREATE TABLE sparse_documents (
id SERIAL PRIMARY KEY,
title TEXT NOT NULL,
embedding sparsevec(10000)
);
הערה
מדדי HNSW בעמודות sparsevec תומכים עד 1,000 איברים שאינם אפס. אם הווקטורים הדלילים שלך חורגים מגבול זה, שקול הפחתת ממדיות או אסטרטגיות אינדוקס חלופיות.
לרוב יישומי הבינה המלאכותית המשתמשים בהטמעות צפופות ממודלים כמו OpenAI או Sentence Transformers, השתמשו בסוג הסטנדרטי vector . שקול halfvec רק לאחר שהבנצ'מרקינג מאשר שחצי דיוק מספק איכות חיפוש סבירה למקרה השימוש הספציפי שלך.