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_typeIVF_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_typeHNSW. Giá trị nên nằm giữa top_k32768. - 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ínhrange_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ínhrange_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ínhrange_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ínhrange_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ínhrange_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ínhrange_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