مجموعه‌ها

مفهوم مجموعه‌ها در پایگاه داده بردار Qdrant می‌تواند مشابه ساختار جدول در MYSQL باشد که برای ذخیره سازی یکنواخت داده‌های برداری از یک نوع استفاده می‌شود. هر قطعه داده‌ای که در یک مجموعه ذخیره می‌شود، به عنوان نقطه‌ای در Qdrant اشاره دارد. در این‌جا، یک نقطه مشابه مفهوم فضای هندسی ریاضیاتی است و نمایندگی از یک بردار در فضای هندسی است (فقط آن را به عنوان یک قطعه داده در نظر بگیرید).

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

متریک فاصله برای اندازه‌گیری شباهت بین بردارها استفاده می‌شود. انتخاب متریک به وابستگی از اینکه چگونه بردارها به دست آمده‌اند، به‌ویژه روش استفاده شده برای آموزش رمزگذارهای شبکه های عصبی، بستگی دارد.

Qdrant از انواع محبوب زیر متریک‌ها پشتیبانی می‌کند:

  • ضرب داخلی: Dot
  • مشابهت کیسون: Cosine
  • فاصله اقلیدسی: Euclid

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

تنظیم چند-سایتی

چندین مجموعه باید ایجاد شود؟ در اکثر موارد، تنها نیاز است که از یک مجموعه با تقسیم بندی بر اساس بار مفید استفاده کنید. این رویکرد به عنوان چند-سایتی شناخته می‌شود. برای اکثر کاربران، این کارآمد است اما نیازمند پیکربندی اضافی است. یاد بگیرید چگونه چند-سایتی راه‌اندازی کنید.

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

ایجاد یک مجموعه

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    }
}

علاوه بر گزینه‌های لازم، مقادیر سفارشی را نیز می‌توان برای گزینه‌های مجموعه زیر مشخص نمود:

  • hnsw_config - برای جزئیات فهرست، به بخش فهرست مراجعه نمایید.
  • wal_config - پیکربندی مربوط به ورودی-پیش از نوشتن ورودی. برای اطلاعات دقیق‌تر در مورد WAL، لطفا به آن مراجعه کنید.
  • optimizers_config - برای جزئیات بهینه‌سازی، به بخش بهینه‌ساز مراجعه نمایید.
  • shard_number - تعداد شاردهایی را که مجموعه باید داشته باشد، مشخص می‌کند. برای اطلاعات بیشتر، لطفا به بخش نصب و راه‌اندازی توزیعی مراجعه نمایید.
  • on_disk_payload - مکان ذخیره داده‌های بار مفید را تعیین می‌کند. اگر به true تنظیم شود، فقط داده‌های بار مفید در دیسک ذخیره خواهند شد. این می‌تواند بسیار مفید باشد برای محدود کردن استفاده از RAM هنگام کار با بار مفید‌های بزرگ.
  • quantization_config - برای اطلاعات دقیق در مورد کوانتیزاسیون، به کوانتیزاسیون مراجعه نمایید.

پارامترهای پیش‌فرض برای گزینه‌های اختیاری مجموعه در پرونده پیکربندی اینجا تعیین شده‌اند.

برای اطلاعات بیشتر در مورد پارامترهای مجموعه و بردارها، لطفا به تعریف طرح و پرونده پیکربندی مراجعه نمایید.

در دسترس از ورژن v1.2.0

بردارها در RAM ذخیره می‌شوند تا دسترسی بسیار سریع بدست آید. می‌توان پارامتر on_disk را در پیکربندی بردار تنظیم کرد. اگر به true تنظیم شود، تمام بردارها بر روی دیسک ذخیره خواهند شد. این قابلیت استفاده از نگاشت حافظه را فعال می‌نماید که مناسب برای وارد کردن مقادیر زیادی داده است.

ایجاد مجموعه از مجموعه دیگر

در دسترس از ورژن v1.0.0

می‌توان یک مجموعه را از یک مجموعه موجود دیگر مقدماتی نمود.

این مفید است برای سریع امتحان تنظیمات مختلف مجموعه یک دیتاست مشابه.

هنگام تنظیم پارامتر بردار در مجموعه جدید، اطمینان حاصل کنید که بردارها ابعاد و تابع فاصله یکسانی با مجموعه اصلی داشته باشند.

PUT /collections/{collection_name}

{
    "vectors": {
      "size": 300,
      "distance": "Cosine"
    },
    "init_from": {
       "collection": {from_collection_name}
    }
}

مجموعه داده‌های چند بُعدی

در دسترس از نگارش v0.10.0

هر رکورد می تواند دارای چند بُعد باشد. این ویژگی امکان ذخیره چند بُعدی در یک مجموعه را فراهم می کند. برای تمایز بُعدها درون یک رکورد، وقتی که مجموعه را ایجاد می کنید، نام‌های یکتای آن‌ها را مشخص کنید. هر بُعد با نام مشخص زیر این قالب، دارای فاصله و اندازه‌ی خود است:

PUT /collections/{collection_name}

{
    "vectors": {
        "image": {
            "size": 4,
            "distance": "Dot"
        },
        "text": {
            "size": 8,
            "distance": "Cosine"
        }
    }
}

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

در دسترس از نگارش v1.1.1

برای هر بُعد مشخص، می توانید به طور اختیاری hnsw_config یا quantization_config را مشخص کنید تا از پیکربندی مجموعه منحرف شود. این مورد می‌تواند برای بهینه‌سازی عملکرد جستجو در سطح بُعدی استفاده شود.

در دسترس از نگارش v1.2.0

بُعدها در حافظه برای دسترسی سریع ذخیره می‌شوند. برای هر بُعد، می‌توانید on_disk را به true تنظیم کنید تا همیشه تمام بُعدها را در دیسک ذخیره کنید. این امر نقشه برداری حافظه را فعال می‌کند که برای دریافت حجم زیادی از داده‌ها مناسب است.

حذف یک مجموعه

DELETE /collections/{collection_name}

به‌روزرسانی پارامترهای مجموعه

به‌روزرسانی پارامترهای پویا می تواند مفید باشد، مانند بارگذاری اولیه بهینه‌تر بُعدها. به عنوان مثال، می‌توانید هنگام بارگذاری فهرست‌سازی را غیرفعال کنید و بلافاصله پس از اتمام بارگذاری آن را فعال کنید. به این ترتیب، منابع محاسباتی اضافی را برای بازسازی فهرست هدر نخواهید داد.

دستور زیر، فهرست‌سازی را برای یک بخش حاوی بُعدهای بزرگتر از 10000 kB فعال می‌کند:

PATCH /collections/{collection_name}

{
    "optimizers_config": {
        "indexing_threshold": 10000
    }
}

پارامترهای زیر قابل به‌روزرسانی هستند:

  • optimizers_config - جزئیات دقیق بهینه‌سازها را ببینید.
  • hnsw_config - جزئیات دقیق فهرست.
  • quantization_config - جزئیات دقیق کوانتیزاسیون.
  • vectors - پیکربندی بُعدهای خاص، شامل پیکربندی‌های مربوطه‌ی hnsw_config، quantization_config و on_disk.
  • params - سایر پارامترهای مجموعه، شامل write_consistency_factor و on_disk_payload.

مشخصات کامل API در تعاریف اسکیما قرار دارد.

در دسترس از نگارش v1.4.0

Qdrant 1.4 پشتیبانی از به‌روزرسانی پارامترهای بیشتر مجموعه در زمان اجرا را اضافه کرده است. ایندکس HNSW، کوانتیزاسیون و پیکربندی دیسک اکنون می‌تواند بدون ایجاد دوباره مجموعه تغییر کند. بخش‌ها (با اطلاعات فهرست و کوانتیزاسیون) به‌طور خودکار در پس‌زمینه بازسازی می‌شوند تا با پارامترهای به‌روزرسانی شده همخوانی داشته باشند.

در مثال زیر، کل مجموعه و پارامترهای ایندکس HNSW و کوانتیزاسیون برای my_vector به‌روزرسانی می‌شوند:

PATCH /collections/{collection_name}

{
    "vectors": {
        "my_vector": {
            "hnsw_config": {
                "m": 32,
                "ef_construct": 123
            },
            "quantization_config": {
                "product": {
                    "compression": "x32",
                    "always_ram": true
                }
            },
            "on_disk": true
        }
    },
    "hnsw_config": {
        "ef_construct": 123
    },
    "quantization_config": {
        "scalar": {
            "type": "int8",
            "quantile": 0.8,
            "always_ram": false
        }
    }
}

توجه: برای به‌روزرسانی پارامترهای بُعدها در یک مجموعه بدون بُعدهای نام‌دار، می‌توان از نام خالی ("") استفاده کرد.

تماس‌ها به این پایانه ممکن است به عنوان یک مسدود کننده عمل کنند زیرا منتظر به پایان رسیدن بهینه‌سازهای موجود هستند. ما توصیه نمی‌کنیم از این قابلیت در یک پایگاه داده تولیدی استفاده کنید زیرا بازسازی فهرست می‌تواند هزینه مهمی را به همراه داشته باشد.

اطلاعات مجموعه

Qdrant امکان تعیین پارامترهای پیکربندی برای یک مجموعه موجود را فراهم می کند تا توزیع نقاط و وضعیت فهرست‌بری را بهتر درک کنیم.

GET /collections/{collection_name}

{
    "result": {
        "status": "green",
        "optimizer_status": "ok",
        "vectors_count": 1068786,
        "indexed_vectors_count": 1024232,
        "points_count": 1068786,
        "segments_count": 31,
        "config": {
            "params": {
                "vectors": {
                    "size": 384,
                    "distance": "Cosine"
                },
                "shard_number": 1,
                "replication_factor": 1,
                "write_consistency_factor": 1,
                "on_disk_payload": false
            },
            "hnsw_config": {
                "m": 16,
                "ef_construct": 100,
                "full_scan_threshold": 10000,
                "max_indexing_threads": 0
            },
            "optimizer_config": {
                "deleted_threshold": 0.2,
                "vacuum_min_vector_number": 1000,
                "default_segment_number": 0,
                "max_segment_size": null,
                "memmap_threshold": null,
                "indexing_threshold": 20000,
                "flush_interval_sec": 5,
                "max_optimization_threads": 1
            },
            "wal_config": {
                "wal_capacity_mb": 32,
                "wal_segments_ahead": 0
            }
        },
        "payload_schema": {}
    },
    "status": "ok",
    "time": 0.00010143
}

در صورتی که برداشت‌ها به مجموعه اضافه شوند، فیلد status ممکن است در حال بهینه‌سازی به "yellow" تغییر کند و پس از پردازش موفق تمام نقاط، به "green" تغییر خواهد کرد.

وضعیت‌های رنگی زیر ممکن است مواجه شود:

  • ? green: مجموعه آماده است
  • ? yellow: مجموعه در حال بهینه‌سازی است
  • ? red: موتور با خطا غیرقابل بازیابی مواجه شده است

مشخصات دیگری که ممکن است جالب باشند عبارتند از:

  • points_count - تعداد کل اشیاء (برداشت‌ها و بارهای آن‌ها) ذخیره شده در مجموعه
  • vectors_count - تعداد کل برداشت‌ها در مجموعه. اگر هر شی دارای چندین برداشت باشد ممکن است با points_count برابر نباشد.
  • indexed_vectors_count - تعداد کل برداشت‌های ذخیره شده در فهرست‌بر HNSW. Qdrant تمام برداشت‌ها را در فهرست‌بر ذخیره نمی کند، بلکه فقط آن‌ها را که ممکن است براساس پیکربندی داده شده، بخش‌های فهرست‌بر را ایجاد کنند.

فهرست‌بری برداشت‌ها در HNSW

در برخی موارد ممکن است مقدار indexed_vectors_count کمتر از vectors_count باشد. این یک رفتار هدفمند است که بسته به پیکربندی بهینه‌ساز، رخ می دهد. یک بخش فهرست جدید ایجاد خواهد شد اگر اندازه برداشت‌های غیرفهرست‌بری مقدار indexing_threshold (به KB) را بیشتر کند. اگر مجموعه شما بسیار کوچک است یا بعد فضای برداشت کم است، بخش‌های HNSW ایجاد نمی‌شود و indexed_vectors_count ممکن است برابر با 0 باشد.

شما می توانید مقدار indexing_threshold را در پارامترهای مجموعه کاهش دهید تا یک بخش فهرست جدید در مجموعه موجود ایجاد شود.

نامهای متحدالشکل مجموعه

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

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

بنابراین، یک مجموعه دوم می تواند در پس زمینه ایجاد شود و سپس متحدالشکل از مجموعه قدیمی به مجموعه جدید منتقل شود. همان‌طور که تغییرات متحدالشکل اتمیک هستند، در هنگام فرایند تغییر، درخواست‌های متوالی تحت تاثیر نیستند.

ایجاد متحدالشکل

POST /collections/aliases

{
    "actions": [
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "example_collection"
            }
        }
    ]
}

حذف متحدالشکل

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        }
    ]
}

تغییر مجموعه

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

POST /collections/aliases

{
    "actions": [
        {
            "delete_alias": {
                "alias_name": "production_collection"
            }
        },
        {
            "create_alias": {
                "alias_name": "production_collection",
                "collection_name": "new_collection"
            }
        }
    ]
}

نمایش همه متغیرها مجموعه

GET /collections/{collection_name}/aliases

نمایش همه متغیرها

GET /aliases

نمایش همه مجموعه‌ها

GET /collections