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

در این بحث به شرح می‌پردازیم چگونه از Milvus برای جستجوی موجودیت‌ها استفاده کنیم.

در Milvus، جستجوی مشابهت بردار فاصله بین بردار پرس و جو و بردارهای موجود در مجموعه‌ها را محاسبه می‌کند (با استفاده از اندازه مشابهت مشخص) و نتایج مشابهت‌دارترین را برمی‌گرداند. می‌توانید با مشخص کردن یک عبارت بولین برای فیلتر کردن فیلدهای اسکالر یا کلید اصلی، جستجوی ترکیبی را اجرا کنید.

مثال زیر نشان می‌دهد که چگونه جستجوی مشابهت بردار برروی مجموعه‌ای شامل 2000 ردیف داده، شامل شناسه کتاب (کلید اصلی)، تعداد کلمات (فیلد اسکالر) و خلاصه کتاب (فیلد بردار) را اجرا کنیم تا جستجوی کتاب‌های خاصی بر اساس توصیفات برداری شان شبیه‌سازی شود. Milvus بر اساس بردار پرس و جو و پارامترهای جستجوی تعیین شده توسط شما، نتایج مشابهت‌دارترین را برمی‌گرداند.

بارگذاری مجموعه

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

from pymilvus import Collection
collection = Collection("book")      # مجموعه موجود را دریافت کنید.
collection.load()

آماده‌سازی پارامترهای جستجو

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

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
پارامتر توضیحات
metric_type روش استفاده شده برای اندازه‌گیری فاصله بین بردارها در طول جستجو. باید همانند روش مشخص شده در فرآیند ساخت اندیس باشد. به معیارهای مشابهت مراجعه کنید برای اطلاعات بیشتر.
offset تعداد موجودیت‌هایی که در طول جستجو رد می‌کند. جمع این مقدار و limit متد search باید کمتر از 16384 باشد. برای مثال، اگر می‌خواهید همسایه نهم و دهم بردار پرس و جو را پرس و جو کنید، limit را به 2 تنظیم کنید و offset را به 8.
ignore_growing آیا باید بخش‌های رشد کننده را هنگام جستجوی مشابهت چشم‌پوشی کند یا خیر. مقدار پیش‌فرض False می‌باشد و نشان می‌دهد که جستجو شامل بخش‌های رشد کننده است.
params پارامترهای جستجو مربوط به نوع اندیس مشخص شده. به اندیس بردارها مراجعه کنید برای اطلاعات بیشتر. گزینه‌های ممکن شامل: - nprobe نشان دهنده تعداد واحد خوشه‌بندی برای جستجو است. این پارامتر تنها هنگام تنظیم index_type به IVF_FLAT، IVF_SQ8 یا IVF_PQ موجود است. مقدار باید کمتر از مقدار nlist مشخص شده در طول فرآیند ساخت اندیس باشد. - ef نشان دهنده دامنه جستجو است. این پارامتر تنها هنگام تنظیم index_type به HNSW موجود است. مقدار باید بین top_k و 32768 باشد. - radius نشان دهنده زاویه است که بردارها با کمترین مشابهت قرار دارند. - range_filter نشان دهنده فیلتر استفاده شده برای فیلتر کردن مقادیر فیلد بردار که مشابهت آن‌ها با بردار پرس و جو در یک محدوده مشخص قرار می‌گیرد.

جستجوی برداری انجام دهید

از Milvus برای جستجوی برداری استفاده کنید. برای جستجو در یک بخش خاص، یک لیست از نام‌های بخش‌ها را مشخص کنید.

Milvus امکان تنظیم سطح یکپارچگی برای جستجوها را پشتیبانی می‌کند. در مثال این موضوع، سطح یکپارچگی را به "قوی" تنظیم می‌کند. همچنین می‌توانید سطح یکپارچگی را به "محدود"، "جلسه" یا "در نهایت" تنظیم کنید. برای کسب اطلاعات بیشتر در مورد چهار سطح یکپارچگی در Milvus، به یکپارچگی مراجعه کنید.

results = collection.search(
    data=[[0.1, 0.2]], 
    anns_field="book_intro", 
    param=search_params,
    limit=10,
    expr=None,
    output_fields=['title'],
    consistency_level="Strong"
)

results[0].ids

results[0].distances

hit = results[0][0]
hit.entity.get('title')
پارامتر توضیحات
data بردارهای استفاده شده برای جستجو.
anns_field نام فیلدی که برای جستجو استفاده می‌شود.
param پارامترهای جستجو ویژه برای شاخص. برای اطلاعات بیشتر، به شاخص بردار مراجعه کنید.
limit تعداد نتایج برای بازگشت. این مقدار به همراه offset در param باید کمتر از 16,384 باشد.
expr عبارت منطقی برای فیلتر کردن ویژگی‌ها. برای اطلاعات بیشتر، به قوانین عبارت منطقی مراجعه کنید.
output_fields (اختیاری) نام فیلدهای بازگشتی. فیلدهای بردار در حال حاضر پشتیبانی نمی‌شوند.
consistency_level (اختیاری) سطح یکپارچگی برای جستجو.

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

results[0].ids
results[0].distances

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

collection.release()

محدودیت‌ها

ویژگی حداکثر محدودیت
طول نام مجموعه 255 کاراکتر
تعداد بخش‌ها در یک مجموعه 4,096
تعداد فیلدها در یک مجموعه 256
تعداد تیکه‌ها در یک مجموعه 256
بعد بردار 32,768
بالاترین K 16,384
بردارهای ورودی 16,384

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

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

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

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

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

search_param = {
  "data": [[0.1, 0.2]],
  "anns_field": "book_intro",
  "param": {"metric_type": "L2", "params": {"nprobe": 10}, "offset": 0},
  "limit": 10,
  "expr": "word_count <= 11000",
}
res = collection.search(**search_param)

نتایج بازگشتی را بررسی کنید.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- تعداد کل ترافیک: {len(hits)}, شناسه‌های ترافیک: {hits.ids} ")
print(f"- اولین شناسه ترافیک: {hits[0].id}, فاصله: {hits[0].distance}, امتیاز: {hits[0].score} ")

انجام جستجوی محدوده‌ای

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

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

مثال زیر نشان می‌دهد چگونه می‌توانید جستجوی محدوده‌ای را بر اساس جستجوی معمولی برداری انجام دهید.

لود کردن مجموعه

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

from pymilvus import Collection
collection = Collection("book")      # مجموعه موجود را بگیرید
collection.load()

پیکربندی محدوده‌های فیلترینگ بردار

در مقایسه با جستجوی معمولی بردار، در Milvus، جستجوی محدوده توسط معرفی دو پارامتر جدید، یعنی قطر و فیلتر_محدوده، کنترل می‌شود تا نتایج جستجوی مطلوب در یک محدوده جستجو خاص بدست آید.

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

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

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

search_params = {
    "metric_type": "L2",
    "params": {
        "radius": 10.0,
        "range_filter" : 5.0
    }
}

در مورد فاصله IP، سناریو متفاوت است. در فاصله IP، فاصله بزرگتر نشان دهنده مشابهت بیشتر است. بنابراین، برخلاف فاصله L2، مقادیر قطر و فیلتر_محدوده در فاصله IP معکوس هستند. به عبارت دیگر، هنگام استفاده از فیلتر_محدوده برای فیلتر کردن برخی از بردارهای بیشتر به شکل مشابه بر اساس فاصله IP، مقدار مؤثر فیلتر_محدوده باید بیشتر از قطر باشد و فاصله بردارهای نتیجه باید بیشتر از قطر ولی کمتر یا مساوی با فیلتر_محدوده باشد.

search_params = {
    "metric_type": "IP",
    "params": {
        "radius": 0.8,
        "range_filter" : 1.0
    }
}

انجام جستجوی محدوده‌ای

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

جستجوی محدوده‌ای بر مشابهت در محدوده 5.0 و 10.0 بر اساس فاصله L2:

search_param = {
  "data": [[0.1, 0.2]], # بردار پرس و جو
  "anns_field": "book_intro", # فیلد قابل جستجو
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # فیلدهای قابل بازگشت
}

res = collection.search(**search_param)

جستجوی محدوده‌ای بر مشابهت در محدوده 1.0 و 0.8 بر اساس فاصله IP:

search_param = {
  "data": [[0.1, 0.2]], # بردار پرس و جو
  "anns_field": "book_intro", # فیلد قابل جستجو
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # فیلدهای قابل بازگشت
}

res = collection.search(**search_param)

خلاصه

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

نوع اندازه‌گیری فاصله پیکربندی
L2 و سایر فاصله‌ها فیلتر_محدوده <= فاصله < قطر
IP و کوسینوس فاصله قطر < فاصله <= فیلتر_محدوده