Tìm kiếm tương tự theo Vector

Chủ đề này giới thiệu cách thực hiện tìm kiếm thực thể trong Milvus.

Tìm kiếm tương tự theo vector trong Milvus tính toán khoảng cách giữa vector truy vấn và các vector trong bộ sưu tập, sau đó trả về kết quả tương tự nhất. Bạn cũng có thể thực hiện tìm kiếm kết hợp bằng cách chỉ định biểu thức logic để lọc trường scalar hoặc trường khóa chính.

Ví dụ sau minh họa cách thực hiện tìm kiếm tương tự theo vector trên một tập dữ liệu gồm 2000 hàng, bao gồm các ID sách (khóa chính), tần suất từ (trường scalar), và mô tả sách (trường vector). Điều này mô phỏng tình huống tìm kiếm sách cụ thể dựa trên mô tả vector hóa. Milvus sẽ trả về kết quả tương tự nhất dựa trên vector truy vấn và tham số tìm kiếm mà bạn đã xác định.

Tải Bộ Sưu Tập

Trước khi thực hiện tìm kiếm tương tự theo vector, Milvus thực hiện tất cả các thao tác tìm kiếm và truy vấn trong bộ nhớ. Vui lòng tải bộ sưu tập vào bộ nhớ trước khi thực hiện tìm kiếm tương tự theo vector.

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("failed to load collection:", err.Error())
}

Chuẩn Bị Tham Số Tìm Kiếm

Chuẩn bị các tham số phù hợp với kịch bản tìm kiếm của bạn. Ví dụ sau định nghĩa việc sử dụng khoảng cách Euclidean để tính khoảng cách và truy vấn vector từ mười cụm gần nhất được xây dựng bởi chỉ số IVF_FLAT.

sp, _ := entity.NewIndexIvfFlatSearchParam( // NewIndex*SearchParam func
    10,                                  // searchParam
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
Tham số Mô tả Tùy chọn
NewIndex*SearchParam func Chức năng để tạo entity.SearchParam dựa trên các loại chỉ số khác nhau. Đối với Vector Float: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Đối với Vector Nhị phân: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp Các tham số tìm kiếm cụ thể cho chỉ số được trả về bởi chức năng trước. Xem Chỉ số Vector để biết chi tiết.
opt Tùy chọn cho tìm kiếm ANN (Approximate Nearest Neighbor). - Limit: Chỉ định số lượng thực thể để trả về. - Offset: Chỉ định số lượng thực thể để bỏ qua trong quá trình tìm kiếm. Tổng của tham số này và Limit phải nhỏ hơn 16384. Ví dụ, nếu bạn muốn truy vấn các láng giềng gần nhất thứ 9 và thứ 10 của một vector, đặt Limit thành 2Offset thành 8. - ConsistencyLevel: Chỉ định mức độ nhất quán được áp dụng trong quá trình tìm kiếm. - Ignore Growing: Cho biết liệu có bỏ qua các đoạn đang phát triển trong tìm kiếm tương tự không. Giá trị mặc định là False, cho biết rằng tìm kiếm liên quan đến các đoạn đang phát triển.

Thực hiện Tìm kiếm Vector

Thực hiện tìm kiếm vector bằng cách sử dụng Milvus. Để tìm kiếm trong một phân vùng cụ thể, vui lòng chỉ định danh sách tên phân vùng.

Milvus hỗ trợ thiết lập mức độ nhất quán cho tìm kiếm. Ví dụ trong chủ đề này thiết lập mức độ nhất quán thành 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, vui lòng xem Phần Required.

searchResult, err := milvusClient.Search(
    context.Background(),                    // ctx
    "book",                                  // CollectionName
    []string{},                              // partitionNames
    "",                                      // expr
    []string{"book_id"},                     // outputFields
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
    "book_intro",                            // vectorField
    entity.L2,                               // metricType
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if err != nil {
    log.Fatal("Failed to search collection:", err.Error())
}
Tham số Mô tả Tùy chọn
ctx Ngữ cảnh được sử dụng để điều khiển quá trình gọi API Không áp dụng
CollectionName Tên của bộ sưu tập cần tải Không áp dụng
partitionNames Danh sách tên phân vùng cần tải. Nếu trống, tìm kiếm tất cả các phân vùng Không áp dụng
expr Biểu thức Boolean để lọc các thuộc tính Xem quy tắc Biểu thức Boolean để biết thông tin chi tiết
output_fields Tên các trường cần trả về Không áp dụng
vectors Các vector cần tìm kiếm Không áp dụng
vectorField Tên của trường cần tìm kiếm Không áp dụng
metricType Loại đo lường được sử dụng cho tìm kiếm Tham số này phải giống như loại đo lường được sử dụng để xây dựng chỉ số
topK Số kết quả cần trả về. Tổng của giá trị này và offset trong opts phải nhỏ hơn 16384 Không áp dụng
sp entity.SearchParam cụ thể cho chỉ số Không áp dụng

Kiểm tra các giá trị khóa chính và khoảng cách của các vector tương tự nhau nhất.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
    fmt.Println(sr.IDs)
    fmt.Println(sr.Scores)
}

Sau 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 thụ bộ nhớ.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("Failed to release collection:", err.Error())
}

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 một bộ sưu tập 4,096
Số lượng trường trong một bộ sưu tập 256
Số lượng shard trong bộ sưu tập 256
Chiều của các vector 32,768
Top K 16,384
Số lượng vector đầu vào mục tiêu 16,384

Thực Hiện Tìm Kiếm Kết Hợp

Tìm kiếm kết hợp về cơ bản là tìm kiếm vector kết hợp với việc lọc thuộc tính. Bằng cách chỉ định một biểu thức Boolean để lọc các trường vô hướng hoặc trường khóa chính, bạn có thể giới hạn tìm kiếm dựa trên điều kiện cụ thể.

Ví dụ sau đây 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. Giả sử bạn muốn tìm kiếm các cuốn sách cụ thể dựa trên phần giới thiệu được vector hóa của các cuốn sách, nhưng chỉ muốn lấy các cuốn sách trong một phạm vi số từ cụ thể. Bạn có thể lọc trường word_count bằng cách chỉ định biểu thức Boolean trong các tham số tìm kiếm. 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.

sp, _ := entity.NewIndexFlatSearchParam(
  10,
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

searchResult, err := milvusClient.Search(
  context.Background(),
  "book",
  []string{},
  "word_count <= 11000",
  []string{"book_id"},
  []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
  "book_intro",
  entity.L2,
  2,
  sp,
  opt,
)

if err != nil {
  log.Fatal("Failed to search collection:", err.Error())
}

Kiểm tra các kết quả trả về.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}