पाठ 7 / 28

WHERE से Filtering: SQL और Vectors साथ

Similarity क्रम को relational शर्तों के साथ मिलाएँ।

सामान्य SQL शर्तें सीधे काम करती हैं

चूँकि vector एक column है, आप सामान्य WHERE से filter करते हैं: WHERE tenant = 'acme' AND year = 2025 ORDER BY embedding <=> :q LIMIT 2। आप अन्य tables (users, permissions, products) से join, IN सूचियाँ, सीमाएँ, OR और यह लागू करने को row-level security भी उपयोग कर सकते हैं कि कौन-सी rows कौन देखे, जो सीमित query भाषा वाले engines पर बड़ा लाभ है। ध्यान रखें कि approximate index के साथ संचालन का क्रम मायने रखता है (अगला खंड ऐसा filter दिखाता है जो शून्य rows लौटाता है), और सटीक scan हमेशा filter मानता है। सुरक्षा filters query या row-level security में रखें, application के पाठ prompts में कभी नहीं।

Similarity और relational filters, चलाकर

मैंने यह SQL Docker container में pgvector extension संस्करण 0.8.6 के साथ PostgreSQL 16 पर चलाया। Tenant acme और वर्ष 2025 तक सीमित करने पर 2022 की नीति और दूसरे tenant का memo बाहर हो जाते हैं, leave नीति और travel दस्तावेज़ बचते हैं, सबसे पास पहले।

SELECT id, tenant, year, body
FROM docs
WHERE tenant = 'acme' AND year = 2025
ORDER BY embedding <=> '[1,0,0]'
LIMIT 2;

Output:

 id | tenant | year |       body        
----+--------+------+-------------------
  1 | acme   | 2025 | leave policy 2025
  3 | acme   | 2025 | travel and hotels
(2 rows)

अपने filter columns को भी index करें

Filter चयनात्मक हो तो tenant या year पर B-tree index planner की मदद करता है। EXPLAIN से जाँचें।

त्वरित जाँच: Filtering के लिए pgvector की एक ताक़त कौन-सी है?

  • पूरा SQL: joins, सीमाएँ, row-level security
  • कोई filtering संभव नहीं
  • सिर्फ़ एक field पर equality
  • Filtering सिर्फ़ prompt में
Answer

पूरा SQL: joins, सीमाएँ, row-level security — Relational database में vector बस एक और column है।