Thực hiện Tìm kiếm Tương tự Vector
Chủ đề này giới thiệu cách sử dụng Milvus để tìm kiếm các thực thể.
Trong Milvus, tìm kiếm tương tự vector tính toán khoảng cách giữa vector truy vấn và các vector trong bộ sưu tập (sử dụng một phép đo tương tự cụ thể) và trả về kết quả tương tự nhất. Bạn có thể thực hiện tìm kiếm hỗn hợp bằng cách xác định một biểu thức boolean để lọc các trường scalar hoặc khóa chính.
Ví dụ dưới đây minh họa cách thực hiện tìm kiếm tương tự vector trên một bộ dữ liệu chứa 2000 dòng dữ liệu, bao gồm ID sách (khóa chính), số từ (trường scalar) và tóm tắt sách (trường vector), để mô phỏng việc tìm kiếm sách cụ thể dựa trên mô tả vector hóa của chúng. Milvus sẽ trả về kết quả tương tự nhất dựa trên vector truy vấn và các tham số tìm kiếm bạn xác định.
Tải Bộ sưu tập
Tất cả các hoạt động tìm kiếm và truy vấn trong Milvus được thực hiện trong bộ nhớ. Trước khi thực hiện tìm kiếm tương tự vector, hãy tải bộ sưu tập vào bộ nhớ.
from pymilvus import Collection
collection = Collection("book") # Lấy bộ sưu tập hiện có.
collection.load()
Chuẩn bị Tham số Tìm kiếm
Chuẩn bị các tham số tương ứng cho kịch bản tìm kiếm của bạn. Ví dụ dưới đây xác định các tham số mà tìm kiếm sẽ sử dụng để tính toán khoảng cách bằng cách sử dụng khoảng cách Euclid và lấy các vector từ mười cụm gần nhất được xây dựng bởi chỉ mục IVF_FLAT.
search_params = {
"metric_type": "L2",
"offset": 5,
"ignore_growing": False,
"params": {"nprobe": 10}
}
Tham số | Mô tả |
---|---|
metric_type |
Phương pháp được sử dụng để đo khoảng cách giữa các vector trong quá trình tìm kiếm. Nó nên giống như phương pháp được xác định trong quá trình xây dựng chỉ mục. Tham khảo các phương pháp đo tương tự để biết thêm thông tin. |
offset |
Số lượng thực thể để bỏ qua trong quá trình tìm kiếm. Tổng của giá trị này và limit của phương thức search không nên lớn hơn 16384 . Ví dụ, nếu bạn muốn truy vấn hàng xóm gần thứ 9 và thứ 10 của vector truy vấn, hãy đặt limit là 2 và offset là 8. |
ignore_growing |
Xác định liệu có bỏ qua các đoạn dữ liệu đang tăng dần trong quá trình tìm kiếm tương tự hay không. Giá trị mặc định là False , cho biết rằng tìm kiếm bao gồm các đoạn dữ liệu đang tăng dần. |
params |
Các tham số tìm kiếm cụ thể cho loại chỉ mục được xác định. Tham khảo chỉ mục vector để biết thêm thông tin. Các tùy chọn có thể bao gồm: - nprobe xác định số lượng đơn vị phân cụm để tìm kiếm. Tham số này chỉ có sẵn khi cài đặt index_type là IVF_FLAT , IVF_SQ8 , hoặc IVF_PQ . Giá trị nên nhỏ hơn giá trị nlist được xác định trong quá trình xây dựng chỉ mục. - ef xác định phạm vi tìm kiếm. Tham số này chỉ có sẵn khi cài đặt index_type là HNSW . Giá trị nên nằm giữa top_k và 32768 . - radius xác định góc mà các vector có độ tương tự thấp nhất định vị. - range_filter xác định bộ lọc được sử dụng để lọc các giá trị trường vector mà độ tương tự với vector truy vấn nằm trong một phạm vi cụ thể. |
Thực hiện Tìm kiếm Vector
Sử dụng Milvus để tìm kiếm vector. Để tìm kiếm trong một phân vùng cụ thể, hãy chỉ định một danh sách tên phân vùng.
Milvus hỗ trợ thiết lập mức độ nhất quán cho các tìm kiếm. Ví dụ trong chủ đề này thiết lập mức độ nhất quán là "Mạnh mẽ". Bạn cũng có thể thiết lập mức độ nhất quán thành "Bounded", "Session" hoặc "Eventually". Để biết thêm thông tin về bốn mức độ nhất quán trong Milvus, xem Nhất quá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')
Tham số | Mô tả |
---|---|
data |
Các vector được sử dụng để tìm kiếm. |
anns_field |
Tên của trường cần tìm kiếm. |
param |
Các tham số tìm kiếm cụ thể cho chỉ mục. Để biết thêm thông tin, xem Chỉ mục Vector. |
limit |
Số kết quả trả về. Giá trị này cộng với offset trong param , không được vượt quá 16,384. |
expr |
Biểu thức logic cho việc lọc các thuộc tính. Để biết thêm thông tin, xem Quy tắc Biểu thức Logic. |
output_fields (tùy chọn) |
Tên các trường cần trả về. Các trường vector hiện không được hỗ trợ. |
consistency_level (tùy chọn) |
Mức độ nhất quán cho tìm kiếm. |
Kiểm tra các giá trị khóa chính và khoảng cách của các vector tương tự nhất.
results[0].ids
results[0].distances
Khi tìm kiếm hoàn tất, hãy giải phóng bộ sưu tập đã tải trong Milvus để giảm tiêu tốn bộ nhớ.
collection.release()
Giới hạn
Tính năng | Giới hạn tối đa |
---|---|
Độ dài tên bộ sưu tập | 255 ký tự |
Số lượng phân vùng trong bộ sưu tập | 4,096 |
Số lượng trường trong bộ sưu tập | 256 |
Số lượng shard trong bộ sưu tập | 256 |
Chiều vector | 32,768 |
Top K | 16,384 |
Các vector đầu vào | 16,384 |
Thực hiện Tìm kiếm Kết hợp (Mixed Search)
Tìm kiếm kết hợp chủ yếu là tìm kiếm vector kèm theo việc lọc thuộc tính. Bằng cách chỉ định một biểu thức logic được sử dụng để lọc các trường của giá trị vô hướng hoặc khóa chính, tìm kiếm có thể bị giới hạn dưới các điều kiện cụ thể.
Ví dụ sau minh họa cách thực hiện tìm kiếm kết hợp dựa trên tìm kiếm vector
thông thường. Hãy giả sử bạn muốn tìm kiếm các cuốn sách cụ thể dựa trên tóm tắt được chuyển đổi thành vector, nhưng bạn chỉ muốn tìm kiếm trong một phạm vi số lượng từ cụ thể. Sau đó, bạn có thể chỉ định một biểu thức logic trong các tham số tìm kiếm để lọc trường word_count
. Milvus sẽ chỉ tìm kiếm các vector tương tự trong các thực thể phù hợp với biểu thức.
Bằng cách chỉ định một biểu thức logic, bạn có thể lọc các trường vô hướng của các thực thể trong khi tìm kiếm vector. Ví dụ sau hạn chế phạm vi tìm kiếm đến các vector trong phạm vi giá trị word_count
được chỉ định.
Bạn cũng có thể sử dụng trường động trong biểu thức lọc và sử dụng trường đầu ra trong yêu cầu tìm kiếm. Ví dụ, tham khảo mẫu động.
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)
Kiểm tra các kết quả trả về.
assert len(res) == 1
hits = res[0]
assert len(hits) == 2
print(f"- Tổng số kết quả: {len(hits)}, ids các kết quả: {hits.ids} ")
print(f"- Kết quả đầu tiên: {hits[0].id}, khoảng cách: {hits[0].distance}, điểm số: {hits[0].score} ")
Thực hiện Tìm kiếm Phạm vi (Range Search)
Tìm kiếm phạm vi là phương pháp lọc kết quả tìm kiếm dựa trên khoảng cách giữa vector truy vấn và các giá trị trường vector. Các phép đo khoảng cách khác nhau có thể được sử dụng để đo lường khoảng cách.
Khi thực hiện tìm kiếm phạm vi, Milvus trước tiên thực hiện tìm kiếm tương tự vector. Sau đó, nó thực hiện lọc vector dựa trên các điều kiện khoảng cách đã chỉ định và trả về các vector mà khoảng cách của chúng rơi vào một phạm vi cụ thể.
Ví dụ sau minh họa cách thực hiện tìm kiếm phạm vi dựa trên tìm kiếm vector thông thường.
Tải Bộ sưu tập
Tất cả các thao tác tìm kiếm và truy vấn trong Milvus đều được thực hiện trong bộ nhớ. Trước khi thực hiện tìm kiếm tương tự vector, bộ sưu tập cần được tải vào bộ nhớ.
from pymilvus import Collection
collection = Collection("book") # Lấy một bộ sưu tập hiện có
collection.load()
Cấu hình Phạm vi Lọc Vector
So với tìm kiếm vector thông thường, tìm kiếm theo phạm vi trong Milvus được điều khiển bằng cách giới thiệu hai tham số mới, bán kính
và range_filter
, để có được kết quả tìm kiếm mong muốn trong một phạm vi tìm kiếm cụ thể.
Bán kính
xác định góc tối thiểu mà vector được coi là tương tự. Một range_filter
tùy chọn có thể được sử dụng cùng với bán kính
để lọc các giá trị trường vector dựa trên sự tương tự với vector truy vấn trong một phạm vi cụ thể. Cả hai tham số bán kính
và range_filter
đều có kiểu dữ liệu FLOAT. Thiết lập hai tham số này một cách hiệu quả để cân bằng độ chính xác và hiệu suất của tìm kiếm.
Thường thì, sự tương tự được đo bằng khoảng cách giữa giá trị trường vector và vector truy vấn. Việc chọn các phép đo khoảng cách khác nhau sẽ ảnh hưởng đáng kể đến cấu hình của bán kính
và range_filter
.
Ví dụ, trong trường hợp khoảng cách L2, kết quả tìm kiếm phải được lọc dựa trên các giá trị trường vector có khoảng cách nhỏ hơn bán kính
. Điều này bởi vì trong khoảng cách L2, khoảng cách nhỏ hơn biểu thị sự tương tự lớn hơn. Với kiến thức này, nếu bạn muốn loại bỏ một số vector tương tự nhất, bạn có thể chỉ định một giá trị range_filter
hiệu quả nhỏ hơn bán kính
.
search_params = {
"metric_type": "L2",
"params": {
"radius": 10.0,
"range_filter" : 5.0
}
}
Trong trường hợp khoảng cách IP, tình huống là khác biệt. Với khoảng cách IP, một khoảng cách lớn biểu thị sự tương tự lớn hơn. Do đó, khác với khoảng cách L2, các giá trị của bán kính
và range_filter
trong khoảng cách IP là ngược nhau. Nói cách khác, khi sử dụng range_filter
để loại bỏ một số vector tương tự nhất dựa trên khoảng cách IP, giá trị range_filter
hiệu quả phải lớn hơn bán kính
, và khoảng cách của vector kết quả phải lớn hơn bán kính
nhưng nhỏ hơn hoặc bằng range_filter
.
search_params = {
"metric_type": "IP",
"params": {
"radius": 0.8,
"range_filter" : 1.0
}
}
Thực hiện Tìm kiếm theo Phạm vi
Bằng cách xác định bán kính
và range_filter
dựa trên loại đo lường khoảng cách, bạn có thể định nghĩa phạm vi vector kết quả được trả về.
Thực hiện tìm kiếm theo phạm vi về sự tương tự trong khoảng từ 5.0
đến 10.0
dựa trên khoảng cách L2:
search_param = {
"data": [[0.1, 0.2]], # Vector truy vấn
"anns_field": "book_intro", # Trường cần tìm kiếm
"param": { "metric_type": "L2", "params": { "nprobe": 10, "radius": 10.0, "range_filter" : 5.0 }, "offset": 0 },
"limit": 2,
"output_fields": ["int64", "float"] # Các trường cần trả về
}
res = collection.search(**search_param)
Thực hiện tìm kiếm theo phạm vi về sự tương tự trong khoảng từ 1.0
đến 0.8
dựa trên khoảng cách IP:
search_param = {
"data": [[0.1, 0.2]], # Vector truy vấn
"anns_field": "book_intro", # Trường cần tìm kiếm
"param": {"metric_type": "IP", "params": { "nprobe": 10, "radius": 0.8, "range_filter" : 1.0 }, "offset": 0 },
"limit": 2,
"output_fields": ["int64", "float"] # Các trường cần trả về
}
res = collection.search(**search_param)
Tóm lược
Trong Milvus, tìm kiếm theo phạm vi có thể trả về kết quả vector tương tự trong phạm vi khoảng cách xác định. Tính năng này được kích hoạt bằng cách xác định bán kính
và range_filter
trong các tham số tìm kiếm. Bảng dưới đây tóm lược cấu hình của hai tham số này cho các loại đo lường khoảng cách khác nhau.
Loại Đo lường Khoảng cách | Cấu hình |
---|---|
L2 và các khoảng cách khác | range_filter <= khoảng cách < bán kính |
IP và cosine distances | bán kính < khoảng cách <= range_filter |