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 |