पाठ 6 / 28
Distance Operators और ORDER BY
Similarity से rows को क्रम देने के लिए <->, <=> और <#> उपयोग करें।
तीन operators, एक पैटर्न
pgvector दूरियाँ operators के रूप में देता है: <-> Euclidean (L2) दूरी, <=> cosine दूरी (1 घटा cosine similarity), और <#> ऋणात्मक inner product (ऋणात्मक ताकि हर operator के लिए "छोटा मतलब पास" रहे और आरोही ORDER BY का अर्थ हमेशा "सबसे पास पहले" हो)। खोज का पैटर्न हमेशा ORDER BY embedding <op> :query LIMIT k है। Cosine similarity दिखाने के लिए 1 - (embedding <=> query) निकालें; inner product दिखाने के लिए <#> को -1 से गुणा करें। अपने index से मेल खाता operator उपयोग करें (vector_cosine_ops से बना HNSW index <=> queries के लिए काम आता है, <-> के लिए नहीं) और वही metric जिसके लिए आपका embedding model प्रशिक्षित है।
एक query के लिए तीन दूरियाँ, चलाकर
मैंने यह SQL Docker container में pgvector extension संस्करण 0.8.6 के साथ PostgreSQL 16 पर चलाया। Query [1,0,0] के लिए cosine से सबसे पास की row 2025 की leave नीति है (cosine दूरी 0.006)। Columns L2 दूरी, cosine दूरी और inner product (वापस धनात्मक similarity में उलटा किया हुआ) दिखाते हैं।
SELECT id, body,
round((embedding <-> '[1,0,0]')::numeric, 3) AS l2,
round((embedding <=> '[1,0,0]')::numeric, 3) AS cosine_distance,
round(((embedding <#> '[1,0,0]') * -1)::numeric, 3) AS inner_product
FROM docs ORDER BY embedding <=> '[1,0,0]' LIMIT 3;
Output:
id | body | l2 | cosine_distance | inner_product ----+------------------------+-------+-----------------+--------------- 1 | leave policy 2025 | 0.141 | 0.006 | 0.900 4 | beta confidential memo | 0.224 | 0.024 | 0.900 2 | old leave policy | 0.300 | 0.037 | 0.800 (3 rows)
वही metric उपयोग करें जिसके लिए मॉडल प्रशिक्षित है
अधिकांश पाठ embedding models cosine similarity के लिए बने हैं। Model card पढ़ें और मेल खाती operator class से index बनाएँ।
त्वरित जाँच: <#> ऋणात्मक inner product क्यों है?
- Inner products स्वभाव से ऋणात्मक होते हैं
- यह bug है
- जगह बचाने के लिए
- ताकि आरोही ORDER BY हर operator के लिए सबसे पास पहले लौटाए
Answer
ताकि आरोही ORDER BY हर operator के लिए सबसे पास पहले लौटाए — बड़ा inner product पास दर्शाता है, इसलिए "छोटा मतलब पास" में फ़िट करने को उसे उलटा किया जाता है।