pgvector के साथ एम्बेडिंग को स्टोर और क्वेरी करें

पूरा किया

वेक्टर एम्बेडिंग पाठ, छवियों और अन्य सामग्री को संख्यात्मक अभ्यावेदन में बदल देते हैं जो शब्दार्थ अर्थ को पकड़ते हैं। Azure Database for PostgreSQL pgvector एक्सटेंशन के माध्यम से इन एम्बेडिंग को संग्रहीत करने और क्वेरी करने का समर्थन करता है, जिससे आप एक अलग वेक्टर स्टोर का प्रबंधन किए बिना अपने मौजूदा PostgreSQL डेटाबेस में वेक्टर खोज क्षमताओं को जोड़ सकते हैं।

इस इकाई में pgvector एक्सटेंशन को सक्षम करना, वेक्टर भंडारण के लिए स्कीमा डिजाइन करना, एम्बेडिंग डालना और अपडेट करना और बुनियादी समानता क्वेरी करना शामिल है। ये मूलभूत संचालन आपके AI अनुप्रयोगों में सिमेंटिक खोज और पुनर्प्राप्ति सुविधाओं के निर्माण का आधार बनते हैं।

pgvector एक्सटेंशन सक्षम करें

pgvector एक्सटेंशन वेक्टर डेटा प्रकार और समानता खोज ऑपरेटरों को PostgreSQL में जोड़ता है। इससे पहले कि आप एम्बेडिंग संग्रहीत कर सकें, आपको अपने डेटाबेस में एक्सटेंशन को सक्षम करना होगा। Azure डेटाबेस for 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-आयामी वैक्टर का उत्पादन करते हैं। OpenAI का टेक्स्ट-एम्बेडिंग-ada-002 मॉडल 1,536 आयाम आउटपुट करता है, जबकि टेक्स्ट-एम्बेडिंग-3-लार्ज 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 । आपका एप्लिकेशन कोड एक एम्बेडिंग एपीआई (जैसे 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 केबी भंडारण का उपयोग करता है।

हाफवेक प्रकार तत्वों को अर्ध-सटीक (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 या वाक्य ट्रांसफार्मर जैसे मॉडल से घने एम्बेडिंग का उपयोग करने वाले अधिकांश AI अनुप्रयोगों के लिए, मानक vector प्रकार का उपयोग करें। बेंचमार्किंग के बाद ही विचार करें halfvec कि अर्ध-परिशुद्धता आपके विशिष्ट उपयोग के मामले के लिए स्वीकार्य खोज गुणवत्ता प्रदान करती है।