Vektör Benzerlik Araması Gerçekleştirme

Bu konu, Milvus'un varlıkları aramak için nasıl kullanılacağını tanıtır.

Milvus'ta, vektör benzerlik araması, sorgu vektörü ile koleksiyondaki vektörler arasındaki mesafeyi (belirli bir benzerlik ölçüsü kullanarak) hesaplar ve en benzer sonuçları döndürür. Skaler veya birincil anahtar alanlarını filtrelemek için boolean ifadesi belirterek karışık arama gerçekleştirebilirsiniz.

Aşağıdaki örnek, 2000 veri satırını içeren, kitap kimliği (birincil anahtar), kelime sayısı (skaler alan) ve kitap özeti (vektör alanı) içeren bir veri setinde vektör benzerlik araması yapmayı açıklar. Bu, vektörleştirilmiş açıklamalarına dayanarak belirli kitapları aramayı simüle eder. Milvus, sorgu vektörü ve tanımladığınız arama parametrelerine göre en benzer sonuçları döndürecektir.

Koleksiyonun Yüklenmesi

Milvus içindeki tüm arama ve sorgu işlemleri bellekte gerçekleştirilir. Vektör benzerlik araması yapmadan önce koleksiyonu belleğe yükleyin.

from pymilvus import Collection
collection = Collection("book")      # Mevcut koleksiyonu alın.
collection.load()

Arama Parametrelerini Hazırlama

Arama senaryonuz için ilgili parametreleri hazırlayın. Aşağıdaki örnek, aramanın Euclidean mesafesini hesaplamak ve IVF_FLAT indeksi tarafından oluşturulan on en yakın kümeden vektörleri almak için kullanacağı parametreleri tanımlar.

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
Parametre Açıklama
metric_type Arama sırasında vektörler arasındaki mesafeyi ölçmek için kullanılan yöntem. İndeks oluşturma sürecinde belirtilen yöntemle aynı olmalıdır. Daha fazla bilgi için benzerlik ölçüleri bölümüne bakın.
offset Arama sırasında atlanacak varlık sayısı. Bu değerle limit yönteminin toplamı 16384'ten küçük olmalıdır. Örneğin, sorgu vektörünün 9. ve 10. en yakın komşularını sorgulamak istiyorsanız, limit değerini 2 ve offset değerini 8 olarak ayarlayın.
ignore_growing Benzerlik araması sırasında büyümekte olan kısımları görmezden gelip gelmeyeceği. Varsayılan değer False olup, aramanın büyümekte olan kısımları içerdiğini belirtir.
params Belirtilen indeks türüne özgü arama parametreleri. Daha fazla bilgi için vektör indeks bölümüne bakın. Mümkün olan seçenekler şunları içerir: - nprobe, aranacak küme birimlerinin sayısını belirtir. Bu parametre, yalnızca IVF_FLAT, IVF_SQ8 veya IVF_PQ olarak index_type ayarlandığında mevcuttur. Değer, indeks oluşturma sürecinde belirtilen nlist değerinden küçük olmalıdır. - ef, arama aralığını belirtir. Bu parametre, yalnızca HNSW olarak index_type ayarlandığında mevcuttur. Değer top_k ve 32768 arasında olmalıdır. - radius, en düşük benzerliğe sahip vektörlerin bulunduğu açıyı belirtir. - range_filter, belirli bir aralığa düşen sorgu vektörünün benzerliğine sahip vektör alanı değerlerini filtrelemek için kullanılan filtrelemeyi belirtir.

Vektör Araması Yapma

Vektör araması için Milvus kullanın. Belirli bir bölüm içinde arama yapmak için bölüm adlarının bir listesini belirtin.

Milvus, aramalar için tutarlılık seviyesi ayarlama desteği sunar. Bu konudaki örnekte tutarlılık seviyesi "Güçlü" olarak ayarlanmıştır. Ayrıca tutarlılık seviyesini "Sınırlı", "Oturum" veya "Sonunda" olarak da ayarlayabilirsiniz. Milvus'taki dört tutarlılık seviyesi hakkında daha fazla bilgi için Tutarlılık sayfasına göz atın.

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')
Parametre Açıklama
data Arama için kullanılan vektörler.
anns_field Aranacak alanın adı.
param İndeks için özgü arama parametreleri. Daha fazla bilgi için Vektör İndeksi'ne bakın.
limit Döndürülecek sonuç sayısı. Bu değer, param içindeki offset ile birlikte 16,384'ten az olmalıdır.
expr Özellikleri filtrelemek için boolean ifade. Daha fazla bilgi için Boolean İfade Kuralları'na bakın.
output_fields (isteğe bağlı) Döndürülecek alanların adları. Vektör alanları şu anda desteklenmemektedir.
consistency_level (isteğe bağlı) Arama için tutarlılık seviyesi.

En benzer vektörlerin birincil anahtar değerlerini ve mesafelerini kontrol edin.

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

Arama tamamlandığında, bellek tüketimini azaltmak için Milvus'ta yüklenmiş koleksiyonu serbest bırakın.

collection.release()

Sınırlamalar

Özellik Maksimum Sınır
Koleksiyon adı uzunluğu 255 karakter
Bir koleksiyonda bölüm sayısı 4,096
Bir koleksiyonda alan sayısı 256
Bir koleksiyonda shard sayısı 256
Vektör boyutu 32,768
Üst K 16,384
Giriş vektörleri 16,384

Karma Arama Gerçekleştirme

Karma arama aslında öznitelik filtresi olan vektör aramasıdır. Özel koşullar altında aramalar sınırlanabilir, bu da scala alanlarını veya birincil anahtar alanlarını filtrelemek için kullanılan boolean ifadesini belirterek yapılır.

Aşağıdaki örnek, düzenli vektör araması temelinde karma arama nasıl gerçekleştirileceğini göstermektedir. Diyelim ki vektörleştirilmiş özetlere göre belirli kitapları aramak istiyorsunuz, ancak sadece belirli bir kelime sayısı aralığında arama yapmak istiyorsunuz. Bu durumda, arama parametrelerinde word_count alanını filtrelemek için bir boolean ifade belirtebilirsiniz. Milvus, ifadeyi karşılayan varlıklar içinde yalnızca benzer vektörler için arama yapacaktır.

Boolean ifadesi belirterek, vektör araması sırasında varlıkların scala alanlarını filtreleyebilirsiniz. Aşağıdaki örnek, arama kapsamını belirli word_count değer aralığındaki vektörlere sınırlar.

Filtreleme ifadesinde dinamik alanları kullanabilir ve arama isteğinde çıktı alanları kullanabilirsiniz. Örneğin, dinamik desene bakın.

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)

Dönen sonuçları kontrol edin.

assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Toplam sonuçlar: {len(hits)}, sonuç id'leri: {hits.ids} ")
print(f"- İlk sıradaki sonuç id: {hits[0].id}, mesafe: {hits[0].distance}, skor: {hits[0].score} ")

Aralık Araması Gerçekleştirme

Aralık araması, sorgu vektörü ile vektör alanı değerleri arasındaki mesafeye dayalı olarak arama sonuçlarını filtreleme yöntemidir. Farklı mesafe metrikleri, mesafeyi ölçmek için kullanılabilir.

Aralık araması gerçekleştirirken, Milvus öncelikle vektör benzerliği araması yapar. Ardından belirtilen mesafe koşullarına dayalı olarak vektör filtresi uygular ve belirli bir aralık içinde mesafesi düşen vektörleri döndürür.

Aşağıdaki örnek, düzenli vektör araması temelinde aralık araması nasıl gerçekleştirileceğini göstermektedir.

Koleksiyonun Yüklenmesi

Milvus'ta tüm arama ve sorgu işlemleri bellekte gerçekleştirilir. Vektör benzerliği araması yapmadan önce koleksiyonun belleğe yüklenmesi gerekir.

from pymilvus import Collection
collection = Collection("book")      # Varolan bir koleksiyon alın
collection.load()

Vektör Filtreleme Aralıklarının Yapılandırılması

Geleneksel vektör aramasına kıyasla, Milvus'ta aralık araması belirli bir arama aralığında istenen arama sonuçlarını elde etmek için radius ve range_filter adında iki yeni parametre tanıtılarak kontrol edilir.

Radius, benzer kabul edilen vektörlerin minimum açısını belirtir. İsteğe bağlı olarak range_filter, belirli bir aralık içinde sorgu vektörüne olan benzerliğe göre vektör alanı değerlerini filtrelemek için radius ile birlikte kullanılabilir. Hem radius hem de range_filter parametreleri FLOAT veri türüne sahiptir. Bu iki parametrenin ayarlanması aramanın doğruluğunu ve verimliliğini etkin bir şekilde dengelemektedir.

Genellikle, benzerlik vektör alanı değeri ile sorgu vektörü arasındaki mesafe ile ölçülür. Farklı mesafe metriklerinin seçimi, radius ve range_filter'ın yapılandırılmasını önemli ölçüde etkileyecektir.

Örneğin, L2 mesafesi durumunda, arama sonuçları radius'dan daha küçük bir mesafeye sahip vektör alanı değerlerine göre filtrelenmelidir. Çünkü L2 mesafesinde, daha küçük mesafeler daha büyük benzerlikleri gösterir. Bu bilgi ile en benzer vektörlerin bazılarını filtrelemek istiyorsanız, range_filter değerini radius'dan daha az olan etkili bir değer olarak belirtebilirsiniz.

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

IP mesafesi durumunda ise senaryo farklıdır. IP mesafesinde, daha büyük bir mesafe daha büyük benzerliği gösterir. Bu nedenle, L2 mesafesine karşı, IP mesafesinde radius ve range_filter'ın değerleri zıttır. Başka bir deyişle, IP mesafesine göre en benzer vektörleri filtrelemek için, etkili range_filter değeri radius'dan daha büyük olmalı ve sonuç vektörlerinin mesafesi radius'dan daha büyük ancak range_filter'dan daha az veya eşit olmalıdır.

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

Aralık Aramasının Gerçekleştirilmesi

Mesafe ölçümü türüne bağlı olarak radius ve range_filter belirterek dönecek sonuç vektörlerinin aralığını tanımlayabilirsiniz.

L2 mesafesine dayalı olarak 5.0 ile 10.0 aralığındaki benzerlik üzerinde aralık araması yapın:

arama_param = {
  "data": [[0.1, 0.2]], # Sorgu vektörü
  "anns_field": "kitap_giris", # Aranacak alan
  "param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Dönecek alanlar
}

sonuç = koleksiyon.arama_yap(**arama_param)

IP mesafesine dayalı olarak 1.0 ile 0.8 aralığındaki benzerlik üzerinde aralık araması yapın:

arama_param = {
  "data": [[0.1, 0.2]], # Sorgu vektörü
  "anns_field": "kitap_giris", # Aranacak alan
  "param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
  "limit": 2,
  "output_fields": ["int64", "float"]  # Dönecek alanlar
}

sonuç = koleksiyon.arama_yap(**arama_param)

Özet

Milvus'ta, aralık araması belirli bir mesafe aralığında benzer vektör sonuçlarını döndürebilir. Bu işlevsellik, arama parametrelerinde radius ve range_filter'ı belirterek etkinleştirilir. Aşağıdaki tablo, farklı mesafe ölçüm türleri için bu iki parametrenin yapılandırmasını özetlemektedir.

Mesafe Ölçüm Türü Yapılandırma
L2 ve diğer mesafeler range_filter <= mesafe < radius
IP ve kosinüs mesafeleri radius < mesafe <= range_filter