การทำการค้นหาความคล้ายคลึงของเวกเตอร์
หัวข้อนี้จะแนะนำวิธีการใช้ 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 |