การทำการค้นหาความคล้ายคลึงของเวกเตอร์

หัวข้อนี้จะแนะนำวิธีการใช้ Milvus เพื่อค้นหา entities

ใน Milvus การค้นหาความคล้ายคลึงของเวกเตอร์นับระยะทางระหว่างเวกเตอร์คิวรี่กับเวกเตอร์ในคอลเล็คชัน (โดยใช้หลักการความคล้ายคลึงที่ระบุไว้) และส่งคืนผลลัพธ์ที่คล้ายคลึงที่สุด คุณสามารถดำเนินการค้นหาแบบผสมโดยการระบุสมการ boolean เพื่อกรองฟิลด์สกาลาร์หรือคีย์หลัก

ตัวอย่างต่อไปนี้แสดงถึงวิธีการทำการค้นหาความคล้ายคลึงของเวกเตอร์บนชุดข้อมูลที่ประกอบไปด้วยข้อมูล 2000 แถว ที่รวมถึง book ID (คีย์หลัก) จำนวนคำ (ฟิลด์สกาลาร์) และสรุปหนังสือ (ฟิลด์เวกเตอร์) เพื่อจำลองการค้นหาหนังสือที่เฉพาะเจาะจงโดยใช้คำอธิบายในรูปแบบเวกเตอร์ Milvus จะส่งคืนผลลัพธ์ที่คล้ายคลึงที่สุดตามความคิดเห็นของคุณและพารามิเตอร์การค้นหาที่คุณกำหนด

โหลดคอลเล็คชัน

การดำเนินการค้นหาและค้นหาคำสั่งภายใน Milvus จะทำการดำเนินการในหน่วยความจำ ก่อนทำการค้นหาความคล้ายคลึงของเวกเตอร์ ให้โหลดคอลเล็คชันเข้าสู่หน่วยความจำ

from pymilvus import Collection
collection = Collection("book")      # Get the existing collection.
collection.load()

เตรียมความพร้อมของพารามิเตอร์การค้นหา

เตรียมพารามิเตอร์ที่สอดคล้องกับสถานการณ์การค้นหาของคุณ ตัวอย่างต่อไปนี้กำหนดค่าพารามิเตอร์ที่จะใช้ในการคำนวณระยะทางโดยใช้ ระยะทางยูคลิเดียน และดึงเวกเตอร์จากกลุ่มที่คล้ายคลึงที่สุดสิบตัวที่สร้างขึ้นโดยดัชนี IVF_FLAT

search_params = {
    "metric_type": "L2",
    "offset": 5,
    "ignore_growing": False,
    "params": {"nprobe": 10}
}
พารามิเตอร์ รายละเอียด
metric_type วิธีการที่ใช้ในการวัดระยะทางระหว่างเวกเตอร์ในระหว่างการค้นหา ควรเป็นเดียวกับวิธีที่ระบุไว้ในขั้นตอนการสร้างดัชนี อ้างอิงข้อมูลเกี่ยวกับการวัดความคล้ายคลึงเพิ่มเติม
offset จำนวน entities ที่ต้องข้ามในระหว่างการค้นหา ผลรวมของค่านี้และ limit ของวิธี search ควรน้อยกว่า 16384 เช่น หากคุณต้องการที่จะ query บวกและ 10 ที่เกี่ยวข้องกับเวกเตอร์คิว กำหนด limit เป็น 2 และ offset เป็น 8
ignore_growing ว่าจะข้าม Segment ที่กำลังเติบโตในระหว่างการค้นหาหรือไม่ ค่าเริ่มต้นคือ False แสดงถึงว่าการค้นหารวม Segment ที่กำลังเติบโต
params พารามิเตอร์การค้นหาที่เฉพาะเจาะจงสำหรับประเภทดัชนีที่ระบุ อ้างอิงเวกเตอร์สำหรับข้อมูลเพิ่มเติม ตัวเลือกที่เป็นไปได้รวมถึง: - nprobe หมายความถึงจำนวนหน่วย clustering ที่ต้องการค้นหา พารามิเตอร์นี้มีอยู่เฉพาะตอนกำหนดประเภทดัชนีเป็น IVF_FLAT, IVF_SQ8, หรือ IVF_PQ ค่าควรน้อยกว่าค่า nlist ที่ระบุขึ้นในขั้นตอนการสร้างดัชนี - ef หมายถึงระยะการค้นหาพารามิเตอร์นี้มีอยู่เฉพาะตอนกำหนดประเภทดัชนีเป็น HNSW ค่าควรอยู่ระหว่าง top_k และ 32768 - radius หมายถึงมุมที่เวกเตอร์ที่มีความคล้ายคลึงต่ำที่สุดตั้งอยู่ - range_filter หมายถึงตัวกรองที่ใช้กรองค่าฟิลด์เวกเตอร์ที่ความคล้ายกับเวกเตอร์คิวตื่นตู้อยู่ในช่วงที่ระยะไว้เป็นบางเฉพาะเป็นบางอย่าง

การค้นหาเวกเตอร์

ใช้ Milvus สำหรับการค้นหาเวกเตอร์ ในการค้นหาภายในพาร์ทิชันที่เฉพาะ ๆ โปรดระบุรายการชื่อพาร์ทิชัน

Milvus รองรับการตั้งค่าระดับความสอดคล้องสำหรับการค้นหา ตัวอย่างในหัวข้อนี้ตั้งค่าระดับความสอดคล้องเป็น "เข้ม" คุณยังสามารถตั้งค่าระดับความสอดคล้องเป็น "รัญจอง", "เซสชัน", หรือ "สุดท้าย" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับระดับความสอดคล้องทั้งสี่ระดับใน Milvus ดูที่ Consistency

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 ตัวอักษร
จำนวนพาร์ทิชันในคอลเลคชัน 4096
จำนวนฟิลด์ในคอลเลคชัน 256
จำนวนชาร์ดในคอลเลคชัน 256
มิติเวกเตอร์ 32,768
บน K 16,384
เวกเตอร์นำเข้า 16,384

การค้นหาผสม

การค้นหาผสมหมายถึงการค้นหาเวกเตอร์พร้อมการกรองแอตทริบิวต์ โดยการระบุสมการตรรกะที่ใช้สำหรับกรองฟิลด์สกาลาร์หรือฟิลด์คีย์หลัก การค้นหาจะถูกจำกัดภายใต้เงื่อนไขที่เฉพาะเจาะจง

ตัวอย่างต่อไปนี้สาธิตวิธีการทำการค้นหาผสมขึ้นอยู่กับ การค้นหาเวกเตอร์ จงสมมติว่าคุณต้องการค้นหาหนังสือที่เฉพาะเจาะจงตามสรุปเวกเตอร์ แต่คุณต้องการค้นหาเฉพาะภายในช่วงคำนับคำ คุณสามารถระบุสมการตรรกะในพารามิเตอร์การค้นหาเพื่อกรองฟิลด์ word_count Milvus จะทำการค้นหาหนังสือที่คล้ายกันเฉพาะเจาะจงภายในเอนทิตีที่ตรงตามสมการ

โดยการระบุสมการตรรกะ คุณสามารถกรองฟิลด์สกาลาร์ของเอนทิตีขณะทำการค้นหาเวกเตอร์ ตัวอย่างต่อไปนี้จำกัดขอบเขตการค้นหาไว้ที่เวกเตอร์ภายในช่วงค่า word_count ที่ระบุ

คุณยังสามารถใช้เขตข้อมูลในสมการกรองและใช้เขตผลลัพธ์ในคำขอการค้นหา ตัวอย่างเช่น อ้างถึงแบบดินเนินที่ไดนามิก

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 ได้รับควบคุมโดยการนำเสนอพารามิเตอร์สองอย่างใหม่ คือ radius และ range_filter เพื่อให้ได้ผลลัพธ์การค้นหาที่ต้องการภายในช่วงการค้นหาที่เฉพาะเจาะจง

พารามิเตอร์ radius ระบุมุมขั้นต่ำที่ที่เวกเตอร์ถือว่าคือคล้ายกัน สามารถใช้ range_filter ตัวเลือกได้หากต้องการกรองค่าฟิลด์เวกเตอร์ตามความคล้ายคลึงกับเวกเตอร์ค้นหาภายในช่วงที่เฉพาะเจาะจง ทั้ง radius และ range_filter มีชนิดข้อมูลเป็น FLOAT การตั้งค่าพารามิเตอร์เหล่านี้จะช่วยให้การค้นหามีประสิทธิภาพและความแม่นยำ

โดยทั่วไป ความคล้ายคลึงถูกวัดโดยระยะห่างระหว่างค่าฟิลด์เวกเตอร์และเวกเตอร์ค้นหา การเลือกเมตริกระยะห่างที่แตกต่างกันจะมีผลกระทบอย่างมากต่อการกำหนดค่า radius และ range_filter

เช่นเช่น ในกรณีของระยะห่าง L2, ผลลัพธ์การค้นหาต้องถูกกรองตามค่าฟิลด์เวกเตอร์ที่มีระยะห่างน้อยกว่า radius นี้เนื่องจากระยะห่างที่น้อยกว่าแสดงถึงความคล้ายคลึงที่มากขึ้น ด้วยความรู้นี้ หากคุณต้องการกรองบางส่วนของเวกเตอร์ที่คล้ายกันที่สุดคุณสามารถระบุค่า range_filter ที่มีประสิทธิภาพซึ่งมีค่าน้อยกว่า radius

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

ในกรณีของระยะห่าง IP, ประการแตกต่างอย่างชัดเจน ด้วยระยะทาง IP ความคล้ายคลึงมีระยะทางที่ใหญ่แสดงถึงความคล้ายกันมากขึ้น ดังนั้น ตรงกันข้ามกับระยะทาง L2 ค่า radius และ range_filter ในระยะทาง IP กลับกัน กล่าวคือ เมื่อใช้ range_filter เพื่อกรองบางส่วนของเวกเตอร์ที่คล้ายกันมากที่สุดโดยใช้ระยะทาง IP ค่า range_filter ที่มีประสิทธิภาพจะต้องมากกว่า radius และระยะทางของเวกเตอร์ที่ได้จากนั้นควรมากกว่า radius แต่น้อยกว่าหรือเท่ากับ range_filter

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

การดำเนินการค้นหาภายในช่วง

โดยการระบุ radius และ range_filter ตามประเภทการวัดระยะทาง คุณสามารถกำหนดช่วงของเวกเตอร์ผลลัพธ์ที่จะส่งคืน

ดำเนินการค้นหาภายในช่วงเกี่ยวกับความคล้ายกันภายในช่วงระหว่าง 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, การค้นหาภายในช่วงสามารถส่งผลลัพธ์เวกเตอร์ที่คล้ายกันภายในช่วงระยะทางที่ระบุได้ ฟังก์ชันนี้สามารถเปิดใช้งานโดยการระบุ radius และ range_filter ในพารามิเตอร์ค้นหา ตารางด้านล่างสรุปการกำหนดค่าของพารามิเตอร์เหล่านี้สำหรับประเภทการวัดระยะทางที่แตกต่างกัน

ประเภทการวัดระยะทาง การกำหนดค่า
L2 และระยะทางอื่นๆ range_filter <= ระยะทาง < radius
IP และระยะทางคอไซน์ radius < ระยะทาง <= range_filter