Vector Databases

استفاده از قدرت pgvector: جستجوی معنایی درون PostgreSQL

در چشم‌انداز به‌سرعت در حال تحول هوش مصنوعی و یادگیری ماشین، توانایی انجام جستجوی معنایی به یک قابلیت حیاتی برای برنامه‌های مدرن تبدیل شده است. در حالی که پایگاه‌های داده برداری اختصاصی مانند Pinecone، Weaviate و Milvus برای مدیریت داده‌های برداری با ابعاد بالا ظهور کرده‌اند، جایگزینی جذاب در سکوت در دنیای محبوب‌ترین پایگاه داده رابطه‌ای متن‌باز جهان قرار دارد: pgvector.

برای توسعه‌دهندگانی که سرمایه‌گذاری زیادی در اکوسیستم PostgreSQL انجام داده‌اند، pgvector مسیر عملیاتی برای پیش رو فراهم می‌کند. این ابزار بار عملیاتی نگهداری یک سرویس پایگاه داده جداگانه را حذف می‌کند و هم‌زمان قابلیت‌های جستجوی شباهت با عملکرد بالا را ارائه می‌دهد. این پست وبلاگ بررسی می‌کند که pgvector چیست، چگونه کار می‌کند و چگونه می‌توانید آن را در پروژه‌های خود پیاده‌سازی کنید.

pgvector چیست؟

pgvector یک افزونه متن‌باز برای PostgreSQL است که از جستجوی شباهت برداری پشتیبانی می‌کند. این افزونه به شما امکان می‌دهد بردارها را مستقیماً در نمونه‌های موجود PostgreSQL خود ذخیره، نمایه‌سازی و پرس‌وجو کنید. با ادغام قابلیت‌های برداری در یک پایگاه داده رابطه‌ای، pgvector به توسعه‌دهندگان اجازه می‌دهد از استحکام، سازگاری و یکپارچگی تراکنشی PostgreSQL برای ویژگی‌های مبتنی بر هوش مصنوعی بهره ببرند.

این افزونه از سه متریک فاصله اصلی پشتیبانی می‌کند:

  • فاصله L2 (اقلیدسی): بهترین گزینه برای بردارهای متراکم که در آن‌ها بزرگی اهمیت دارد.
  • حاصل‌ضرب داخلی (کسینوس): ایده‌آل برای جاسازی‌های متنی که در آن‌ها جهت اهمیت بیشتری نسبت به بزرگی دارد.
  • فاصله کسینوس: یک نسخه نرمال‌سازی شده که اغلب در وظایف پردازش زبان طبیعی (NLP) استفاده می‌شود.

شروع کار با pgvector

فرض بر این است که PostgreSQL نصب شده است، افزودن pgvector ساده است. می‌توانید آن را از طریق مدیر بسته سیستم‌عامل خود نصب کنید یا از سورس کامپایل نمایید. پس از نصب، افزونه را در پایگاه داده خود فعال می‌کنید.

نصب و راه‌اندازی

-- Connect to your database
\c my_database;

-- Enable the pgvector extension
CREATE EXTENSION vector;

پس از فعال‌سازی افزونه، می‌توانید یک ستون برای ذخیره بردارهای خود ایجاد کنید. نوع داده vector نیاز دارد که ابعاد بردارهایی که قصد ذخیره آن‌ها را دارید مشخص کنید.

ایجاد یک ستون برداری

CREATE TABLE items (
    id SERIAL PRIMARY KEY,
    content TEXT NOT NULL,
    embedding VECTOR(1536) -- For OpenAI Ada-002 embeddings
);

نمایه‌سازی برای عملکرد

جستجوی نیروی خالص (Brute-force) برای مجموعه‌های داده بزرگ کند است. برای دستیابی به تأخیر زیر میلی‌ثانیه در مقیاس بزرگ، pgvector از ساختارهای جستجوی نمایه‌سازی، به‌ویژه IVFFlat و HNSW استفاده می‌کند.

  • IVFFlat (فایل معکوس با کوانتیزاسیون تخت): سریع‌تر برای ساخت، اما ممکن است در زمان پرس‌وجو کندتر باشد. بهترین گزینه برای مجموعه‌های داده‌ای که نتایج تقریبی قابل قبول است و فضای دیسک نگرانی ایجاد می‌کند.
  • HNSW (جهان کوچک ناوبری سلسله‌مراتبی): بهترین عملکرد پرس‌وجو و بازگشت (recall) را ارائه می‌دهد و برای برنامه‌های با تراکم بالا مناسب است، اگرچه به حافظه و فضای ذخیره‌سازی بیشتری نیاز دارد.

در اینجا مثالی از ایجاد یک نمایه HNSW برای شباهت کسینوس آورده شده است:

CREATE INDEX ON items USING hnsw (embedding vector_cosine_ops);

انجام جستجوی شباهت

پس از نمایه‌سازی داده‌های شما، پرس‌وجو برای موارد مشابه شهودی است. می‌توانید از عملگر ->> برای فاصله کسینوس یا <-> برای فاصله L2 استفاده کنید. مثال زیر ۵ مورد مشابه‌ترین را به یک جاسازی داده شده پیدا می‌کند.

SELECT id, content
FROM items
ORDER BY embedding <-> '[0.1, 0.2, ..., 0.9]'::vector
LIMIT 5;

برای شباهت کسینوس، ممکن است ترجیح دهید به جای فاصله، امتیاز شباهت واقعی را محاسبه کنید، زیرا فواصل کوچکتر نشان‌دهنده شباهت بیشتر هستند.

بهترین شیوه‌ها و ملاحظات

در حالی که pgvector قدرتمند است، اما راه‌حل جادویی نیست. در اینجا برخی ملاحظات برای توسعه‌دهندگان متوسط تا پیشرفته آورده شده است:

  1. مدیریت ابعاد: اطمینان حاصل کنید که مدل‌های جاسازی شما بردارهایی با ابعاد سازگار تولید می‌کنند. ابعاد نامتناسب باعث خطاهای درج می‌شود.
  2. تنظیم نمایه: برای IVFFlat، پارامتر lists تعداد خوشه‌ها را کنترل می‌کند. تعداد بالاتر دقت را بهبود می‌بخشد اما زمان ساخت را افزایش می‌دهد. برای HNSW، پارامترهای m و ef_construction پارامترهای کلیدی هستند که باید بر اساس محدودیت‌های سخت‌افزاری خود تنظیم کنید.
  3. انطباق ACID: برخلاف بسیاری از پایگاه‌های داده برداری اختصاصی، pgvector از ویژگی‌های ACID PostgreSQL بهره می‌برد. این تضمین می‌کند که داده‌های برداری شما با داده‌های رابطه‌ای خود سازگار باقی بمانند و به‌روزرسانی‌ها و حذف‌ها را ساده می‌کند.
  4. مقیاس‌پذیری: در حالی که pgvector برای استقرارهای تک‌گره‌ای عالی است، مقیاس‌پذیری جستجوی برداری به صورت افقی در چندین گره نیاز به برنامه‌ریزی دقیق دارد که اغلب شامل استراتژی‌های شاردینگ (تکه‌بندی) می‌شود.

نتیجه‌گیری

pgvector نشان‌دهنده تغییر قابل توجهی در نحوه رویکرد ما به ذخیره‌سازی داده‌های برداری است. با آوردن قابلیت‌های برداری به حوزه رابطه‌ای، این ابزار پیچیدگی معماری را برای تیم‌هایی که قبلاً به PostgreSQL وابسته هستند کاهش می‌دهد. چه در حال ساخت یک موتور توصیه‌گر باشید، چه یک ویژگی جستجوی معنایی، یا یک برنامه RAG (تولید تقویت‌شده با بازیابی)، pgvector یک پایه قدرتمند، با عملکرد بالا و آشنا ارائه می‌دهد. با بالغ‌تر شدن اکوسیستم هوش مصنوعی، بهره‌برداری از زیرساخت‌های موجود مانند PostgreSQL احتمالاً مزیت استراتژیک برای بسیاری از سازمان‌ها باقی خواهد ماند.

Share: