pg_vectorsearch: جستجوی برداری سریعتر از pgvector داخل PostgreSQL
خلاصهٔ کاملتر
pg_vectorsearch یه اکستنشن برای PostgreSQL هست که برای جستجوی ANN (یعنی پیدا کردن نزدیکترین بردارها بهصورت تقریبی و سریع) ساخته شده. این همون کاریه که برای جستجوی معنایی و RAG با embeddingها لازم داری. پروژه فعلاً در وضعیت alpha هست و تیمش صریحاً میگه برای تسته، نه production. حتی ممکنه آپگرید بین نسخهها ممکن نباشه و مجبور شی اکستنشن و ایندکسها رو پاک کنی و از نو بسازی.
قلب پروژه ایندکسی به اسم PRISM هست. ایدهش شبیه IVFFlat در pgvectorه، یعنی بردارها رو توی خوشهها (cluster) دستهبندی میکنه و موقع جستجو فقط خوشههای نزدیک رو میگرده. فرقش اینه که یه درخت سلسلهمراتبی از مرکز خوشهها داره و اونو توی buffer cache خود PostgreSQL گرم نگه میداره. به گفتهی تیم سازنده، PRISM روی یه دیتاست ۱۰۰ میلیون برداری با همون دقت (recall)، از HNSW سریعتره، اونم روی سروری که یکچهارم رم داره.
بخش دیگهی ماجرا RaBitQ هست، یعنی یه روش فشردهسازی بردارها که یه حد خطای ریاضی هم همراهش داره. با این حد خطا، موتور جستجو میتونه بردارهایی رو که اصلاً امکان نداره جزو نزدیکترینها باشن زود کنار بذاره. پس فقط تعداد کمی از بردارها با نسخهی کامل و دقیقشون دوباره مقایسه میشن. محاسبهی فاصله هم با دستورهای SIMD (یعنی پردازش چند عدد با یه دستور CPU) روی AVX2، AVX512 و NEON بهینه شده.
برای استفاده دو راه هست. میتونی از نوعهای خود اکستنشن یعنی vec32 و vec16 استفاده کنی، یا اگه از قبل جدول pgvector با ستون vector یا halfvec داری، PRISM رو مستقیم روی همون ستون بسازی. این نوعها با pgvector سازگاری باینری دارن، پس جدول بازنویسی نمیشه و کوئریها همونطور کار میکنن:
CREATE EXTENSION pg_vectorsearch;
CREATE INDEX documents_embedding_prism
ON documents USING prism (embedding vec32_l2_ops);بعدش planner خودش PRISM رو به HNSW ترجیح میده و میتونی با EXPLAIN چکش کنی و ایندکس قدیمی رو پاک کنی. برای تنظیم سرعت و دقت معمولاً فقط prism.nprobe رو عوض میکنی. مقدار صفر یعنی خودکار با recall حدود ۰.۹۵. یه نکتهی نگهداری هم هست: insertها لیستها رو بزرگ میکنن و خودشون تقسیم نمیشن، پس باید گاهی prism_rebalance یا REINDEX بزنی.
نکات کلیدی:
- وضعیت پروژه alpha هست و برای production توصیه نمیشه.
- ایندکس PRISM برای مقیاس ۱۰۰ میلیون بردار به بالا طراحی شده.
- فشردهسازی RaBitQ با حد خطا، تعداد مقایسههای دقیق رو کم میکنه.
- با ستونهای vector و halfvec در pgvector بدون تغییر جدول کار میکنه.
- عملگرهای و و برای L2، ضرب داخلی و cosine پشتیبانی میشن.
- به PostgreSQL 18 به بالا و سیستم بیلد Meson نیاز داره و لایسنسش PostgreSQL License هست.




